Files
codebase-memory-mcp/tests/test_language.c
T
Martin Vogel 18c23d438f Fix 12 more Windows test failures: mkstemp, temp paths, TRE config
- cbm_mkstemp: Windows implementation using _mktemp + _open
- cbm_tmpdir(): portable temp directory function (replaces /tmp/)
- Fix hardcoded /tmp/ paths in test_language, test_gitignore,
  test_store_search, test_sqlite_writer
- Enlarge remaining small path buffers for Windows %TEMP% paths
2026-03-19 02:58:03 +01:00

753 lines
20 KiB
C

/*
* test_language.c — Tests for language detection (filename + extension).
*
* RED phase: These tests define the expected behavior for all 64 languages.
*/
#include "../src/foundation/compat.h"
#include "test_framework.h"
#include "discover/discover.h"
/* ── Extension-based detection ─────────────────────────────────── */
TEST(lang_ext_go) {
ASSERT_EQ(cbm_language_for_extension(".go"), CBM_LANG_GO);
PASS();
}
TEST(lang_ext_python) {
ASSERT_EQ(cbm_language_for_extension(".py"), CBM_LANG_PYTHON);
PASS();
}
TEST(lang_ext_javascript) {
ASSERT_EQ(cbm_language_for_extension(".js"), CBM_LANG_JAVASCRIPT);
PASS();
}
TEST(lang_ext_jsx) {
ASSERT_EQ(cbm_language_for_extension(".jsx"), CBM_LANG_JAVASCRIPT);
PASS();
}
TEST(lang_ext_typescript) {
ASSERT_EQ(cbm_language_for_extension(".ts"), CBM_LANG_TYPESCRIPT);
PASS();
}
TEST(lang_ext_tsx) {
ASSERT_EQ(cbm_language_for_extension(".tsx"), CBM_LANG_TSX);
PASS();
}
TEST(lang_ext_rust) {
ASSERT_EQ(cbm_language_for_extension(".rs"), CBM_LANG_RUST);
PASS();
}
TEST(lang_ext_java) {
ASSERT_EQ(cbm_language_for_extension(".java"), CBM_LANG_JAVA);
PASS();
}
TEST(lang_ext_cpp) {
ASSERT_EQ(cbm_language_for_extension(".cpp"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_hpp) {
ASSERT_EQ(cbm_language_for_extension(".hpp"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_cc) {
ASSERT_EQ(cbm_language_for_extension(".cc"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_cxx) {
ASSERT_EQ(cbm_language_for_extension(".cxx"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_hxx) {
ASSERT_EQ(cbm_language_for_extension(".hxx"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_hh) {
ASSERT_EQ(cbm_language_for_extension(".hh"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_h) {
ASSERT_EQ(cbm_language_for_extension(".h"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_ixx) {
ASSERT_EQ(cbm_language_for_extension(".ixx"), CBM_LANG_CPP);
PASS();
}
TEST(lang_ext_csharp) {
ASSERT_EQ(cbm_language_for_extension(".cs"), CBM_LANG_CSHARP);
PASS();
}
TEST(lang_ext_php) {
ASSERT_EQ(cbm_language_for_extension(".php"), CBM_LANG_PHP);
PASS();
}
TEST(lang_ext_lua) {
ASSERT_EQ(cbm_language_for_extension(".lua"), CBM_LANG_LUA);
PASS();
}
TEST(lang_ext_scala) {
ASSERT_EQ(cbm_language_for_extension(".scala"), CBM_LANG_SCALA);
PASS();
}
TEST(lang_ext_sc) {
ASSERT_EQ(cbm_language_for_extension(".sc"), CBM_LANG_SCALA);
PASS();
}
TEST(lang_ext_kotlin) {
ASSERT_EQ(cbm_language_for_extension(".kt"), CBM_LANG_KOTLIN);
PASS();
}
TEST(lang_ext_kts) {
ASSERT_EQ(cbm_language_for_extension(".kts"), CBM_LANG_KOTLIN);
PASS();
}
TEST(lang_ext_ruby) {
ASSERT_EQ(cbm_language_for_extension(".rb"), CBM_LANG_RUBY);
PASS();
}
TEST(lang_ext_rake) {
ASSERT_EQ(cbm_language_for_extension(".rake"), CBM_LANG_RUBY);
PASS();
}
TEST(lang_ext_gemspec) {
ASSERT_EQ(cbm_language_for_extension(".gemspec"), CBM_LANG_RUBY);
PASS();
}
TEST(lang_ext_c) {
ASSERT_EQ(cbm_language_for_extension(".c"), CBM_LANG_C);
PASS();
}
TEST(lang_ext_bash) {
ASSERT_EQ(cbm_language_for_extension(".sh"), CBM_LANG_BASH);
PASS();
}
TEST(lang_ext_bash2) {
ASSERT_EQ(cbm_language_for_extension(".bash"), CBM_LANG_BASH);
PASS();
}
TEST(lang_ext_zig) {
ASSERT_EQ(cbm_language_for_extension(".zig"), CBM_LANG_ZIG);
PASS();
}
TEST(lang_ext_elixir) {
ASSERT_EQ(cbm_language_for_extension(".ex"), CBM_LANG_ELIXIR);
PASS();
}
TEST(lang_ext_exs) {
ASSERT_EQ(cbm_language_for_extension(".exs"), CBM_LANG_ELIXIR);
PASS();
}
TEST(lang_ext_haskell) {
ASSERT_EQ(cbm_language_for_extension(".hs"), CBM_LANG_HASKELL);
PASS();
}
TEST(lang_ext_ocaml) {
ASSERT_EQ(cbm_language_for_extension(".ml"), CBM_LANG_OCAML);
PASS();
}
TEST(lang_ext_mli) {
ASSERT_EQ(cbm_language_for_extension(".mli"), CBM_LANG_OCAML);
PASS();
}
TEST(lang_ext_swift) {
ASSERT_EQ(cbm_language_for_extension(".swift"), CBM_LANG_SWIFT);
PASS();
}
TEST(lang_ext_dart) {
ASSERT_EQ(cbm_language_for_extension(".dart"), CBM_LANG_DART);
PASS();
}
TEST(lang_ext_perl) {
ASSERT_EQ(cbm_language_for_extension(".pl"), CBM_LANG_PERL);
PASS();
}
TEST(lang_ext_pm) {
ASSERT_EQ(cbm_language_for_extension(".pm"), CBM_LANG_PERL);
PASS();
}
TEST(lang_ext_groovy) {
ASSERT_EQ(cbm_language_for_extension(".groovy"), CBM_LANG_GROOVY);
PASS();
}
TEST(lang_ext_gradle) {
ASSERT_EQ(cbm_language_for_extension(".gradle"), CBM_LANG_GROOVY);
PASS();
}
TEST(lang_ext_erlang) {
ASSERT_EQ(cbm_language_for_extension(".erl"), CBM_LANG_ERLANG);
PASS();
}
TEST(lang_ext_r) {
ASSERT_EQ(cbm_language_for_extension(".r"), CBM_LANG_R);
PASS();
}
TEST(lang_ext_R) {
ASSERT_EQ(cbm_language_for_extension(".R"), CBM_LANG_R);
PASS();
}
/* Tier 2 programming */
TEST(lang_ext_clojure) {
ASSERT_EQ(cbm_language_for_extension(".clj"), CBM_LANG_CLOJURE);
PASS();
}
TEST(lang_ext_cljs) {
ASSERT_EQ(cbm_language_for_extension(".cljs"), CBM_LANG_CLOJURE);
PASS();
}
TEST(lang_ext_cljc) {
ASSERT_EQ(cbm_language_for_extension(".cljc"), CBM_LANG_CLOJURE);
PASS();
}
TEST(lang_ext_fsharp) {
ASSERT_EQ(cbm_language_for_extension(".fs"), CBM_LANG_FSHARP);
PASS();
}
TEST(lang_ext_fsi) {
ASSERT_EQ(cbm_language_for_extension(".fsi"), CBM_LANG_FSHARP);
PASS();
}
TEST(lang_ext_fsx) {
ASSERT_EQ(cbm_language_for_extension(".fsx"), CBM_LANG_FSHARP);
PASS();
}
TEST(lang_ext_julia) {
ASSERT_EQ(cbm_language_for_extension(".jl"), CBM_LANG_JULIA);
PASS();
}
TEST(lang_ext_vim) {
ASSERT_EQ(cbm_language_for_extension(".vim"), CBM_LANG_VIMSCRIPT);
PASS();
}
TEST(lang_ext_nix) {
ASSERT_EQ(cbm_language_for_extension(".nix"), CBM_LANG_NIX);
PASS();
}
TEST(lang_ext_commonlisp) {
ASSERT_EQ(cbm_language_for_extension(".lisp"), CBM_LANG_COMMONLISP);
PASS();
}
TEST(lang_ext_lsp) {
ASSERT_EQ(cbm_language_for_extension(".lsp"), CBM_LANG_COMMONLISP);
PASS();
}
TEST(lang_ext_cl) {
ASSERT_EQ(cbm_language_for_extension(".cl"), CBM_LANG_COMMONLISP);
PASS();
}
TEST(lang_ext_elm) {
ASSERT_EQ(cbm_language_for_extension(".elm"), CBM_LANG_ELM);
PASS();
}
TEST(lang_ext_fortran) {
ASSERT_EQ(cbm_language_for_extension(".f90"), CBM_LANG_FORTRAN);
PASS();
}
TEST(lang_ext_f95) {
ASSERT_EQ(cbm_language_for_extension(".f95"), CBM_LANG_FORTRAN);
PASS();
}
TEST(lang_ext_f03) {
ASSERT_EQ(cbm_language_for_extension(".f03"), CBM_LANG_FORTRAN);
PASS();
}
TEST(lang_ext_f08) {
ASSERT_EQ(cbm_language_for_extension(".f08"), CBM_LANG_FORTRAN);
PASS();
}
TEST(lang_ext_cuda) {
ASSERT_EQ(cbm_language_for_extension(".cu"), CBM_LANG_CUDA);
PASS();
}
TEST(lang_ext_cuh) {
ASSERT_EQ(cbm_language_for_extension(".cuh"), CBM_LANG_CUDA);
PASS();
}
TEST(lang_ext_cobol) {
ASSERT_EQ(cbm_language_for_extension(".cob"), CBM_LANG_COBOL);
PASS();
}
TEST(lang_ext_cbl) {
ASSERT_EQ(cbm_language_for_extension(".cbl"), CBM_LANG_COBOL);
PASS();
}
TEST(lang_ext_verilog) {
ASSERT_EQ(cbm_language_for_extension(".v"), CBM_LANG_VERILOG);
PASS();
}
TEST(lang_ext_sv) {
ASSERT_EQ(cbm_language_for_extension(".sv"), CBM_LANG_VERILOG);
PASS();
}
TEST(lang_ext_emacslisp) {
ASSERT_EQ(cbm_language_for_extension(".el"), CBM_LANG_EMACSLISP);
PASS();
}
/* Scientific/math */
TEST(lang_ext_matlab) {
ASSERT_EQ(cbm_language_for_extension(".matlab"), CBM_LANG_MATLAB);
PASS();
}
TEST(lang_ext_mlx) {
ASSERT_EQ(cbm_language_for_extension(".mlx"), CBM_LANG_MATLAB);
PASS();
}
TEST(lang_ext_lean) {
ASSERT_EQ(cbm_language_for_extension(".lean"), CBM_LANG_LEAN);
PASS();
}
TEST(lang_ext_form) {
ASSERT_EQ(cbm_language_for_extension(".frm"), CBM_LANG_FORM);
PASS();
}
TEST(lang_ext_prc) {
ASSERT_EQ(cbm_language_for_extension(".prc"), CBM_LANG_FORM);
PASS();
}
TEST(lang_ext_magma) {
ASSERT_EQ(cbm_language_for_extension(".mag"), CBM_LANG_MAGMA);
PASS();
}
TEST(lang_ext_magma2) {
ASSERT_EQ(cbm_language_for_extension(".magma"), CBM_LANG_MAGMA);
PASS();
}
TEST(lang_ext_wolfram) {
ASSERT_EQ(cbm_language_for_extension(".wl"), CBM_LANG_WOLFRAM);
PASS();
}
TEST(lang_ext_wls) {
ASSERT_EQ(cbm_language_for_extension(".wls"), CBM_LANG_WOLFRAM);
PASS();
}
/* Helper languages */
TEST(lang_ext_html) {
ASSERT_EQ(cbm_language_for_extension(".html"), CBM_LANG_HTML);
PASS();
}
TEST(lang_ext_htm) {
ASSERT_EQ(cbm_language_for_extension(".htm"), CBM_LANG_HTML);
PASS();
}
TEST(lang_ext_css) {
ASSERT_EQ(cbm_language_for_extension(".css"), CBM_LANG_CSS);
PASS();
}
TEST(lang_ext_scss) {
ASSERT_EQ(cbm_language_for_extension(".scss"), CBM_LANG_SCSS);
PASS();
}
TEST(lang_ext_yaml) {
ASSERT_EQ(cbm_language_for_extension(".yml"), CBM_LANG_YAML);
PASS();
}
TEST(lang_ext_yaml2) {
ASSERT_EQ(cbm_language_for_extension(".yaml"), CBM_LANG_YAML);
PASS();
}
TEST(lang_ext_toml) {
ASSERT_EQ(cbm_language_for_extension(".toml"), CBM_LANG_TOML);
PASS();
}
TEST(lang_ext_hcl) {
ASSERT_EQ(cbm_language_for_extension(".tf"), CBM_LANG_HCL);
PASS();
}
TEST(lang_ext_hcl2) {
ASSERT_EQ(cbm_language_for_extension(".hcl"), CBM_LANG_HCL);
PASS();
}
TEST(lang_ext_sql) {
ASSERT_EQ(cbm_language_for_extension(".sql"), CBM_LANG_SQL);
PASS();
}
TEST(lang_ext_dockerfile) {
ASSERT_EQ(cbm_language_for_extension(".dockerfile"), CBM_LANG_DOCKERFILE);
PASS();
}
TEST(lang_ext_json) {
ASSERT_EQ(cbm_language_for_extension(".json"), CBM_LANG_JSON);
PASS();
}
TEST(lang_ext_xml) {
ASSERT_EQ(cbm_language_for_extension(".xml"), CBM_LANG_XML);
PASS();
}
TEST(lang_ext_xsl) {
ASSERT_EQ(cbm_language_for_extension(".xsl"), CBM_LANG_XML);
PASS();
}
TEST(lang_ext_xsd) {
ASSERT_EQ(cbm_language_for_extension(".xsd"), CBM_LANG_XML);
PASS();
}
TEST(lang_ext_svg) {
ASSERT_EQ(cbm_language_for_extension(".svg"), CBM_LANG_XML);
PASS();
}
TEST(lang_ext_markdown) {
ASSERT_EQ(cbm_language_for_extension(".md"), CBM_LANG_MARKDOWN);
PASS();
}
TEST(lang_ext_mdx) {
ASSERT_EQ(cbm_language_for_extension(".mdx"), CBM_LANG_MARKDOWN);
PASS();
}
TEST(lang_ext_makefile) {
ASSERT_EQ(cbm_language_for_extension(".mk"), CBM_LANG_MAKEFILE);
PASS();
}
TEST(lang_ext_cmake) {
ASSERT_EQ(cbm_language_for_extension(".cmake"), CBM_LANG_CMAKE);
PASS();
}
TEST(lang_ext_protobuf) {
ASSERT_EQ(cbm_language_for_extension(".proto"), CBM_LANG_PROTOBUF);
PASS();
}
TEST(lang_ext_graphql) {
ASSERT_EQ(cbm_language_for_extension(".graphql"), CBM_LANG_GRAPHQL);
PASS();
}
TEST(lang_ext_gql) {
ASSERT_EQ(cbm_language_for_extension(".gql"), CBM_LANG_GRAPHQL);
PASS();
}
TEST(lang_ext_vue) {
ASSERT_EQ(cbm_language_for_extension(".vue"), CBM_LANG_VUE);
PASS();
}
TEST(lang_ext_svelte) {
ASSERT_EQ(cbm_language_for_extension(".svelte"), CBM_LANG_SVELTE);
PASS();
}
TEST(lang_ext_meson) {
ASSERT_EQ(cbm_language_for_extension(".meson"), CBM_LANG_MESON);
PASS();
}
TEST(lang_ext_glsl) {
ASSERT_EQ(cbm_language_for_extension(".glsl"), CBM_LANG_GLSL);
PASS();
}
TEST(lang_ext_vert) {
ASSERT_EQ(cbm_language_for_extension(".vert"), CBM_LANG_GLSL);
PASS();
}
TEST(lang_ext_frag) {
ASSERT_EQ(cbm_language_for_extension(".frag"), CBM_LANG_GLSL);
PASS();
}
TEST(lang_ext_ini) {
ASSERT_EQ(cbm_language_for_extension(".ini"), CBM_LANG_INI);
PASS();
}
TEST(lang_ext_cfg) {
ASSERT_EQ(cbm_language_for_extension(".cfg"), CBM_LANG_INI);
PASS();
}
TEST(lang_ext_conf) {
ASSERT_EQ(cbm_language_for_extension(".conf"), CBM_LANG_INI);
PASS();
}
/* Unknown extension */
TEST(lang_ext_unknown) {
ASSERT_EQ(cbm_language_for_extension(".xyz"), CBM_LANG_COUNT);
PASS();
}
TEST(lang_ext_null) {
ASSERT_EQ(cbm_language_for_extension(""), CBM_LANG_COUNT);
PASS();
}
/* ── Filename-based detection ──────────────────────────────────── */
TEST(lang_fn_makefile) {
ASSERT_EQ(cbm_language_for_filename("Makefile"), CBM_LANG_MAKEFILE);
PASS();
}
TEST(lang_fn_gnumakefile) {
ASSERT_EQ(cbm_language_for_filename("GNUmakefile"), CBM_LANG_MAKEFILE);
PASS();
}
TEST(lang_fn_makefile_lower) {
ASSERT_EQ(cbm_language_for_filename("makefile"), CBM_LANG_MAKEFILE);
PASS();
}
TEST(lang_fn_cmake) {
ASSERT_EQ(cbm_language_for_filename("CMakeLists.txt"), CBM_LANG_CMAKE);
PASS();
}
TEST(lang_fn_dockerfile) {
ASSERT_EQ(cbm_language_for_filename("Dockerfile"), CBM_LANG_DOCKERFILE);
PASS();
}
TEST(lang_fn_meson_build) {
ASSERT_EQ(cbm_language_for_filename("meson.build"), CBM_LANG_MESON);
PASS();
}
TEST(lang_fn_meson_opts) {
ASSERT_EQ(cbm_language_for_filename("meson.options"), CBM_LANG_MESON);
PASS();
}
TEST(lang_fn_meson_opts_txt) {
ASSERT_EQ(cbm_language_for_filename("meson_options.txt"), CBM_LANG_MESON);
PASS();
}
TEST(lang_fn_vimrc) {
ASSERT_EQ(cbm_language_for_filename(".vimrc"), CBM_LANG_VIMSCRIPT);
PASS();
}
/* Filename with extension falls through to extension lookup */
TEST(lang_fn_main_go) {
ASSERT_EQ(cbm_language_for_filename("main.go"), CBM_LANG_GO);
PASS();
}
TEST(lang_fn_test_py) {
ASSERT_EQ(cbm_language_for_filename("test.py"), CBM_LANG_PYTHON);
PASS();
}
TEST(lang_fn_unknown) {
ASSERT_EQ(cbm_language_for_filename("README"), CBM_LANG_COUNT);
PASS();
}
/* ── Language name ─────────────────────────────────────────────── */
TEST(lang_name_go) {
ASSERT_STR_EQ(cbm_language_name(CBM_LANG_GO), "Go");
PASS();
}
TEST(lang_name_python) {
ASSERT_STR_EQ(cbm_language_name(CBM_LANG_PYTHON), "Python");
PASS();
}
TEST(lang_name_cpp) {
ASSERT_STR_EQ(cbm_language_name(CBM_LANG_CPP), "C++");
PASS();
}
TEST(lang_name_csharp) {
ASSERT_STR_EQ(cbm_language_name(CBM_LANG_CSHARP), "C#");
PASS();
}
TEST(lang_name_unknown) {
ASSERT_STR_EQ(cbm_language_name(CBM_LANG_COUNT), "Unknown");
PASS();
}
/* ── .m disambiguation ─────────────────────────────────────────── */
/* These tests need temp files with content markers */
TEST(lang_m_objc) {
/* Write a temp file with Objective-C markers */
char path[256]; snprintf(path, sizeof(path), "%s/test_lang_objc.m", cbm_tmpdir());
FILE *f = fopen(path, "w");
ASSERT_NOT_NULL(f);
fprintf(f, "#import <Foundation/Foundation.h>\n@interface Foo : NSObject\n@end\n");
fclose(f);
ASSERT_EQ(cbm_disambiguate_m(path), CBM_LANG_OBJC);
remove(path);
PASS();
}
TEST(lang_m_magma) {
char path[256]; snprintf(path, sizeof(path), "%s/test_lang_magma.m", cbm_tmpdir());
FILE *f = fopen(path, "w");
ASSERT_NOT_NULL(f);
fprintf(f, "function MyFunc(x)\n return x^2;\nend function;\n");
fclose(f);
ASSERT_EQ(cbm_disambiguate_m(path), CBM_LANG_MAGMA);
remove(path);
PASS();
}
TEST(lang_m_matlab) {
char path[256]; snprintf(path, sizeof(path), "%s/test_lang_matlab.m", cbm_tmpdir());
FILE *f = fopen(path, "w");
ASSERT_NOT_NULL(f);
fprintf(f, "function y = square(x)\n y = x.^2;\nend\n");
fclose(f);
ASSERT_EQ(cbm_disambiguate_m(path), CBM_LANG_MATLAB);
remove(path);
PASS();
}
TEST(lang_m_default_on_read_fail) {
/* Non-existent file defaults to MATLAB */
ASSERT_EQ(cbm_disambiguate_m("/tmp/nonexistent_file_12345.m"), CBM_LANG_MATLAB);
PASS();
}
/* --- Ported from lang_test.go: TestForLanguage --- */
TEST(lang_all_have_names) {
/* Every language enum value from 0 to CBM_LANG_COUNT-1
* should have a non-"Unknown" name. */
for (int i = 0; i < CBM_LANG_COUNT; i++) {
const char *name = cbm_language_name((CBMLanguage)i);
ASSERT_NOT_NULL(name);
ASSERT_TRUE(strcmp(name, "Unknown") != 0);
}
PASS();
}
/* ── Suite ─────────────────────────────────────────────────────── */
SUITE(language) {
/* Extension: Tier 1 programming */
RUN_TEST(lang_ext_go);
RUN_TEST(lang_ext_python);
RUN_TEST(lang_ext_javascript);
RUN_TEST(lang_ext_jsx);
RUN_TEST(lang_ext_typescript);
RUN_TEST(lang_ext_tsx);
RUN_TEST(lang_ext_rust);
RUN_TEST(lang_ext_java);
RUN_TEST(lang_ext_cpp);
RUN_TEST(lang_ext_hpp);
RUN_TEST(lang_ext_cc);
RUN_TEST(lang_ext_cxx);
RUN_TEST(lang_ext_hxx);
RUN_TEST(lang_ext_hh);
RUN_TEST(lang_ext_h);
RUN_TEST(lang_ext_ixx);
RUN_TEST(lang_ext_csharp);
RUN_TEST(lang_ext_php);
RUN_TEST(lang_ext_lua);
RUN_TEST(lang_ext_scala);
RUN_TEST(lang_ext_sc);
RUN_TEST(lang_ext_kotlin);
RUN_TEST(lang_ext_kts);
RUN_TEST(lang_ext_ruby);
RUN_TEST(lang_ext_rake);
RUN_TEST(lang_ext_gemspec);
RUN_TEST(lang_ext_c);
RUN_TEST(lang_ext_bash);
RUN_TEST(lang_ext_bash2);
RUN_TEST(lang_ext_zig);
RUN_TEST(lang_ext_elixir);
RUN_TEST(lang_ext_exs);
RUN_TEST(lang_ext_haskell);
RUN_TEST(lang_ext_ocaml);
RUN_TEST(lang_ext_mli);
RUN_TEST(lang_ext_swift);
RUN_TEST(lang_ext_dart);
RUN_TEST(lang_ext_perl);
RUN_TEST(lang_ext_pm);
RUN_TEST(lang_ext_groovy);
RUN_TEST(lang_ext_gradle);
RUN_TEST(lang_ext_erlang);
RUN_TEST(lang_ext_r);
RUN_TEST(lang_ext_R);
/* Extension: Tier 2 programming */
RUN_TEST(lang_ext_clojure);
RUN_TEST(lang_ext_cljs);
RUN_TEST(lang_ext_cljc);
RUN_TEST(lang_ext_fsharp);
RUN_TEST(lang_ext_fsi);
RUN_TEST(lang_ext_fsx);
RUN_TEST(lang_ext_julia);
RUN_TEST(lang_ext_vim);
RUN_TEST(lang_ext_nix);
RUN_TEST(lang_ext_commonlisp);
RUN_TEST(lang_ext_lsp);
RUN_TEST(lang_ext_cl);
RUN_TEST(lang_ext_elm);
RUN_TEST(lang_ext_fortran);
RUN_TEST(lang_ext_f95);
RUN_TEST(lang_ext_f03);
RUN_TEST(lang_ext_f08);
RUN_TEST(lang_ext_cuda);
RUN_TEST(lang_ext_cuh);
RUN_TEST(lang_ext_cobol);
RUN_TEST(lang_ext_cbl);
RUN_TEST(lang_ext_verilog);
RUN_TEST(lang_ext_sv);
RUN_TEST(lang_ext_emacslisp);
/* Extension: Scientific/math */
RUN_TEST(lang_ext_matlab);
RUN_TEST(lang_ext_mlx);
RUN_TEST(lang_ext_lean);
RUN_TEST(lang_ext_form);
RUN_TEST(lang_ext_prc);
RUN_TEST(lang_ext_magma);
RUN_TEST(lang_ext_magma2);
RUN_TEST(lang_ext_wolfram);
RUN_TEST(lang_ext_wls);
/* Extension: Helper languages */
RUN_TEST(lang_ext_html);
RUN_TEST(lang_ext_htm);
RUN_TEST(lang_ext_css);
RUN_TEST(lang_ext_scss);
RUN_TEST(lang_ext_yaml);
RUN_TEST(lang_ext_yaml2);
RUN_TEST(lang_ext_toml);
RUN_TEST(lang_ext_hcl);
RUN_TEST(lang_ext_hcl2);
RUN_TEST(lang_ext_sql);
RUN_TEST(lang_ext_dockerfile);
RUN_TEST(lang_ext_json);
RUN_TEST(lang_ext_xml);
RUN_TEST(lang_ext_xsl);
RUN_TEST(lang_ext_xsd);
RUN_TEST(lang_ext_svg);
RUN_TEST(lang_ext_markdown);
RUN_TEST(lang_ext_mdx);
RUN_TEST(lang_ext_makefile);
RUN_TEST(lang_ext_cmake);
RUN_TEST(lang_ext_protobuf);
RUN_TEST(lang_ext_graphql);
RUN_TEST(lang_ext_gql);
RUN_TEST(lang_ext_vue);
RUN_TEST(lang_ext_svelte);
RUN_TEST(lang_ext_meson);
RUN_TEST(lang_ext_glsl);
RUN_TEST(lang_ext_vert);
RUN_TEST(lang_ext_frag);
RUN_TEST(lang_ext_ini);
RUN_TEST(lang_ext_cfg);
RUN_TEST(lang_ext_conf);
/* Unknown/edge cases */
RUN_TEST(lang_ext_unknown);
RUN_TEST(lang_ext_null);
/* Filename-based */
RUN_TEST(lang_fn_makefile);
RUN_TEST(lang_fn_gnumakefile);
RUN_TEST(lang_fn_makefile_lower);
RUN_TEST(lang_fn_cmake);
RUN_TEST(lang_fn_dockerfile);
RUN_TEST(lang_fn_meson_build);
RUN_TEST(lang_fn_meson_opts);
RUN_TEST(lang_fn_meson_opts_txt);
RUN_TEST(lang_fn_vimrc);
RUN_TEST(lang_fn_main_go);
RUN_TEST(lang_fn_test_py);
RUN_TEST(lang_fn_unknown);
/* Language names */
RUN_TEST(lang_name_go);
RUN_TEST(lang_name_python);
RUN_TEST(lang_name_cpp);
RUN_TEST(lang_name_csharp);
RUN_TEST(lang_name_unknown);
/* .m disambiguation */
RUN_TEST(lang_m_objc);
RUN_TEST(lang_m_magma);
RUN_TEST(lang_m_matlab);
RUN_TEST(lang_m_default_on_read_fail);
/* Go test ports */
RUN_TEST(lang_all_have_names);
}