Files
herolib/lib/ai/filemap/filemap_test.v
2025-11-25 06:10:17 +01:00

364 lines
8.3 KiB
V

module filemap
import os
import incubaid.herolib.core.pathlib
fn test_parse_header_file() {
kind, name := parse_header('===FILE:main.v===')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_file2() {
kind, name := parse_header('===FILE:main.v ===')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_file3() {
kind, name := parse_header('=== FILE:main.v ===')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_file4() {
kind, name := parse_header('== FILE: main.v =====')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_filechange() {
kind, name := parse_header('===FILECHANGE:utils/helper.v===')!
assert kind == BlockKind.filechange
assert name == 'utils/helper.v'
}
fn test_parse_header_end() {
kind, _ := parse_header('===END===')!
assert kind == BlockKind.end
}
fn test_parse_header_with_spaces() {
kind, name := parse_header(' === FILE : config.yaml === ')!
assert kind == BlockKind.file
assert name == 'config.yaml'
}
fn test_parse_header_lowercase() {
kind, name := parse_header('===file:test.txt===')!
assert kind == BlockKind.file
assert name == 'test.txt'
}
fn test_parse_header_variable_equals() {
kind, name := parse_header('=FILE:path/file.v=')!
assert kind == BlockKind.file
assert name == 'path/file.v'
}
fn test_parse_header_end_lowercase() {
kind, _ := parse_header('===end===')!
assert kind == BlockKind.end
}
fn test_filemap_from_simple_content() {
content := '===FILE:main.v===
fn main() {
println("Hello, World!")
}
===END==='
fm := filemap_get_from_content(content)!
assert fm.content.len == 1
assert 'main.v' in fm.content
assert fm.content['main.v'].contains('println')
}
fn test_filemap_from_multiple_files() {
content := '===FILE:main.v===
fn main() {
println("Hello")
}
===FILE:utils/helper.v===
pub fn help() {
println("Helping")
}
===END==='
fm := filemap_get_from_content(content)!
assert fm.content.len == 2
assert 'main.v' in fm.content
assert 'utils/helper.v' in fm.content
}
fn test_filemap_with_filechange() {
content := '===FILE:config.v===
pub const version = "1.0"
===FILECHANGE:main.v===
fn main() {
println(version)
}
===END==='
fm := filemap_get_from_content(content)!
assert fm.content.len == 1
assert fm.content_change.len == 1
assert 'config.v' in fm.content
assert 'main.v' in fm.content_change
}
fn test_filemap_multiline_content() {
content := '===FILE:multiline.txt===
Line 1
Line 2
Line 3
===FILE:another.txt===
Another content
===END==='
fm := filemap_get_from_content(content)!
assert fm.content['multiline.txt'].contains('Line 1')
assert fm.content['multiline.txt'].contains('Line 2')
assert fm.content['multiline.txt'].contains('Line 3')
assert fm.content['another.txt'] == 'Another content'
}
fn test_filemap_get_method() {
content := '===FILE:test.v===
test content
===END==='
fm := filemap_get_from_content(content)!
result := fm.get('test.v')!
assert result == 'test content'
}
fn test_filemap_get_not_found() {
content := '===FILE:test.v===
content
===END==='
fm := filemap_get_from_content(content)!
result := fm.get('nonexistent.v') or {
assert err.msg().contains('File not found')
return
}
panic('Should have returned error')
}
fn test_filemap_set_method() {
mut fm := FileMap{}
fm.set('new/file.v', 'new content')
assert fm.content['new/file.v'] == 'new content'
}
fn test_filemap_delete_method() {
mut fm := FileMap{}
fm.set('file1.v', 'content1')
fm.set('file2.v', 'content2')
assert fm.content.len == 2
fm.delete('file1.v')
assert fm.content.len == 1
assert 'file2.v' in fm.content
assert 'file1.v' !in fm.content
}
fn test_filemap_find_method() {
mut fm := FileMap{}
fm.set('src/main.v', 'main')
fm.set('src/utils/helper.v', 'helper')
fm.set('test/test.v', 'test')
results := fm.find('src/')
assert results.len == 2
assert 'src/main.v' in results
assert 'src/utils/helper.v' in results
}
fn test_filemap_find_empty() {
mut fm := FileMap{}
fm.set('main.v', 'main')
results := fm.find('src/')
assert results.len == 0
}
fn test_filemap_from_path() {
// Create temporary test directory
tmpdir := os.temp_dir() + '/test_filemap_${os.getpid()}'
os.mkdir_all(tmpdir) or { panic(err) }
defer {
os.rmdir_all(tmpdir) or {}
}
// Create test files
os.mkdir_all('${tmpdir}/src') or { panic(err) }
os.mkdir_all('${tmpdir}/test') or { panic(err) }
os.write_file('${tmpdir}/main.v', 'fn main() {}')!
os.write_file('${tmpdir}/src/utils.v', 'pub fn help() {}')!
os.write_file('${tmpdir}/test/test.v', 'fn test() {}')!
fm := filemap_get_from_path(tmpdir, true)!
assert fm.content.len >= 3
assert 'main.v' in fm.content
assert fm.content['main.v'] == 'fn main() {}'
}
fn test_filemap_from_path_no_content() {
tmpdir := os.temp_dir() + '/test_filemap_nocontent_${os.getpid()}'
os.mkdir_all(tmpdir) or { panic(err) }
defer {
os.rmdir_all(tmpdir) or {}
}
os.mkdir_all('${tmpdir}/src') or { panic(err) }
os.write_file('${tmpdir}/main.v', 'fn main() {}')!
fm := filemap_get_from_path(tmpdir, false)!
assert fm.content.len >= 1
assert 'main.v' in fm.content
assert fm.content['main.v'] == ''
}
fn test_filemap_from_path_not_exists() {
result := filemap_get_from_path('/nonexistent/path/12345', true) or {
assert err.msg().contains('does not exist')
return
}
panic('Should have returned error for nonexistent path')
}
fn test_filemap_content_string() {
mut fm := FileMap{}
fm.set('file1.v', 'content1')
fm.set('file2.v', 'content2')
output := fm.content()
assert output.contains('===FILE:file1.v===')
assert output.contains('content1')
assert output.contains('===FILE:file2.v===')
assert output.contains('content2')
assert output.contains('===END===')
}
fn test_filemap_export() {
tmpdir := os.temp_dir() + '/test_filemap_export_${os.getpid()}'
os.mkdir_all(tmpdir) or { panic(err) }
defer {
os.rmdir_all(tmpdir) or {}
}
mut fm := FileMap{}
fm.set('main.v', 'fn main() {}')
fm.set('src/helper.v', 'pub fn help() {}')
fm.export(tmpdir)!
assert os.exists('${tmpdir}/main.v')
assert os.exists('${tmpdir}/src/helper.v')
assert os.read_file('${tmpdir}/main.v')! == 'fn main() {}'
}
fn test_filemap_write() {
tmpdir := os.temp_dir() + '/test_filemap_write_${os.getpid()}'
os.mkdir_all(tmpdir) or { panic(err) }
defer {
os.rmdir_all(tmpdir) or {}
}
mut fm := FileMap{}
fm.set('config.v', 'const version = "1.0"')
fm.set('models/user.v', 'struct User {}')
fm.write(tmpdir)!
assert os.exists('${tmpdir}/config.v')
assert os.exists('${tmpdir}/models/user.v')
}
fn test_filemap_factory_from_path() {
tmpdir := os.temp_dir() + '/test_factory_path_${os.getpid()}'
os.mkdir_all(tmpdir) or { panic(err) }
defer {
os.rmdir_all(tmpdir) or {}
}
os.write_file('${tmpdir}/test.v', 'fn test() {}')!
fm := filemap(path: tmpdir, content_read: true)!
assert 'test.v' in fm.content
}
fn test_filemap_factory_from_content() {
content := '===FILE:sample.v===
fn main() {}
===END==='
fm := filemap(content: content)!
assert 'sample.v' in fm.content
}
fn test_filemap_factory_requires_input() {
result := filemap(path: '', content: '') or {
assert err.msg().contains('Either path or content')
return
}
panic('Should have returned error')
}
fn test_filemap_parse_errors_content_before_file() {
content := 'Some text before file
===FILE:main.v===
content
===END==='
fm := filemap_get_from_content(content)!
assert fm.errors.len > 0
assert fm.errors[0].category == 'parse'
}
fn test_filemap_parse_errors_end_without_file() {
content := '===END==='
fm := filemap_get_from_content(content)!
assert fm.errors.len > 0
}
fn test_filemap_empty_content() {
content := ''
fm := filemap_get_from_content(content)!
assert fm.content.len == 0
}
fn test_filemap_complex_filenames() {
content := '===FILE:src/v_models/user_model.v===
pub struct User {}
===FILE:test/unit/user_test.v===
fn test_user() {}
===FILE:.config/settings.json===
{ "key": "value" }
===END==='
fm := filemap_get_from_content(content)!
assert 'src/v_models/user_model.v' in fm.content
assert 'test/unit/user_test.v' in fm.content
assert '.config/settings.json' in fm.content
}
fn test_filemap_whitespace_preservation() {
content := '===FILE:formatted.txt===
Line with spaces
Tab indented
Spaces indented
===END==='
fm := filemap_get_from_content(content)!
file_content := fm.content['formatted.txt']
assert file_content.contains(' spaces')
assert file_content.contains('\t')
}