Fork of daniellemaywood.uk/gleam — Wasm codegen work
4.6 kB
314 lines
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2021 The Gleam contributors
3
4use crate::{assert_js, assert_module_error, assert_ts_def};
5
6#[test]
7fn type_() {
8 assert_js!(r#"pub type Thing"#,);
9}
10
11#[test]
12fn module_fn() {
13 assert_js!(
14 r#"
15@external(javascript, "utils", "inspect")
16fn show(x: anything) -> Nil"#,
17 );
18}
19
20#[test]
21fn at_namespace_module() {
22 assert_js!(
23 r#"
24@external(javascript, "@namespace/package", "inspect")
25fn show(x: anything) -> Nil"#,
26 );
27}
28
29#[test]
30fn pub_module_fn() {
31 assert_js!(
32 r#"
33@external(javascript, "utils", "inspect")
34pub fn show(x: anything) -> Nil"#,
35 );
36}
37
38#[test]
39fn pub_module_fn_typescript() {
40 assert_ts_def!(
41 r#"
42@external(javascript, "utils", "inspect")
43pub fn show(x: anything) -> Nil"#,
44 );
45}
46
47#[test]
48fn same_name_external() {
49 assert_js!(
50 r#"
51@external(javascript, "thingy", "fetch")
52pub fn fetch(request: Nil) -> Nil"#,
53 );
54}
55
56#[test]
57fn same_module_multiple_imports() {
58 assert_js!(
59 r#"
60@external(javascript, "./the/module.mjs", "one")
61pub fn one() -> Nil
62
63@external(javascript, "./the/module.mjs", "two")
64pub fn two() -> Nil
65"#,
66 );
67}
68
69#[test]
70fn duplicate_import() {
71 assert_js!(
72 r#"
73@external(javascript, "./the/module.mjs", "dup")
74pub fn one() -> Nil
75
76@external(javascript, "./the/module.mjs", "dup")
77pub fn two() -> Nil
78"#,
79 );
80}
81
82#[test]
83fn name_to_escape() {
84 assert_js!(
85 r#"
86@external(javascript, "./the/module.mjs", "one")
87pub fn class() -> Nil
88"#,
89 );
90}
91
92#[test]
93fn external_type_typescript() {
94 assert_ts_def!(
95 r#"pub type Queue(a)
96
97@external(javascript, "queue", "new")
98pub fn new() -> Queue(a)
99"#,
100 );
101}
102
103// https://github.com/gleam-lang/gleam/issues/1636
104#[test]
105fn external_fn_escaping() {
106 assert_js!(
107 r#"
108@external(javascript, "./ffi.js", "then")
109pub fn then(a: a) -> b"#,
110 );
111}
112
113// https://github.com/gleam-lang/gleam/issues/1954
114#[test]
115fn pipe_variable_shadow() {
116 assert_js!(
117 r#"
118@external(javascript, "module", "string")
119fn name() -> String
120
121pub fn main() {
122 let name = name()
123 name
124}
125"#
126 );
127}
128
129// https://github.com/gleam-lang/gleam/issues/2090
130#[test]
131fn tf_type_name_usage() {
132 assert_ts_def!(
133 r#"
134pub type TESTitem
135
136@external(javascript, "it", "one")
137pub fn one(a: TESTitem) -> TESTitem
138"#
139 );
140}
141
142#[test]
143fn attribute_erlang() {
144 assert_js!(
145 r#"
146@external(erlang, "one", "one_erl")
147pub fn one(x: Int) -> Int {
148 todo
149}
150
151pub fn main() {
152 one(1)
153}
154"#
155 );
156}
157
158#[test]
159fn attribute_javascript() {
160 assert_js!(
161 r#"
162@external(javascript, "./one.mjs", "oneJs")
163pub fn one(x: Int) -> Int {
164 todo
165}
166
167pub fn main() {
168 one(1)
169}
170"#
171 );
172}
173
174#[test]
175fn erlang_and_javascript() {
176 assert_js!(
177 r#"
178@external(erlang, "one", "one")
179@external(javascript, "./one.mjs", "oneJs")
180pub fn one(x: Int) -> Int {
181 todo
182}
183
184pub fn main() {
185 one(1)
186}
187"#
188 );
189}
190
191#[test]
192fn private_attribute_erlang() {
193 assert_js!(
194 r#"
195@external(erlang, "one", "one_erl")
196fn one(x: Int) -> Int {
197 todo
198}
199
200pub fn main() {
201 one(1)
202}
203"#
204 );
205}
206
207#[test]
208fn private_attribute_javascript() {
209 assert_js!(
210 r#"
211@external(javascript, "./one.mjs", "oneJs")
212fn one(x: Int) -> Int {
213 todo
214}
215
216pub fn main() {
217 one(1)
218}
219"#
220 );
221}
222
223#[test]
224fn private_erlang_and_javascript() {
225 assert_js!(
226 r#"
227@external(erlang, "one", "one")
228@external(javascript, "./one.mjs", "oneJs")
229fn one(x: Int) -> Int {
230 todo
231}
232
233pub fn main() {
234 one(1)
235}
236"#
237 );
238}
239
240#[test]
241fn no_body() {
242 assert_js!(
243 r#"
244@external(javascript, "one", "one")
245pub fn one(x: Int) -> Int
246"#
247 );
248}
249
250#[test]
251fn no_module() {
252 assert_module_error!(
253 r#"
254@external(javascript, "", "one")
255pub fn one(x: Int) -> Int {
256 1
257}
258"#
259 );
260}
261
262#[test]
263fn inline_function() {
264 assert_module_error!(
265 r#"
266@external(javascript, "blah", "(x => x)")
267pub fn one(x: Int) -> Int {
268 1
269}
270"#
271 );
272}
273
274#[test]
275fn erlang_only() {
276 assert_js!(
277 r#"
278pub fn should_be_generated(x: Int) -> Int {
279 x
280}
281
282@external(erlang, "one", "one")
283pub fn should_not_be_generated(x: Int) -> Int
284"#
285 );
286}
287
288#[test]
289fn both_externals_no_valid_impl() {
290 assert_js!(
291 r#"
292@external(javascript, "one", "one")
293pub fn js() -> Nil
294
295@external(erlang, "one", "one")
296pub fn erl() -> Nil
297
298pub fn should_not_be_generated() {
299 js()
300 erl()
301}
302"#
303 );
304}
305
306#[test]
307fn discarded_names_in_external_are_passed_correctly() {
308 assert_js!(
309 r#"
310@external(javascript, "wibble", "wobble")
311pub fn woo(_ignored: a) -> Nil
312"#
313 );
314}