Fork of daniellemaywood.uk/gleam — Wasm codegen work
3.9 kB
214 lines
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2021 The Gleam contributors
3
4use crate::assert_js;
5use crate::javascript::tests::CURRENT_PACKAGE;
6
7#[test]
8fn empty_module() {
9 // Renders an export statement to ensure it's an ESModule
10 assert_js!("", "export {}\n");
11}
12
13#[test]
14fn unqualified_fn_call() {
15 assert_js!(
16 ("rocket_ship", r#"pub fn launch() { 1 }"#),
17 r#"import rocket_ship.{launch}
18pub fn go() { launch() }
19"#,
20 );
21}
22
23#[test]
24fn aliased_unqualified_fn_call() {
25 assert_js!(
26 ("rocket_ship", r#"pub fn launch() { 1 }"#),
27 r#"import rocket_ship.{launch as boom_time}
28pub fn go() { boom_time() }
29"#,
30 );
31}
32
33#[test]
34fn multiple_unqualified_fn_call() {
35 assert_js!(
36 (
37 CURRENT_PACKAGE,
38 "rocket_ship",
39 r#"
40pub fn a() { 1 }
41pub fn b() { 2 }"#
42 ),
43 r#"import rocket_ship.{a,b as bb}
44pub fn go() { a() + bb() }
45"#,
46 );
47}
48
49#[test]
50fn constant() {
51 assert_js!(
52 ("rocket_ship", r#"pub const x = 1"#),
53 r#"
54import rocket_ship
55pub fn go() { rocket_ship.x }
56"#,
57 );
58}
59
60#[test]
61fn alias_aliased_constant() {
62 assert_js!(
63 ("rocket_ship", r#"pub const x = 1"#),
64 r#"
65import rocket_ship.{ x as y }
66pub const z = y
67"#,
68 );
69}
70
71#[test]
72fn renamed_module() {
73 assert_js!(
74 ("x", r#"pub const v = 1"#),
75 r#"
76import x as y
77pub const z = y.v
78"#,
79 );
80}
81
82#[test]
83fn nested_module_constant() {
84 assert_js!(
85 (
86 CURRENT_PACKAGE,
87 "rocket_ship/launcher",
88 r#"pub const x = 1"#
89 ),
90 r#"
91import rocket_ship/launcher
92pub fn go() { launcher.x }
93"#,
94 );
95}
96
97#[test]
98fn alias_constant() {
99 assert_js!(
100 ("rocket_ship", r#"pub const x = 1"#),
101 r#"
102import rocket_ship as boop
103pub fn go() { boop.x }
104"#,
105 );
106}
107
108#[test]
109fn alias_fn_call() {
110 assert_js!(
111 ("rocket_ship", r#"pub fn go() { 1 }"#),
112 r#"
113import rocket_ship as boop
114pub fn go() { boop.go() }
115"#,
116 );
117}
118
119#[test]
120fn nested_fn_call() {
121 assert_js!(
122 ("one/two", r#"pub fn go() { 1 }"#),
123 r#"import one/two
124pub fn go() { two.go() }"#,
125 );
126}
127
128#[test]
129fn nested_nested_fn_call() {
130 assert_js!(
131 ("one/two/three", r#"pub fn go() { 1 }"#),
132 r#"import one/two/three
133pub fn go() { three.go() }"#,
134 );
135}
136
137#[test]
138fn different_package_import() {
139 assert_js!(
140 ("other_package", "one", r#"pub fn go() { 1 }"#),
141 r#"import one
142pub fn go() { one.go() }
143"#,
144 );
145}
146
147#[test]
148fn nested_same_package() {
149 assert_js!(
150 ("one/two/three", r#"pub fn go() { 1 }"#),
151 r#"import one/two/three
152pub fn go() { three.go() }
153"#,
154 );
155}
156
157#[test]
158fn discarded_duplicate_import() {
159 assert_js!(
160 ("esa/rocket_ship", r#"pub fn go() { 1 }"#),
161 ("nasa/rocket_ship", r#"pub fn go() { 1 }"#),
162 r#"
163import esa/rocket_ship
164import nasa/rocket_ship as _nasa_rocket
165pub fn go() { rocket_ship.go() }
166"#
167 );
168}
169
170#[test]
171fn discarded_duplicate_import_with_unqualified() {
172 assert_js!(
173 ("esa/rocket_ship", r#"pub fn go() { 1 }"#),
174 ("nasa/rocket_ship", r#"pub fn go() { 1 }"#),
175 r#"
176import esa/rocket_ship
177import nasa/rocket_ship.{go} as _nasa_rocket
178pub fn esa_go() { rocket_ship.go() }
179pub fn nasa_go() { go() }
180"#
181 );
182}
183
184#[test]
185fn import_with_keyword() {
186 assert_js!(
187 (
188 CURRENT_PACKAGE,
189 "rocket_ship",
190 r#"
191pub const class = 1
192pub const in = 2
193"#
194 ),
195 r#"
196import rocket_ship.{class, in as while}
197pub fn main() {
198 #(class, while)
199}
200"#
201 );
202}
203
204// https://github.com/gleam-lang/gleam/issues/3004
205#[test]
206fn constant_module_access_with_keyword() {
207 assert_js!(
208 ("rocket_ship", r#"pub const class = 1"#),
209 r#"
210import rocket_ship
211pub const variable = rocket_ship.class
212"#,
213 );
214}