this repo has no description
1use hexpm::version::Version;
2use pubgrub::Range;
3
4use crate::{
5 assert_js, assert_js_no_warnings_with_gleam_version, assert_js_warnings_with_gleam_version,
6 assert_ts_def,
7};
8
9#[test]
10fn empty() {
11 assert_js!(
12 r#"
13pub fn go() {
14 <<>>
15}
16"#,
17 );
18}
19
20#[test]
21fn one() {
22 assert_js!(
23 r#"
24pub fn go() {
25 <<256>>
26}
27"#,
28 );
29}
30
31#[test]
32fn two() {
33 assert_js!(
34 r#"
35pub fn go() {
36 <<256, 4>>
37}
38"#,
39 );
40}
41
42#[test]
43fn integer() {
44 assert_js!(
45 r#"
46pub fn go() {
47 <<256:int>>
48}
49"#,
50 );
51}
52
53#[test]
54fn float() {
55 assert_js!(
56 r#"
57pub fn go() {
58 <<1.1:float>>
59}
60"#,
61 );
62}
63
64#[test]
65fn float_big_endian() {
66 assert_js!(
67 r#"
68pub fn go() {
69 <<1.1:float-big>>
70}
71"#,
72 );
73}
74
75#[test]
76fn float_little_endian() {
77 assert_js!(
78 r#"
79pub fn go() {
80 <<1.1:float-little>>
81}
82"#,
83 );
84}
85
86#[test]
87fn float_sized() {
88 assert_js!(
89 r#"
90pub fn go() {
91 <<1.1:float-32>>
92}
93"#,
94 );
95}
96
97#[test]
98fn float_sized_big_endian() {
99 assert_js!(
100 r#"
101pub fn go() {
102 <<1.1:float-32-big>>
103}
104"#,
105 );
106}
107
108#[test]
109fn float_sized_little_endian() {
110 assert_js!(
111 r#"
112pub fn go() {
113 <<1.1:float-32-little>>
114}
115"#,
116 );
117}
118
119#[test]
120fn sized_constant_value() {
121 assert_js!(
122 r#"
123pub fn go() {
124 <<256:64>>
125}
126"#,
127 );
128}
129
130#[test]
131fn sized_dynamic_value() {
132 assert_js!(
133 r#"
134pub fn go(i: Int) {
135 <<i:64>>
136}
137"#,
138 );
139}
140
141#[test]
142fn sized_constant_value_positive_overflow() {
143 assert_js!(
144 r#"
145pub fn go() {
146 <<80_000:16>>
147}
148"#,
149 );
150}
151
152#[test]
153fn sized_constant_value_negative_overflow() {
154 assert_js!(
155 r#"
156pub fn go() {
157 <<-80_000:16>>
158}
159"#,
160 );
161}
162
163#[test]
164fn sized_constant_value_max_size_for_compile_time_evaluation() {
165 assert_js!(
166 r#"
167pub fn go() {
168 <<-1:48>>
169}
170"#,
171 );
172}
173
174#[test]
175fn sized_big_endian_constant_value() {
176 assert_js!(
177 r#"
178pub fn go() {
179 <<256:16-big>>
180}
181"#,
182 );
183}
184
185#[test]
186fn sized_big_endian_dynamic_value() {
187 assert_js!(
188 r#"
189pub fn go(i: Int) {
190 <<i:16-big>>
191}
192"#,
193 );
194}
195
196#[test]
197fn sized_little_endian_constant_value() {
198 assert_js!(
199 r#"
200pub fn go() {
201 <<256:16-little>>
202}
203"#,
204 );
205}
206
207#[test]
208fn sized_little_endian_dynamic_value() {
209 assert_js!(
210 r#"
211pub fn go(i: Int) {
212 <<i:16-little>>
213}
214"#,
215 );
216}
217
218#[test]
219fn explicit_sized_constant_value() {
220 assert_js!(
221 r#"
222pub fn go() {
223 <<256:size(32)>>
224}
225"#,
226 );
227}
228
229#[test]
230fn explicit_sized_dynamic_value() {
231 assert_js!(
232 r#"
233pub fn go(i: Int) {
234 <<i:size(32)>>
235}
236"#,
237 );
238}
239
240#[test]
241fn variable_sized() {
242 assert_js!(
243 r#"
244pub fn go(x, y) {
245 <<x:size(y)>>
246}
247"#,
248 );
249}
250
251#[test]
252fn variable() {
253 assert_js!(
254 r#"
255pub fn go(x) {
256 <<256, 4, x>>
257}
258"#,
259 );
260}
261
262#[test]
263fn utf8() {
264 assert_js!(
265 r#"
266pub fn go(x) {
267 <<256, 4, x, "Gleam":utf8>>
268}
269"#,
270 );
271}
272
273#[test]
274fn match_utf8_with_escape_chars() {
275 assert_js!(
276 r#"
277pub fn go(x) {
278 let assert <<"\"\\\r\n\t\f\u{1f600}">> = x
279}
280"#,
281 );
282}
283
284#[test]
285fn match_utf8() {
286 assert_js!(
287 r#"
288pub fn go(x) {
289 let assert <<"Gleam 👍":utf8>> = x
290}
291"#,
292 );
293}
294
295#[test]
296fn match_case_utf8_with_escape_chars() {
297 assert_js!(
298 r#"
299pub fn go(x) {
300 case x {
301 <<"\"\\\r\n\t\f\u{1f600}">> -> 1
302 _ -> 2
303 }
304}
305"#,
306 );
307}
308
309#[test]
310fn match_case_utf8() {
311 assert_js!(
312 r#"
313pub fn go(x) {
314 case x {
315 <<"Gleam 👍":utf8>> -> 1
316 _ -> 2
317 }
318}
319"#,
320 );
321}
322
323#[test]
324fn utf8_codepoint() {
325 assert_js!(
326 r#"
327pub fn go(x) {
328 <<x:utf8_codepoint, "Gleam":utf8>>
329}
330"#,
331 );
332}
333
334#[test]
335fn utf8_codepoint_typescript() {
336 assert_ts_def!(
337 r#"
338pub fn go(x) {
339 <<x:utf8_codepoint, "Gleam":utf8>>
340}
341"#,
342 );
343}
344
345#[test]
346fn bit_string() {
347 assert_js!(
348 r#"
349pub fn go(x) {
350 <<x:bits>>
351}
352"#,
353 );
354}
355
356#[test]
357fn bits() {
358 assert_js!(
359 r#"
360pub fn go(x) {
361 <<x:bits>>
362}
363"#,
364 );
365}
366
367#[test]
368fn bit_array_sliced() {
369 assert_js!(
370 r#"
371pub fn go(x) {
372 <<<<0xAB>>:bits-4>>
373}
374"#,
375 );
376}
377
378#[test]
379fn bit_array_dynamic_slice() {
380 assert_js!(
381 r#"
382pub fn go(x) {
383 let i = 4
384 <<<<0xAB>>:bits-size(i)>>
385}
386"#,
387 );
388}
389
390#[test]
391fn bit_string_typescript() {
392 assert_ts_def!(
393 r#"
394pub fn go(x) {
395 <<x:bits>>
396}
397"#,
398 );
399}
400
401#[test]
402fn bits_typescript() {
403 assert_ts_def!(
404 r#"
405pub fn go(x) {
406 <<x:bits>>
407}
408"#,
409 );
410}
411
412#[test]
413fn empty_match() {
414 assert_js!(
415 r#"
416pub fn go(x) {
417 let assert <<>> = x
418}
419"#,
420 );
421}
422
423#[test]
424fn case_empty_match() {
425 assert_js!(
426 r#"
427pub fn go(x) {
428 case x {
429 <<>> -> 1
430 _ -> 2
431 }
432}
433"#,
434 );
435}
436
437#[test]
438fn match_bytes() {
439 assert_js!(
440 r#"
441pub fn go(x) {
442 let assert <<1, y>> = x
443}
444"#,
445 );
446}
447
448#[test]
449fn case_match_bytes() {
450 assert_js!(
451 r#"
452pub fn go(x) {
453 case x {
454 <<1, y>> -> y
455 _ -> 1
456 }
457}
458"#,
459 );
460}
461
462#[test]
463fn match_sized() {
464 assert_js!(
465 r#"
466pub fn go(x) {
467 let assert <<a:16, b:8>> = x
468}
469"#,
470 );
471}
472
473#[test]
474fn case_match_sized() {
475 assert_js!(
476 r#"
477pub fn go(x) {
478 case x {
479 <<a:16, b:8>> -> a + b
480 _ -> 1
481 }
482}
483"#,
484 );
485}
486
487#[test]
488fn match_sized_unaligned() {
489 assert_js!(
490 r#"
491pub fn go(x) {
492 let assert <<a:17, b:7>> = x
493}
494"#,
495 );
496}
497
498#[test]
499fn case_match_sized_unaligned() {
500 assert_js!(
501 r#"
502pub fn go(x) {
503 case x {
504 <<a:17, b:7>> -> b * 2
505 _ -> 1
506 }
507}
508"#,
509 );
510}
511
512#[test]
513fn match_sized_constant_pattern() {
514 assert_js!(
515 r#"
516pub fn go(x) {
517 let assert <<1234:16, 123:8>> = x
518}
519"#,
520 );
521}
522
523#[test]
524fn case_match_sized_constant_pattern() {
525 assert_js!(
526 r#"
527pub fn go(x) {
528 case x {
529 <<1234:16, 123:8>> -> 1
530 _ -> 2
531 }
532}
533"#,
534 );
535}
536
537#[test]
538fn match_unsigned() {
539 assert_js!(
540 r#"
541pub fn go(x) {
542 let assert <<a:unsigned>> = x
543}
544"#,
545 );
546}
547
548#[test]
549fn case_match_unsigned() {
550 assert_js!(
551 r#"
552pub fn go(x) {
553 case x {
554 <<a:unsigned>> -> a
555 _ -> 1
556 }
557}
558"#,
559 );
560}
561
562#[test]
563fn match_unsigned_constant_pattern() {
564 assert_js!(
565 r#"
566pub fn go(x) {
567 let assert <<-2:unsigned>> = x
568}
569"#,
570 );
571}
572
573#[test]
574fn case_match_unsigned_constant_pattern() {
575 assert_js!(
576 r#"
577pub fn go(x) {
578 case x {
579 <<-2:unsigned>> -> 1
580 _ -> 2
581 }
582}
583"#,
584 );
585}
586
587#[test]
588fn match_signed() {
589 assert_js!(
590 r#"
591pub fn go(x) {
592 let assert <<a:signed>> = x
593}
594"#,
595 );
596}
597
598#[test]
599fn case_match_signed() {
600 assert_js!(
601 r#"
602pub fn go(x) {
603 case x {
604 <<a:signed>> -> a
605 _ -> 1
606 }
607}
608"#,
609 );
610}
611
612#[test]
613fn match_signed_constant_pattern() {
614 assert_js!(
615 r#"
616pub fn go(x) {
617 let assert <<-1:signed>> = x
618}
619"#,
620 );
621}
622
623#[test]
624fn case_match_signed_constant_pattern() {
625 assert_js!(
626 r#"
627pub fn go(x) {
628 case x {
629 <<-1:signed>> -> 1
630 _ -> 2
631 }
632}
633"#,
634 );
635}
636
637#[test]
638fn match_sized_big_endian() {
639 assert_js!(
640 r#"
641pub fn go(x) {
642 let assert <<a:16-big>> = x
643}
644"#,
645 );
646}
647
648#[test]
649fn case_match_sized_big_endian() {
650 assert_js!(
651 r#"
652pub fn go(x) {
653 case x {
654 <<a:16-big>> -> a
655 _ -> 1
656 }
657}
658"#,
659 );
660}
661
662#[test]
663fn match_sized_big_endian_constant_pattern() {
664 assert_js!(
665 r#"
666pub fn go(x) {
667 let assert <<1234:16-big>> = x
668}
669"#,
670 );
671}
672
673#[test]
674fn case_match_sized_big_endian_constant_pattern() {
675 assert_js!(
676 r#"
677pub fn go(x) {
678 case x {
679 <<1234:16-big>> -> 1
680 _ -> 2
681 }
682}
683"#,
684 );
685}
686
687#[test]
688fn match_sized_little_endian() {
689 assert_js!(
690 r#"
691pub fn go(x) {
692 let assert <<a:16-little>> = x
693}
694"#,
695 );
696}
697
698#[test]
699fn case_match_sized_little_endian() {
700 assert_js!(
701 r#"
702pub fn go(x) {
703 case x {
704 <<a:16-little>> -> a
705 _ -> 1
706 }
707}
708"#,
709 );
710}
711
712#[test]
713fn match_sized_little_endian_constant_pattern() {
714 assert_js!(
715 r#"
716pub fn go(x) {
717 let assert <<1234:16-little>> = x
718}
719"#,
720 );
721}
722
723#[test]
724fn case_match_sized_little_endian_constant_pattern() {
725 assert_js!(
726 r#"
727pub fn go(x) {
728 case x {
729 <<1234:16-little>> -> 1
730 _ -> 2
731 }
732}
733"#,
734 );
735}
736
737#[test]
738fn match_sized_big_endian_unsigned() {
739 assert_js!(
740 r#"
741pub fn go(x) {
742 let assert <<a:16-big-unsigned>> = x
743}
744"#,
745 );
746}
747
748#[test]
749fn case_match_sized_big_endian_unsigned() {
750 assert_js!(
751 r#"
752pub fn go(x) {
753 case x {
754 <<a:16-big-unsigned>> -> a
755 _ -> 1
756 }
757}
758"#,
759 );
760}
761
762#[test]
763fn match_sized_big_endian_unsigned_constant_pattern() {
764 assert_js!(
765 r#"
766pub fn go(x) {
767 let assert <<1234:16-big-unsigned>> = x
768}
769"#,
770 );
771}
772
773#[test]
774fn case_match_sized_big_endian_unsigned_constant_pattern() {
775 assert_js!(
776 r#"
777pub fn go(x) {
778 case x {
779 <<1234:16-big-unsigned>> -> 1
780 _ -> 2
781 }
782}
783"#,
784 );
785}
786
787#[test]
788fn match_sized_big_endian_signed() {
789 assert_js!(
790 r#"
791pub fn go(x) {
792 let assert <<a:16-big-signed>> = x
793}
794"#,
795 );
796}
797
798#[test]
799fn case_match_sized_big_endian_signed() {
800 assert_js!(
801 r#"
802pub fn go(x) {
803 case x {
804 <<a:16-big-signed>> -> a
805 _ -> 1
806 }
807}
808"#,
809 );
810}
811
812#[test]
813fn match_sized_big_endian_signed_constant_pattern() {
814 assert_js!(
815 r#"
816pub fn go(x) {
817 let assert <<1234:16-big-signed>> = x
818}
819"#,
820 );
821}
822
823#[test]
824fn case_match_sized_big_endian_signed_constant_pattern() {
825 assert_js!(
826 r#"
827pub fn go(x) {
828 case x {
829 <<1234:16-big-signed>> -> 1
830 _ -> 2
831 }
832}
833"#,
834 );
835}
836
837#[test]
838fn match_sized_little_endian_unsigned() {
839 assert_js!(
840 r#"
841pub fn go(x) {
842 let assert <<a:16-little-unsigned>> = x
843}
844"#,
845 );
846}
847
848#[test]
849fn case_match_sized_little_endian_unsigned() {
850 assert_js!(
851 r#"
852pub fn go(x) {
853 case x {
854 <<a:16-little-unsigned>> -> a
855 _ -> 1
856 }
857}
858"#,
859 );
860}
861
862#[test]
863fn match_sized_little_endian_unsigned_constant_pattern() {
864 assert_js!(
865 r#"
866pub fn go(x) {
867 let assert <<1234:16-little-unsigned>> = x
868}
869"#,
870 );
871}
872
873#[test]
874fn case_match_sized_little_endian_unsigned_constant_pattern() {
875 assert_js!(
876 r#"
877pub fn go(x) {
878 case x {
879 <<1234:16-little-unsigned>> -> 1
880 _ -> 2
881 }
882}
883"#,
884 );
885}
886
887#[test]
888fn match_sized_little_endian_signed() {
889 assert_js!(
890 r#"
891pub fn go(x) {
892 let assert <<a:16-little-signed>> = x
893}
894"#,
895 );
896}
897
898#[test]
899fn case_match_sized_little_endian_signed() {
900 assert_js!(
901 r#"
902pub fn go(x) {
903 case x {
904 <<a:16-little-signed>> -> a
905 _ -> 1
906 }
907}
908"#,
909 );
910}
911
912#[test]
913fn match_sized_little_endian_signed_constant_pattern() {
914 assert_js!(
915 r#"
916pub fn go(x) {
917 let assert <<1234:16-little-signed>> = x
918}
919"#,
920 );
921}
922
923#[test]
924fn case_match_sized_little_endian_signed_constant_pattern() {
925 assert_js!(
926 r#"
927pub fn go(x) {
928 case x {
929 <<1234:16-little-signed>> -> 1
930 _ -> 2
931 }
932}
933"#,
934 );
935}
936
937#[test]
938fn match_dynamic_size() {
939 assert_js!(
940 r#"
941pub fn go(x) {
942 let n = 16
943 let assert <<a:size(n)>> = x
944}
945"#
946 );
947}
948
949#[test]
950fn case_match_dynamic_size() {
951 assert_js!(
952 r#"
953pub fn go(x) {
954 let n = 16
955 case x {
956 <<a:size(n)>> -> a
957 _ -> 1
958 }
959}
960"#
961 );
962}
963
964#[test]
965fn match_dynamic_size_with_other_segments() {
966 assert_js!(
967 r#"
968pub fn go(x) {
969 let n = 16
970 let m = 32
971 let assert <<first:size(8), a:size(n), b:size(m), rest:bits>> = x
972}
973"#
974 );
975}
976
977#[test]
978fn case_match_dynamic_size_with_other_segments() {
979 assert_js!(
980 r#"
981pub fn go(x) {
982 let n = 16
983 let m = 32
984 case x {
985 <<first:size(8), a:size(n), b:size(m), rest:bits>> -> first + a + b
986 _ -> 1
987 }
988}
989"#
990 );
991}
992
993#[test]
994fn match_dynamic_size_shadowed_variable() {
995 assert_js!(
996 r#"
997pub fn go(x) {
998 let n = 16
999 let n = 5
1000 let assert <<a:size(n)>> = x
1001}
1002"#
1003 );
1004}
1005
1006#[test]
1007fn case_match_dynamic_size_shadowed_variable() {
1008 assert_js!(
1009 r#"
1010pub fn go(x) {
1011 let n = 16
1012 let n = 5
1013 case x {
1014 <<a:size(n)>> -> a
1015 _ -> 1
1016 }
1017}
1018"#
1019 );
1020}
1021
1022#[test]
1023fn match_dynamic_size_literal_value() {
1024 assert_js!(
1025 r#"
1026pub fn go(x) {
1027 let n = 8
1028 let assert <<a:size(n), 0b010101:size(8)>> = x
1029}
1030"#
1031 );
1032}
1033
1034#[test]
1035fn case_match_dynamic_size_literal_value() {
1036 assert_js!(
1037 r#"
1038pub fn go(x) {
1039 let n = 8
1040 case x {
1041 <<a:size(n), 0b010101:size(8)>> -> a
1042 _ -> 1
1043 }
1044}
1045"#
1046 );
1047}
1048
1049#[test]
1050fn match_dynamic_bits_size() {
1051 assert_js!(
1052 r#"
1053pub fn go(x) {
1054 let n = 16
1055 let assert <<a:bits-size(n)>> = x
1056}
1057"#
1058 );
1059}
1060
1061#[test]
1062fn case_match_dynamic_bits_size() {
1063 assert_js!(
1064 r#"
1065pub fn go(x) {
1066 let n = 16
1067 case x {
1068 <<a:bits-size(n)>> -> a
1069 _ -> x
1070 }
1071}
1072"#
1073 );
1074}
1075
1076#[test]
1077fn match_dynamic_bytes_size() {
1078 assert_js!(
1079 r#"
1080pub fn go(x) {
1081 let n = 3
1082 let assert <<a:bytes-size(n)>> = x
1083}
1084"#
1085 );
1086}
1087
1088#[test]
1089fn case_match_dynamic_bytes_size() {
1090 assert_js!(
1091 r#"
1092pub fn go(x) {
1093 let n = 3
1094 case x {
1095 <<a:bytes-size(n)>> -> a
1096 _ -> x
1097 }
1098}
1099"#
1100 );
1101}
1102
1103#[test]
1104fn discard_sized() {
1105 assert_js!(
1106 r#"
1107pub fn go(x) {
1108 let assert <<_:16, _:8>> = x
1109 let assert <<_:16-little-signed, _:8>> = x
1110}
1111"#,
1112 );
1113}
1114
1115#[test]
1116fn case_discard_sized() {
1117 assert_js!(
1118 r#"
1119pub fn go(x) {
1120 case x {
1121 <<_:16, _:8>> -> 1
1122 _ -> 2
1123 }
1124 case x {
1125 <<_:16-little-signed, _:8>> -> 1
1126 _ -> 2
1127 }
1128}
1129"#,
1130 );
1131}
1132
1133#[test]
1134fn match_sized_value() {
1135 assert_js!(
1136 r#"
1137pub fn go(x) {
1138 let assert <<i:16>> = x
1139}
1140"#,
1141 );
1142}
1143
1144#[test]
1145fn case_match_sized_value() {
1146 assert_js!(
1147 r#"
1148pub fn go(x) {
1149 case x {
1150 <<i:16>> -> i
1151 _ -> 1
1152 }
1153}
1154"#,
1155 );
1156}
1157
1158#[test]
1159fn match_sized_value_constant_pattern() {
1160 assert_js!(
1161 r#"
1162pub fn go(x) {
1163 let assert <<258:16>> = x
1164}
1165"#,
1166 );
1167}
1168
1169#[test]
1170fn case_match_sized_value_constant_pattern() {
1171 assert_js!(
1172 r#"
1173pub fn go(x) {
1174 case x {
1175 <<258:16>> -> 1
1176 _ -> 2
1177 }
1178}
1179"#,
1180 );
1181}
1182
1183#[test]
1184fn match_float() {
1185 assert_js!(
1186 r#"
1187pub fn go(x) {
1188 let assert <<a:float, b:int>> = x
1189}
1190"#,
1191 );
1192}
1193
1194#[test]
1195fn case_match_float() {
1196 assert_js!(
1197 r#"
1198pub fn go(x) {
1199 case x {
1200 <<a:float, b:int>> -> #(a, b)
1201 _ -> #(1.1, 2)
1202 }
1203}
1204"#,
1205 );
1206}
1207
1208#[test]
1209fn match_float_big_endian() {
1210 assert_js!(
1211 r#"
1212pub fn go(x) {
1213 let assert <<a:float-big, b:int>> = x
1214}
1215"#,
1216 );
1217}
1218
1219#[test]
1220fn case_match_float_big_endian() {
1221 assert_js!(
1222 r#"
1223pub fn go(x) {
1224 case x {
1225 <<a:float-big, b:int>> -> #(a, b)
1226 _ -> #(1.1, 1)
1227 }
1228}
1229"#,
1230 );
1231}
1232
1233#[test]
1234fn match_float_little_endian() {
1235 assert_js!(
1236 r#"
1237pub fn go(x) {
1238 let assert <<a:float-little, b:int>> = x
1239}
1240"#,
1241 );
1242}
1243
1244#[test]
1245fn case_match_float_little_endian() {
1246 assert_js!(
1247 r#"
1248pub fn go(x) {
1249 case x {
1250 <<a:float-little, b:int>> -> #(a, b)
1251 _ -> #(1.1, 2)
1252 }
1253}
1254"#,
1255 );
1256}
1257
1258#[test]
1259fn match_float_sized() {
1260 assert_js!(
1261 r#"
1262pub fn go(x) {
1263 let assert <<a:float-32, b:int>> = x
1264}
1265"#,
1266 );
1267}
1268
1269#[test]
1270fn case_match_float_sized() {
1271 assert_js!(
1272 r#"
1273pub fn go(x) {
1274 case x {
1275 <<a:float-32, b:int>> -> #(a, b)
1276 _ -> #(1.1, 2)
1277 }
1278}
1279"#,
1280 );
1281}
1282
1283#[test]
1284fn match_float_sized_big_endian() {
1285 assert_js!(
1286 r#"
1287pub fn go(x) {
1288 let assert <<a:float-32-big, b:int>> = x
1289}
1290"#,
1291 );
1292}
1293
1294#[test]
1295fn case_match_float_sized_big_endian() {
1296 assert_js!(
1297 r#"
1298pub fn go(x) {
1299 case x {
1300 <<a:float-32-big, b:int>> -> #(a, b)
1301 _ -> #(1.1, 2)
1302 }
1303}
1304"#,
1305 );
1306}
1307
1308#[test]
1309fn match_float_sized_little_endian() {
1310 assert_js!(
1311 r#"
1312pub fn go(x) {
1313 let assert <<a:float-32-little, b:int>> = x
1314}
1315"#,
1316 );
1317}
1318
1319#[test]
1320fn case_match_float_sized_little_endian() {
1321 assert_js!(
1322 r#"
1323pub fn go(x) {
1324 case x {
1325 <<a:float-32-little, b:int>> -> #(a, b)
1326 _ -> #(1.1, 2)
1327 }
1328}
1329"#,
1330 );
1331}
1332
1333#[test]
1334fn match_literal_float() {
1335 assert_js!(
1336 r#"
1337pub fn go(x) {
1338 let assert <<1.4, b:int>> = x
1339}
1340"#,
1341 );
1342}
1343
1344#[test]
1345fn case_match_literal_float() {
1346 assert_js!(
1347 r#"
1348pub fn go(x) {
1349 case x {
1350 <<1.4, b:int>> -> 1
1351 _ -> 2
1352 }
1353}
1354"#,
1355 );
1356}
1357
1358#[test]
1359fn match_literal_unaligned_float() {
1360 assert_js!(
1361 r#"
1362pub fn go(x) {
1363 let n = 1
1364 let assert <<_:size(n), 1.1, _:bits>> = x
1365}
1366"#,
1367 );
1368}
1369
1370#[test]
1371fn case_match_literal_unaligned_float() {
1372 assert_js!(
1373 r#"
1374pub fn go(x) {
1375 let n = 1
1376 case x {
1377 <<_:size(n), 1.1, _:int>> -> 1
1378 _ -> 2
1379 }
1380}
1381"#,
1382 );
1383}
1384
1385#[test]
1386fn match_literal_aligned_float() {
1387 assert_js!(
1388 r#"
1389pub fn go(x) {
1390 let assert <<_, 1.1, _:bits>> = x
1391}
1392"#,
1393 );
1394}
1395
1396#[test]
1397fn case_match_literal_aligned_float() {
1398 assert_js!(
1399 r#"
1400pub fn go(x) {
1401 case x {
1402 <<_, 1.1, _:int>> -> 1
1403 _ -> 2
1404 }
1405}
1406"#,
1407 );
1408}
1409
1410#[test]
1411fn match_float_16_bit() {
1412 assert_js!(
1413 r#"
1414pub fn go(x) {
1415 let assert <<a:float-size(16)>> = x
1416}
1417"#
1418 );
1419}
1420
1421#[test]
1422fn case_match_float_16_bit() {
1423 assert_js!(
1424 r#"
1425pub fn go(x) {
1426 case x {
1427 <<a:float-size(16)>> -> a
1428 _ -> 1.1
1429 }
1430}
1431"#
1432 );
1433}
1434
1435#[test]
1436fn match_rest() {
1437 assert_js!(
1438 r#"
1439pub fn go(x) {
1440 let assert <<_, b:bytes>> = <<1,2,3>>
1441}
1442"#,
1443 );
1444}
1445
1446#[test]
1447fn case_match_rest() {
1448 assert_js!(
1449 r#"
1450pub fn go(x) {
1451 case <<1, 2, 3>> {
1452 <<_, b:bytes>> -> b
1453 _ -> x
1454 }
1455}
1456"#,
1457 );
1458}
1459
1460#[test]
1461fn match_bytes_with_size() {
1462 assert_js!(
1463 r#"
1464pub fn go(x) {
1465 let assert <<f:bytes-2>> = <<1, 2>>
1466}
1467"#,
1468 );
1469}
1470
1471#[test]
1472fn case_match_bytes_with_size() {
1473 assert_js!(
1474 r#"
1475pub fn go(x) {
1476 case <<1, 2>> {
1477 <<f:bytes-2>> -> f
1478 _ -> x
1479 }
1480}
1481"#,
1482 );
1483}
1484
1485#[test]
1486fn match_bits_with_size() {
1487 assert_js!(
1488 r#"
1489pub fn go(x) {
1490 let assert <<_:4, f:bits-2, _:1>> = <<0x77:7>>
1491}
1492"#,
1493 );
1494}
1495
1496#[test]
1497fn case_match_bits_with_size() {
1498 assert_js!(
1499 r#"
1500pub fn go(x) {
1501 case <<0x77:7>> {
1502 <<_:4, f:bits-2, _:1>> -> f
1503 _ -> x
1504 }
1505}
1506"#,
1507 );
1508}
1509
1510#[test]
1511fn match_rest_bytes() {
1512 assert_js!(
1513 r#"
1514pub fn go(x) {
1515 let assert <<_, b:bytes>> = <<1,2,3>>
1516}
1517"#,
1518 );
1519}
1520
1521#[test]
1522fn case_match_rest_bytes() {
1523 assert_js!(
1524 r#"
1525pub fn go(x) {
1526 case x {
1527 <<_, b:bytes>> -> b
1528 _ -> x
1529 }
1530}
1531"#,
1532 );
1533}
1534
1535#[test]
1536fn match_rest_bits() {
1537 assert_js!(
1538 r#"
1539pub fn go(x) {
1540 let assert <<_, b:bits>> = <<1,2,3>>
1541}
1542"#,
1543 );
1544}
1545
1546#[test]
1547fn case_match_rest_bits() {
1548 assert_js!(
1549 r#"
1550pub fn go(x) {
1551 case x {
1552 <<_, b:bits>> -> b
1553 _ -> x
1554 }
1555}
1556"#,
1557 );
1558}
1559
1560#[test]
1561fn match_rest_bits_unaligned() {
1562 assert_js!(
1563 r#"
1564pub fn go(x) {
1565 let assert <<_:5, b:bits>> = <<1,2,3>>
1566}
1567"#,
1568 );
1569}
1570
1571#[test]
1572fn case_match_rest_bits_unaligned() {
1573 assert_js!(
1574 r#"
1575pub fn go(x) {
1576 case x {
1577 <<_:5, b:bits>> -> b
1578 _ -> x
1579 }
1580}
1581"#,
1582 );
1583}
1584
1585#[test]
1586fn match_binary_size() {
1587 assert_js!(
1588 r#"
1589pub fn go(x) {
1590 let assert <<_, a:2-bytes>> = x
1591 let assert <<_, b:bytes-size(2)>> = x
1592}
1593"#,
1594 );
1595}
1596
1597#[test]
1598fn case_match_binary_size() {
1599 assert_js!(
1600 r#"
1601pub fn go(x) {
1602 case x {
1603 <<_, a:2-bytes>> -> a
1604 _ -> x
1605 }
1606
1607 case x {
1608 <<_, b:bytes-size(2)>> -> b
1609 _ -> x
1610 }
1611}
1612"#,
1613 );
1614}
1615
1616#[test]
1617fn unaligned_int_expression_requires_v1_9() {
1618 assert_js_warnings_with_gleam_version!(
1619 Range::higher_than(Version::new(1, 8, 0)),
1620 "
1621pub fn main() {
1622 <<0:1>>
1623}
1624 ",
1625 );
1626}
1627
1628#[test]
1629fn bits_expression_does_not_require_v1_9() {
1630 assert_js_no_warnings_with_gleam_version!(
1631 Range::higher_than(Version::new(1, 8, 0)),
1632 "
1633pub fn main() {
1634 <<<<0>>:bits>>
1635}
1636 ",
1637 );
1638}
1639
1640#[test]
1641fn sized_bits_expression_requires_v1_9() {
1642 assert_js_warnings_with_gleam_version!(
1643 Range::higher_than(Version::new(1, 8, 0)),
1644 "
1645pub fn main() {
1646 <<<<0>>:bits-5>>
1647}
1648 ",
1649 );
1650}
1651
1652#[test]
1653fn unaligned_int_pattern_requires_v1_9() {
1654 assert_js_warnings_with_gleam_version!(
1655 Range::higher_than(Version::new(1, 8, 0)),
1656 "
1657pub fn main() {
1658 let assert <<_:3>> = <<0>>
1659}
1660 ",
1661 );
1662}
1663
1664#[test]
1665fn bits_pattern_requires_v1_9() {
1666 assert_js_warnings_with_gleam_version!(
1667 Range::higher_than(Version::new(1, 8, 0)),
1668 "
1669pub fn main() {
1670 let assert <<_:bits>> = <<0>>
1671}
1672 ",
1673 );
1674}
1675
1676#[test]
1677fn bytes_pattern_with_odd_size_does_not_require_v1_9() {
1678 assert_js_no_warnings_with_gleam_version!(
1679 Range::higher_than(Version::new(1, 8, 0)),
1680 "
1681pub fn main() {
1682 let assert <<_:bytes-3>> = <<0, 1, 2>>
1683}
1684 ",
1685 );
1686}
1687
1688#[test]
1689fn sized_bits_expression_with_javascript_external_does_not_require_v1_9() {
1690 assert_js_no_warnings_with_gleam_version!(
1691 Range::higher_than(Version::new(1, 8, 0)),
1692 r#"
1693@external(javascript, "test.mjs", "go")
1694pub fn go() -> BitArray {
1695 <<0:size(5)>>
1696}
1697 "#,
1698 );
1699}
1700
1701#[test]
1702fn bits_pattern_with_javascript_external_does_not_require_v1_9() {
1703 assert_js_no_warnings_with_gleam_version!(
1704 Range::higher_than(Version::new(1, 8, 0)),
1705 r#"
1706@external(javascript, "test.mjs", "go")
1707pub fn go() -> BitArray {
1708 let <<a:bits>> = <<>>
1709 a
1710}
1711 "#,
1712 );
1713}
1714
1715#[test]
1716fn as_module_const() {
1717 assert_js!(
1718 r#"
1719 pub const data = <<
1720 0x1,
1721 2,
1722 2:size(16),
1723 0x4:size(32),
1724 -1:32,
1725 "Gleam":utf8,
1726 4.2:float,
1727 4.2:32-float,
1728 <<0xFA>>:bits-6,
1729 -1:64,
1730 <<
1731 <<1, 2, 3>>:bits,
1732 "Gleam":utf8,
1733 1024
1734 >>:bits
1735 >>
1736 "#
1737 )
1738}
1739
1740#[test]
1741fn bit_array_literal_string_constant_is_treated_as_utf8() {
1742 assert_js!(r#"pub const a = <<"hello", " ", "world">>"#);
1743}
1744
1745#[test]
1746fn bit_array_literal_string_is_treated_as_utf8() {
1747 assert_js!(
1748 r#"
1749pub fn main() {
1750 <<"hello", " ", "world">>
1751}"#
1752 );
1753}
1754
1755#[test]
1756fn bit_array_literal_string_pattern_is_treated_as_utf8() {
1757 assert_js!(
1758 r#"
1759pub fn main() {
1760 case <<>> {
1761 <<"a", "b", _:bytes>> -> 1
1762 _ -> 2
1763 }
1764}"#
1765 );
1766}
1767
1768#[test]
1769fn with_unit() {
1770 assert_js!(
1771 r#"
1772pub fn main() {
1773 <<1:size(2)-unit(2), 2:size(3)-unit(4)>>
1774}
1775"#,
1776 );
1777}
1778
1779#[test]
1780fn dynamic_size_with_unit() {
1781 assert_js!(
1782 r#"
1783pub fn main() {
1784 let size = 3
1785 <<1:size(size)-unit(2)>>
1786}
1787"#,
1788 );
1789}
1790
1791#[test]
1792fn pattern_with_unit() {
1793 assert_js!(
1794 r#"
1795pub fn go(x) {
1796 let assert <<1:size(2)-unit(2), 2:size(3)-unit(4)>> = x
1797}
1798"#,
1799 );
1800}
1801
1802#[test]
1803fn case_pattern_with_unit() {
1804 assert_js!(
1805 r#"
1806pub fn go(x) {
1807 case x {
1808 <<1:size(2)-unit(2), 2:size(3)-unit(4)>> -> 1
1809 _ -> 2
1810 }
1811}
1812"#,
1813 );
1814}
1815
1816#[test]
1817fn dynamic_size_pattern_with_unit() {
1818 assert_js!(
1819 r#"
1820pub fn go(x) {
1821 let size = 3
1822 let assert <<1:size(size)-unit(2)>> = x
1823}
1824"#,
1825 );
1826}
1827
1828#[test]
1829fn case_dynamic_size_pattern_with_unit() {
1830 assert_js!(
1831 r#"
1832pub fn go(x) {
1833 let size = 3
1834 case x {
1835 <<1:size(size)-unit(2)>> -> 1
1836 _ -> 2
1837 }
1838}
1839"#,
1840 );
1841}
1842
1843#[test]
1844fn case_dynamic_size_float_pattern_with_unit() {
1845 assert_js!(
1846 r#"
1847pub fn go(x) {
1848 let size = 3
1849 case x {
1850 <<1.3:size(size)-unit(2)>> -> 1
1851 _ -> 2
1852 }
1853}
1854"#,
1855 );
1856}
1857
1858#[test]
1859fn case_with_remaining_bytes_after_constant_size() {
1860 assert_js!(
1861 r#"
1862pub fn go(x) {
1863 case x {
1864 <<_, _, _:bytes>> -> 1
1865 _ -> 2
1866 }
1867}
1868"#,
1869 );
1870}
1871
1872#[test]
1873fn case_with_remaining_bytes_after_variable_size() {
1874 assert_js!(
1875 r#"
1876pub fn go(x) {
1877 let n = 1
1878 case x {
1879 <<_:size(n), _, _:bytes>> -> 1
1880 _ -> 2
1881 }
1882}
1883"#,
1884 );
1885}
1886
1887#[test]
1888fn case_with_remaining_bytes_after_variable_size_2() {
1889 assert_js!(
1890 r#"
1891pub fn go(x) {
1892 let n = 1
1893 case x {
1894 <<m:size(n), _:size(m), _:bytes>> -> 1
1895 _ -> 2
1896 }
1897}
1898"#,
1899 );
1900}
1901
1902#[test]
1903fn case_is_byte_aligned() {
1904 assert_js!(
1905 r#"
1906pub fn is_byte_aligned(x) {
1907 case x {
1908 <<_:bytes>> -> True
1909 _ -> False
1910 }
1911}
1912"#,
1913 );
1914}
1915
1916#[test]
1917fn alternative_patterns_with_variable_size() {
1918 assert_js!(
1919 r#"
1920pub fn go(x) {
1921 case x {
1922 <<_, n, rest:size(n)>> |
1923 <<n, _, rest:size(n)>> -> True
1924 _ -> False
1925 }
1926}
1927"#,
1928 );
1929}
1930
1931#[test]
1932fn variable_sized_segment() {
1933 assert_js!(
1934 r#"
1935pub fn go(x) {
1936 case x {
1937 <<n, rest:size(n)>> -> 1
1938 _ -> 2
1939 }
1940}
1941"#
1942 )
1943}
1944
1945#[test]
1946fn segments_shadowing_each_other() {
1947 assert_js!(
1948 r#"
1949pub fn go(x) {
1950 let n = 1
1951 case x {
1952 <<n, rest:size(n)>> -> 1
1953 _ -> 2
1954 }
1955}
1956"#
1957 )
1958}
1959
1960#[test]
1961fn negative_size_pattern() {
1962 assert_js!(
1963 r#"
1964pub fn go(x) {
1965 let n = -10
1966 case x {
1967 <<int:size(n)>> -> int
1968 _ -> 2
1969 }
1970}
1971"#
1972 )
1973}
1974
1975#[test]
1976fn negative_size_pattern_2() {
1977 assert_js!(
1978 r#"
1979pub fn go(x) {
1980 case x {
1981 <<n:signed, int:size(n)>> -> int
1982 _ -> 2
1983 }
1984}
1985"#
1986 )
1987}
1988
1989// https://github.com/gleam-lang/gleam/issues/3375
1990#[test]
1991fn bit_array_assignment_int() {
1992 assert_js!(
1993 "
1994pub fn main() {
1995 let assert <<1 as a>> = <<1>>
1996 a
1997}
1998"
1999 );
2000}
2001
2002#[test]
2003fn case_bit_array_assignment_int() {
2004 assert_js!(
2005 "
2006pub fn go(x) {
2007 case x {
2008 <<1 as n>>
2009 | <<2 as n, _:bytes>> -> n
2010 _ -> 1
2011 }
2012}
2013"
2014 );
2015}
2016
2017// https://github.com/gleam-lang/gleam/issues/3375
2018#[test]
2019fn bit_array_assignment_float() {
2020 assert_js!(
2021 "
2022pub fn main() {
2023 let assert <<3.14 as pi:float>> = <<3.14>>
2024 pi
2025}
2026"
2027 );
2028}
2029
2030#[test]
2031fn case_bit_array_assignment_float() {
2032 assert_js!(
2033 "
2034pub fn go(x) {
2035 case x {
2036 <<3.14 as pi:float>>
2037 | <<1.1 as pi:float, _:bytes>> -> pi
2038 _ -> 1.1
2039 }
2040}
2041"
2042 );
2043}
2044
2045// https://github.com/gleam-lang/gleam/issues/3375
2046#[test]
2047fn bit_array_assignment_string() {
2048 assert_js!(
2049 r#"
2050pub fn main() {
2051 let assert <<"Hello, world!" as message:utf8>> = <<"Hello, world!">>
2052 message
2053}
2054"#
2055 );
2056}
2057
2058#[test]
2059fn case_bit_array_assignment_string() {
2060 assert_js!(
2061 r#"
2062pub fn go(x) {
2063 case x {
2064 <<"Hello" as message>>
2065 | <<"Jak" as message, _:bytes>> -> message
2066 _ -> "wibble"
2067 }
2068}
2069"#
2070 );
2071}
2072
2073// https://github.com/gleam-lang/gleam/issues/3375
2074#[test]
2075fn bit_array_assignment_discard() {
2076 assert_js!(
2077 r#"
2078pub fn main() {
2079 let assert <<_ as number>> = <<10>>
2080 number
2081}
2082"#
2083 );
2084}
2085
2086#[test]
2087fn case_bit_array_assignment_discard() {
2088 assert_js!(
2089 r#"
2090pub fn go(x) {
2091 case x {
2092 <<_ as n>>
2093 | <<_ as n, _:bytes>> -> n
2094 _ -> 1
2095 }
2096}
2097"#
2098 );
2099}
2100
2101#[test]
2102fn utf16() {
2103 assert_js!(
2104 r#"
2105pub fn main() {
2106 <<"Hello, world!":utf16>>
2107}
2108"#
2109 );
2110}
2111
2112#[test]
2113fn utf16_codepoint() {
2114 assert_js!(
2115 r#"
2116fn codepoint() -> UtfCodepoint { todo }
2117
2118pub fn main() {
2119 let my_codepoint = codepoint()
2120 <<my_codepoint:utf16_codepoint>>
2121}
2122"#
2123 );
2124}
2125
2126#[test]
2127fn utf32() {
2128 assert_js!(
2129 r#"
2130pub fn main() {
2131 <<"Hello, world!":utf32>>
2132}
2133"#
2134 );
2135}
2136
2137#[test]
2138fn utf32_codepoint() {
2139 assert_js!(
2140 r#"
2141fn codepoint() -> UtfCodepoint { todo }
2142
2143pub fn main() {
2144 let my_codepoint = codepoint()
2145 <<my_codepoint:utf32_codepoint>>
2146}
2147"#
2148 );
2149}
2150
2151#[test]
2152fn const_utf16() {
2153 assert_js!(
2154 r#"
2155pub const message = <<"Hello, world!":utf16>>
2156"#
2157 );
2158}
2159
2160#[test]
2161fn const_utf32() {
2162 assert_js!(
2163 r#"
2164pub const message = <<"Hello, world!":utf32>>
2165"#
2166 );
2167}
2168
2169#[test]
2170fn pattern_match_utf16() {
2171 assert_js!(
2172 r#"
2173pub fn go(x) {
2174 let assert <<"Hello":utf16, _rest:bytes>> = x
2175}
2176"#
2177 );
2178}
2179
2180#[test]
2181fn pattern_match_utf32() {
2182 assert_js!(
2183 r#"
2184pub fn go(x) {
2185 let assert <<"Hello":utf32, _rest:bytes>> = x
2186}
2187"#
2188 );
2189}
2190
2191#[test]
2192fn utf16_little_endian() {
2193 assert_js!(
2194 r#"
2195pub fn main() {
2196 <<"Hello, world!":utf16-little>>
2197}
2198"#
2199 );
2200}
2201
2202#[test]
2203fn utf32_little_endian() {
2204 assert_js!(
2205 r#"
2206pub fn main() {
2207 <<"Hello, world!":utf32-little>>
2208}
2209"#
2210 );
2211}
2212
2213#[test]
2214fn pattern_match_utf16_little_endian() {
2215 assert_js!(
2216 r#"
2217pub fn go(x) {
2218 let assert <<"Hello":utf16-little, _rest:bytes>> = x
2219}
2220"#
2221 );
2222}
2223
2224#[test]
2225fn pattern_match_utf32_little_endian() {
2226 assert_js!(
2227 r#"
2228pub fn go(x) {
2229 let assert <<"Hello":utf32-little, _rest:bytes>> = x
2230}
2231"#
2232 );
2233}
2234
2235// https://github.com/gleam-lang/gleam/issues/4630
2236#[test]
2237fn tuple_bit_array() {
2238 assert_js!(
2239 "
2240pub fn go(x) {
2241 let assert #(<<>>) = x
2242}
2243"
2244 );
2245}
2246
2247// https://github.com/gleam-lang/gleam/issues/4630
2248#[test]
2249fn tuple_bit_array_case() {
2250 assert_js!(
2251 "
2252pub fn go(x) {
2253 case x {
2254 #(<<>>) -> 1
2255 _ -> 2
2256 }
2257}
2258"
2259 );
2260}
2261
2262#[test]
2263fn tuple_multiple_bit_arrays() {
2264 assert_js!(
2265 "
2266pub fn go(x) {
2267 let assert #(<<>>, <<1>>, <<2, 3>>) = x
2268}
2269"
2270 );
2271}
2272
2273#[test]
2274fn tuple_multiple_bit_arrays_case() {
2275 assert_js!(
2276 "
2277pub fn go(x) {
2278 case x {
2279 #(<<>>, <<1>>, <<2, 3>>) -> True
2280 _ -> False
2281 }
2282}
2283"
2284 );
2285}
2286
2287// https://github.com/gleam-lang/gleam/issues/4637
2288#[test]
2289fn pattern_matching_on_32_float_plus_infinity_still_reachable() {
2290 assert_js!(
2291 r#"
2292pub fn go(x) {
2293 case x {
2294 <<_:32-float>> -> "Float"
2295 <<0x7f800000:32>> -> "+Infinity"
2296 _ -> "Other"
2297 }
2298}
2299"#
2300 );
2301}
2302
2303#[test]
2304fn pattern_matching_on_32_float_plus_infinity_still_reachable_2() {
2305 assert_js!(
2306 r#"
2307pub fn go(x) {
2308 case x {
2309 <<_:32-float>> -> "Float"
2310 <<0x7f80:16, 0x0000:16>> -> "+Infinity"
2311 _ -> "Other"
2312 }
2313}
2314"#
2315 );
2316}
2317
2318#[test]
2319fn pattern_matching_on_32_float_minus_infinity_still_reachable() {
2320 assert_js!(
2321 r#"
2322pub fn go(x) {
2323 case x {
2324 <<_:32-float>> -> "Float"
2325 <<0xff800000:32>> -> "-Infinity"
2326 _ -> "Other"
2327 }
2328}
2329"#
2330 );
2331}
2332
2333#[test]
2334fn pattern_matching_on_32_float_minus_infinity_still_reachable_2() {
2335 assert_js!(
2336 r#"
2337pub fn go(x) {
2338 case x {
2339 <<_:32-float>> -> "Float"
2340 <<0xff80:16, 0x0000:16>> -> "-Infinity"
2341 _ -> "Other"
2342 }
2343}
2344"#
2345 );
2346}
2347
2348#[test]
2349fn pattern_matching_on_32_float_nan_still_reachable() {
2350 assert_js!(
2351 r#"
2352pub fn go(x) {
2353 case x {
2354 <<_:32-float>> -> "Float"
2355 <<0x7fc00000:32>> -> "NaN"
2356 _ -> "Other"
2357 }
2358}
2359"#
2360 );
2361}
2362
2363#[test]
2364fn pattern_matching_on_32_float_nan_still_reachable_2() {
2365 assert_js!(
2366 r#"
2367pub fn go(x) {
2368 case x {
2369 <<_:32-float>> -> "Float"
2370 <<0x7fc0:16, 0x0000:16>> -> "NaN"
2371 _ -> "Other"
2372 }
2373}
2374"#
2375 );
2376}
2377
2378#[test]
2379fn pattern_matching_on_64_float_plus_infinity_still_reachable() {
2380 assert_js!(
2381 r#"
2382pub fn go(x) {
2383 case x {
2384 <<_:64-float>> -> "Float"
2385 <<0x7ff0000000000000:64>> -> "+Infinity"
2386 _ -> "Other"
2387 }
2388}
2389"#
2390 );
2391}
2392
2393#[test]
2394fn pattern_matching_on_64_float_plus_infinity_still_reachable_2() {
2395 assert_js!(
2396 r#"
2397pub fn go(x) {
2398 case x {
2399 <<_:64-float>> -> "Float"
2400 <<0x7ff00000:32, 0x00000000:32>> -> "+Infinity"
2401 _ -> "Other"
2402 }
2403}
2404"#
2405 );
2406}
2407
2408#[test]
2409fn pattern_matching_on_64_float_minus_infinity_still_reachable() {
2410 assert_js!(
2411 r#"
2412pub fn go(x) {
2413 case x {
2414 <<_:64-float>> -> "Float"
2415 <<0xfff0000000000000:64>> -> "-Infinity"
2416 _ -> "Other"
2417 }
2418}
2419"#
2420 );
2421}
2422
2423#[test]
2424fn pattern_matching_on_64_float_minus_infinity_still_reachable_2() {
2425 assert_js!(
2426 r#"
2427pub fn go(x) {
2428 case x {
2429 <<_:64-float>> -> "Float"
2430 <<0xfff00000:32, 0x00000000:32>> -> "-Infinity"
2431 _ -> "Other"
2432 }
2433}
2434"#
2435 );
2436}
2437
2438#[test]
2439fn pattern_matching_on_64_float_nan_still_reachable() {
2440 assert_js!(
2441 r#"
2442pub fn go(x) {
2443 case x {
2444 <<_:64-float>> -> "Float"
2445 <<0x7ff8000000000000:64>> -> "NaN"
2446 _ -> "Other"
2447 }
2448}
2449"#
2450 );
2451}
2452
2453#[test]
2454fn pattern_matching_on_64_float_nan_still_reachable_2() {
2455 assert_js!(
2456 r#"
2457pub fn go(x) {
2458 case x {
2459 <<_:64-float>> -> "Float"
2460 <<0x7ff80000:32, 0x00000000:32>> -> "NaN"
2461 _ -> "Other"
2462 }
2463}
2464"#
2465 );
2466}
2467
2468#[test]
2469fn pattern_matching_on_64_float_int_is_still_reachable() {
2470 assert_js!(
2471 r#"
2472pub fn go(x) {
2473 case x {
2474 <<_:64-float>> -> "Float"
2475 <<_:64-int>> -> "Int"
2476 _ -> "Other"
2477 }
2478}
2479"#
2480 );
2481}
2482
2483#[test]
2484fn pattern_matching_on_64_float_float_is_unreachable() {
2485 assert_js!(
2486 r#"
2487pub fn go(x) {
2488 case x {
2489 <<_:64-float>> -> "Float"
2490 <<_:64-float>> -> "unreachable"
2491 _ -> "Other"
2492 }
2493}
2494"#
2495 );
2496}
2497
2498#[test]
2499fn unit_with_bits_option() {
2500 assert_js!(
2501 "
2502pub fn go(x) {
2503 <<x:bits-size(4)-unit(8)>>
2504}
2505"
2506 );
2507}
2508
2509#[test]
2510fn unit_with_bits_option_constant() {
2511 assert_js!(
2512 "
2513pub const bits = <<1, 2, 3>>
2514pub const more_bits = <<bits:bits-size(3)-unit(8)>>
2515"
2516 );
2517}
2518
2519#[test]
2520fn operator_in_size_for_bit_array_segment() {
2521 assert_js!(
2522 "
2523pub fn go(x) {
2524 <<x:bits-size(4 + 1)>>
2525}
2526"
2527 );
2528}
2529
2530// https://github.com/gleam-lang/gleam/issues/4712
2531#[test]
2532fn multiple_variable_size_segments() {
2533 assert_js!(
2534 "
2535pub fn main() {
2536 let assert <<a, b:size(a), c:size(b)>> = <<1, 2, 3, 4>>
2537 a + b + c
2538}
2539"
2540 );
2541}
2542
2543#[test]
2544fn utf16_codepoint_little_endian() {
2545 assert_js!(
2546 "
2547pub fn go(codepoint) {
2548 <<codepoint:utf16_codepoint-little>>
2549}
2550"
2551 );
2552}
2553
2554#[test]
2555fn utf32_codepoint_little_endian() {
2556 assert_js!(
2557 "
2558pub fn go(codepoint) {
2559 <<codepoint:utf32_codepoint-little>>
2560}
2561"
2562 );
2563}
2564
2565#[test]
2566fn operator_in_pattern_size() {
2567 assert_js!(
2568 "
2569pub fn main() {
2570 let assert <<len, payload:size(len * 8)>> = <<>>
2571}
2572"
2573 );
2574}
2575
2576#[test]
2577fn operator_in_pattern_size2() {
2578 assert_js!(
2579 "
2580pub fn main() {
2581 let assert <<len, payload:size(len / 8 - 1)>> = <<>>
2582}
2583"
2584 );
2585}
2586
2587#[test]
2588fn operator_in_pattern_size3() {
2589 assert_js!(
2590 "
2591pub fn main() {
2592 let additional = 10
2593 let assert <<len, payload:size(len + additional * 8)>> = <<>>
2594}
2595"
2596 );
2597}
2598
2599#[test]
2600fn block_in_pattern_size() {
2601 assert_js!(
2602 "
2603pub fn main() {
2604 let assert <<len, payload:size({ len - 1 } * 8)>> = <<>>
2605}
2606"
2607 );
2608}
2609
2610#[test]
2611fn non_byte_aligned_size_calculation() {
2612 assert_js!(
2613 "
2614pub fn main() {
2615 case <<>> {
2616 <<a:1, b:3, c:size(b - 2)>> -> c + b
2617 _ -> 1
2618 }
2619}
2620"
2621 );
2622}
2623
2624#[test]
2625fn pattern_match_on_negative_size_calculation() {
2626 assert_js!(
2627 "
2628pub fn main() {
2629 let assert <<a, b:size(a - 100000), c:size(b)>> = <<1, 2, 3, 4, 5>>
2630}
2631"
2632 );
2633}
2634
2635#[test]
2636fn pattern_match_unknown_size_and_literal_string() {
2637 assert_js!(
2638 r#"
2639pub fn go(x, n) {
2640 case x {
2641 <<_:size(n), "\r\n">> -> 1
2642 _ -> 2
2643 }
2644}
2645"#
2646 );
2647}