Fork of daniellemaywood.uk/gleam — Wasm codegen work
Something went wrong. Try again.
6.9 kB · 438 lines
Rust
at wasm
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439// SPDX-License-Identifier: Apache-2.0// SPDX-FileCopyrightText: 2021 The Gleam contributors
use crate::assert_js;
#[test]fn unicode1() { assert_js!( r#"pub fn emoji() -> String { "\u{1f600}"}"#, );}
#[test]fn unicode2() { assert_js!( r#"pub fn y_with_dieresis() -> String { "\u{0308}y"}"#, );}
#[test]fn ascii_as_unicode_escape_sequence() { assert_js!( r#"pub fn y() -> String { "\u{79}"}"#, )}
#[test]fn unicode_escape_sequence_6_digits() { assert_js!( r#"pub fn unicode_escape_sequence_6_digits() -> String { "\u{10abcd}"}"#, );}
#[test]fn string_literals() { assert_js!( r#"pub fn go() { "Hello, Gleam!"}"#, );}
#[test]fn string_patterns() { assert_js!( r#"pub fn go(x) { let assert "Hello" = x}"#, );}
#[test]fn equality() { assert_js!( r#"pub fn go(a) { a == "ok" a != "ok" a == a}"#, );}
#[test]fn case() { assert_js!( r#"pub fn go(a) { case a { "" -> 0 "one" -> 1 "two" -> 2 _ -> 3 }}"#, );}
#[test]fn string_concat() { assert_js!( r#"pub fn go() { "Hello, " <> "Joe"}"#, );}
#[test]fn string_prefix() { assert_js!( r#"pub fn go(x) { case x { "Hello, " <> name -> name _ -> "Unknown" }}"#, );}
#[test]fn string_prefix_utf16() { assert_js!( r#"pub fn go(x) { case "Θ wibble wobble" { "Θ" <> rest -> rest _ -> "" } case "🫥 is neutral dotted" { "🫥" <> rest -> rest _ -> "" } case "🇺🇸 is a cluster" { "🇺🇸" <> rest -> rest _ -> "" } case "\" is a an escaped quote" { "\"" <> rest -> rest _ -> "" } case "\\ is a an escaped backslash" { "\\" <> rest -> rest _ -> "" }}"#, );}
#[test]fn discard_concat_rest_pattern() { // We can discard the right hand side, it parses and type checks ok assert_js!( r#"pub fn go(x) { case x { "Hello, " <> _ -> Nil _ -> Nil }}"#, );}
#[test]fn string_prefix_assignment() { assert_js!( r#"pub fn go(x) { case x { "Hello, " as greeting <> name -> greeting _ -> "Unknown" }}"#, )}
#[test]fn string_prefix_assignment_with_utf_escape_sequence() { assert_js!( r#"pub fn go(x) { case x { "\u{0032} " as greeting <> name -> greeting "\u{0007ff} " as greeting <> name -> greeting "\u{00ffff} " as greeting <> name -> greeting "\u{10ffff} " as greeting <> name -> greeting _ -> "Unknown" }}"#, )}
#[test]fn string_prefix_shadowing() { assert_js!( r#"pub fn go(x) { case x { "Hello, " as x <> name -> x _ -> "Unknown" }}"#, )}
// https://github.com/gleam-lang/gleam/issues/2471#[test]fn string_prefix_assignment_with_multiple_subjects() { assert_js!( r#"pub fn go(x) { case x { "1" as prefix <> _ | "11" as prefix <> _ -> prefix _ -> "Unknown" }}"#, )}
#[test]fn const_concat() { assert_js!( r#"pub const cute = "cute"pub const cute_bee = cute <> "bee"
pub fn main() { cute_bee}"# );}
#[test]fn const_concat_multiple() { assert_js!( r#"pub const cute = "cute"pub const cute_bee = cute <> "bee"pub const cute_cute_bee_buzz = cute <> cute_bee <> "buzz"
pub fn main() { cute_cute_bee_buzz}"# );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn overlapping_string_prefixes_with_guard() { assert_js!( r#"pub fn classify(input: String, flag: Bool) -> String { case input { "aa" <> _rest if flag -> "wibble" "a" <> _rest if flag -> "wobble" "a" <> _rest -> "woo" _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_binding_rest_with_guard() { assert_js!( r#"pub fn classify(input: String, flag: Bool) -> String { case input { "aa" <> rest if flag -> rest "a" <> rest -> rest _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn non_overlapping_sibling_string_prefix() { assert_js!( r#"pub fn classify(input: String, a: Bool, b: Bool) -> String { case input { "aa" <> _ if a -> "aa" "a" <> _ if b -> "a-guard" "ac" <> _ -> "ac" _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn exact_string_after_longer_prefix() { assert_js!( r#"pub fn classify(input: String, a: Bool, b: Bool) -> String { case input { "aa" <> _ if a -> "aa-prefix" "a" <> _ if b -> "a-prefix" "a" -> "exact-a" _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_name_binding_after_longer_prefix() { assert_js!( r#"pub fn classify(input: String, flag: Bool) -> String { case input { "aa" <> _ if flag -> "aa" "a" as first <> rest -> rest <> first _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_guard_on_bound_variable_falls_through() { assert_js!( r#"pub fn classify(input: String) -> String { case input { "aa" <> rest if rest == "x" -> "aa-x" "a" <> rest -> rest _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_nested_guard_falls_through_to_shorter() { assert_js!( r#"pub fn classify(input: String, flag: Bool) -> String { case input { "w" <> _ if flag -> "w" "wibble" <> rest if rest == "x" -> rest "wib" <> rest -> rest _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_name_binding_falls_through_to_shorter() { assert_js!( r#"pub fn classify(input: String) -> String { case input { "aa" <> rest if rest == "x" -> rest "a" as first <> rest -> rest <> first _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_discard_falls_through_to_shorter() { assert_js!( r#"pub fn classify(input: String) -> String { case input { "aa" <> rest if rest == "x" -> rest "a" <> _ -> "short" _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn string_prefix_multibyte_falls_through_to_shorter() { assert_js!( r#"pub fn classify(input: String) -> String { case input { "🫥a" <> rest if rest == "x" -> rest "🫥" <> rest -> rest _ -> "other" }}"#, );}
// https://github.com/gleam-lang/gleam/issues/5856#[test]fn disjoint_string_prefixes_with_guard() { assert_js!( r#"pub fn classify(input: String) -> String { case input { "aa" <> rest if rest == "x" -> rest "b" <> _ -> "b-start" _ -> "other" }}"#, );}