235 lines
6.9 KiB
JavaScript
235 lines
6.9 KiB
JavaScript
// This is free software for the public good of a permacomputer hosted at
|
|
// permacomputer.com, an always-on computer by the people, for the people.
|
|
// One which is durable, easy to repair, & distributed like tap water
|
|
// for machine learning intelligence.
|
|
//
|
|
// The permacomputer is community-owned infrastructure optimized around
|
|
// four values:
|
|
//
|
|
// TRUTH First principles, math & science, open source code freely distributed
|
|
// FREEDOM Voluntary partnerships, freedom from tyranny & corporate control
|
|
// HARMONY Minimal waste, self-renewing systems with diverse thriving connections
|
|
// LOVE Be yourself without hurting others, cooperation through natural law
|
|
//
|
|
// This software contributes to that vision by enabling code execution across 42+ programming languages through a unified interface, accessible to all.
|
|
// Code is seeds to sprout on any abandoned technology.
|
|
|
|
/**
|
|
* Tests for language detection from filenames
|
|
*/
|
|
|
|
import { detectLanguage } from '../src/un_async.js';
|
|
|
|
describe('detectLanguage', () => {
|
|
describe('common languages', () => {
|
|
test('detects Python', () => {
|
|
expect(detectLanguage('script.py')).toBe('python');
|
|
expect(detectLanguage('main.py')).toBe('python');
|
|
});
|
|
|
|
test('detects JavaScript', () => {
|
|
expect(detectLanguage('app.js')).toBe('javascript');
|
|
expect(detectLanguage('index.js')).toBe('javascript');
|
|
});
|
|
|
|
test('detects TypeScript', () => {
|
|
expect(detectLanguage('app.ts')).toBe('typescript');
|
|
expect(detectLanguage('index.ts')).toBe('typescript');
|
|
});
|
|
|
|
test('detects Go', () => {
|
|
expect(detectLanguage('main.go')).toBe('go');
|
|
});
|
|
|
|
test('detects Rust', () => {
|
|
expect(detectLanguage('main.rs')).toBe('rust');
|
|
expect(detectLanguage('lib.rs')).toBe('rust');
|
|
});
|
|
|
|
test('detects Ruby', () => {
|
|
expect(detectLanguage('app.rb')).toBe('ruby');
|
|
});
|
|
|
|
test('detects Java', () => {
|
|
expect(detectLanguage('Main.java')).toBe('java');
|
|
});
|
|
|
|
test('detects C', () => {
|
|
expect(detectLanguage('main.c')).toBe('c');
|
|
});
|
|
|
|
test('detects C++', () => {
|
|
expect(detectLanguage('main.cpp')).toBe('cpp');
|
|
expect(detectLanguage('main.cc')).toBe('cpp');
|
|
expect(detectLanguage('main.cxx')).toBe('cpp');
|
|
});
|
|
});
|
|
|
|
describe('scripting languages', () => {
|
|
test('detects Bash', () => {
|
|
expect(detectLanguage('script.sh')).toBe('bash');
|
|
});
|
|
|
|
test('detects PHP', () => {
|
|
expect(detectLanguage('index.php')).toBe('php');
|
|
});
|
|
|
|
test('detects Perl', () => {
|
|
expect(detectLanguage('script.pl')).toBe('perl');
|
|
});
|
|
|
|
test('detects Lua', () => {
|
|
expect(detectLanguage('script.lua')).toBe('lua');
|
|
});
|
|
|
|
test('detects R', () => {
|
|
expect(detectLanguage('analysis.r')).toBe('r');
|
|
});
|
|
});
|
|
|
|
describe('functional languages', () => {
|
|
test('detects Haskell', () => {
|
|
expect(detectLanguage('Main.hs')).toBe('haskell');
|
|
});
|
|
|
|
test('detects OCaml', () => {
|
|
expect(detectLanguage('main.ml')).toBe('ocaml');
|
|
});
|
|
|
|
test('detects Clojure', () => {
|
|
expect(detectLanguage('core.clj')).toBe('clojure');
|
|
});
|
|
|
|
test('detects Scheme', () => {
|
|
expect(detectLanguage('script.scm')).toBe('scheme');
|
|
expect(detectLanguage('script.ss')).toBe('scheme');
|
|
});
|
|
|
|
test('detects Elixir', () => {
|
|
expect(detectLanguage('app.ex')).toBe('elixir');
|
|
expect(detectLanguage('script.exs')).toBe('elixir');
|
|
});
|
|
|
|
test('detects Erlang', () => {
|
|
expect(detectLanguage('module.erl')).toBe('erlang');
|
|
});
|
|
});
|
|
|
|
describe('modern languages', () => {
|
|
test('detects Kotlin', () => {
|
|
expect(detectLanguage('Main.kt')).toBe('kotlin');
|
|
});
|
|
|
|
test('detects Swift via Objective-C extension', () => {
|
|
expect(detectLanguage('ViewController.m')).toBe('objc');
|
|
});
|
|
|
|
test('detects C#', () => {
|
|
expect(detectLanguage('Program.cs')).toBe('csharp');
|
|
});
|
|
|
|
test('detects F#', () => {
|
|
expect(detectLanguage('Program.fs')).toBe('fsharp');
|
|
});
|
|
|
|
test('detects Dart', () => {
|
|
expect(detectLanguage('main.dart')).toBe('dart');
|
|
});
|
|
|
|
test('detects Julia', () => {
|
|
expect(detectLanguage('script.jl')).toBe('julia');
|
|
});
|
|
|
|
test('detects Nim', () => {
|
|
expect(detectLanguage('main.nim')).toBe('nim');
|
|
});
|
|
|
|
test('detects Zig', () => {
|
|
expect(detectLanguage('main.zig')).toBe('zig');
|
|
});
|
|
|
|
test('detects V', () => {
|
|
expect(detectLanguage('main.v')).toBe('v');
|
|
});
|
|
|
|
test('detects Crystal', () => {
|
|
expect(detectLanguage('app.cr')).toBe('crystal');
|
|
});
|
|
});
|
|
|
|
describe('other languages', () => {
|
|
test('detects D', () => {
|
|
expect(detectLanguage('main.d')).toBe('d');
|
|
});
|
|
|
|
test('detects Groovy', () => {
|
|
expect(detectLanguage('script.groovy')).toBe('groovy');
|
|
});
|
|
|
|
test('detects Fortran', () => {
|
|
expect(detectLanguage('program.f90')).toBe('fortran');
|
|
expect(detectLanguage('program.f95')).toBe('fortran');
|
|
});
|
|
|
|
test('detects Common Lisp', () => {
|
|
expect(detectLanguage('app.lisp')).toBe('commonlisp');
|
|
expect(detectLanguage('app.lsp')).toBe('commonlisp');
|
|
});
|
|
|
|
test('detects COBOL', () => {
|
|
expect(detectLanguage('program.cob')).toBe('cobol');
|
|
});
|
|
|
|
test('detects Tcl', () => {
|
|
expect(detectLanguage('script.tcl')).toBe('tcl');
|
|
});
|
|
|
|
test('detects Raku', () => {
|
|
expect(detectLanguage('script.raku')).toBe('raku');
|
|
});
|
|
|
|
test('detects Prolog', () => {
|
|
expect(detectLanguage('rules.pro')).toBe('prolog');
|
|
expect(detectLanguage('rules.p')).toBe('prolog');
|
|
});
|
|
|
|
test('detects Forth', () => {
|
|
expect(detectLanguage('program.4th')).toBe('forth');
|
|
expect(detectLanguage('program.forth')).toBe('forth');
|
|
expect(detectLanguage('program.fth')).toBe('forth');
|
|
});
|
|
});
|
|
|
|
describe('edge cases', () => {
|
|
test('returns null for files without extension', () => {
|
|
expect(detectLanguage('Makefile')).toBeNull();
|
|
expect(detectLanguage('README')).toBeNull();
|
|
expect(detectLanguage('Dockerfile')).toBeNull();
|
|
});
|
|
|
|
test('returns null for unknown extensions', () => {
|
|
expect(detectLanguage('data.xyz')).toBeNull();
|
|
expect(detectLanguage('config.unknown')).toBeNull();
|
|
});
|
|
|
|
test('returns null for null/undefined input', () => {
|
|
expect(detectLanguage(null)).toBeNull();
|
|
expect(detectLanguage(undefined)).toBeNull();
|
|
});
|
|
|
|
test('returns null for empty string', () => {
|
|
expect(detectLanguage('')).toBeNull();
|
|
});
|
|
|
|
test('handles multiple dots in filename', () => {
|
|
expect(detectLanguage('app.test.py')).toBe('python');
|
|
expect(detectLanguage('my.script.js')).toBe('javascript');
|
|
});
|
|
|
|
test('is case-insensitive for extensions', () => {
|
|
expect(detectLanguage('script.PY')).toBe('python');
|
|
expect(detectLanguage('app.JS')).toBe('javascript');
|
|
expect(detectLanguage('main.Go')).toBe('go');
|
|
});
|
|
});
|
|
});
|