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 {"glif", XML}, // https://unifiedfontobject.org/versions/ufo3/glyphs/glif
88 {"glsl", GLSL},
89 {"glslf", GLSL},
90 {"glslv", GLSL},
91 {"gltf", JSON},
92 {"gml", XML},
93 {"gnuplot", GNUPLOT},
94 {"go", GO},
95 {"god", RUBY},
96 {"gp", GNUPLOT},
97 {"gperf", GPERF},
98 {"gpi", GNUPLOT},
99 {"gql", GRAPHQL},
100 {"graphql", GRAPHQL},
101 {"graphqls", GRAPHQL},
102 {"groovy", GROOVY},
103 {"grxml", XML},
104 {"gsed", SED},
105 {"gv", DOT},
106 {"ha", HARE},
107 {"har", JSON},
108 {"hcl", HCL},
109 {"hh", CPLUSPLUS},
110 {"hpp", CPLUSPLUS},
111 {"hrl", ERLANG},
112 {"hs", HASKELL},
113 {"htm", HTML},
114 {"html", HTML},
115 {"hwdb", CONFIG}, // Linux udev hwdb(7) file (/usr/lib/udev/hwdb.d/*.hwdb)
116 {"hxx", CPLUSPLUS},
117 {"ini", INI},
118 {"ino", CPLUSPLUS}, // https://arduino.github.io/arduino-cli/1.0/sketch-build-process/#pre-processing
119 {"ins", TEX},
120 {"java", JAVA},
121 {"jl", JULIA},
122 {"jq", JQ},
123 {"js", JAVASCRIPT},
124 {"jslib", JAVASCRIPT},
125 {"json", JSON},
126 {"jsonc", JSONC},
127 {"jsonl", JSON},
128 {"jspre", JAVASCRIPT},
129 {"kdl", KDL},
130 {"kml", XML},
131 {"ksh", SH},
132 {"kt", KOTLIN},
133 {"kts", KOTLIN},
134 {"latex", TEX},
135 {"lrc", LRC},
136 {"lsp", LISP},
137 {"ltx", TEX},
138 {"lua", LUA},
139 {"m3u", CONFIG},
140 {"m3u8", CONFIG},
141 {"m4", M4},
142 {"mak", MAKE},
143 {"make", MAKE},
144 {"markdown", MARKDOWN},
145 {"mawk", AWK},
146 {"mcmeta", JSON},
147 {"md", MARKDOWN},
148 {"mdown", MARKDOWN},
149 {"mk", MAKE},
150 {"mkd", MARKDOWN},
151 {"mkdn", MARKDOWN},
152 {"ml", OCAML},
153 {"mli", OCAML},
154 {"moon", MOONSCRIPT},
155 {"mount", INI},
156 {"nawk", AWK},
157 {"nft", NFTABLES},
158 {"nginx", NGINX},
159 {"nginxconf", NGINX},
160 {"nim", NIM},
161 {"ninja", NINJA},
162 {"nix", NIX},
163 {"nomad", HCL},
164 {"odin", ODIN},
165 {"opml", XML},
166 {"page", XML},
167 {"pas", PASCAL},
168 {"patch", DIFF},
169 {"path", INI},
170 {"pc", PKGCONFIG},
171 {"perl", PERL},
172 {"php", PHP},
173 {"pl", PERL},
174 {"plist", XML},
175 {"pls", INI},
176 {"plt", GNUPLOT},
177 {"pm", PERL},
178 {"po", GETTEXT},
179 {"podspec", RUBY},
180 {"pot", GETTEXT},
181 {"pp", RUBY},
182 {"proto", PROTOBUF},
183 {"ps", POSTSCRIPT},
184 {"ps1", POWERSHELL},
185 {"psd1", POWERSHELL},
186 {"psm1", POWERSHELL},
187 {"py", PYTHON},
188 {"py3", PYTHON},
189 {"qrc", XML},
190 {"rake", RUBY},
191 {"rb", RUBY},
192 {"rbi", RUBY},
193 {"rbx", RUBY},
194 {"rdf", XML},
195 {"re", C}, // re2c
196 {"rkt", RACKET},
197 {"rktd", RACKET},
198 {"rktl", RACKET},
199 {"rockspec", LUA},
200 {"roff", ROFF},
201 {"rs", RUST},
202 {"rss", XML},
203 {"rst", RST},
204 {"ru", RUBY},
205 {"sarif", JSON},
206 {"scad", SCAD},
207 {"scala", SCALA},
208 {"scm", SCHEME},
209 {"scss", SCSS},
210 {"scxml", XML},
211 {"sed", SED},
212 {"service", INI},
213 {"sh", SH},
214 {"sld", SCHEME},
215 {"slice", INI},
216 {"slint", SLINT},
217 {"sls", SCHEME},
218 {"socket", INI},
219 {"spec", RPMSPEC},
220 {"sql", SQL},
221 {"ss", SCHEME},
222 {"sty", TEX},
223 {"supp", CONFIG},
224 {"svg", XML},
225 {"swift", SWIFT},
226 {"target", INI},
227 {"tcl", TCL},
228 {"tcsh", CSH},
229 {"tcshrc", CSH},
230 {"terminfo", TERMINFO},
231 {"tex", TEX},
232 {"texi", TEXINFO},
233 {"texinfo", TEXINFO},
234 {"tf", HCL},
235 {"tfvars", HCL},
236 {"thor", RUBY},
237 {"timer", INI},
238 {"tlv", TLVERILOG},
239 {"toml", TOML},
240 {"topojson", JSON},
241 {"tr", ROFF},
242 {"ts", TYPESCRIPT},
243 {"tsv", TSV},
244 {"tsx", TYPESCRIPT},
245 {"typ", TYPST},
246 {"ui", XML},
247 {"vala", VALA},
248 {"vapi", VALA},
249 {"vcard", VCARD},
250 {"vcf", VCARD},
251 {"ver", VERILOG},
252 {"vert", GLSL},
253 {"vh", VHDL},
254 {"vhd", VHDL},
255 {"vhdl", VHDL},
256 {"vim", VIML},
257 {"weechatlog", WEECHATLOG},
258 {"wsgi", PYTHON},
259 {"xbel", XML},
260 {"xhtml", HTML},
261 {"xml", XML},
262 {"xsd", XML},
263 {"xsl", XML},
264 {"xslt", XML},
265 {"xspf", XML},
266 {"yaml", YAML},
267 {"yml", YAML},
268 {"zig", ZIG},
269 {"zsh", SH},
270 };
271
272 24 UNITTEST {
273 24 CHECK_BSEARCH_ARRAY(extensions, ext);
274 24 }
275
276 156 FileTypeEnum filetype_from_extension(StringView ext)
277 {
278
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)) {
279 return NONE;
280 }
281
282
2/2
✓ Branch 3 → 4 taken 28 times.
✓ Branch 3 → 14 taken 59 times.
87 if (ext.length == 1) {
283
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]) {
284 case '1': case '2': case '3':
285 case '4': case '5': case '6':
286 case '7': case '8': case '9':
287 return ROFF;
288 16 case 'c': case 'h':
289 16 return C;
290 2 case 'C': case 'H':
291 2 return CPLUSPLUS;
292 2 case 'S': case 's':
293 2 return ASM;
294 1 case 'd': return D;
295 1 case 'l': return LEX;
296 1 case 'm': return OBJC;
297 1 case 'v': return VERILOG;
298 1 case 'y': return YACC;
299 }
300 1 return NONE;
301 }
302
303 59 const struct FileExtensionMap *e = BSEARCH(&ext, extensions, ft_compare);
304
2/2
✓ Branch 15 → 16 taken 30 times.
✓ Branch 15 → 17 taken 29 times.
59 return e ? e->filetype : NONE;
305 }
306