Fork of daniellemaywood.uk/gleam — Wasm codegen work
Something went wrong. Try again.
4.6 kB · 314 lines
Rust
at wasm
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315// SPDX-License-Identifier: Apache-2.0// SPDX-FileCopyrightText: 2021 The Gleam contributors
use crate::{assert_js, assert_module_error, assert_ts_def};
#[test]fn type_() { assert_js!(r#"pub type Thing"#,);}
#[test]fn module_fn() { assert_js!( r#"@external(javascript, "utils", "inspect")fn show(x: anything) -> Nil"#, );}
#[test]fn at_namespace_module() { assert_js!( r#"@external(javascript, "@namespace/package", "inspect")fn show(x: anything) -> Nil"#, );}
#[test]fn pub_module_fn() { assert_js!( r#"@external(javascript, "utils", "inspect")pub fn show(x: anything) -> Nil"#, );}
#[test]fn pub_module_fn_typescript() { assert_ts_def!( r#"@external(javascript, "utils", "inspect")pub fn show(x: anything) -> Nil"#, );}
#[test]fn same_name_external() { assert_js!( r#"@external(javascript, "thingy", "fetch")pub fn fetch(request: Nil) -> Nil"#, );}
#[test]fn same_module_multiple_imports() { assert_js!( r#"@external(javascript, "./the/module.mjs", "one")pub fn one() -> Nil
@external(javascript, "./the/module.mjs", "two")pub fn two() -> Nil"#, );}
#[test]fn duplicate_import() { assert_js!( r#"@external(javascript, "./the/module.mjs", "dup")pub fn one() -> Nil
@external(javascript, "./the/module.mjs", "dup")pub fn two() -> Nil"#, );}
#[test]fn name_to_escape() { assert_js!( r#"@external(javascript, "./the/module.mjs", "one")pub fn class() -> Nil"#, );}
#[test]fn external_type_typescript() { assert_ts_def!( r#"pub type Queue(a)
@external(javascript, "queue", "new")pub fn new() -> Queue(a)"#, );}
// https://github.com/gleam-lang/gleam/issues/1636#[test]fn external_fn_escaping() { assert_js!( r#"@external(javascript, "./ffi.js", "then")pub fn then(a: a) -> b"#, );}
// https://github.com/gleam-lang/gleam/issues/1954#[test]fn pipe_variable_shadow() { assert_js!( r#"@external(javascript, "module", "string")fn name() -> String
pub fn main() { let name = name() name}"# );}
// https://github.com/gleam-lang/gleam/issues/2090#[test]fn tf_type_name_usage() { assert_ts_def!( r#"pub type TESTitem
@external(javascript, "it", "one")pub fn one(a: TESTitem) -> TESTitem"# );}
#[test]fn attribute_erlang() { assert_js!( r#"@external(erlang, "one", "one_erl")pub fn one(x: Int) -> Int { todo}
pub fn main() { one(1)}"# );}
#[test]fn attribute_javascript() { assert_js!( r#"@external(javascript, "./one.mjs", "oneJs")pub fn one(x: Int) -> Int { todo}
pub fn main() { one(1)}"# );}
#[test]fn erlang_and_javascript() { assert_js!( r#"@external(erlang, "one", "one")@external(javascript, "./one.mjs", "oneJs")pub fn one(x: Int) -> Int { todo}
pub fn main() { one(1)}"# );}
#[test]fn private_attribute_erlang() { assert_js!( r#"@external(erlang, "one", "one_erl")fn one(x: Int) -> Int { todo}
pub fn main() { one(1)}"# );}
#[test]fn private_attribute_javascript() { assert_js!( r#"@external(javascript, "./one.mjs", "oneJs")fn one(x: Int) -> Int { todo}
pub fn main() { one(1)}"# );}
#[test]fn private_erlang_and_javascript() { assert_js!( r#"@external(erlang, "one", "one")@external(javascript, "./one.mjs", "oneJs")fn one(x: Int) -> Int { todo}
pub fn main() { one(1)}"# );}
#[test]fn no_body() { assert_js!( r#"@external(javascript, "one", "one")pub fn one(x: Int) -> Int"# );}
#[test]fn no_module() { assert_module_error!( r#"@external(javascript, "", "one")pub fn one(x: Int) -> Int { 1}"# );}
#[test]fn inline_function() { assert_module_error!( r#"@external(javascript, "blah", "(x => x)")pub fn one(x: Int) -> Int { 1}"# );}
#[test]fn erlang_only() { assert_js!( r#"pub fn should_be_generated(x: Int) -> Int { x}
@external(erlang, "one", "one")pub fn should_not_be_generated(x: Int) -> Int"# );}
#[test]fn both_externals_no_valid_impl() { assert_js!( r#"@external(javascript, "one", "one")pub fn js() -> Nil
@external(erlang, "one", "one")pub fn erl() -> Nil
pub fn should_not_be_generated() { js() erl()}"# );}
#[test]fn discarded_names_in_external_are_passed_correctly() { assert_js!( r#"@external(javascript, "wibble", "wobble")pub fn woo(_ignored: a) -> Nil"# );}