diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__strings__disjoint_string_prefixes_with_guard.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__strings__disjoint_string_prefixes_with_guard.snap new file mode 100644 index 000000000..737d0b1a0 --- /dev/null +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__strings__disjoint_string_prefixes_with_guard.snap @@ -0,0 +1,30 @@ +--- +source: compiler-core/src/javascript/tests/strings.rs +expression: "\npub fn classify(input: String) -> String {\n case input {\n \"aa\" <> rest if rest == \"x\" -> rest\n \"b\" <> _ -> \"b-start\"\n _ -> \"other\"\n }\n}\n" +--- +----- SOURCE CODE + +pub fn classify(input: String) -> String { + case input { + "aa" <> rest if rest == "x" -> rest + "b" <> _ -> "b-start" + _ -> "other" + } +} + + +----- COMPILED JAVASCRIPT +export function classify(input) { + if (input.startsWith("aa")) { + let rest = input.slice(2); + if (rest === "x") { + return rest; + } else { + return "other"; + } + } else if (input.charCodeAt(0) === 98) { + return "b-start"; + } else { + return "other"; + } +} diff --git a/compiler-core/src/javascript/tests/strings.rs b/compiler-core/src/javascript/tests/strings.rs index 873495abf..28323dbdc 100644 --- a/compiler-core/src/javascript/tests/strings.rs +++ b/compiler-core/src/javascript/tests/strings.rs @@ -420,3 +420,19 @@ pub fn classify(input: String) -> String { "#, ); } + +// 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" + } +} +"#, + ); +} diff --git a/test/language/test/language/string_pattern_matching_test.gleam b/test/language/test/language/string_pattern_matching_test.gleam index 3e88523de..098c8a9d3 100644 --- a/test/language/test/language/string_pattern_matching_test.gleam +++ b/test/language/test/language/string_pattern_matching_test.gleam @@ -244,3 +244,19 @@ pub fn string_prefix_multibyte_falls_through_to_shorter_test() { assert classify("🫥z") == "z" assert classify("abc") == "other" } + +// https://github.com/gleam-lang/gleam/issues/5856 +pub fn disjoint_string_prefixes_with_guard_test() { + let classify = fn(input: String) -> String { + case input { + "aa" <> rest if rest == "x" -> rest + "b" <> _ -> "b-start" + _ -> "other" + } + } + + assert classify("aax") == "x" + assert classify("aay") == "other" + assert classify("bcd") == "b-start" + assert classify("zzz") == "other" +}