Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

gleam / compiler-core / src / javascript / tests / externals.rs
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}