Skip to content

Commit 26947a2

Browse files
committed
feat: Test exports
1 parent 465d0d2 commit 26947a2

File tree

3 files changed

+208
-50
lines changed

3 files changed

+208
-50
lines changed

test/export_test.re

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
open Binaryen;
2+
open Frame_work;
3+
4+
suite("Export", () => {
5+
let create_test_func = (wasm_mod, name) => {
6+
Function.add_function(
7+
wasm_mod,
8+
name,
9+
Type.none,
10+
Type.none,
11+
[||],
12+
Expression.Nop.make(wasm_mod),
13+
);
14+
};
15+
test("AddFunctionExport", () => {
16+
let wasm_mod = Module.create();
17+
let internal_name = "ExportedFunc";
18+
let _ = create_test_func(wasm_mod, internal_name);
19+
let _ = Export.add_function_export(wasm_mod, internal_name, "funcExport");
20+
Printf.printf("%s", Module.write_text(wasm_mod));
21+
Module.dispose(wasm_mod);
22+
});
23+
test("AddTableExport", () => {
24+
let wasm_mod = Module.create();
25+
let internal_name = "ExportedTable";
26+
let _ = Table.add_table(wasm_mod, internal_name, 0, 1, Type.funcref);
27+
let _ = Export.add_table_export(wasm_mod, internal_name, "tableExport");
28+
Printf.printf("%s", Module.write_text(wasm_mod));
29+
Module.dispose(wasm_mod);
30+
});
31+
test("AddMemoryExport", () => {
32+
let wasm_mod = Module.create();
33+
let internal_name = "ExportedMemory";
34+
// Note: By default memories are exported
35+
let _ =
36+
Memory.set_memory(
37+
wasm_mod,
38+
1,
39+
Memory.unlimited,
40+
"DefaultMemoryExport",
41+
[],
42+
false,
43+
false,
44+
internal_name,
45+
);
46+
let _ = Export.add_memory_export(wasm_mod, internal_name, "memoryExport");
47+
Printf.printf("%s", Module.write_text(wasm_mod));
48+
Module.dispose(wasm_mod);
49+
});
50+
test("AddGlobalExport", () => {
51+
let wasm_mod = Module.create();
52+
let internal_name = "ExportedGlobal";
53+
let _ =
54+
Global.add_global(
55+
wasm_mod,
56+
internal_name,
57+
Type.int32,
58+
false,
59+
Expression.Const.make(wasm_mod, Literal.int32(1l)),
60+
);
61+
let _ = Export.add_global_export(wasm_mod, internal_name, "globalExport");
62+
Printf.printf("%s", Module.write_text(wasm_mod));
63+
Module.dispose(wasm_mod);
64+
});
65+
test("GetNumExports", () => {
66+
let wasm_mod = Module.create();
67+
let internal_name = "ExportedFunc";
68+
let _ = create_test_func(wasm_mod, internal_name);
69+
assert(Export.get_num_exports(wasm_mod) == 0);
70+
let _ = Export.add_function_export(wasm_mod, internal_name, "funcExport");
71+
assert(Export.get_num_exports(wasm_mod) == 1);
72+
Module.dispose(wasm_mod);
73+
});
74+
test("RemoveExport", () => {
75+
let wasm_mod = Module.create();
76+
let internal_name = "ExportedFunc";
77+
let export_name = "funcExport";
78+
let _ = create_test_func(wasm_mod, internal_name);
79+
let _ = Export.add_function_export(wasm_mod, internal_name, export_name);
80+
assert(Export.get_num_exports(wasm_mod) == 1);
81+
Export.remove_export(wasm_mod, export_name);
82+
assert(Export.get_num_exports(wasm_mod) == 0);
83+
Module.dispose(wasm_mod);
84+
});
85+
test("GetName", () => {
86+
let wasm_mod = Module.create();
87+
let internal_name = "ExportedFunc";
88+
let export_name = "funcExport";
89+
let _ = create_test_func(wasm_mod, internal_name);
90+
let test_export =
91+
Export.add_function_export(wasm_mod, internal_name, export_name);
92+
assert(Export.get_name(test_export) == export_name);
93+
Module.dispose(wasm_mod);
94+
});
95+
test("GetExport", () => {
96+
let wasm_mod = Module.create();
97+
let internal_name = "ExportedFunc";
98+
let export_name = "funcExport";
99+
let _ = create_test_func(wasm_mod, internal_name);
100+
let _ = Export.add_function_export(wasm_mod, internal_name, export_name);
101+
let fetched_export = Export.get_export(wasm_mod, export_name);
102+
assert(Export.get_name(fetched_export) == export_name);
103+
Module.dispose(wasm_mod);
104+
});
105+
test("GetExportByIndex", () => {
106+
let wasm_mod = Module.create();
107+
let internal_name1 = "ExportedFunc";
108+
let export_name1 = "funcExport1";
109+
let internal_name2 = "ExportedFunc2";
110+
let export_name2 = "funcExport2";
111+
let _ = create_test_func(wasm_mod, internal_name1);
112+
let _ = create_test_func(wasm_mod, internal_name2);
113+
let _ =
114+
Export.add_function_export(wasm_mod, internal_name1, export_name1);
115+
let _ =
116+
Export.add_function_export(wasm_mod, internal_name2, export_name2);
117+
let fetched_export1 = Export.get_export_by_index(wasm_mod, 0);
118+
let fetched_export2 = Export.get_export_by_index(wasm_mod, 1);
119+
assert(Export.get_name(fetched_export1) == export_name1);
120+
assert(Export.get_name(fetched_export2) == export_name2);
121+
Module.dispose(wasm_mod);
122+
});
123+
test("GetValue", () => {
124+
let wasm_mod = Module.create();
125+
let internal_name = "ExportedFunc";
126+
let export_name = "funcExport";
127+
let _ = create_test_func(wasm_mod, internal_name);
128+
let test_export =
129+
Export.add_function_export(wasm_mod, internal_name, export_name);
130+
assert(Export.get_value(test_export) == internal_name);
131+
Module.dispose(wasm_mod);
132+
});
133+
test("GetKind", () => {
134+
let wasm_mod = Module.create();
135+
// Function Export
136+
let _ = create_test_func(wasm_mod, "ExportedFunc");
137+
let func_export =
138+
Export.add_function_export(wasm_mod, "ExportedFunc", "funcExport");
139+
assert(Export.export_get_kind(func_export) == Export.external_function);
140+
// Table Export
141+
let _ = Table.add_table(wasm_mod, "ExportedTable", 0, 1, Type.funcref);
142+
let table_export =
143+
Export.add_table_export(wasm_mod, "ExportedTable", "tableExport");
144+
assert(Export.export_get_kind(table_export) == Export.external_table);
145+
// Memory Export
146+
let _ =
147+
Memory.set_memory(
148+
wasm_mod,
149+
1,
150+
Memory.unlimited,
151+
"DefaultMemoryExport",
152+
[],
153+
false,
154+
false,
155+
"ExportedMemory",
156+
);
157+
let memory_export =
158+
Export.add_memory_export(wasm_mod, "ExportedMemory", "memoryExport");
159+
assert(Export.export_get_kind(memory_export) == Export.external_memory);
160+
// Global Export
161+
let _ =
162+
Global.add_global(
163+
wasm_mod,
164+
"ExportedGlobal",
165+
Type.int32,
166+
false,
167+
Expression.Const.make(wasm_mod, Literal.int32(1l)),
168+
);
169+
let global_export =
170+
Export.add_global_export(wasm_mod, "ExportedGlobal", "globalExport");
171+
assert(Export.export_get_kind(global_export) == Export.external_global);
172+
// TODO(#264): Can't test Tag export until tags are implemented
173+
Module.dispose(wasm_mod);
174+
});
175+
});

