the base
This commit is contained in:
643
lib/code/codeparser/vparser_test.v
Normal file
643
lib/code/codeparser/vparser_test.v
Normal file
@@ -0,0 +1,643 @@
|
||||
module codeparser
|
||||
|
||||
import freeflowuniverse.herolib.core.codemodel { CodeItem, Function, Struct }
|
||||
import os
|
||||
import freeflowuniverse.herolib.ui.console
|
||||
|
||||
const testpath = os.dir(@FILE) + '/testdata'
|
||||
|
||||
// is a map of test files used in these tests and their complete codeitems
|
||||
// used to make assertions and verify test outputs
|
||||
const testcode = {
|
||||
'anotherfile.v': [
|
||||
CodeItem(Function{
|
||||
name: 'anotherfile_func0'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the first function of file'
|
||||
params: []
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'anotherfile_func1'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the second function of file'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: 'a name that the function will do nothing with'
|
||||
name: 'name'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Struct{
|
||||
name: 'AnotherfileStruct0'
|
||||
description: 'AnotherfileStruct0 defines the configuration params of anotherfile_func2'
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
is_pub: true
|
||||
attrs: [
|
||||
codemodel.Attribute{
|
||||
name: 'params'
|
||||
has_arg: false
|
||||
arg: ''
|
||||
},
|
||||
]
|
||||
fields: [
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param1'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param2'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'int'
|
||||
}
|
||||
},
|
||||
]
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'anotherfile_func2'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the third function of the file'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: 'configuration for anotherfile_func2'
|
||||
name: 'config'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'AnotherfileStruct0'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Struct{
|
||||
name: 'AnotherfileStruct1'
|
||||
description: ''
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
is_pub: true
|
||||
fields: [
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'anotherfile_func3'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the fourth function of the file is does something with param1 and param2 and creates AnotherfileStruct1'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: 'param1'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: 'param2'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'AnotherfileStruct1'
|
||||
}
|
||||
description: 'a FileStruc1 struct filled in with params 1 and 2'
|
||||
name: 'the created filestruct1'
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
]
|
||||
'subfile.v': [
|
||||
CodeItem(Function{
|
||||
name: 'subfile_func0'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the first function of file'
|
||||
params: []
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'subfile_func1'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the second function of file'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: 'a name that the function will do nothing with'
|
||||
name: 'name'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Struct{
|
||||
name: 'SubfileStruct0'
|
||||
description: 'SubfileStruct0 defines the configuration params of subfile_func2'
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
is_pub: true
|
||||
attrs: [
|
||||
codemodel.Attribute{
|
||||
name: 'params'
|
||||
has_arg: false
|
||||
arg: ''
|
||||
},
|
||||
]
|
||||
fields: [
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param1'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param2'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'int'
|
||||
}
|
||||
},
|
||||
]
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'subfile_func2'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the third function of the file'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: 'configuration for subfile_func2'
|
||||
name: 'config'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'SubfileStruct0'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Struct{
|
||||
name: 'SubfileStruct1'
|
||||
description: ''
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
is_pub: true
|
||||
fields: [
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'subfile_func3'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata.flatdir'
|
||||
description: 'is the fourth function of the file is does something with param1 and param2 and creates SubfileStruct1'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: 'param1'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: 'param2'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'SubfileStruct1'
|
||||
}
|
||||
description: 'a FileStruc1 struct filled in with params 1 and 2'
|
||||
name: 'the created filestruct1'
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
]
|
||||
'file.v': [
|
||||
CodeItem(Function{
|
||||
name: 'file_func0'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata'
|
||||
description: 'is the first function of file'
|
||||
params: []
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'file_func1'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata'
|
||||
description: 'is the second function of file'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: 'a name that the function will do nothing with'
|
||||
name: 'name'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Struct{
|
||||
name: 'FileStruct0'
|
||||
description: 'FileStruct0 defines the configuration params of file_func2'
|
||||
mod: 'core.codeparser.testdata'
|
||||
is_pub: true
|
||||
attrs: [
|
||||
codemodel.Attribute{
|
||||
name: 'params'
|
||||
has_arg: false
|
||||
arg: ''
|
||||
},
|
||||
]
|
||||
fields: [
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param1'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
codemodel.StructField{
|
||||
comments: []
|
||||
attrs: []
|
||||
name: 'param2'
|
||||
description: ''
|
||||
anon_struct: Struct{
|
||||
name: ''
|
||||
description: ''
|
||||
fields: []
|
||||
}
|
||||
typ: codemodel.Type{
|
||||
symbol: 'int'
|
||||
}
|
||||
},
|
||||
]
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'file_func2'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata'
|
||||
description: 'is the third function of the file'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: 'configuration for file_func2'
|
||||
name: 'config'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'FileStruct0'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
description: ''
|
||||
name: ''
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
CodeItem(Struct{
|
||||
name: 'FileStruct1'
|
||||
description: ''
|
||||
fields: []
|
||||
mod: 'core.codeparser.testdata'
|
||||
is_pub: true
|
||||
}),
|
||||
CodeItem(Function{
|
||||
name: 'file_func3'
|
||||
receiver: codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: ''
|
||||
typ: codemodel.Type{
|
||||
symbol: 'void'
|
||||
}
|
||||
}
|
||||
mod: 'core.codeparser.testdata'
|
||||
description: 'is the fourth function of the file is does something with param1 and param2 and creates FileStruct1'
|
||||
params: [
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: 'param1'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'string'
|
||||
}
|
||||
},
|
||||
codemodel.Param{
|
||||
required: false
|
||||
description: ''
|
||||
name: 'param2'
|
||||
typ: codemodel.Type{
|
||||
symbol: 'int'
|
||||
}
|
||||
},
|
||||
]
|
||||
body: ''
|
||||
result: codemodel.Result{
|
||||
typ: codemodel.Type{
|
||||
symbol: 'FileStruct1'
|
||||
}
|
||||
description: 'a FileStruc1 struct filled in with params 1 and 2'
|
||||
name: 'the created filestruct1'
|
||||
}
|
||||
has_return: false
|
||||
}),
|
||||
]
|
||||
}
|
||||
|
||||
fn test_vparse_blankdir() ! {
|
||||
os.mkdir_all('${testpath}/blankdir', os.MkdirParams{})!
|
||||
code := parse_v('${testpath}/blankdir')!
|
||||
assert code.len == 0
|
||||
}
|
||||
|
||||
fn test_vparse_flat_directory() ! {
|
||||
code := parse_v('${testpath}/flatdir')!
|
||||
assert code.len == 12
|
||||
assert code[0] == testcode['anotherfile.v'][0]
|
||||
assert code[0..6] == testcode['anotherfile.v'][0..6], '<${code[0..6]}> vs <${testcode['anotherfile.v'][0..6]}>'
|
||||
assert code[6..12] == testcode['subfile.v'][0..6], '<${code[6..12]}> vs <${testcode['subfile.v'][0..6]}>'
|
||||
}
|
||||
|
||||
fn test_vparse_non_recursive() ! {
|
||||
code := parse_v(testpath)!
|
||||
assert code.len == 6
|
||||
assert code[0] == testcode['file.v'][0]
|
||||
assert code[0..6] == testcode['file.v'][0..6], '<${code[0..6]}> vs <${testcode['file.v'][0..6]}>'
|
||||
}
|
||||
|
||||
fn test_vparse_recursive() ! {
|
||||
$if debug {
|
||||
console.print_debug('\nTEST: test_vparse_recursive\n')
|
||||
}
|
||||
code := parse_v(testpath, recursive: true)!
|
||||
assert code.len == 18
|
||||
assert code[0..6] == testcode['anotherfile.v'][0..6]
|
||||
assert code[6..12] == testcode['subfile.v'][0..6]
|
||||
assert code[12..18] == testcode['file.v'][0..6]
|
||||
}
|
||||
|
||||
fn test_vparse_exclude_directories() ! {
|
||||
code := parse_v(testpath,
|
||||
recursive: true
|
||||
exclude_dirs: ['flatdir']
|
||||
)!
|
||||
assert code.len == 6
|
||||
assert code[0..6] == testcode['file.v'][0..6]
|
||||
}
|
||||
|
||||
fn test_vparse_exclude_files() ! {
|
||||
code := parse_v(testpath,
|
||||
recursive: true
|
||||
exclude_files: ['flatdir/anotherfile.v']
|
||||
)!
|
||||
assert code.len == 12
|
||||
assert code[0..6] == testcode['subfile.v'][0..6]
|
||||
assert code[6..12] == testcode['file.v'][0..6]
|
||||
}
|
||||
|
||||
fn test_vparse_only_public() ! {
|
||||
code := parse_v(testpath,
|
||||
recursive: true
|
||||
only_pub: true
|
||||
)!
|
||||
|
||||
// first function of each code file is private so should skip those
|
||||
assert code.len == 15
|
||||
assert code[0..5] == testcode['anotherfile.v'][1..6]
|
||||
assert code[5..10] == testcode['subfile.v'][1..6]
|
||||
assert code[10..15] == testcode['file.v'][1..6]
|
||||
}
|
||||
Reference in New Issue
Block a user