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