add ArrayList alias to std
This commit is contained in:
@@ -7125,6 +7125,149 @@ imports_do_not_reexport_members :: proc(t: ^testing.T) {
|
||||
testing.expect(t, !state.success)
|
||||
}
|
||||
|
||||
@(test)
|
||||
declaration_aliases_preserve_identity_and_chain :: proc(t: ^testing.T) {
|
||||
root :: "/tmp/brolang-test-declaration-aliases"
|
||||
dep_dir :: root + "/dep"
|
||||
facade_dir :: root + "/facade"
|
||||
top_dir :: root + "/top"
|
||||
app_dir :: root + "/app"
|
||||
output :: "/tmp/brolang-test-declaration-aliases-output"
|
||||
_ = os2.remove_all(root)
|
||||
defer _ = os2.remove_all(root)
|
||||
defer _ = os.remove(output)
|
||||
directories := [?]string{root, dep_dir, facade_dir, top_dir, app_dir}
|
||||
for directory in directories {
|
||||
testing.expect(t, os.make_directory(directory) == nil)
|
||||
}
|
||||
dep_text := `Box func($T type) type {
|
||||
return struct { value T }
|
||||
}
|
||||
Point :: struct { value i32 }
|
||||
counter i32 = 1
|
||||
answer func() i32 { return 40 }
|
||||
`
|
||||
facade_text := `dep :: import "../dep"
|
||||
RenamedBox :: alias dep.Box
|
||||
RenamedPoint :: alias dep.Point
|
||||
counter :: alias dep.counter
|
||||
answer :: alias dep.answer
|
||||
_local_answer :: alias dep.answer
|
||||
local_answer func() i32 { return _local_answer() }
|
||||
Scalar :: alias i32
|
||||
MaybePoint :: alias ?@dep.Point
|
||||
Concrete :: alias dep.Box(i32)
|
||||
`
|
||||
top_text := `facade :: import "../facade"
|
||||
Box :: alias facade.RenamedBox
|
||||
Point :: alias facade.RenamedPoint
|
||||
counter :: alias facade.counter
|
||||
answer :: alias facade.answer
|
||||
`
|
||||
app_text := `dep :: import "../dep"
|
||||
facade :: import "../facade"
|
||||
top :: import "../top"
|
||||
|
||||
main func() i32 {
|
||||
box top.Box(i32) :: top.Box(i32) { value = 2 }
|
||||
point top.Point :: top.Point { value = 3 }
|
||||
maybe facade.MaybePoint :: none
|
||||
scalar facade.Scalar :: 5
|
||||
top.counter = 7
|
||||
if box.value != 2 or point.value != 3 { return 1 }
|
||||
if scalar != 5 or top.answer() != 40 or facade.local_answer() != 40 or dep.counter != 7 { return 2 }
|
||||
_ = maybe
|
||||
return 0
|
||||
}
|
||||
`
|
||||
testing.expect(t, os.write_entire_file(dep_dir + "/dep.bro", transmute([]byte)dep_text))
|
||||
testing.expect(t, os.write_entire_file(facade_dir + "/facade.bro", transmute([]byte)facade_text))
|
||||
testing.expect(t, os.write_entire_file(top_dir + "/top.bro", transmute([]byte)top_text))
|
||||
testing.expect(t, os.write_entire_file(app_dir + "/main.bro", transmute([]byte)app_text))
|
||||
|
||||
status := compiler_core.compile_package(app_dir, output)
|
||||
testing.expect_value(t, status, 0)
|
||||
state := run_executable(output)
|
||||
testing.expect_value(t, state.exit_code, 0)
|
||||
}
|
||||
|
||||
@(test)
|
||||
declaration_aliases_diagnose_invalid_targets :: proc(t: ^testing.T) {
|
||||
root :: "/tmp/brolang-test-declaration-alias-errors"
|
||||
dep_dir :: root + "/dep"
|
||||
facade_dir :: root + "/facade"
|
||||
a_dir :: root + "/a"
|
||||
b_dir :: root + "/b"
|
||||
app_dir :: root + "/app"
|
||||
_ = os2.remove_all(root)
|
||||
defer _ = os2.remove_all(root)
|
||||
directories := [?]string{root, dep_dir, facade_dir, a_dir, b_dir, app_dir}
|
||||
for directory in directories {
|
||||
testing.expect(t, os.make_directory(directory) == nil)
|
||||
}
|
||||
dep_text := `visible func() i32 { return 1 }
|
||||
_hidden func() i32 { return 2 }
|
||||
ambiguous func() i32 { return 3 }
|
||||
ambiguous i32 :: 4
|
||||
`
|
||||
facade_text := `dep :: import "../dep"
|
||||
gone :: import "../gone"
|
||||
missing :: alias dep.missing
|
||||
hidden :: alias dep._hidden
|
||||
unknown :: alias nope.visible
|
||||
unavailable :: alias gone.visible
|
||||
ambiguous :: alias dep.ambiguous
|
||||
duplicate :: alias dep.visible
|
||||
duplicate :: alias dep.visible
|
||||
collision func() i32 { return 0 }
|
||||
collision :: alias dep.visible
|
||||
dep :: alias dep.visible
|
||||
`
|
||||
a_text := `b :: import "../b"
|
||||
value :: alias b.value
|
||||
`
|
||||
b_text := `a :: import "../a"
|
||||
value :: alias a.value
|
||||
`
|
||||
app_text := `facade :: import "../facade"
|
||||
a :: import "../a"
|
||||
main func() void {}
|
||||
`
|
||||
testing.expect(t, os.write_entire_file(dep_dir + "/dep.bro", transmute([]byte)dep_text))
|
||||
testing.expect(t, os.write_entire_file(facade_dir + "/facade.bro", transmute([]byte)facade_text))
|
||||
testing.expect(t, os.write_entire_file(a_dir + "/a.bro", transmute([]byte)a_text))
|
||||
testing.expect(t, os.write_entire_file(b_dir + "/b.bro", transmute([]byte)b_text))
|
||||
testing.expect(t, os.write_entire_file(app_dir + "/main.bro", transmute([]byte)app_text))
|
||||
|
||||
sources := source.init_store()
|
||||
defer source.destroy_store(&sources)
|
||||
diagnostics := source.init_store_diagnostics(&sources)
|
||||
defer source.destroy_diagnostics(&diagnostics)
|
||||
symbols := symbol.init_table()
|
||||
defer symbol.destroy_table(&symbols)
|
||||
module, loaded := loader.load(app_dir, &sources, &diagnostics, &symbols)
|
||||
defer ast.destroy_module(&module)
|
||||
testing.expect(t, loaded)
|
||||
wants := []string{
|
||||
"has no member 'missing'",
|
||||
"is file-hidden",
|
||||
"unknown package alias 'nope'",
|
||||
"unavailable imported package 'gone'",
|
||||
"package member 'dep.ambiguous' is ambiguous",
|
||||
"duplicate declaration alias 'duplicate'",
|
||||
"declaration alias 'collision' conflicts with a package declaration",
|
||||
"declaration alias 'dep' conflicts with an import",
|
||||
"declaration alias cycle",
|
||||
}
|
||||
for want in wants {
|
||||
found := false
|
||||
for diagnostic in diagnostics.items {
|
||||
found = found || strings.contains(diagnostic.message, want)
|
||||
}
|
||||
testing.expect(t, found)
|
||||
}
|
||||
}
|
||||
|
||||
@(test)
|
||||
self_import_via_dot_is_valid :: proc(t: ^testing.T) {
|
||||
output := "/tmp/brolang-test-package-self"
|
||||
|
||||
Reference in New Issue
Block a user