Skip to content

Commit 42cc1b4

Browse files
committed
Add WPT-style tests for MessageChannel, FormData, Performance Timeline
1 parent 4a83ae8 commit 42cc1b4

3 files changed

Lines changed: 762 additions & 0 deletions

File tree

test/wpt_form_data_test.exs

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
defmodule QuickBEAM.WPT.FormDataTest do
2+
@moduledoc "Ported from WPT: xhr/formdata"
3+
use ExUnit.Case, async: true
4+
5+
setup do
6+
{:ok, rt} = QuickBEAM.start()
7+
on_exit(fn -> try do QuickBEAM.stop(rt) catch :exit, _ -> :ok end end)
8+
%{rt: rt}
9+
end
10+
11+
describe "FormData constructor" do
12+
test "creates empty FormData", %{rt: rt} do
13+
assert {:ok, true} =
14+
QuickBEAM.eval(rt, """
15+
const fd = new FormData();
16+
fd.constructor.name === 'FormData'
17+
""")
18+
end
19+
end
20+
21+
describe "append and get" do
22+
test "append adds entry, get retrieves it", %{rt: rt} do
23+
assert {:ok, "value"} =
24+
QuickBEAM.eval(rt, """
25+
const fd = new FormData();
26+
fd.append("key", "value");
27+
fd.get("key")
28+
""")
29+
end
30+
31+
test "get returns null for missing key", %{rt: rt} do
32+
assert {:ok, nil} =
33+
QuickBEAM.eval(rt, """
34+
const fd = new FormData();
35+
fd.get("missing")
36+
""")
37+
end
38+
39+
test "multiple append same key preserves all", %{rt: rt} do
40+
assert {:ok, "first"} =
41+
QuickBEAM.eval(rt, """
42+
const fd = new FormData();
43+
fd.append("key", "first");
44+
fd.append("key", "second");
45+
fd.get("key")
46+
""")
47+
end
48+
49+
test "getAll returns all values for a key", %{rt: rt} do
50+
assert {:ok, ["first", "second", "third"]} =
51+
QuickBEAM.eval(rt, """
52+
const fd = new FormData();
53+
fd.append("key", "first");
54+
fd.append("key", "second");
55+
fd.append("key", "third");
56+
fd.getAll("key")
57+
""")
58+
end
59+
60+
test "getAll returns empty array for missing key", %{rt: rt} do
61+
assert {:ok, []} =
62+
QuickBEAM.eval(rt, """
63+
const fd = new FormData();
64+
fd.getAll("missing")
65+
""")
66+
end
67+
end
68+
69+
describe "set" do
70+
test "set replaces existing entries", %{rt: rt} do
71+
assert {:ok, true} =
72+
QuickBEAM.eval(rt, """
73+
const fd = new FormData();
74+
fd.append("key", "first");
75+
fd.append("key", "second");
76+
fd.set("key", "replaced");
77+
const all = fd.getAll("key");
78+
all.length === 1 && all[0] === "replaced"
79+
""")
80+
end
81+
82+
test "set adds if key does not exist", %{rt: rt} do
83+
assert {:ok, "new"} =
84+
QuickBEAM.eval(rt, """
85+
const fd = new FormData();
86+
fd.set("key", "new");
87+
fd.get("key")
88+
""")
89+
end
90+
end
91+
92+
describe "delete" do
93+
test "delete removes all entries with key", %{rt: rt} do
94+
assert {:ok, true} =
95+
QuickBEAM.eval(rt, """
96+
const fd = new FormData();
97+
fd.append("key", "a");
98+
fd.append("key", "b");
99+
fd.append("other", "c");
100+
fd.delete("key");
101+
fd.has("key") === false && fd.has("other") === true
102+
""")
103+
end
104+
end
105+
106+
describe "has" do
107+
test "has returns true for existing key", %{rt: rt} do
108+
assert {:ok, true} =
109+
QuickBEAM.eval(rt, """
110+
const fd = new FormData();
111+
fd.append("key", "value");
112+
fd.has("key")
113+
""")
114+
end
115+
116+
test "has returns false for missing key", %{rt: rt} do
117+
assert {:ok, false} =
118+
QuickBEAM.eval(rt, """
119+
const fd = new FormData();
120+
fd.has("missing")
121+
""")
122+
end
123+
end
124+
125+
describe "Blob and File handling" do
126+
test "Blob value wrapped in File with name 'blob'", %{rt: rt} do
127+
assert {:ok, true} =
128+
QuickBEAM.eval(rt, """
129+
const fd = new FormData();
130+
fd.append("file", new Blob(["data"], { type: "text/plain" }));
131+
const val = fd.get("file");
132+
val instanceof File && val.name === "blob" && val.type === "text/plain"
133+
""")
134+
end
135+
136+
test "File values preserve original name", %{rt: rt} do
137+
assert {:ok, true} =
138+
QuickBEAM.eval(rt, """
139+
const fd = new FormData();
140+
fd.append("file", new File(["data"], "test.txt", { type: "text/plain" }));
141+
const val = fd.get("file");
142+
val instanceof File && val.name === "test.txt"
143+
""")
144+
end
145+
146+
test "custom filename overrides Blob default", %{rt: rt} do
147+
assert {:ok, "custom.txt"} =
148+
QuickBEAM.eval(rt, """
149+
const fd = new FormData();
150+
fd.append("file", new Blob(["data"]), "custom.txt");
151+
fd.get("file").name
152+
""")
153+
end
154+
155+
test "custom filename overrides File name", %{rt: rt} do
156+
assert {:ok, "override.txt"} =
157+
QuickBEAM.eval(rt, """
158+
const fd = new FormData();
159+
fd.append("file", new File(["data"], "original.txt"), "override.txt");
160+
fd.get("file").name
161+
""")
162+
end
163+
end
164+
165+
describe "iteration" do
166+
test "forEach works correctly", %{rt: rt} do
167+
assert {:ok, "a=1,b=2,c=3"} =
168+
QuickBEAM.eval(rt, """
169+
const fd = new FormData();
170+
fd.append("a", "1");
171+
fd.append("b", "2");
172+
fd.append("c", "3");
173+
const pairs = [];
174+
fd.forEach((value, name) => pairs.push(name + "=" + value));
175+
pairs.join(",")
176+
""")
177+
end
178+
179+
test "iteration order matches insertion order", %{rt: rt} do
180+
assert {:ok, "first,second,third"} =
181+
QuickBEAM.eval(rt, """
182+
const fd = new FormData();
183+
fd.append("first", "1");
184+
fd.append("second", "2");
185+
fd.append("third", "3");
186+
const keys = [];
187+
for (const [key] of fd) keys.push(key);
188+
keys.join(",")
189+
""")
190+
end
191+
192+
test "keys iterator", %{rt: rt} do
193+
assert {:ok, "a,b,c"} =
194+
QuickBEAM.eval(rt, """
195+
const fd = new FormData();
196+
fd.append("a", "1");
197+
fd.append("b", "2");
198+
fd.append("c", "3");
199+
[...fd.keys()].join(",")
200+
""")
201+
end
202+
203+
test "values iterator", %{rt: rt} do
204+
assert {:ok, "1,2,3"} =
205+
QuickBEAM.eval(rt, """
206+
const fd = new FormData();
207+
fd.append("a", "1");
208+
fd.append("b", "2");
209+
fd.append("c", "3");
210+
[...fd.values()].join(",")
211+
""")
212+
end
213+
214+
test "entries iterator", %{rt: rt} do
215+
assert {:ok, "a:1,b:2"} =
216+
QuickBEAM.eval(rt, """
217+
const fd = new FormData();
218+
fd.append("a", "1");
219+
fd.append("b", "2");
220+
const pairs = [];
221+
for (const [k, v] of fd.entries()) pairs.push(k + ":" + v);
222+
pairs.join(",")
223+
""")
224+
end
225+
226+
test "Symbol.iterator works", %{rt: rt} do
227+
assert {:ok, "x:10,y:20"} =
228+
QuickBEAM.eval(rt, """
229+
const fd = new FormData();
230+
fd.append("x", "10");
231+
fd.append("y", "20");
232+
const pairs = [];
233+
for (const [k, v] of fd) pairs.push(k + ":" + v);
234+
pairs.join(",")
235+
""")
236+
end
237+
end
238+
end

0 commit comments

Comments
 (0)