///|
test "lookup_keyword classifies module/value/opcode and unknown inputs" {
match lookup_keyword("module") {
Some(Module) => ()
_ => fail("expected module keyword classification")
}
match lookup_keyword("extern") {
Some(ValueType(ExternRef)) => ()
_ => fail("expected extern alias to classify as externref value type")
}
match lookup_keyword("ref.cast_desc_eq") {
Some(Opcode(RefCastDescEq)) => ()
_ => fail("expected descriptor cast opcode classification")
}
match lookup_keyword("i8x16.relaxed_swizzle") {
Some(Opcode(I8x16RelaxedSwizzle)) => ()
_ => fail("expected relaxed SIMD opcode classification")
}
match lookup_keyword("totally.unknown.keyword") {
None => ()
_ => fail("expected unknown keyword to return None")
}
}
///|
test "lookup_keyword classifies advanced reference and exception keywords" {
let keywords = [
"ref.eq", "ref.as_non_null", "any.convert_extern", "extern.convert_any", "ref.i31",
"i31.get_s", "i31.get_u", "throw", "throw_ref", "try_table", "catch", "catch_ref",
"catch_all", "catch_all_ref", "tag",
]
for keyword in keywords {
match lookup_keyword(keyword) {
Some(_) => ()
None => fail("expected keyword to resolve: \{keyword}")
}
}
}
///|
test "wast_to_script parser boundaries for empty and unknown commands" {
let empty_script = match wast_to_script("") {
Ok(script) => script
Err(e) => fail("unexpected parse error for empty script: \{e}")
}
@debug.assert_eq(empty_script.commands.length(), 0)
match wast_to_script("(unknown)", filename="script-boundary.wast") {
Ok(_) => fail("expected parse error for unknown command")
Err(msg) => {
assert_true(msg.contains("expected WAST command"))
assert_true(msg.contains("script-boundary.wast:1"))
}
}
}
///|
test "wast_to_module parser boundary requires module keyword" {
match wast_to_module("()", filename="module-boundary.wast") {
Ok(_) => fail("expected parse error for missing module keyword")
Err(msg) => {
assert_true(msg.contains("expected 'module'"))
assert_true(msg.contains("module-boundary.wast:1"))
}
}
}