dte test coverage


Directory: ./
File: src/filetype/extensions.c
Date: 2025-12-11 10:43:49
Coverage Exec Excl Total
Lines: 100.0% 18 0 18
Functions: 100.0% 1 0 1
Branches: 100.0% 16 0 16

Line Branch Exec Source
1 static const struct FileExtensionMap {
2 const char ext[11];
3 const uint8_t filetype; // FileTypeEnum
4 } extensions[] = {
5 {"ada", ADA},
6 {"adb", ADA},
7 {"adoc", ASCIIDOC},
8 {"ads", ADA},
9 {"asciidoc", ASCIIDOC},
10 {"asd", LISP},
11 {"asm", ASM},
12 {"auk", AWK},
13 {"automount", INI},
14 {"avsc", JSON},
15 {"awk", AWK},
16 {"bash", SH},
17 {"bat", BATCH},
18 {"bats", SH}, // https://github.com/bats-core/bats-core
19 {"bbl", TEX},
20 {"bib", BIBTEX},
21 {"btm", BATCH},
22 {"bzl", PYTHON}, // https://bazel.build/rules/language
23 {"c++", CPLUSPLUS},
24 {"c++m", CPLUSPLUS},
25 {"cbl", COBOL},
26 {"cc", CPLUSPLUS},
27 {"ccm", CPLUSPLUS},
28 {"cjs", JAVASCRIPT},
29 {"cl", LISP},
30 {"clj", CLOJURE},
31 {"cls", TEX},
32 {"cmake", CMAKE},
33 {"cmd", BATCH},
34 {"cnc", GCODE},
35 {"cob", COBOL},
36 {"cobol", COBOL},
37 {"cocci", COCCINELLE},
38 {"coffee", COFFEESCRIPT},
39 {"cpp", CPLUSPLUS},
40 {"cppm", CPLUSPLUS}, // https://clang.llvm.org/docs/StandardCPlusPlusModules.html#file-name-requirements
41 {"cr", RUBY},
42 {"cs", CSHARP},
43 {"csh", CSH},
44 {"cshrc", CSH},
45 {"cson", COFFEESCRIPT},
46 {"css", CSS},
47 {"csv", CSV},
48 {"cxx", CPLUSPLUS},
49 {"cxxm", CPLUSPLUS},
50 {"d2", D2},
51 {"dart", DART},
52 {"desktop", INI},
53 {"di", D},
54 {"diff", DIFF},
55 {"dircolors", CONFIG},
56 {"doap", XML},
57 {"docbook", XML},
58 {"docker", DOCKER},
59 {"dot", DOT},
60 {"doxy", CONFIG},
61 {"dterc", DTE},
62 {"dts", DEVICETREE},
63 {"dtsi", DEVICETREE},
64 {"dtx", TEX},
65 {"ebuild", SH},
66 {"el", LISP},
67 {"emacs", LISP},
68 {"eml", MAIL},
69 {"eps", POSTSCRIPT},
70 {"erl", ERLANG},
71 {"ex", ELIXIR},
72 {"exs", ELIXIR},
73 {"fish", FISH},
74 {"flatpakref", INI},
75 {"frag", GLSL},
76 {"gawk", AWK},
77 {"gco", GCODE},
78 {"gcode", GCODE},
79 {"gd", GDSCRIPT},
80 {"gemspec", RUBY},
81 {"geojson", JSON},
82 {"gitignore", GITIGNORE},
83 {"glsl", GLSL},
84 {"glslf", GLSL},
85 {"glslv", GLSL},
86 {"gltf", JSON},
87 {"gml", XML},
88 {"gnuplot", GNUPLOT},
89 {"go", GO},
90 {"god", RUBY},
91 {"gp", GNUPLOT},
92 {"gperf", GPERF},
93 {"gpi", GNUPLOT},
94 {"gql", GRAPHQL},
95 {"graphql", GRAPHQL},
96 {"graphqls", GRAPHQL},
97 {"groovy", GROOVY},
98 {"grxml", XML},
99 {"gsed", SED},
100 {"gv", DOT},
101 {"ha", HARE},
102 {"har", JSON},
103 {"hcl", HCL},
104 {"hh", CPLUSPLUS},
105 {"hpp", CPLUSPLUS},
106 {"hrl", ERLANG},
107 {"hs", HASKELL},
108 {"htm", HTML},
109 {"html", HTML},
110 {"hxx", CPLUSPLUS},
111 {"ini", INI},
112 {"ino", CPLUSPLUS}, // https://arduino.github.io/arduino-cli/1.0/sketch-build-process/#pre-processing
113 {"ins", TEX},
114 {"java", JAVA},
115 {"jl", JULIA},
116 {"jq", JQ},
117 {"js", JAVASCRIPT},
118 {"jslib", JAVASCRIPT},
119 {"json", JSON},
120 {"jsonc", JSONC},
121 {"jsonl", JSON},
122 {"jspre", JAVASCRIPT},
123 {"kdl", KDL},
124 {"kml", XML},
125 {"ksh", SH},
126 {"kt", KOTLIN},
127 {"kts", KOTLIN},
128 {"latex", TEX},
129 {"lrc", LRC},
130 {"lsp", LISP},
131 {"ltx", TEX},
132 {"lua", LUA},
133 {"m3u", CONFIG},
134 {"m3u8", CONFIG},
135 {"m4", M4},
136 {"mak", MAKE},
137 {"make", MAKE},
138 {"markdown", MARKDOWN},
139 {"mawk", AWK},
140 {"mcmeta", JSON},
141 {"md", MARKDOWN},
142 {"mdown", MARKDOWN},
143 {"mk", MAKE},
144 {"mkd", MARKDOWN},
145 {"mkdn", MARKDOWN},
146 {"ml", OCAML},
147 {"mli", OCAML},
148 {"moon", MOONSCRIPT},
149 {"mount", INI},
150 {"nawk", AWK},
151 {"nft", NFTABLES},
152 {"nginx", NGINX},
153 {"nginxconf", NGINX},
154 {"nim", NIM},
155 {"ninja", NINJA},
156 {"nix", NIX},
157 {"nomad", HCL},
158 {"odin", ODIN},
159 {"opml", XML},
160 {"page", XML},
161 {"pas", PASCAL},
162 {"patch", DIFF},
163 {"path", INI},
164 {"pc", PKGCONFIG},
165 {"perl", PERL},
166 {"php", PHP},
167 {"pl", PERL},
168 {"plist", XML},
169 {"pls", INI},
170 {"plt", GNUPLOT},
171 {"pm", PERL},
172 {"po", GETTEXT},
173 {"podspec", RUBY},
174 {"pot", GETTEXT},
175 {"pp", RUBY},
176 {"proto", PROTOBUF},
177 {"ps", POSTSCRIPT},
178 {"ps1", POWERSHELL},
179 {"psd1", POWERSHELL},
180 {"psm1", POWERSHELL},
181 {"py", PYTHON},
182 {"py3", PYTHON},
183 {"qrc", XML},
184 {"rake", RUBY},
185 {"rb", RUBY},
186 {"rbi", RUBY},
187 {"rbx", RUBY},
188 {"rdf", XML},
189 {"re", C}, // re2c
190 {"rkt", RACKET},
191 {"rktd", RACKET},
192 {"rktl", RACKET},
193 {"rockspec", LUA},
194 {"roff", ROFF},
195 {"rs", RUST},
196 {"rss", XML},
197 {"rst", RST},
198 {"ru", RUBY},
199 {"sarif", JSON},
200 {"scad", SCAD},
201 {"scala", SCALA},
202 {"scm", SCHEME},
203 {"scss", SCSS},
204 {"scxml", XML},
205 {"sed", SED},
206 {"service", INI},
207 {"sh", SH},
208 {"sld", SCHEME},
209 {"slice", INI},
210 {"slint", SLINT},
211 {"sls", SCHEME},
212 {"socket", INI},
213 {"spec", RPMSPEC},
214 {"sql", SQL},
215 {"ss", SCHEME},
216 {"sty", TEX},
217 {"supp", CONFIG},
218 {"svg", XML},
219 {"swift", SWIFT},
220 {"target", INI},
221 {"tcl", TCL},
222 {"tcsh", CSH},
223 {"tcshrc", CSH},
224 {"terminfo", TERMINFO},
225 {"tex", TEX},
226 {"texi", TEXINFO},
227 {"texinfo", TEXINFO},
228 {"tf", HCL},
229 {"tfvars", HCL},
230 {"thor", RUBY},
231 {"timer", INI},
232 {"tlv", TLVERILOG},
233 {"toml", TOML},
234 {"topojson", JSON},
235 {"tr", ROFF},
236 {"ts", TYPESCRIPT},
237 {"tsv", TSV},
238 {"tsx", TYPESCRIPT},
239 {"typ", TYPST},
240 {"ui", XML},
241 {"vala", VALA},
242 {"vapi", VALA},
243 {"vcard", VCARD},
244 {"vcf", VCARD},
245 {"ver", VERILOG},
246 {"vert", GLSL},
247 {"vh", VHDL},
248 {"vhd", VHDL},
249 {"vhdl", VHDL},
250 {"vim", VIML},
251 {"weechatlog", WEECHATLOG},
252 {"wsgi", PYTHON},
253 {"xbel", XML},
254 {"xhtml", HTML},
255 {"xml", XML},
256 {"xsd", XML},
257 {"xsl", XML},
258 {"xslt", XML},
259 {"xspf", XML},
260 {"yaml", YAML},
261 {"yml", YAML},
262 {"zig", ZIG},
263 {"zsh", SH},
264 };
265
266 154 static FileTypeEnum filetype_from_extension(const StringView ext)
267 {
268
2/2
✓ Branch 2 → 3 taken 86 times.
✓ Branch 2 → 17 taken 68 times.
154 if (ext.length == 0 || ext.length >= sizeof(extensions[0].ext)) {
269 return NONE;
270 }
271
272
2/2
✓ Branch 3 → 4 taken 28 times.
✓ Branch 3 → 14 taken 58 times.
86 if (ext.length == 1) {
273
10/10
✓ Branch 4 → 5 taken 16 times.
✓ Branch 4 → 6 taken 2 times.
✓ Branch 4 → 7 taken 2 times.
✓ Branch 4 → 8 taken 1 time.
✓ Branch 4 → 9 taken 1 time.
✓ Branch 4 → 10 taken 1 time.
✓ Branch 4 → 11 taken 1 time.
✓ Branch 4 → 12 taken 1 time.
✓ Branch 4 → 13 taken 1 time.
✓ Branch 4 → 17 taken 2 times.
28 switch (ext.data[0]) {
274 case '1': case '2': case '3':
275 case '4': case '5': case '6':
276 case '7': case '8': case '9':
277 return ROFF;
278 16 case 'c': case 'h':
279 16 return C;
280 2 case 'C': case 'H':
281 2 return CPLUSPLUS;
282 2 case 'S': case 's':
283 2 return ASM;
284 1 case 'd': return D;
285 1 case 'l': return LEX;
286 1 case 'm': return OBJC;
287 1 case 'v': return VERILOG;
288 1 case 'y': return YACC;
289 }
290 1 return NONE;
291 }
292
293 58 const struct FileExtensionMap *e = BSEARCH(&ext, extensions, ft_compare);
294
2/2
✓ Branch 15 → 16 taken 30 times.
✓ Branch 15 → 17 taken 28 times.
58 return e ? e->filetype : NONE;
295 }
296