dte test coverage


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 50.0% high: ≥ 85.0%
Coverage Exec / Excl / Total
Lines: 100.0% 172 / 0 / 172
Functions: 100.0% 4 / 0 / 4
Branches: 100.0% 10 / 0 / 10

test/indent.c
Line Branch Exec Source
1 #include "test.h"
2 #include "block-iter.h"
3 #include "buffer.h"
4 #include "editor.h"
5 #include "indent.h"
6 #include "options.h"
7 #include "view.h"
8 #include "window.h"
9
10 1 static void test_get_indent_info(TestContext *ctx)
11 {
12 1 LocalOptions options = {
13 .expand_tab = true,
14 .indent_width = 4,
15 .tab_width = 4,
16 };
17
18 1 StringView line = strview(" ");
19 1 IndentInfo info = get_indent_info(&options, line);
20 1 EXPECT_EQ(info.bytes, 12);
21 1 EXPECT_EQ(info.width, 12);
22 1 EXPECT_EQ(info.level, 3);
23 1 EXPECT_TRUE(info.wsonly);
24 1 EXPECT_TRUE(info.sane);
25
26 1 line = strview("\t\t");
27 1 info = get_indent_info(&options, line);
28 1 EXPECT_EQ(info.bytes, 2);
29 1 EXPECT_EQ(info.width, 8);
30 1 EXPECT_EQ(info.level, 2);
31 1 EXPECT_TRUE(info.wsonly);
32 1 EXPECT_FALSE(info.sane);
33
34 1 line = strview(" xyz");
35 1 info = get_indent_info(&options, line);
36 1 EXPECT_EQ(info.bytes, 4);
37 1 EXPECT_EQ(info.width, 4);
38 1 EXPECT_EQ(info.level, 1);
39 1 EXPECT_FALSE(info.wsonly);
40 1 EXPECT_TRUE(info.sane);
41
42 1 options.expand_tab = false;
43 1 line = strview("\t\t");
44 1 info = get_indent_info(&options, line);
45 1 EXPECT_EQ(info.bytes, 2);
46 1 EXPECT_EQ(info.width, 8);
47 1 EXPECT_EQ(info.level, 2);
48 1 EXPECT_TRUE(info.wsonly);
49 1 EXPECT_TRUE(info.sane);
50
51 1 line = strview(" test");
52 1 info = get_indent_info(&options, line);
53 1 EXPECT_EQ(info.bytes, 4);
54 1 EXPECT_EQ(info.width, 4);
55 1 EXPECT_EQ(info.level, 1);
56 1 EXPECT_FALSE(info.wsonly);
57 1 EXPECT_FALSE(info.sane);
58
59 1 options.indent_width = 8;
60 1 options.tab_width = 8;
61 1 line = strview("\t\t ");
62 1 info = get_indent_info(&options, line);
63 1 EXPECT_EQ(info.bytes, 4);
64 1 EXPECT_EQ(info.width, 18);
65 1 EXPECT_EQ(info.level, 2);
66 1 EXPECT_TRUE(info.wsonly);
67 1 EXPECT_TRUE(info.sane);
68
69 1 line = strview("\t \t ");
70 1 info = get_indent_info(&options, line);
71 1 EXPECT_EQ(info.bytes, 4);
72 1 EXPECT_EQ(info.width, 17);
73 1 EXPECT_EQ(info.level, 2);
74 1 EXPECT_TRUE(info.wsonly);
75 1 EXPECT_FALSE(info.sane);
76
77 1 line = strview(" test");
78 1 info = get_indent_info(&options, line);
79 1 EXPECT_EQ(info.bytes, 4);
80 1 EXPECT_EQ(info.width, 4);
81 1 EXPECT_EQ(info.level, 0);
82 1 EXPECT_FALSE(info.wsonly);
83 1 EXPECT_TRUE(info.sane);
84
85 1 line = strview(" test");
86 1 info = get_indent_info(&options, line);
87 1 EXPECT_EQ(info.bytes, 8);
88 1 EXPECT_EQ(info.width, 8);
89 1 EXPECT_EQ(info.level, 1);
90 1 EXPECT_FALSE(info.wsonly);
91 1 EXPECT_FALSE(info.sane);
92 1 }
93
94 1 static void test_indent_level(TestContext *ctx)
95 {
96 1 EXPECT_EQ(indent_level(0, 2), 0);
97 1 EXPECT_EQ(indent_level(1, 2), 0);
98 1 EXPECT_EQ(indent_level(2, 2), 1);
99 1 EXPECT_EQ(indent_level(3, 2), 1);
100 1 EXPECT_EQ(indent_level(4, 2), 2);
101 1 EXPECT_EQ(indent_level(7, 8), 0);
102 1 EXPECT_EQ(indent_level(8, 8), 1);
103 1 EXPECT_EQ(indent_level(9, 8), 1);
104
105 1 EXPECT_EQ(indent_remainder(0, 2), 0);
106 1 EXPECT_EQ(indent_remainder(1, 2), 1);
107 1 EXPECT_EQ(indent_remainder(2, 2), 0);
108 1 EXPECT_EQ(indent_remainder(3, 2), 1);
109 1 EXPECT_EQ(indent_remainder(4, 2), 0);
110 1 EXPECT_EQ(indent_remainder(7, 8), 7);
111 1 EXPECT_EQ(indent_remainder(8, 8), 0);
112 1 EXPECT_EQ(indent_remainder(9, 8), 1);
113
114
2/2
✓ Branch 42 → 40 taken 18 times.
✓ Branch 42 → 43 taken 1 time.
19 for (size_t x = 0; x <= 17; x++) {
115
2/2
✓ Branch 40 → 35 taken 144 times.
✓ Branch 40 → 41 taken 18 times.
162 for (size_t m = 1; m <= 8; m++) {
116 144 EXPECT_EQ(indent_level(x, m), x / m);
117 144 EXPECT_EQ(indent_remainder(x, m), x % m);
118 }
119 }
120 1 }
121
122 1 static void test_next_indent_width(TestContext *ctx)
123 {
124 1 EXPECT_EQ(next_indent_width(0, 4), 4);
125 1 EXPECT_EQ(next_indent_width(1, 4), 4);
126 1 EXPECT_EQ(next_indent_width(2, 4), 4);
127 1 EXPECT_EQ(next_indent_width(3, 4), 4);
128 1 EXPECT_EQ(next_indent_width(4, 4), 8);
129 1 EXPECT_EQ(next_indent_width(5, 4), 8);
130 1 EXPECT_EQ(next_indent_width(6, 4), 8);
131 1 EXPECT_EQ(next_indent_width(7, 4), 8);
132 1 EXPECT_EQ(next_indent_width(8, 4), 12);
133 1 EXPECT_EQ(next_indent_width(9, 4), 12);
134
135 1 EXPECT_EQ(next_indent_width(0, 3), 3);
136 1 EXPECT_EQ(next_indent_width(1, 3), 3);
137 1 EXPECT_EQ(next_indent_width(2, 3), 3);
138 1 EXPECT_EQ(next_indent_width(3, 3), 6);
139 1 EXPECT_EQ(next_indent_width(4, 3), 6);
140 1 EXPECT_EQ(next_indent_width(5, 3), 6);
141 1 EXPECT_EQ(next_indent_width(6, 3), 9);
142 1 EXPECT_EQ(next_indent_width(7, 3), 9);
143 1 EXPECT_EQ(next_indent_width(8, 3), 9);
144 1 EXPECT_EQ(next_indent_width(9, 3), 12);
145
146 1 EXPECT_EQ(next_indent_width(0, 1), 1);
147 1 EXPECT_EQ(next_indent_width(1, 1), 2);
148 1 EXPECT_EQ(next_indent_width(2, 1), 3);
149 1 EXPECT_EQ(next_indent_width(3, 1), 4);
150 1 EXPECT_EQ(next_indent_width(4, 1), 5);
151
152
2/2
✓ Branch 62 → 60 taken 18 times.
✓ Branch 62 → 63 taken 1 time.
19 for (size_t x = 0; x <= 17; x++) {
153
2/2
✓ Branch 60 → 53 taken 144 times.
✓ Branch 60 → 61 taken 18 times.
162 for (size_t m = 1; m <= 8; m++) {
154 144 size_t r = next_indent_width(x, m);
155 144 EXPECT_TRUE(r > x);
156 144 EXPECT_EQ(r % m, 0);
157 144 EXPECT_EQ(r, ((x + m) / m) * m);
158
2/2
✓ Branch 57 → 58 taken 51 times.
✓ Branch 57 → 59 taken 93 times.
144 if (x % m == 0) {
159 51 EXPECT_EQ(r, x + m);
160 }
161 }
162 }
163
164 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 0, 4), 0);
165 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 1, 4), 0);
166 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 2, 4), 0);
167 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 3, 4), 0);
168
169 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 0, 3), 0);
170 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 1, 3), 0);
171 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 2, 3), 0);
172
173 1 EXPECT_UINT_EQ(next_indent_width(SIZE_MAX - 0, 1), 0);
174 1 }
175
176 1 static void test_indent_lines(TestContext *ctx)
177 {
178 1 EditorState *e = ctx->userdata;
179 1 View *view = window_open_empty_buffer(e->window);
180 1 LocalOptions *opts = &view->buffer->options;
181 1 opts->indent_width = 4;
182 1 opts->auto_indent = false;
183 1 opts->emulate_tab = true;
184 1 opts->expand_tab = true;
185
186 1 static const char text[] = " line 1\n line 2\n";
187 1 BlockIter *cursor = &view->cursor;
188 1 buffer_insert_bytes(view, text, sizeof(text) - 1);
189 1 block_iter_goto_offset(cursor, 4);
190 1 EXPECT_EQ(block_iter_get_offset(cursor), 4);
191
192 1 CodePoint u = 0;
193 1 EXPECT_EQ(block_iter_get_char(cursor, &u), 1);
194 1 EXPECT_EQ(u, 'l');
195
196 1 indent_lines(view, 0);
197 1 EXPECT_EQ(block_iter_get_offset(cursor), 4);
198 1 indent_lines(view, 1);
199 1 EXPECT_EQ(block_iter_get_offset(cursor), 8);
200 1 indent_lines(view, 1);
201 1 EXPECT_EQ(block_iter_get_offset(cursor), 12);
202 1 indent_lines(view, 2);
203 1 EXPECT_EQ(block_iter_get_offset(cursor), 20);
204 1 indent_lines(view, -1);
205 1 EXPECT_EQ(block_iter_get_offset(cursor), 16);
206 1 indent_lines(view, -2);
207 1 EXPECT_EQ(block_iter_get_offset(cursor), 8);
208 1 indent_lines(view, -2);
209 1 EXPECT_EQ(block_iter_get_offset(cursor), 0);
210 1 indent_lines(view, -1);
211 1 EXPECT_EQ(block_iter_get_offset(cursor), 0);
212 1 indent_lines(view, 1);
213 1 EXPECT_EQ(block_iter_get_offset(cursor), 4);
214 1 indent_lines(view, -50);
215 1 EXPECT_EQ(block_iter_get_offset(cursor), 0);
216
217 1 window_close_current_view(e->window);
218 1 }
219
220 static const TestEntry tests[] = {
221 TEST(test_get_indent_info),
222 TEST(test_indent_level),
223 TEST(test_next_indent_width),
224 };
225
226 static const TestEntry tests_late[] = {
227 TEST(test_indent_lines),
228 };
229
230 const TestGroup indent_tests = TEST_GROUP(tests);
231 const TestGroup indent_tests_late = TEST_GROUP(tests_late);
232