dte test coverage


Directory: ./
File: test/editorconfig.c
Date: 2025-05-08 15:05:54
Exec Total Coverage
Lines: 104 104 100.0%
Functions: 3 3 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 #include <stdlib.h>
2 #include "test.h"
3 #include "editorconfig/editorconfig.h"
4 #include "editorconfig/ini.h"
5 #include "editorconfig/match.h"
6 #include "util/path.h"
7
8 1 static void test_ini_parse(TestContext *ctx)
9 {
10 1 static const char input[] =
11 " \t key = val \n"
12 "\n"
13 " \t [section 1] \n"
14 "xyz = 123\n"
15 "\tfoo bar = this;is#not#a;comment\n"
16 "[section 2]\n"
17 " x=0\n"
18 "[]\n"
19 "z=."
20 ;
21
22 1 IniParser ini = {
23 .input = input,
24 .input_len = sizeof(input) - 1,
25 };
26
27 1 EXPECT_TRUE(ini_parse(&ini));
28 1 EXPECT_EQ(ini.pos, 17);
29 1 EXPECT_EQ(ini.name_count, 1);
30 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.section, "");
31 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.name, "key");
32 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.value, "val");
33
34 1 EXPECT_TRUE(ini_parse(&ini));
35 1 EXPECT_EQ(ini.pos, 45);
36 1 EXPECT_EQ(ini.name_count, 1);
37 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.section, "section 1");
38 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.name, "xyz");
39 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.value, "123");
40
41 1 EXPECT_TRUE(ini_parse(&ini));
42 1 EXPECT_EQ(ini.pos, 78);
43 1 EXPECT_EQ(ini.name_count, 2);
44 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.section, "section 1");
45 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.name, "foo bar");
46 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.value, "this;is#not#a;comment");
47
48 1 EXPECT_TRUE(ini_parse(&ini));
49 1 EXPECT_EQ(ini.pos, 95);
50 1 EXPECT_EQ(ini.name_count, 1);
51 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.section, "section 2");
52 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.name, "x");
53 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.value, "0");
54
55 1 EXPECT_TRUE(ini_parse(&ini));
56 1 EXPECT_EQ(ini.pos, 101);
57 1 EXPECT_EQ(ini.name_count, 1);
58 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.section, "");
59 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.name, "z");
60 1 EXPECT_STRVIEW_EQ_CSTRING(&ini.value, ".");
61
62 1 EXPECT_FALSE(ini_parse(&ini));
63 1 }
64
65 1 static void test_ec_pattern_match(TestContext *ctx)
66 {
67 #define patmatch(s, f) (ec_pattern_match(s, STRLEN(s), f))
68
69 1 EXPECT_TRUE(patmatch("*", "file.c"));
70 1 EXPECT_TRUE(patmatch("*.{c,h}", "file.c"));
71 1 EXPECT_TRUE(patmatch("*.{foo}", "file.foo"));
72
73 1 EXPECT_TRUE(patmatch("*.{foo{bar,baz}}", "file.foobaz"));
74 1 EXPECT_FALSE(patmatch("*.{foo{bar,baz}}", "file.foo"));
75
76 1 EXPECT_TRUE(patmatch("a/**/b/c/*.[ch]", "a/zzz/yyy/foo/b/c/file.h"));
77 1 EXPECT_FALSE(patmatch("a/*/b/c/*.[ch]", "a/zzz/yyy/foo/b/c/file.h"));
78
79 1 EXPECT_TRUE(patmatch("}*.{x,y}", "}foo.y"));
80 1 EXPECT_FALSE(patmatch("}*.{x,y}", "foo.y"));
81 1 EXPECT_TRUE(patmatch("{}*.{x,y}", "foo.y"));
82
83 1 EXPECT_TRUE(patmatch("*.[xyz]", "foo.z"));
84 1 EXPECT_FALSE(patmatch("*.[xyz", "foo.z"));
85 1 EXPECT_TRUE(patmatch("*.[xyz", "foo.[xyz"));
86
87 1 EXPECT_TRUE(patmatch("*.[!xyz]", "foo.a"));
88 1 EXPECT_FALSE(patmatch("*.[!xyz]", "foo.z"));
89
90 1 EXPECT_TRUE(patmatch("*.[", "foo.["));
91 1 EXPECT_TRUE(patmatch("*.[a", "foo.[a"));
92
93 1 EXPECT_TRUE(patmatch("*.[abc]def", "foo.bdef"));
94
95 1 EXPECT_TRUE(patmatch("x{{foo,},}", "x"));
96 1 EXPECT_TRUE(patmatch("x{{foo,},}", "xfoo"));
97
98 1 EXPECT_TRUE(patmatch("file.{,,x,,y,,}", "file.x"));
99 1 EXPECT_TRUE(patmatch("file.{,,x,,y,,}", "file."));
100 1 EXPECT_FALSE(patmatch("file.{,,x,,y,,}", "file.z"));
101
102 1 EXPECT_TRUE(patmatch("*.x,y,z", "file.x,y,z"));
103 1 EXPECT_TRUE(patmatch("*.{x,y,z}", "file.y"));
104 1 EXPECT_FALSE(patmatch("*.{x,y,z}", "file.x,y,z"));
105 1 EXPECT_FALSE(patmatch("*.{x,y,z}", "file.{x,y,z}"));
106
107 1 EXPECT_TRUE(patmatch("file.{{{a,b,{c,,d}}}}", "file.d"));
108 1 EXPECT_TRUE(patmatch("file.{{{a,b,{c,,d}}}}", "file."));
109 1 EXPECT_FALSE(patmatch("file.{{{a,b,{c,d}}}}", "file."));
110
111 1 EXPECT_TRUE(patmatch("file.{c[vl]d,inc}", "file.cvd"));
112 1 EXPECT_TRUE(patmatch("file.{c[vl]d,inc}", "file.cld"));
113 1 EXPECT_TRUE(patmatch("file.{c[vl]d,inc}", "file.inc"));
114 1 EXPECT_FALSE(patmatch("file.{c[vl]d,inc}", "file.cd"));
115
116 1 EXPECT_TRUE(patmatch("a?b.c", "a_b.c"));
117 1 EXPECT_FALSE(patmatch("a?b.c", "a/b.c"));
118
119 1 EXPECT_TRUE(patmatch("a\\[.abc", "a[.abc"));
120 1 EXPECT_TRUE(patmatch("a\\{.abc", "a{.abc"));
121 1 EXPECT_TRUE(patmatch("a\\*.abc", "a*.abc"));
122 1 EXPECT_TRUE(patmatch("a\\?.abc", "a?.abc"));
123 1 EXPECT_FALSE(patmatch("a\\*.abc", "az.abc"));
124 1 EXPECT_FALSE(patmatch("a\\?.abc", "az.abc"));
125
126 1 EXPECT_TRUE(patmatch("{{{a}}}", "a"));
127 1 EXPECT_FALSE(patmatch("{{{a}}", "a"));
128
129 // It's debatable whether this edge case behavior is sensible,
130 // but it's tested here anyway for the sake of UBSan coverage
131 1 EXPECT_TRUE(patmatch("*.xyz\\", "file.xyz\\"));
132 1 EXPECT_FALSE(patmatch("*.xyz\\", "file.xyz"));
133
134 #undef patmatch
135 1 }
136
137 1 static void test_get_editorconfig_options(TestContext *ctx)
138 {
139 1 EditorConfigOptions opts = editorconfig_options_init();
140 1 char *path = path_absolute("test/data/file.0foo.z");
141 1 ASSERT_NONNULL(path);
142 1 EXPECT_EQ(get_editorconfig_options(path, &opts), 0);
143 1 free(path);
144 1 EXPECT_EQ(opts.indent_style, INDENT_STYLE_SPACE);
145 1 EXPECT_EQ(opts.indent_size, 3);
146 1 EXPECT_EQ(opts.tab_width, 3);
147 1 EXPECT_EQ(opts.max_line_length, 68);
148 1 EXPECT_FALSE(opts.indent_size_is_tab);
149
150 1 path = path_absolute("test/data/file.foo");
151 1 ASSERT_NONNULL(path);
152 1 EXPECT_EQ(get_editorconfig_options(path, &opts), 0);
153 1 free(path);
154 1 EXPECT_EQ(opts.indent_style, INDENT_STYLE_UNSPECIFIED);
155 1 EXPECT_EQ(opts.indent_size, 0);
156 1 EXPECT_EQ(opts.tab_width, 0);
157 1 EXPECT_EQ(opts.max_line_length, 0);
158 1 EXPECT_FALSE(opts.indent_size_is_tab);
159 1 }
160
161 static const TestEntry tests[] = {
162 TEST(test_ini_parse),
163 TEST(test_ec_pattern_match),
164 TEST(test_get_editorconfig_options),
165 };
166
167 const TestGroup editorconfig_tests = TEST_GROUP(tests);
168