add ArrayList alias to std

This commit is contained in:
2026-07-13 13:46:45 +02:00
parent 288df082e2
commit 6455df52b4
14 changed files with 600 additions and 13 deletions
+143
View File
@@ -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"