test/test.expected

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,38 @@ Running suite: Element Segment
2323
. Running test: GetOffset
2424
. Running test: GetLength
2525
. Running test: GetData
26+
Running suite: Export
27+
. Running test: AddFunctionExport
28+
(module
29+
(type $0 (func))
30+
(export "funcExport" (func $ExportedFunc))
31+
(func $ExportedFunc
32+
(nop)
33+
)
34+
)
35+
. Running test: AddTableExport
36+
(module
37+
(table $ExportedTable 0 1 funcref)
38+
(export "tableExport" (table $ExportedTable))
39+
)
40+
. Running test: AddMemoryExport
41+
(module
42+
(memory $ExportedMemory 1)
43+
(export "DefaultMemoryExport" (memory $ExportedMemory))
44+
(export "memoryExport" (memory $ExportedMemory))
45+
)
46+
. Running test: AddGlobalExport
47+
(module
48+
(global $ExportedGlobal i32 (i32.const 1))
49+
(export "globalExport" (global $ExportedGlobal))
50+
)
51+
. Running test: GetNumExports
52+
. Running test: RemoveExport
53+
. Running test: GetName
54+
. Running test: GetExport
55+
. Running test: GetExportByIndex
56+
. Running test: GetValue
57+
. Running test: GetKind
2658
Running suite: Function
2759
. Running test: Add Function
2860
(module

test/test.re

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ open Global_test; // TODO: Document
1212
open Memory_test; // TODO: Document
1313
open Table_test; // TODO: Document
1414
open Element_segment_test; // TODO: Document
15-
// TODO: Export (Medium)
15+
open Export_test; // TODO: Document
1616
// TODO: Import (Medium)
1717
// TODO: Passes (Hard)
1818
// TODO: Expression (Hard)
@@ -103,7 +103,6 @@ open Element_segment_test; // TODO: Document
103103
// ])
104104

105105
// let _ = Export.add_function_export wasm_mod "adder" "adder"
106-
// let _ = Table.add_table wasm_mod "table" 1 1 Type.funcref
107106

108107
// (* TODO(#240): Re-enable after type-builder api is merged *)
109108
// (* let funcref_expr1 = Expression.Ref.func wasm_mod "adder" (Heap_type.func ())
@@ -131,51 +130,6 @@ open Element_segment_test; // TODO: Document
131130

132131
// let _ = Expression.print table_grow
133132

134-
// let _ =
135-
// Table.add_active_element_segment wasm_mod "table" "elem" [ "adder" ]
136-
// (Expression.Const.make wasm_mod (Literal.int32 0l))
137-
138-
// let _ = Function.set_start wasm_mod start
139-
// let start_func = Function.get_start wasm_mod
140-
// let _ = assert (Function.get_name start_func = "start")
141-
142-
// let segment : Binaryen.Memory.segment =
143-
// let data = Bytes.of_string "hello" in
144-
// let kind =
145-
// Binaryen.Memory.Active
146-
// { offset = Expression.Const.make wasm_mod (Literal.int32 0l) }
147-
// in
148-
// let size = Bytes.length data in
149-
// { name = "hello"; data; kind; size }
150-
151-
// let passive_segment : Binaryen.Memory.segment =
152-
// let data = Bytes.of_string "world" in
153-
// let kind = Binaryen.Memory.Passive in
154-
// let size = Bytes.length data in
155-
// { name = "world"; data; kind; size }
156-
157-
// let _ = assert (Memory.has_memory wasm_mod = false)
158-
159-
// let _ =
160-
// Memory.set_memory wasm_mod 1 Memory.unlimited "memory"
161-
// [ segment; passive_segment ]
162-
// false false "0"
163-
164-
// let _ = assert (Memory.has_memory wasm_mod = true)
165-
// let _ = assert (Memory.get_initial wasm_mod "0" = 1)
166-
// let _ = assert (Memory.has_max wasm_mod "0" = false)
167-
// let _ = assert (Memory.get_max wasm_mod "0" = Memory.unlimited)
168-
// let max_memory_wasm_mod = Module.create ()
169-
// let _ = Memory.set_memory max_memory_wasm_mod 1 2 "memory" [] false false "0"
170-
// let _ = assert (Memory.has_max max_memory_wasm_mod "0" = true)
171-
// let _ = assert (Memory.get_max max_memory_wasm_mod "0" = 2)
172-
173-
// let _ =
174-
// assert (
175-
// Bytes.equal
176-
// (Memory.get_segment_data wasm_mod "world")
177-
// (Bytes.of_string "world"))
178-
179133
// (* Create an imported "write" function i32 (externref, i32, i32) *)
180134
// (* Similar to the example here: https://bytecodealliance.org/articles/reference-types-in-wasmtime *)
181135

@@ -196,9 +150,6 @@ open Element_segment_test; // TODO: Document
196150
// Type.int32)
197151

198152
// let _ = Export.add_function_export wasm_mod "hello" "hello"
199-
// let _ = Module.validate wasm_mod
200-
201-
// let new_mod = Module.read byts
202153

203154
// let _ =
204155
// Module.run_passes new_mod

0 commit comments

Comments
 (0)