testing: allow tests to import the same module with no custom options

pull/3079/head
Delyan Angelov 2019-12-13 18:28:39 +02:00 committed by Alexander Medvednikov
parent ec36755407
commit fc64238a39
4 changed files with 66 additions and 21 deletions

View File

@ -77,6 +77,7 @@ pub mut:
file_parser_idx map[string]int // map absolute file path to v.parsers index file_parser_idx map[string]int // map absolute file path to v.parsers index
gen_parser_idx map[string]int gen_parser_idx map[string]int
cached_mods []string cached_mods []string
module_lookup_paths []string
} }
struct Preferences { struct Preferences {
@ -641,23 +642,28 @@ pub fn (v &V) v_files_from_dir(dir string) []string {
if file.ends_with('_c.v') && v.os == .js { if file.ends_with('_c.v') && v.os == .js {
continue continue
} }
res << '$dir${os.path_separator}$file' res << filepath.join(dir,file)
} }
return res return res
} }
// Parses imports, adds necessary libs, and then user files // Parses imports, adds necessary libs, and then user files
pub fn (v mut V) add_v_files_to_compile() { pub fn (v mut V) add_v_files_to_compile() {
v.set_module_lookup_paths()
mut builtin_files := v.get_builtin_files() mut builtin_files := v.get_builtin_files()
if v.pref.is_bare { if v.pref.is_bare {
//builtin_files = [] //builtin_files = []
} }
// Builtin cache exists? Use it. // Builtin cache exists? Use it.
builtin_vh := '${v.pref.vlib_path}${os.path_separator}builtin.vh' if v.pref.is_cache {
if v.pref.is_cache && os.exists(builtin_vh) { builtin_vh := filepath.join(v_modules_path,'vlib','builtin.vh')
v.cached_mods << 'builtin' if os.exists(builtin_vh) {
builtin_files = [builtin_vh] v.cached_mods << 'builtin'
builtin_files = [builtin_vh]
}
} }
if v.pref.is_verbose { v.log('v.add_v_files_to_compile > builtin_files: $builtin_files') }
// Parse builtin imports // Parse builtin imports
for file in builtin_files { for file in builtin_files {
// add builtins first // add builtins first
@ -768,11 +774,13 @@ pub fn (v &V) get_user_files() []string {
} }
} }
if dir.ends_with('.v') || dir.ends_with('.vsh') { if dir.ends_with('.v') || dir.ends_with('.vsh') {
single_v_file := dir
// Just compile one file and get parent dir // Just compile one file and get parent dir
user_files << dir user_files << single_v_file
dir = dir.all_before(os.path_separator) if v.pref.is_verbose { v.log('> just compile one file: "${single_v_file}"') }
} }
else { else {
if v.pref.is_verbose { v.log('> add all .v files from directory "${dir}" ...') }
// Add .v files from the directory being compiled // Add .v files from the directory being compiled
files := v.v_files_from_dir(dir) files := v.v_files_from_dir(dir)
for file in files { for file in files {
@ -784,8 +792,7 @@ pub fn (v &V) get_user_files() []string {
exit(1) exit(1)
} }
if v.pref.is_verbose { if v.pref.is_verbose {
v.log('user_files:') v.log('user_files: $user_files')
println(user_files)
} }
return user_files return user_files
} }

View File

@ -150,27 +150,45 @@ pub fn(graph &DepGraph) imports() []string {
// 'strings' => 'VROOT/vlib/strings' // 'strings' => 'VROOT/vlib/strings'
// 'installed_mod' => '~/.vmodules/installed_mod' // 'installed_mod' => '~/.vmodules/installed_mod'
// 'local_mod' => '/path/to/current/dir/local_mod' // 'local_mod' => '/path/to/current/dir/local_mod'
fn (v &V) find_module_path(mod string) ?string {
fn (v mut V) set_module_lookup_paths(){
mlookup_path := if v.pref.vpath.len>0{ v.pref.vpath }else{ v_modules_path }
// Module search order: // Module search order:
// 0) V test files are very commonly located right inside the folder of the
// module, which they test. Adding the parent folder of the module folder
// with the _test.v files, *guarantees* that the tested module can be found
// without needing to set custom options/flags.
// 1) search in the *same* directory, as the compiled final v program source // 1) search in the *same* directory, as the compiled final v program source
// (i.e. the . in `v .` or file.v in `v file.v`) // (i.e. the . in `v .` or file.v in `v file.v`)
// 2) search in the modules/ in the same directory. // 2) search in the modules/ in the same directory.
// 3) search in vlib/ // 3) search in vlib/
// 4.1) search in -vpath (if given) // 4.1) search in -vpath (if given)
// 4.2) search in ~/.vmodules/ (i.e. modules installed with vpm) (no -vpath) // 4.2) search in ~/.vmodules/ (i.e. modules installed with vpm) (no -vpath)
modules_lookup_path := if v.pref.vpath.len > 0 { v.pref.vpath } else { v_modules_path } v.module_lookup_paths = []
mod_path := v.module_path(mod) if v.pref.is_test {
mut tried_paths := []string v.module_lookup_paths << os.basedir(v.compiled_dir) // pdir of _test.v
tried_paths << filepath.join(v.compiled_dir, mod_path)
tried_paths << filepath.join(v.compiled_dir, 'modules', mod_path)
tried_paths << filepath.join(v.pref.vlib_path, mod_path)
tried_paths << filepath.join(modules_lookup_path, mod_path)
if v.pref.user_mod_path.len > 0 {
tried_paths << filepath.join(v.pref.user_mod_path, mod_path)
} }
for try_path in tried_paths { v.module_lookup_paths << v.compiled_dir
v.module_lookup_paths << filepath.join(v.compiled_dir, 'modules')
v.module_lookup_paths << v.pref.vlib_path
v.module_lookup_paths << mlookup_path
if v.pref.user_mod_path.len > 0 {
v.module_lookup_paths << v.pref.user_mod_path
}
if v.pref.is_verbose {
v.log('v.module_lookup_paths: $v.module_lookup_paths')
}
}
fn (v &V) find_module_path(mod string) ?string {
mod_path := v.module_path(mod)
for lookup_path in v.module_lookup_paths {
try_path := filepath.join(lookup_path, mod_path)
if v.pref.is_verbose { println(' >> trying to find $mod in $try_path ...') } if v.pref.is_verbose { println(' >> trying to find $mod in $try_path ...') }
if os.is_dir(try_path) { if os.is_dir(try_path) {
if v.pref.is_verbose { println(' << found $try_path .') }
return try_path return try_path
} }
} }

View File

@ -0,0 +1,11 @@
import simplemodule
// this tests whether the tests can import the same module without any special
// custom paths setup on the CLI
fn test_iadd(){
assert simplemodule.iadd(10, 20) == 30
}
fn test_imul(){
assert simplemodule.imul(5,8) == 40
}

View File

@ -0,0 +1,9 @@
module simplemodule
pub fn iadd(x int, y int) int {
return x + y
}
pub fn imul(x int, y int) int {
return x * y
}