Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

gleam / test / language / test / language / string_pattern_matching_test.gleam
6.9 kB 262 lines
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}