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 |
|
|
|