From 76bf5bf7b1b7a676920f3f88854d4bc5eaa9df15 Mon Sep 17 00:00:00 2001 From: jtenner Date: Thu, 5 Sep 2024 18:57:09 -0400 Subject: [PATCH] test visitor functions --- src/builder/types/block_type.gleam | 14 + src/builder/types/rec_type.gleam | 10 +- src/internal/visitor.gleam | 328 ++++++++++++++ src/visitor.gleam | 22 +- test/visitor/block_type_test.gleam | 89 ++++ test/visitor_test.gleam | 699 +++++++++++++++++++++++++++++ 6 files changed, 1153 insertions(+), 9 deletions(-) create mode 100644 src/builder/types/block_type.gleam create mode 100644 test/visitor/block_type_test.gleam create mode 100644 test/visitor_test.gleam diff --git a/src/builder/types/block_type.gleam b/src/builder/types/block_type.gleam new file mode 100644 index 0000000..ae230c4 --- /dev/null +++ b/src/builder/types/block_type.gleam @@ -0,0 +1,14 @@ +import internal/structure/types.{ + type BlockType, type TypeIDX, type ValType, FuncTypeBlockType, + ValTypeBlockType, VoidBlockType, +} + +pub const void = VoidBlockType + +pub fn val_type(vt: ValType) { + ValTypeBlockType(vt) +} + +pub fn func_type(idx: TypeIDX) { + FuncTypeBlockType(idx) +} diff --git a/src/builder/types/rec_type.gleam b/src/builder/types/rec_type.gleam index 43e8c2a..a28c9c5 100644 --- a/src/builder/types/rec_type.gleam +++ b/src/builder/types/rec_type.gleam @@ -1,6 +1,6 @@ import internal/finger_tree import internal/structure/types.{ - type FieldType, type StructType, type SubType, type ValType, + type FieldType, type FuncType, type StructType, type SubType, type ValType, ArrayCompositeType, ArrayType, FuncCompositeType, FuncType, RecType, StructCompositeType, StructType, SubType, } @@ -9,6 +9,14 @@ pub fn from_sub_types(sub_types: List(SubType)) { RecType(sub_types |> finger_tree.from_list) } +pub fn from_func_type(func_type: FuncType) { + RecType( + finger_tree.from_list([ + SubType(True, finger_tree.new(), FuncCompositeType(func_type)), + ]), + ) +} + pub fn func_type(parameters: List(ValType), results: List(ValType)) { RecType( finger_tree.from_list([ diff --git a/src/internal/visitor.gleam b/src/internal/visitor.gleam index 33c011f..001fe11 100644 --- a/src/internal/visitor.gleam +++ b/src/internal/visitor.gleam @@ -1,3 +1,4 @@ +import gleam/io import gleam/list import gleam/option.{type Option, None, Some} import gleam/result.{map, try} @@ -46,6 +47,333 @@ import internal/structure/types.{ pub type VisitorCallback(ctx, element) = fn(ctx, element) -> Result(#(ctx, element), String) +pub const empty_visitor = BinaryModuleVisitor( + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, +) + pub type BinaryModuleVisitor(ctx) { BinaryModuleVisitor( on_enter_module: Option(VisitorCallback(ctx, BinaryModule)), diff --git a/src/visitor.gleam b/src/visitor.gleam index f429ec8..33aee7c 100644 --- a/src/visitor.gleam +++ b/src/visitor.gleam @@ -1,5 +1,4 @@ import gleam/option.{type Option, Some} -import internal/finger_tree import internal/structure/modules.{ type BinaryModule, type CodeSection, type CustomSection, type DataCountSection, type DataSection, type ElementSection, type ExportSection, @@ -17,13 +16,13 @@ import internal/structure/types.{ type TableType, type TypeIDX, type ValType, } import internal/visitor.{ - type BinaryModuleVisitor, type VisitorCallback, BinaryModuleVisitor, - do_visit_array_type, do_visit_block_type, do_visit_code, do_visit_code_section, - do_visit_composite_type, do_visit_custom_section, do_visit_custom_sections, - do_visit_data, do_visit_data_count_section, do_visit_data_idx, - do_visit_data_section, do_visit_def_type, do_visit_elem_idx, - do_visit_element_mode, do_visit_element_section, do_visit_element_segment, - do_visit_export, do_visit_export_section, do_visit_expr, do_visit_field_idx, + type VisitorCallback, BinaryModuleVisitor, do_visit_array_type, + do_visit_block_type, do_visit_code, do_visit_code_section, + do_visit_composite_type, do_visit_custom_section, do_visit_data, + do_visit_data_count_section, do_visit_data_idx, do_visit_data_section, + do_visit_def_type, do_visit_elem_idx, do_visit_element_mode, + do_visit_element_section, do_visit_element_segment, do_visit_export, + do_visit_export_section, do_visit_expr, do_visit_field_idx, do_visit_field_type, do_visit_func_idx, do_visit_func_type, do_visit_function_section, do_visit_global, do_visit_global_idx, do_visit_global_section, do_visit_global_type, do_visit_heap_type, @@ -3226,3 +3225,10 @@ pub fn visit_block_type( ) -> Result(#(ctx, BlockType), String) { do_visit_block_type(ctx, block_type, visitor) } + +pub fn new() { + visitor.empty_visitor +} + +pub type BinaryModuleVisitor(ctx) = + visitor.BinaryModuleVisitor(ctx) diff --git a/test/visitor/block_type_test.gleam b/test/visitor/block_type_test.gleam new file mode 100644 index 0000000..67d42ae --- /dev/null +++ b/test/visitor/block_type_test.gleam @@ -0,0 +1,89 @@ +import builder/module +import builder/types/block_type +import builder/types/val_type +import gleeunit/should +import visitor.{type BinaryModuleVisitor} + +type VisitCallback(u) = + fn(VisitorContext, u) -> Result(#(VisitorContext, u), String) + +type VisitorContext = + #(Int, Int, Int, Int) + +type VisitorEventCallback(u) = + fn(BinaryModuleVisitor(VisitorContext), VisitCallback(u)) -> + BinaryModuleVisitor(VisitorContext) + +type DoVisitCallback(u) = + fn(BinaryModuleVisitor(VisitorContext), VisitorContext, u) -> + Result(#(VisitorContext, u), String) + +fn do_visit_test( + expected_value: u, + on_enter_type: VisitorEventCallback(u), + on_exit_type: VisitorEventCallback(u), + on_enter_variant: VisitorEventCallback(u), + on_exit_variant: VisitorEventCallback(u), + visit_func: DoVisitCallback(u), +) { + let start_context = #(0, 0, 0, 0) + let expected_context = #(1, 1, 1, 1) + visitor.new() + |> on_enter_type(fn(ctx, actual_value) { + let #(a, b, c, d) = ctx + actual_value |> should.equal(expected_value) + Ok(#(#(a + 1, b, c, d), actual_value)) + }) + |> on_exit_type(fn(ctx, actual_value) { + let #(a, b, c, d) = ctx + actual_value |> should.equal(expected_value) + Ok(#(#(a, b + 1, c, d), actual_value)) + }) + |> on_enter_variant(fn(ctx, actual_value) { + let #(a, b, c, d) = ctx + actual_value |> should.equal(expected_value) + Ok(#(#(a, b, c + 1, d), actual_value)) + }) + |> on_exit_variant(fn(ctx, actual_value) { + let #(a, b, c, d) = ctx + actual_value |> should.equal(expected_value) + Ok(#(#(a, b, c, d + 1), actual_value)) + }) + |> visit_func(start_context, expected_value) + |> should.be_ok + |> should.equal(#(expected_context, expected_value)) +} + +pub fn visit_val_type_storage_type_test() { + do_visit_test( + block_type.val_type(val_type.i32), + visitor.on_enter_block_type, + visitor.on_exit_block_type, + visitor.on_enter_val_type_block_type, + visitor.on_exit_val_type_block_type, + visitor.visit_block_type, + ) +} + +pub fn visit_void_block_type_test() { + do_visit_test( + block_type.void, + visitor.on_enter_block_type, + visitor.on_exit_block_type, + visitor.on_enter_void_block_type, + visitor.on_exit_void_block_type, + visitor.visit_block_type, + ) +} + +pub fn visit_func_type_block_type_test() { + let assert Ok(type_idx) = module.type_idx(42) + do_visit_test( + block_type.func_type(type_idx), + visitor.on_enter_block_type, + visitor.on_exit_block_type, + visitor.on_enter_void_block_type, + visitor.on_exit_void_block_type, + visitor.visit_block_type, + ) +} diff --git a/test/visitor_test.gleam b/test/visitor_test.gleam new file mode 100644 index 0000000..4be0bd5 --- /dev/null +++ b/test/visitor_test.gleam @@ -0,0 +1,699 @@ +import builder/types/block_type +import gleeunit/should +import visitor + +pub fn visit_binary_module_test() { + todo +} + +pub fn visit_code_section_test() { + todo +} + +pub fn visit_data_section_test() { + todo +} + +pub fn visit_element_section_test() { + todo +} + +pub fn visit_export_section_test() { + todo +} + +pub fn visit_function_section_test() { + todo +} + +pub fn visit_global_section_test() { + todo +} + +pub fn visit_import_section_test() { + todo +} + +pub fn visit_memory_section_test() { + todo +} + +pub fn visit_start_section_test() { + todo +} + +pub fn visit_table_section_test() { + todo +} + +pub fn visit_type_section_test() { + todo +} + +pub fn visit_type_array_type_test() { + todo +} + +pub fn visit_type_code_test() { + todo +} + +pub fn visit_type_composite_type_test() { + todo +} + +pub fn visit_type_data_test() { + todo +} + +pub fn visit_type_data_idx_test() { + todo +} + +pub fn visit_type_def_type_test() { + todo +} + +pub fn visit_type_elem_test() { + todo +} + +pub fn visit_type_elem_idx_test() { + todo +} + +pub fn visit_type_elem_mode_test() { + todo +} + +pub fn visit_type_export_test() { + todo +} + +pub fn visit_type_expr_test() { + todo +} + +pub fn visit_type_field_idx_test() { + todo +} + +pub fn visit_type_field_type_test() { + todo +} + +pub fn visit_type_func_idx_test() { + todo +} + +pub fn visit_type_func_type_test() { + todo +} + +pub fn visit_type_global_test() { + todo +} + +pub fn visit_type_global_idx_test() { + todo +} + +pub fn visit_type_global_type_test() { + todo +} + +pub fn visit_type_heap_type_test() { + todo +} + +pub fn visit_type_import_test() { + todo +} + +pub fn visit_type_instruction_test() { + todo +} + +pub fn visit_type_label_idx_test() { + todo +} + +pub fn visit_type_limits_test() { + todo +} + +pub fn visit_type_local_idx_test() { + todo +} + +pub fn visit_type_locals_test() { + todo +} + +pub fn visit_type_mem_idx_test() { + todo +} + +pub fn visit_type_mem_type_test() { + todo +} + +pub fn visit_type_rec_type_test() { + todo +} + +pub fn visit_type_ref_type_test() { + todo +} + +pub fn visit_type_storage_type_test() { + todo +} + +pub fn visit_type_struct_type_test() { + todo +} + +pub fn visit_type_sub_type_test() { + todo +} + +pub fn visit_type_table_test() { + todo +} + +pub fn visit_type_table_idx_test() { + todo +} + +pub fn visit_type_table_type_test() { + todo +} + +pub fn visit_type_type_idx_test() { + todo +} + +pub fn visit_type_val_type_test() { + todo +} + +pub fn visit_active_data_test() { + todo +} + +pub fn visit_active_elem_mode_test() { + todo +} + +pub fn visit_any_heap_type_test() { + todo +} + +pub fn visit_any_ref_type_test() { + todo +} + +pub fn visit_array_composite_type_test() { + todo +} + +pub fn visit_array_copy_test() { + todo +} + +pub fn visit_array_fill_test() { + todo +} + +pub fn visit_array_get_test() { + todo +} + +pub fn visit_array_get_s_test() { + todo +} + +pub fn visit_array_get_u_test() { + todo +} + +pub fn visit_array_heap_type_test() { + todo +} + +pub fn visit_array_init_data_test() { + todo +} + +pub fn visit_array_init_elem_test() { + todo +} + +pub fn visit_array_new_test() { + todo +} + +pub fn visit_array_new_data_test() { + todo +} + +pub fn visit_array_new_default_test() { + todo +} + +pub fn visit_array_new_elem_test() { + todo +} + +pub fn visit_array_new_fixed_test() { + todo +} + +pub fn visit_array_ref_type_test() { + todo +} + +pub fn visit_array_set_test() { + todo +} + +pub fn visit_array_type_test() { + todo +} + +pub fn visit_block_test() { + todo +} + +pub fn visit_br_test() { + todo +} + +pub fn visit_br_if_test() { + todo +} + +pub fn visit_br_on_cast_test() { + todo +} + +pub fn visit_br_on_cast_fail_test() { + todo +} + +pub fn visit_br_on_non_null_test() { + todo +} + +pub fn visit_br_on_null_test() { + todo +} + +pub fn visit_br_table_test() { + todo +} + +pub fn visit_call_test() { + todo +} + +pub fn visit_call_indirect_test() { + todo +} + +pub fn visit_call_ref_test() { + todo +} + +pub fn visit_code_test() { + todo +} + +pub fn visit_concrete_heap_type_test() { + todo +} + +pub fn visit_data_drop_test() { + todo +} + +pub fn visit_declarative_elem_mode_test() { + todo +} + +pub fn visit_def_type_test() { + todo +} + +pub fn visit_def_type_reference_test() { + todo +} + +pub fn visit_elem_drop_test() { + todo +} + +pub fn visit_elem_expressions_test() { + todo +} + +pub fn visit_elem_funcs_test() { + todo +} + +pub fn visit_eq_heap_type_test() { + todo +} + +pub fn visit_eq_ref_type_test() { + todo +} + +pub fn visit_expr_test() { + todo +} + +pub fn visit_extern_heap_type_test() { + todo +} + +pub fn visit_extern_ref_type_test() { + todo +} + +pub fn visit_f32_val_type_test() { + todo +} + +pub fn visit_f64_val_type_test() { + todo +} + +pub fn visit_field_type_test() { + todo +} + +pub fn visit_func_composite_type_test() { + todo +} + +pub fn visit_func_export_test() { + todo +} + +pub fn visit_func_heap_type_test() { + todo +} + +pub fn visit_func_import_test() { + todo +} + +pub fn visit_func_ref_type_test() { + todo +} + +pub fn visit_func_type_test() { + todo +} + +pub fn visit_global_test() { + todo +} + +pub fn visit_global_export_test() { + todo +} + +pub fn visit_global_get_test() { + todo +} + +pub fn visit_global_import_test() { + todo +} + +pub fn visit_global_set_test() { + todo +} + +pub fn visit_global_type_test() { + todo +} + +pub fn visit_heap_type_ref_type_test() { + todo +} + +pub fn visit_i16_storage_type_test() { + todo +} + +pub fn visit_i31_heap_type_test() { + todo +} + +pub fn visit_i31_ref_type_test() { + todo +} + +pub fn visit_i32_val_type_test() { + todo +} + +pub fn visit_i64_val_type_test() { + todo +} + +pub fn visit_i8_storage_type_test() { + todo +} + +pub fn visit_if_test() { + todo +} + +pub fn visit_label_idx_test() { + todo +} + +pub fn visit_limits_test() { + todo +} + +pub fn visit_local_get_test() { + todo +} + +pub fn visit_local_set_test() { + todo +} + +pub fn visit_local_tee_test() { + todo +} + +pub fn visit_locals_test() { + todo +} + +pub fn visit_loop_test() { + todo +} + +pub fn visit_mem_export_test() { + todo +} + +pub fn visit_mem_idx_test() { + todo +} + +pub fn visit_mem_import_test() { + todo +} + +pub fn visit_mem_type_test() { + todo +} + +pub fn visit_memory_init_test() { + todo +} + +pub fn visit_no_extern_heap_type_test() { + todo +} + +pub fn visit_no_extern_ref_type_test() { + todo +} + +pub fn visit_no_func_heap_type_test() { + todo +} + +pub fn visit_no_func_ref_type_test() { + todo +} + +pub fn visit_none_heap_type_test() { + todo +} + +pub fn visit_none_ref_type_test() { + todo +} + +pub fn visit_passive_data_test() { + todo +} + +pub fn visit_passive_elem_mode_test() { + todo +} + +pub fn visit_rec_type_test() { + todo +} + +pub fn visit_rec_type_idx_test() { + todo +} + +pub fn visit_ref_cast_test() { + todo +} + +pub fn visit_ref_cast_nullable_test() { + todo +} + +pub fn visit_ref_func_test() { + todo +} + +pub fn visit_ref_null_test() { + todo +} + +pub fn visit_ref_test_test() { + todo +} + +pub fn visit_ref_test_nullable_test() { + todo +} + +pub fn visit_ref_type_val_type_test() { + todo +} + +pub fn visit_return_call_test() { + todo +} + +pub fn visit_return_call_indirect_test() { + todo +} + +pub fn visit_return_call_ref_test() { + todo +} + +pub fn visit_select_t_test() { + todo +} + +pub fn visit_struct_composite_type_test() { + todo +} + +pub fn visit_struct_get_test() { + todo +} + +pub fn visit_struct_get_s_test() { + todo +} + +pub fn visit_struct_get_u_test() { + todo +} + +pub fn visit_struct_heap_type_test() { + todo +} + +pub fn visit_struct_ref_type_test() { + todo +} + +pub fn visit_struct_set_test() { + todo +} + +pub fn visit_struct_type_test() { + todo +} + +pub fn visit_sub_type_test() { + todo +} + +pub fn visit_table_test() { + todo +} + +pub fn visit_table_copy_test() { + todo +} + +pub fn visit_table_export_test() { + todo +} + +pub fn visit_table_fill_test() { + todo +} + +pub fn visit_table_get_test() { + todo +} + +pub fn visit_table_grow_test() { + todo +} + +pub fn visit_table_import_test() { + todo +} + +pub fn visit_table_init_test() { + todo +} + +pub fn visit_table_set_test() { + todo +} + +pub fn visit_table_size_test() { + todo +} + +pub fn visit_table_type_test() { + todo +} + +pub fn visit_type_idx_test() { + todo +} + +pub fn visit_v128_val_type_test() { + todo +} + +pub fn visit_val_type_storage_type_test() { + todo +}