lana/tests/devenv_test.v

183 lines
6.2 KiB
V

module tests
import os
import config
import devenv
fn test_detect_shell_from_env() {
// Test shell detection parsing
assert devenv.parse_shell_name('/bin/bash') == devenv.ShellType.bash
assert devenv.parse_shell_name('/usr/bin/zsh') == devenv.ShellType.zsh
assert devenv.parse_shell_name('/usr/local/bin/fish') == devenv.ShellType.fish
assert devenv.parse_shell_name('/bin/sh') == devenv.ShellType.sh
assert devenv.parse_shell_name('bash') == devenv.ShellType.bash
assert devenv.parse_shell_name('zsh') == devenv.ShellType.zsh
assert devenv.parse_shell_name('fish') == devenv.ShellType.fish
assert devenv.parse_shell_name('sh') == devenv.ShellType.sh
assert devenv.parse_shell_name('unknown_shell') == devenv.ShellType.unknown
}
fn test_shell_type_to_string() {
assert devenv.shell_type_to_string(devenv.ShellType.bash) == 'bash'
assert devenv.shell_type_to_string(devenv.ShellType.zsh) == 'zsh'
assert devenv.shell_type_to_string(devenv.ShellType.fish) == 'fish'
assert devenv.shell_type_to_string(devenv.ShellType.sh) == 'sh'
assert devenv.shell_type_to_string(devenv.ShellType.unknown) == 'unknown'
}
fn test_get_devenv_config_uses_lib_search_paths_by_default() {
build_config := config.BuildConfig{
project_name: 'testproject'
bin_dir: 'bin'
lib_search_paths: ['custom/lib', 'other/lib']
devenv_lib_paths: []
}
devenv_config := devenv.get_devenv_config(build_config)
assert devenv_config.project_name == 'testproject'
assert 'custom/lib' in devenv_config.lib_search_paths
assert 'other/lib' in devenv_config.lib_search_paths
assert 'bin/lib' in devenv_config.lib_search_paths
}
fn test_get_devenv_config_uses_devenv_lib_paths_when_set() {
build_config := config.BuildConfig{
project_name: 'testproject'
bin_dir: 'bin'
lib_search_paths: ['default/lib']
devenv_lib_paths: ['devenv/lib', 'devenv/extra']
}
devenv_config := devenv.get_devenv_config(build_config)
assert devenv_config.project_name == 'testproject'
// devenv_lib_paths should take priority
assert 'devenv/lib' in devenv_config.lib_search_paths
assert 'devenv/extra' in devenv_config.lib_search_paths
// default lib path should still be added
assert 'bin/lib' in devenv_config.lib_search_paths
// lib_search_paths should NOT be used when devenv_lib_paths is set
assert 'default/lib' !in devenv_config.lib_search_paths
}
fn test_generate_bash_script_contains_deactivate() {
devenv_config := devenv.DevEnvConfig{
lib_search_paths: ['/path/to/lib']
project_name: 'myproject'
bin_dir: 'bin'
}
script := devenv.generate_activation_script(devenv.ShellType.bash, devenv_config) or {
assert false, 'Failed to generate bash script: ${err}'
return
}
assert script.contains('deactivate')
assert script.contains('LD_LIBRARY_PATH')
assert script.contains('myproject')
assert script.contains('/path/to/lib')
assert script.contains("Lana's temp environment")
}
fn test_generate_fish_script_contains_deactivate() {
devenv_config := devenv.DevEnvConfig{
lib_search_paths: ['/path/to/lib']
project_name: 'myproject'
bin_dir: 'bin'
}
script := devenv.generate_activation_script(devenv.ShellType.fish, devenv_config) or {
assert false, 'Failed to generate fish script: ${err}'
return
}
assert script.contains('function deactivate')
assert script.contains('LD_LIBRARY_PATH')
assert script.contains('myproject')
assert script.contains('fish_prompt')
}
fn test_generate_zsh_script_contains_deactivate() {
devenv_config := devenv.DevEnvConfig{
lib_search_paths: ['/path/to/lib']
project_name: 'myproject'
bin_dir: 'bin'
}
script := devenv.generate_activation_script(devenv.ShellType.zsh, devenv_config) or {
assert false, 'Failed to generate zsh script: ${err}'
return
}
assert script.contains('deactivate')
assert script.contains('LD_LIBRARY_PATH')
assert script.contains('PS1')
}
fn test_generate_sh_script_contains_deactivate() {
devenv_config := devenv.DevEnvConfig{
lib_search_paths: ['/path/to/lib']
project_name: 'myproject'
bin_dir: 'bin'
}
script := devenv.generate_activation_script(devenv.ShellType.sh, devenv_config) or {
assert false, 'Failed to generate sh script: ${err}'
return
}
assert script.contains('deactivate')
assert script.contains('LD_LIBRARY_PATH')
}
fn test_unknown_shell_returns_error() {
devenv_config := devenv.DevEnvConfig{
lib_search_paths: ['/path/to/lib']
project_name: 'myproject'
bin_dir: 'bin'
}
script := devenv.generate_activation_script(devenv.ShellType.unknown, devenv_config) or {
// Expected to fail
assert err.msg().contains('unknown shell')
return
}
assert false, 'Should have returned error for unknown shell'
}
fn test_config_parsing_devenv_lib_paths() {
tmp := new_temp_dir('lana_devenv_config')
defer {
os.rmdir_all(tmp) or {}
}
config_path := os.join_path(tmp, 'config.ini')
config_content := '[global]\nproject_name = testproj\nlib_search_paths = default/lib\ndevenv_lib_paths = devenv/lib1, devenv/lib2\n'
os.write_file(config_path, config_content) or { panic(err) }
cfg := config.parse_config_file(config_path) or { panic(err) }
assert cfg.project_name == 'testproj'
assert cfg.lib_search_paths.contains('default/lib')
assert cfg.devenv_lib_paths.contains('devenv/lib1')
assert cfg.devenv_lib_paths.contains('devenv/lib2')
}
fn test_multiple_lib_paths_joined_with_colon() {
devenv_config := devenv.DevEnvConfig{
lib_search_paths: ['/path/one', '/path/two', '/path/three']
project_name: 'myproject'
bin_dir: 'bin'
}
script := devenv.generate_activation_script(devenv.ShellType.bash, devenv_config) or {
assert false, 'Failed to generate script: ${err}'
return
}
// Paths should be joined with colons in the script
assert script.contains('/path/one:/path/two:/path/three')
}