···11use crate::assert_js;
2233+#[test]
44+fn tuple_and_guard() {
55+ assert_js!(
66+ r#"
77+fn go(x) {
88+ case #(1, 2) {
99+ #(1, a) if a == 2 -> 1
1010+ #(_, _) -> 2
1111+ }
1212+}
1313+"#,
1414+ )
1515+}
1616+1717+#[test]
1818+fn guard_variable_only_brought_into_scope_when_needed() {
1919+ assert_js!(
2020+ r#"
2121+fn go(x) {
2222+ case x {
2323+ // We want `a` to be defined before the guard check, and
2424+ // `b` to be defined only if the predicate on a matches!
2525+ [a, b] if a == 1 -> a + b
2626+ _ -> 2
2727+ }
2828+}
2929+"#
3030+ )
3131+}
3232+3333+// https://github.com/gleam-lang/gleam/issues/4221
3434+#[test]
3535+fn guard_variable_only_brought_into_scope_when_needed_1() {
3636+ assert_js!(
3737+ r#"
3838+pub fn main() {
3939+ case 1 {
4040+ i if i == 1 -> True
4141+ i if i < 2 -> True
4242+ _ -> False
4343+ }
4444+}
4545+"#
4646+ )
4747+}
4848+349// https://github.com/gleam-lang/gleam/issues/1187
450#[test]
551fn pointless() {
···11+---
22+source: compiler-core/src/javascript/tests/case.rs
33+expression: "\nfn go(x) {\n case x {\n // We want `a` to be defined before the guard check, and\n // `b` to be defined only if the predicate on a matches!\n [a, b] if a == 1 -> a + b\n _ -> 2\n }\n}\n"
44+---
55+----- SOURCE CODE
66+77+fn go(x) {
88+ case x {
99+ // We want `a` to be defined before the guard check, and
1010+ // `b` to be defined only if the predicate on a matches!
1111+ [a, b] if a == 1 -> a + b
1212+ _ -> 2
1313+ }
1414+}
1515+1616+1717+----- COMPILED JAVASCRIPT
1818+function go(x) {
1919+ if (x.hasLength(0)) {
2020+ return 2;
2121+ } else {
2222+ if (x.tail.hasLength(0)) {
2323+ return 2;
2424+ } else {
2525+ if (x.tail.tail.hasLength(0)) {
2626+ let a = x.head;
2727+ if (a === 1) {
2828+ let b = x.tail.head;
2929+ return a + b;
3030+ } else {
3131+ return 2;
3232+ }
3333+ } else {
3434+ return 2;
3535+ }
3636+ }
3737+ }
3838+}
···1717export function main() {
1818 let text = "first defined";
1919 let $ = "defined again";
2020- {
2121- let text$1 = $;
2222- undefined
2323- }
2424- let text$1 = "a third time";
2525- return text$1;
2020+ let text$1 = $;
2121+ undefined
2222+ let text$2 = "a third time";
2323+ return text$2;
2624}
···1818 let text = "first defined";
1919 let _block;
2020 let $ = "defined again";
2121- {
2222- let text$1 = $;
2323- _block = undefined;
2424- }
2121+ let text$1 = $;
2222+ _block = undefined;
2523 let other = _block;
2626- let text$1 = "a third time";
2727- return text$1;
2424+ let text$2 = "a third time";
2525+ return text$2;
2826}
···16161717export function main() {
1818 let $ = 5;
1919- if (isEqual(toBitArray([$]), toBitArray([$]))) {
2020- let z = $;
1919+ let z = $;
2020+ if (isEqual(toBitArray([z]), toBitArray([z]))) {
2121 return undefined;
2222 } else {
2323 return undefined;
···19192020function func() {
2121 let $ = new B();
2222- if (isEqual($, new B())) {
2323- let x = $;
2222+ let x = $;
2323+ if (isEqual(x, new B())) {
2424 return true;
2525 } else {
2626 return false;
···3232export function main() {
3333 let given_name = "jack";
3434 let raiden = new Person("raiden", "jack", 31);
3535- if (given_name === raiden.name) {
3636- let name = given_name;
3535+ let name = given_name;
3636+ if (name === raiden.name) {
3737 return "It's jack";
3838 } else {
3939 return "It's not jack";
···19192020export function main() {
2121 let name = "Tony Stark";
2222- if (name === $hero.ironman.name) {
2323- let n = name;
2222+ let n = name;
2323+ if (n === $hero.ironman.name) {
2424 return true;
2525 } else {
2626 return false;
···19192020export function main() {
2121 let name = "Tony Stark";
2222- if (name === $myhero.ironman.name) {
2323- let n = name;
2222+ let n = name;
2323+ if (n === $myhero.ironman.name) {
2424 return true;
2525 } else {
2626 return false;
···19192020export function main() {
2121 let name = "Tony Stark";
2222- if (name === $submodule.ironman.name) {
2323- let n = name;
2222+ let n = name;
2323+ if (n === $submodule.ironman.name) {
2424 return true;
2525 } else {
2626 return false;
···19192020export function main() {
2121 let name = "Bruce Wayne";
2222- if (name === $hero.batman.secret_identity.name) {
2323- let n = name;
2222+ let n = name;
2323+ if (n === $hero.batman.secret_identity.name) {
2424 return true;
2525 } else {
2626 return false;
···19192020export function main() {
2121 let name = "Tony Stark";
2222- if (name === ($hero.ironman)) {
2323- let n = name;
2222+ let n = name;
2323+ if (n === ($hero.ironman)) {
2424 return true;
2525 } else {
2626 return false;
···19192020export function main() {
2121 let name = "Tony Stark";
2222- if (name === $hero.hero[1]) {
2323- let n = name;
2222+ let n = name;
2323+ if (n === $hero.hero[1]) {
2424 return true;
2525 } else {
2626 return false;
···13131414----- COMPILED JAVASCRIPT
1515export function main(xs) {
1616- if (xs[0]) {
1717- let x = xs[0];
1616+ let x = xs[0];
1717+ if (x) {
1818 return 1;
1919 } else {
2020 return 0;
···2424}
25252626function go(x) {
2727- if (x instanceof Box && x.b instanceof Box) {
2828- let a = x.b.a;
2929- let b = x.b.b;
3030- return a + b;
3131- } else {
3232- return 1;
3333- }
2727+ let a = x.b.a;
2828+ let b = x.b.b;
2929+ return a + b;
3430}
···1818----- COMPILED JAVASCRIPT
1919export function go(x) {
2020 if (x.startsWith("\u{0032} ")) {
2121- let name = x.slice(2);
2221 let greeting = "\u{0032} ";
2222+ let name = x.slice(2);
2323 return greeting;
2424 } else if (x.startsWith("\u{0007ff} ")) {
2525- let name = x.slice(2);
2625 let greeting = "\u{0007ff} ";
2626+ let name = x.slice(2);
2727 return greeting;
2828 } else if (x.startsWith("\u{00ffff} ")) {
2929- let name = x.slice(2);
3029 let greeting = "\u{00ffff} ";
3030+ let name = x.slice(2);
3131 return greeting;
3232 } else if (x.startsWith("\u{10ffff} ")) {
3333- let name = x.slice(3);
3433 let greeting = "\u{10ffff} ";
3434+ let name = x.slice(3);
3535 return greeting;
3636 } else {
3737 return "Unknown";