dte test coverage


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 50.0% high: ≥ 85.0%
Coverage Exec / Excl / Total
Lines: 100.0% 21 / 0 / 21
Functions: 100.0% 2 / 0 / 2
Branches: 100.0% 16 / 0 / 16

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