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

Configure Feed

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

gleam / compiler-core / src / erlang / tests / bit_arrays.rs
7.8 kB 553 lines
1use crate::assert_erl; 2 3#[test] 4fn bit_array() { 5 assert_erl!( 6 r#"pub fn main() { 7 let a = 1 8 let simple = <<1, a>> 9 let complex = <<4:int-big, 5.0:little-float, 6:native-int>> 10 let assert <<7:2, 8:size(3), b:bytes-size(4)>> = <<1>> 11 let assert <<c:8-unit(1), d:bytes-size(2)-unit(2)>> = <<1>> 12 13 simple 14} 15"# 16 ); 17} 18 19#[test] 20fn bit_array_float() { 21 assert_erl!( 22 r#"pub fn main() { 23 let b = 16 24 let floats = <<1.0:16-float, 5.0:float-32, 6.0:float-64-little, 1.0:float-size(b)>> 25 let assert <<1.0:16-float, 5.0:float-32, 6.0:float-64-little, 1.0:float-size(b)>> = floats 26}"# 27 ); 28} 29 30#[test] 31fn bit_array1() { 32 assert_erl!( 33 r#"pub fn x() { 2 } 34pub fn main() { 35 let a = -1 36 let b = <<a:unit(2)-size(a * 2), a:size(3 + x())-unit(1)>> 37 38 b 39} 40"# 41 ); 42} 43 44#[test] 45fn bit_array2() { 46 assert_erl!( 47 r#"pub fn main() { 48 let a = 1 49 let assert <<b, 1>> = <<1, a>> 50 b 51} 52"# 53 ); 54} 55 56#[test] 57fn bit_array3() { 58 assert_erl!( 59 r#"pub fn main() { 60 let a = <<"test":utf8>> 61 let assert <<b:utf8_codepoint, "st":utf8>> = a 62 b 63} 64"# 65 ); 66} 67 68#[test] 69fn bit_array4() { 70 assert_erl!( 71 r#"fn x() { 1 } 72pub fn main() { 73 let a = <<x():int>> 74 a 75} 76"# 77 ); 78} 79 80#[test] 81fn bit_array5() { 82 assert_erl!( 83 r#"const bit_size = 8 84pub fn main() { 85 let a = <<10:size(bit_size)>> 86 a 87} 88"# 89 ); 90} 91 92#[test] 93fn bit_array_discard() { 94 // https://github.com/gleam-lang/gleam/issues/704 95 96 assert_erl!( 97 r#" 98pub fn bit_array_discard(x) -> Bool { 99 case x { 100 <<_:utf8, rest:bytes>> -> True 101 _ -> False 102 } 103} 104 "# 105 ); 106} 107 108#[test] 109fn bit_array_discard1() { 110 assert_erl!( 111 r#" 112pub fn bit_array_discard(x) -> Bool { 113 case x { 114 <<_discardme:utf8, rest:bytes>> -> True 115 _ -> False 116 } 117} 118"# 119 ); 120} 121 122#[test] 123fn bit_array_declare_and_use_var() { 124 assert_erl!( 125 r#"pub fn go(x) { 126 let assert <<name_size:8, name:bytes-size(name_size)>> = x 127 name 128}"# 129 ); 130} 131 132// https://github.com/gleam-lang/gleam/issues/3050 133#[test] 134fn unicode_bit_array_1() { 135 assert_erl!( 136 r#" 137 pub fn main() { 138 let emoji = "\u{1F600}" 139 let arr = <<emoji:utf8>> 140}"# 141 ); 142} 143 144#[test] 145fn unicode_bit_array_2() { 146 assert_erl!( 147 r#" 148 pub fn main() { 149 let arr = <<"\u{1F600}":utf8>> 150}"# 151 ); 152} 153 154#[test] 155fn bit_array_literal_string_constant_is_treated_as_utf8() { 156 assert_erl!( 157 r#" 158const a = <<"hello", " ", "world">> 159pub fn main() { a } 160"# 161 ); 162} 163 164#[test] 165fn bit_array_literal_string_is_treated_as_utf8() { 166 assert_erl!( 167 r#" 168pub fn main() { 169 <<"hello", " ", "world">> 170}"# 171 ); 172} 173 174#[test] 175fn bit_array_literal_string_pattern_is_treated_as_utf8() { 176 assert_erl!( 177 r#" 178pub fn main() { 179 case <<>> { 180 <<"a", "b", _:bits>> -> 1 181 _ -> 2 182 } 183}"# 184 ); 185} 186 187#[test] 188fn discard_utf8_pattern() { 189 assert_erl!( 190 r#" 191pub fn main() { 192 let assert <<_:utf8, rest:bits>> = <<>> 193}"# 194 ); 195} 196 197// https://github.com/gleam-lang/gleam/issues/3944 198#[test] 199fn pipe_size_segment() { 200 assert_erl!( 201 " 202pub fn main() { 203 <<0xAE:size(5 |> identity)>> 204} 205 206fn identity(x) { 207 x 208} 209" 210 ); 211} 212 213#[test] 214fn utf16_codepoint_little_endian() { 215 assert_erl!( 216 " 217pub fn go(codepoint) { 218 <<codepoint:utf16_codepoint-little>> 219} 220" 221 ); 222} 223 224#[test] 225fn utf32_codepoint_little_endian() { 226 assert_erl!( 227 " 228pub fn go(codepoint) { 229 <<codepoint:utf32_codepoint-little>> 230} 231" 232 ); 233} 234 235#[test] 236fn pattern_match_utf16_codepoint_little_endian() { 237 assert_erl!( 238 " 239pub fn go(x) { 240 let assert <<codepoint:utf16_codepoint-little>> = x 241 codepoint 242} 243" 244 ); 245} 246 247#[test] 248fn pattern_match_utf32_codepoint_little_endian() { 249 assert_erl!( 250 " 251pub fn go(x) { 252 let assert <<codepoint:utf32_codepoint-little>> = x 253 codepoint 254} 255" 256 ); 257} 258 259#[test] 260fn operator_in_pattern_size() { 261 assert_erl!( 262 " 263pub fn main() { 264 let assert <<len, payload:size(len * 8 - 8)>> = <<>> 265} 266" 267 ); 268} 269 270#[test] 271fn operator_in_pattern_size2() { 272 assert_erl!( 273 " 274pub fn main() { 275 let assert <<len, payload:size(len / 8 - 1)>> = <<>> 276} 277" 278 ); 279} 280 281#[test] 282fn operator_in_pattern_size3() { 283 assert_erl!( 284 " 285pub fn main() { 286 let additional = 10 287 let assert <<len, payload:size(len + additional * 8)>> = <<>> 288} 289" 290 ); 291} 292 293#[test] 294fn subtraction_in_pattern_size_is_left_associative() { 295 assert_erl!( 296 " 297pub fn main() { 298 let a = 10 299 let b = 3 300 let c = 2 301 let assert <<_:bytes-size(a - b - c)>> = <<>> 302} 303" 304 ); 305} 306 307#[test] 308fn multiplication_in_pattern_size_is_left_associative() { 309 assert_erl!( 310 " 311pub fn main() { 312 let a = 2 313 let b = 3 314 let c = 4 315 let assert <<_:bytes-size(a * b * c)>> = <<>> 316} 317" 318 ); 319} 320 321#[test] 322fn block_in_pattern_size() { 323 assert_erl!( 324 " 325pub fn main() { 326 let assert <<len, payload:size({ len - 1 } * 8)>> = <<>> 327} 328" 329 ); 330} 331 332#[test] 333fn non_byte_aligned_size_calculation() { 334 assert_erl!( 335 " 336pub fn main() { 337 case <<>> { 338 <<a:1, b:3, c:size(b - 2)>> -> c + b 339 _ -> 1 340 } 341} 342" 343 ); 344} 345 346#[test] 347fn unicode_character_encoding_in_bit_array_pattern_segment() { 348 assert_erl!( 349 r#" 350pub fn main() -> Nil { 351 let wibble = <<"\u{00A9}wibble":utf8>> 352 let _bits = case wibble { 353 <<"\u{00A9}":utf8, rest: bits>> -> rest 354 _ -> wibble 355 } 356 Nil 357} 358"# 359 ); 360} 361 362#[test] 363fn size_8_literal_test() { 364 assert_erl!( 365 "pub fn size_8_literal_test() { 366 <<257:size(8)>> 367}" 368 ); 369} 370 371#[test] 372fn size_8_variable_test() { 373 assert_erl!( 374 "pub fn size_8_variable_test() { 375 let i = 257 376 <<i:size(8)>> 377}" 378 ); 379} 380 381#[test] 382fn size_16_literal_test() { 383 assert_erl!( 384 "pub fn size_16_literal_test() { 385 <<257:size(16)>> 386}" 387 ); 388} 389 390#[test] 391fn size_16_variable_test() { 392 assert_erl!( 393 "pub fn size_16_variable_test() { 394 let i = 257 395 <<i:size(16)>> 396}" 397 ); 398} 399 400#[test] 401fn size_unit_test() { 402 assert_erl!( 403 "pub fn size_16_variable_test() { 404 let i = 257 405 <<i:size(4)-unit(16)>> 406}" 407 ); 408} 409 410#[test] 411fn negative_size_test() { 412 assert_erl!( 413 "pub fn size_16_variable_test() { 414 let i = 257 415 <<i:size(-1)>> 416}" 417 ); 418} 419 420#[test] 421fn literal_utf8_string() { 422 assert_erl!( 423 r#" 424pub fn go() { 425 <<"wibble":utf8>> 426} 427"# 428 ) 429} 430 431#[test] 432fn variable_utf8_string() { 433 assert_erl!( 434 r#" 435pub fn go(wibble: String) { 436 <<wibble:utf8>> 437} 438"# 439 ) 440} 441 442#[test] 443fn literal_utf16_little_string() { 444 assert_erl!( 445 r#" 446pub fn go() { 447 <<"wibble":utf16-little>> 448} 449"# 450 ) 451} 452 453#[test] 454fn variable_utf16_little_string() { 455 assert_erl!( 456 r#" 457pub fn go(wibble: String) { 458 <<wibble:utf16-little>> 459} 460"# 461 ) 462} 463 464#[test] 465fn literal_utf16_big_string() { 466 assert_erl!( 467 r#" 468pub fn go() { 469 <<"wibble":utf16-big>> 470} 471"# 472 ) 473} 474 475#[test] 476fn variable_utf16_big_string() { 477 assert_erl!( 478 r#" 479pub fn go(wibble: String) { 480 <<wibble:utf16-big>> 481} 482"# 483 ) 484} 485 486#[test] 487fn literal_utf32_little_string() { 488 assert_erl!( 489 r#" 490pub fn go() { 491 <<"wibble":utf32-little>> 492} 493"# 494 ) 495} 496 497#[test] 498fn variable_utf32_little_string() { 499 assert_erl!( 500 r#" 501pub fn go(wibble: String) { 502 <<wibble:utf32-little>> 503} 504"# 505 ) 506} 507 508#[test] 509fn literal_utf32_big_string() { 510 assert_erl!( 511 r#" 512pub fn go() { 513 <<"wibble":utf32-big>> 514} 515"# 516 ) 517} 518 519#[test] 520fn variable_utf32_big_string() { 521 assert_erl!( 522 r#" 523pub fn go(wibble: String) { 524 <<wibble:utf32-big>> 525} 526"# 527 ) 528} 529 530// https://github.com/gleam-lang/gleam/issues/5208 531#[test] 532fn unit_option_ignores_bytes() { 533 assert_erl!( 534 " 535pub fn main() { 536 let assert <<x:unit(2)-bytes-size(3)>> = <<1:6>> 537 x 538} 539" 540 ); 541} 542 543#[test] 544fn unit_option_ignores_bytes_regardless_of_order() { 545 assert_erl!( 546 " 547pub fn main() { 548 let assert <<x:bytes-unit(2)-size(3)>> = <<1:6>> 549 x 550} 551" 552 ); 553}