Fork of daniellemaywood.uk/gleam — Wasm codegen work
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2026 The Gleam contributors
3
4pub fn case_string_prefix_match_test() {
5 let string = "12345"
6 let string_2 = case string {
7 "0" <> rest -> rest
8 "123" <> rest -> rest
9 _ -> ""
10 }
11 assert "45" == string_2
12}
13
14pub fn match_emoji_test() {
15 let string = "🫥 is neutral dotted"
16 let string_2 = case string {
17 "🫥" <> rest -> rest
18 _ -> panic
19 }
20 assert " is neutral dotted" == string_2
21}
22
23pub fn match_theta_test() {
24 let string = "Θ wibble wobble"
25 let string_2 = case string {
26 "Θ" <> rest -> rest
27 _ -> panic
28 }
29 assert " wibble wobble" == string_2
30}
31
32pub fn match_flag_emoji_test() {
33 let string = "🇺🇸 is a cluster"
34 let string_2 = case string {
35 "🇺🇸" <> rest -> rest
36 _ -> panic
37 }
38 assert " is a cluster" == string_2
39}
40
41pub fn match_backslash_test() {
42 let string = "\" is a backslash"
43 let string_2 = case string {
44 "\"" <> rest -> rest
45 _ -> panic
46 }
47 assert " is a backslash" == string_2
48}
49
50pub fn match_newline_test() {
51 let string = "\n is a newline"
52 let string_2 = case string {
53 "\n" <> rest -> rest
54 _ -> panic
55 }
56 assert " is a newline" == string_2
57}
58
59pub fn match_escaped_newline_test() {
60 let string = "\\n is a newline that escaped"
61 let string_2 = case string {
62 "\\n" <> rest -> rest
63 _ -> panic
64 }
65 assert " is a newline that escaped" == string_2
66}
67
68pub fn multiple_single_character_matches() {
69 let string = "1234"
70 let string_2 = case string {
71 "0" <> _ -> panic
72 "1" <> rest -> rest
73 "2" <> _ -> panic
74 _ -> panic
75 }
76 assert "234" == string_2
77}
78
79// https://github.com/gleam-lang/gleam/issues/5856
80pub fn overlapping_string_prefixes_with_guard_test() {
81 let classify = fn(input: String, flag: Bool) -> String {
82 case input {
83 "aa" <> _rest if flag -> "wibble"
84 "a" <> _rest if flag -> "wobble"
85 "a" <> _rest -> "woo"
86 _ -> "other"
87 }
88 }
89
90 assert classify("aabc", True) == "wibble"
91 assert classify("aabc", False) == "woo"
92 assert classify("abc", True) == "wobble"
93 assert classify("abc", False) == "woo"
94 assert classify("xyz", True) == "other"
95}
96
97// https://github.com/gleam-lang/gleam/issues/5856
98pub fn string_prefix_binding_rest_with_guard_test() {
99 let classify = fn(input: String, flag: Bool) -> String {
100 case input {
101 "aa" <> rest if flag -> rest
102 "a" <> rest -> rest
103 _ -> "other"
104 }
105 }
106
107 assert classify("aax", True) == "x"
108 assert classify("aax", False) == "ax"
109 assert classify("abc", True) == "bc"
110 assert classify("z", True) == "other"
111}
112
113// https://github.com/gleam-lang/gleam/issues/5856
114pub fn non_overlapping_sibling_string_prefix_test() {
115 let classify = fn(input: String, a: Bool, b: Bool) -> String {
116 case input {
117 "aa" <> _ if a -> "aa"
118 "a" <> _ if b -> "a-guard"
119 "ac" <> _ -> "ac"
120 _ -> "other"
121 }
122 }
123
124 assert classify("aaz", True, False) == "aa"
125 assert classify("aaz", False, True) == "a-guard"
126 assert classify("aaz", False, False) == "other"
127 assert classify("acz", False, False) == "ac"
128 assert classify("acz", False, True) == "a-guard"
129 assert classify("xyz", False, False) == "other"
130}
131
132// https://github.com/gleam-lang/gleam/issues/5856
133pub fn exact_string_after_longer_prefix_test() {
134 let classify = fn(input: String, a: Bool, b: Bool) -> String {
135 case input {
136 "aa" <> _ if a -> "aa-prefix"
137 "a" <> _ if b -> "a-prefix"
138 "a" -> "exact-a"
139 _ -> "other"
140 }
141 }
142
143 assert classify("aa", True, False) == "aa-prefix"
144 assert classify("a", False, True) == "a-prefix"
145 assert classify("a", False, False) == "exact-a"
146 assert classify("ab", False, False) == "other"
147 assert classify("x", False, False) == "other"
148}
149
150// https://github.com/gleam-lang/gleam/issues/5856
151pub fn string_prefix_name_binding_after_longer_prefix_test() {
152 let classify = fn(input: String, flag: Bool) -> String {
153 case input {
154 "aa" <> _ if flag -> "aa"
155 "a" as first <> rest -> rest <> first
156 _ -> "other"
157 }
158 }
159
160 assert classify("aabc", True) == "aa"
161 assert classify("aabc", False) == "abca"
162 assert classify("axyz", True) == "xyza"
163 assert classify("z", True) == "other"
164}
165
166// https://github.com/gleam-lang/gleam/issues/5856
167pub fn string_prefix_guard_on_bound_variable_falls_through_test() {
168 let classify = fn(input: String) -> String {
169 case input {
170 "aa" <> rest if rest == "x" -> "aa-x"
171 "a" <> rest -> rest
172 _ -> "other"
173 }
174 }
175
176 assert classify("aax") == "aa-x"
177 assert classify("aay") == "ay"
178 assert classify("abc") == "bc"
179 assert classify("z") == "other"
180}
181
182// https://github.com/gleam-lang/gleam/issues/5856
183pub fn string_prefix_nested_guard_falls_through_to_shorter_test() {
184 let classify = fn(input: String, flag: Bool) -> String {
185 case input {
186 "w" <> _ if flag -> "w"
187 "wibble" <> rest if rest == "x" -> rest
188 "wib" <> rest -> rest
189 _ -> "other"
190 }
191 }
192
193 assert classify("wabc", True) == "w"
194 assert classify("wibblex", False) == "x"
195 assert classify("wibbley", False) == "bley"
196 assert classify("wibz", False) == "z"
197 assert classify("xyz", False) == "other"
198}
199
200// https://github.com/gleam-lang/gleam/issues/5856
201pub fn string_prefix_name_binding_falls_through_to_shorter_test() {
202 let classify = fn(input: String) -> String {
203 case input {
204 "aa" <> rest if rest == "x" -> rest
205 "a" as first <> rest -> rest <> first
206 _ -> "other"
207 }
208 }
209
210 assert classify("aax") == "x"
211 assert classify("aay") == "aya"
212 assert classify("abc") == "bca"
213 assert classify("z") == "other"
214}
215
216// https://github.com/gleam-lang/gleam/issues/5856
217pub fn string_prefix_discard_falls_through_to_shorter_test() {
218 let classify = fn(input: String) -> String {
219 case input {
220 "aa" <> rest if rest == "x" -> rest
221 "a" <> _ -> "short"
222 _ -> "other"
223 }
224 }
225
226 assert classify("aax") == "x"
227 assert classify("aay") == "short"
228 assert classify("ab") == "short"
229 assert classify("z") == "other"
230}
231
232// https://github.com/gleam-lang/gleam/issues/5856
233pub fn string_prefix_multibyte_falls_through_to_shorter_test() {
234 let classify = fn(input: String) -> String {
235 case input {
236 "🫥a" <> rest if rest == "x" -> rest
237 "🫥" <> rest -> rest
238 _ -> "other"
239 }
240 }
241
242 assert classify("🫥ax") == "x"
243 assert classify("🫥ay") == "ay"
244 assert classify("🫥z") == "z"
245 assert classify("abc") == "other"
246}
247
248// https://github.com/gleam-lang/gleam/issues/5856
249pub fn disjoint_string_prefixes_with_guard_test() {
250 let classify = fn(input: String) -> String {
251 case input {
252 "aa" <> rest if rest == "x" -> rest
253 "b" <> _ -> "b-start"
254 _ -> "other"
255 }
256 }
257
258 assert classify("aax") == "x"
259 assert classify("aay") == "other"
260 assert classify("bcd") == "b-start"
261 assert classify("zzz") == "other"
262}