- Backend: ProjectFileService with file CRUD, search, git status, file watcher - IPC: 12 editor channels with security validation and path containment - Store: editorSlice with multi-tab management, draft persistence, conflict detection - UI: CodeMirror 6 editor, file tree with DnD, search-in-files, context menus - Move: fs.rename with EXDEV fallback, full path remapping across all caches - Tests: comprehensive coverage for services, IPC handlers, store, and utilities
87 lines
2.5 KiB
TypeScript
87 lines
2.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
getAsyncLanguageDesc,
|
|
getSyncLanguageExtension,
|
|
} from '@renderer/utils/codemirrorLanguages';
|
|
|
|
describe('getSyncLanguageExtension', () => {
|
|
it.each([
|
|
['file.ts', true],
|
|
['file.tsx', true],
|
|
['file.js', true],
|
|
['file.jsx', true],
|
|
['file.mjs', true],
|
|
['file.cjs', true],
|
|
['file.py', true],
|
|
['file.json', true],
|
|
['file.jsonl', true],
|
|
['file.css', true],
|
|
['file.scss', true],
|
|
['file.sass', true],
|
|
['file.less', true],
|
|
['file.html', true],
|
|
['file.htm', true],
|
|
['file.xml', true],
|
|
['file.svg', true],
|
|
['file.md', true],
|
|
['file.mdx', true],
|
|
['file.markdown', true],
|
|
['file.yaml', true],
|
|
['file.yml', true],
|
|
['file.rs', true],
|
|
['file.go', true],
|
|
['file.java', true],
|
|
['file.c', true],
|
|
['file.h', true],
|
|
['file.cpp', true],
|
|
['file.cxx', true],
|
|
['file.cc', true],
|
|
['file.hpp', true],
|
|
['file.php', true],
|
|
['file.sql', true],
|
|
])('returns extension for %s', (fileName, expected) => {
|
|
const ext = getSyncLanguageExtension(fileName);
|
|
expect(ext !== null).toBe(expected);
|
|
});
|
|
|
|
it('returns null for unknown extensions', () => {
|
|
expect(getSyncLanguageExtension('file.unknown')).toBeNull();
|
|
expect(getSyncLanguageExtension('file.dat')).toBeNull();
|
|
expect(getSyncLanguageExtension('file.bin')).toBeNull();
|
|
});
|
|
|
|
it('handles files without extension', () => {
|
|
expect(getSyncLanguageExtension('Makefile')).toBeNull();
|
|
expect(getSyncLanguageExtension('Dockerfile')).toBeNull();
|
|
});
|
|
|
|
it('is case-insensitive for extensions', () => {
|
|
expect(getSyncLanguageExtension('file.TS')).not.toBeNull();
|
|
expect(getSyncLanguageExtension('file.JSON')).not.toBeNull();
|
|
expect(getSyncLanguageExtension('file.Py')).not.toBeNull();
|
|
});
|
|
|
|
it('handles nested paths', () => {
|
|
expect(getSyncLanguageExtension('src/main/index.ts')).not.toBeNull();
|
|
expect(getSyncLanguageExtension('deeply/nested/path/file.py')).not.toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('getAsyncLanguageDesc', () => {
|
|
it('returns a LanguageDescription for known file types', () => {
|
|
const desc = getAsyncLanguageDesc('file.rb');
|
|
expect(desc).not.toBeNull();
|
|
expect(desc!.name).toBeDefined();
|
|
});
|
|
|
|
it('returns null for completely unknown types', () => {
|
|
const desc = getAsyncLanguageDesc('file.xyzabc123');
|
|
expect(desc).toBeNull();
|
|
});
|
|
|
|
it('works with full path', () => {
|
|
const desc = getAsyncLanguageDesc('src/main.rb');
|
|
expect(desc).not.toBeNull();
|
|
});
|
|
});
|