microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.1.3

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

compiler/qsc_parse/src/lex/raw/tests.rs

1345lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use super::Lexer;
5use crate::lex::raw::{Single, Token, TokenKind};
6use expect_test::{expect, Expect};
7
8fn check(input: &str, expect: &Expect) {
9 let actual: Vec<_> = Lexer::new(input).collect();
10 expect.assert_debug_eq(&actual);
11}
12
13#[test]
14fn singles() {
15 for single in enum_iterator::all::<Single>() {
16 let actual: Vec<_> = Lexer::new(&single.to_string()).collect();
17 let kind = TokenKind::Single(single);
18 assert_eq!(actual, vec![Token { kind, offset: 0 }]);
19 }
20}
21
22#[test]
23fn braces() {
24 check(
25 "{}",
26 &expect![[r#"
27 [
28 Token {
29 kind: Single(
30 Open(
31 Brace,
32 ),
33 ),
34 offset: 0,
35 },
36 Token {
37 kind: Single(
38 Close(
39 Brace,
40 ),
41 ),
42 offset: 1,
43 },
44 ]
45 "#]],
46 );
47}
48
49#[test]
50fn negate() {
51 check(
52 "-x",
53 &expect![[r#"
54 [
55 Token {
56 kind: Single(
57 Minus,
58 ),
59 offset: 0,
60 },
61 Token {
62 kind: Ident,
63 offset: 1,
64 },
65 ]
66 "#]],
67 );
68}
69
70#[test]
71fn whitespace() {
72 check(
73 "- x",
74 &expect![[r#"
75 [
76 Token {
77 kind: Single(
78 Minus,
79 ),
80 offset: 0,
81 },
82 Token {
83 kind: Whitespace,
84 offset: 1,
85 },
86 Token {
87 kind: Ident,
88 offset: 4,
89 },
90 ]
91 "#]],
92 );
93}
94
95#[test]
96fn comment() {
97 check(
98 "//comment\nx",
99 &expect![[r#"
100 [
101 Token {
102 kind: Comment(
103 Normal,
104 ),
105 offset: 0,
106 },
107 Token {
108 kind: Whitespace,
109 offset: 9,
110 },
111 Token {
112 kind: Ident,
113 offset: 10,
114 },
115 ]
116 "#]],
117 );
118}
119
120#[test]
121fn doc_comment() {
122 check(
123 "///comment\nx",
124 &expect![[r#"
125 [
126 Token {
127 kind: Comment(
128 Doc,
129 ),
130 offset: 0,
131 },
132 Token {
133 kind: Whitespace,
134 offset: 10,
135 },
136 Token {
137 kind: Ident,
138 offset: 11,
139 },
140 ]
141 "#]],
142 );
143}
144
145#[test]
146fn comment_four_slashes() {
147 check(
148 "////comment\nx",
149 &expect![[r#"
150 [
151 Token {
152 kind: Comment(
153 Normal,
154 ),
155 offset: 0,
156 },
157 Token {
158 kind: Whitespace,
159 offset: 11,
160 },
161 Token {
162 kind: Ident,
163 offset: 12,
164 },
165 ]
166 "#]],
167 );
168}
169
170#[test]
171fn string() {
172 check(
173 r#""string""#,
174 &expect![[r#"
175 [
176 Token {
177 kind: String(
178 Normal {
179 terminated: true,
180 },
181 ),
182 offset: 0,
183 },
184 ]
185 "#]],
186 );
187}
188
189#[test]
190fn string_escape_quote() {
191 check(
192 r#""str\"ing""#,
193 &expect![[r#"
194 [
195 Token {
196 kind: String(
197 Normal {
198 terminated: true,
199 },
200 ),
201 offset: 0,
202 },
203 ]
204 "#]],
205 );
206}
207
208#[test]
209fn string_missing_ending() {
210 check(
211 r#""string"#,
212 &expect![[r#"
213 [
214 Token {
215 kind: String(
216 Normal {
217 terminated: false,
218 },
219 ),
220 offset: 0,
221 },
222 ]
223 "#]],
224 );
225}
226
227#[test]
228fn interpolated_string_missing_ending() {
229 check(
230 r#"$"string"#,
231 &expect![[r#"
232 [
233 Token {
234 kind: String(
235 Interpolated(
236 DollarQuote,
237 None,
238 ),
239 ),
240 offset: 0,
241 },
242 ]
243 "#]],
244 );
245}
246
247#[test]
248fn interpolated_string() {
249 check(
250 r#"$"string""#,
251 &expect![[r#"
252 [
253 Token {
254 kind: String(
255 Interpolated(
256 DollarQuote,
257 Some(
258 Quote,
259 ),
260 ),
261 ),
262 offset: 0,
263 },
264 ]
265 "#]],
266 );
267}
268
269#[test]
270fn interpolated_string_braced() {
271 check(
272 r#"$"{x}""#,
273 &expect![[r#"
274 [
275 Token {
276 kind: String(
277 Interpolated(
278 DollarQuote,
279 Some(
280 LBrace,
281 ),
282 ),
283 ),
284 offset: 0,
285 },
286 Token {
287 kind: Ident,
288 offset: 3,
289 },
290 Token {
291 kind: String(
292 Interpolated(
293 RBrace,
294 Some(
295 Quote,
296 ),
297 ),
298 ),
299 offset: 4,
300 },
301 ]
302 "#]],
303 );
304}
305
306#[test]
307fn interpolated_string_escape_brace() {
308 check(
309 r#"$"\{""#,
310 &expect![[r#"
311 [
312 Token {
313 kind: String(
314 Interpolated(
315 DollarQuote,
316 Some(
317 Quote,
318 ),
319 ),
320 ),
321 offset: 0,
322 },
323 ]
324 "#]],
325 );
326}
327
328#[test]
329fn interpolated_string_unclosed_brace() {
330 check(
331 r#"$"{"#,
332 &expect![[r#"
333 [
334 Token {
335 kind: String(
336 Interpolated(
337 DollarQuote,
338 Some(
339 LBrace,
340 ),
341 ),
342 ),
343 offset: 0,
344 },
345 ]
346 "#]],
347 );
348}
349
350#[test]
351fn interpolated_string_unclosed_brace_quote() {
352 check(
353 r#"$"{""#,
354 &expect![[r#"
355 [
356 Token {
357 kind: String(
358 Interpolated(
359 DollarQuote,
360 Some(
361 LBrace,
362 ),
363 ),
364 ),
365 offset: 0,
366 },
367 Token {
368 kind: String(
369 Normal {
370 terminated: false,
371 },
372 ),
373 offset: 3,
374 },
375 ]
376 "#]],
377 );
378}
379
380#[test]
381fn interpolated_string_unopened_brace() {
382 check(
383 r#"$"}"#,
384 &expect![[r#"
385 [
386 Token {
387 kind: String(
388 Interpolated(
389 DollarQuote,
390 None,
391 ),
392 ),
393 offset: 0,
394 },
395 ]
396 "#]],
397 );
398}
399
400#[test]
401fn interpolated_string_unopened_brace_quote() {
402 check(
403 r#"$"}""#,
404 &expect![[r#"
405 [
406 Token {
407 kind: String(
408 Interpolated(
409 DollarQuote,
410 Some(
411 Quote,
412 ),
413 ),
414 ),
415 offset: 0,
416 },
417 ]
418 "#]],
419 );
420}
421
422#[test]
423fn interpolated_string_braced_index() {
424 check(
425 r#"$"{xs[0]}""#,
426 &expect![[r#"
427 [
428 Token {
429 kind: String(
430 Interpolated(
431 DollarQuote,
432 Some(
433 LBrace,
434 ),
435 ),
436 ),
437 offset: 0,
438 },
439 Token {
440 kind: Ident,
441 offset: 3,
442 },
443 Token {
444 kind: Single(
445 Open(
446 Bracket,
447 ),
448 ),
449 offset: 5,
450 },
451 Token {
452 kind: Number(
453 Int(
454 Decimal,
455 ),
456 ),
457 offset: 6,
458 },
459 Token {
460 kind: Single(
461 Close(
462 Bracket,
463 ),
464 ),
465 offset: 7,
466 },
467 Token {
468 kind: String(
469 Interpolated(
470 RBrace,
471 Some(
472 Quote,
473 ),
474 ),
475 ),
476 offset: 8,
477 },
478 ]
479 "#]],
480 );
481}
482
483#[test]
484fn interpolated_string_two_braced() {
485 check(
486 r#"$"{x} {y}""#,
487 &expect![[r#"
488 [
489 Token {
490 kind: String(
491 Interpolated(
492 DollarQuote,
493 Some(
494 LBrace,
495 ),
496 ),
497 ),
498 offset: 0,
499 },
500 Token {
501 kind: Ident,
502 offset: 3,
503 },
504 Token {
505 kind: String(
506 Interpolated(
507 RBrace,
508 Some(
509 LBrace,
510 ),
511 ),
512 ),
513 offset: 4,
514 },
515 Token {
516 kind: Ident,
517 offset: 7,
518 },
519 Token {
520 kind: String(
521 Interpolated(
522 RBrace,
523 Some(
524 Quote,
525 ),
526 ),
527 ),
528 offset: 8,
529 },
530 ]
531 "#]],
532 );
533}
534
535#[test]
536fn interpolated_string_braced_normal_string() {
537 check(
538 r#"$"{"{}"}""#,
539 &expect![[r#"
540 [
541 Token {
542 kind: String(
543 Interpolated(
544 DollarQuote,
545 Some(
546 LBrace,
547 ),
548 ),
549 ),
550 offset: 0,
551 },
552 Token {
553 kind: String(
554 Normal {
555 terminated: true,
556 },
557 ),
558 offset: 3,
559 },
560 Token {
561 kind: String(
562 Interpolated(
563 RBrace,
564 Some(
565 Quote,
566 ),
567 ),
568 ),
569 offset: 7,
570 },
571 ]
572 "#]],
573 );
574}
575
576#[test]
577fn nested_interpolated_string() {
578 check(
579 r#"$"{$"{x}"}""#,
580 &expect![[r#"
581 [
582 Token {
583 kind: String(
584 Interpolated(
585 DollarQuote,
586 Some(
587 LBrace,
588 ),
589 ),
590 ),
591 offset: 0,
592 },
593 Token {
594 kind: String(
595 Interpolated(
596 DollarQuote,
597 Some(
598 LBrace,
599 ),
600 ),
601 ),
602 offset: 3,
603 },
604 Token {
605 kind: Ident,
606 offset: 6,
607 },
608 Token {
609 kind: String(
610 Interpolated(
611 RBrace,
612 Some(
613 Quote,
614 ),
615 ),
616 ),
617 offset: 7,
618 },
619 Token {
620 kind: String(
621 Interpolated(
622 RBrace,
623 Some(
624 Quote,
625 ),
626 ),
627 ),
628 offset: 9,
629 },
630 ]
631 "#]],
632 );
633}
634
635#[test]
636fn nested_interpolated_string_with_exprs() {
637 check(
638 r#"$"foo {x + $"bar {y}"} baz""#,
639 &expect![[r#"
640 [
641 Token {
642 kind: String(
643 Interpolated(
644 DollarQuote,
645 Some(
646 LBrace,
647 ),
648 ),
649 ),
650 offset: 0,
651 },
652 Token {
653 kind: Ident,
654 offset: 7,
655 },
656 Token {
657 kind: Whitespace,
658 offset: 8,
659 },
660 Token {
661 kind: Single(
662 Plus,
663 ),
664 offset: 9,
665 },
666 Token {
667 kind: Whitespace,
668 offset: 10,
669 },
670 Token {
671 kind: String(
672 Interpolated(
673 DollarQuote,
674 Some(
675 LBrace,
676 ),
677 ),
678 ),
679 offset: 11,
680 },
681 Token {
682 kind: Ident,
683 offset: 18,
684 },
685 Token {
686 kind: String(
687 Interpolated(
688 RBrace,
689 Some(
690 Quote,
691 ),
692 ),
693 ),
694 offset: 19,
695 },
696 Token {
697 kind: String(
698 Interpolated(
699 RBrace,
700 Some(
701 Quote,
702 ),
703 ),
704 ),
705 offset: 21,
706 },
707 ]
708 "#]],
709 );
710}
711
712#[test]
713fn nested_interpolated_string_followed_by_braces() {
714 check(
715 r#"$"{$"{x}"}" {y}"#,
716 &expect![[r#"
717 [
718 Token {
719 kind: String(
720 Interpolated(
721 DollarQuote,
722 Some(
723 LBrace,
724 ),
725 ),
726 ),
727 offset: 0,
728 },
729 Token {
730 kind: String(
731 Interpolated(
732 DollarQuote,
733 Some(
734 LBrace,
735 ),
736 ),
737 ),
738 offset: 3,
739 },
740 Token {
741 kind: Ident,
742 offset: 6,
743 },
744 Token {
745 kind: String(
746 Interpolated(
747 RBrace,
748 Some(
749 Quote,
750 ),
751 ),
752 ),
753 offset: 7,
754 },
755 Token {
756 kind: String(
757 Interpolated(
758 RBrace,
759 Some(
760 Quote,
761 ),
762 ),
763 ),
764 offset: 9,
765 },
766 Token {
767 kind: Whitespace,
768 offset: 11,
769 },
770 Token {
771 kind: Single(
772 Open(
773 Brace,
774 ),
775 ),
776 offset: 12,
777 },
778 Token {
779 kind: Ident,
780 offset: 13,
781 },
782 Token {
783 kind: Single(
784 Close(
785 Brace,
786 ),
787 ),
788 offset: 14,
789 },
790 ]
791 "#]],
792 );
793}
794
795#[test]
796fn binary() {
797 check(
798 "0b10110",
799 &expect![[r#"
800 [
801 Token {
802 kind: Number(
803 Int(
804 Binary,
805 ),
806 ),
807 offset: 0,
808 },
809 ]
810 "#]],
811 );
812}
813
814#[test]
815fn octal() {
816 check(
817 "0o70351",
818 &expect![[r#"
819 [
820 Token {
821 kind: Number(
822 Int(
823 Octal,
824 ),
825 ),
826 offset: 0,
827 },
828 ]
829 "#]],
830 );
831}
832
833#[test]
834fn decimal() {
835 check(
836 "123",
837 &expect![[r#"
838 [
839 Token {
840 kind: Number(
841 Int(
842 Decimal,
843 ),
844 ),
845 offset: 0,
846 },
847 ]
848 "#]],
849 );
850}
851
852#[test]
853fn number_seps() {
854 check(
855 "123_456",
856 &expect![[r#"
857 [
858 Token {
859 kind: Number(
860 Int(
861 Decimal,
862 ),
863 ),
864 offset: 0,
865 },
866 ]
867 "#]],
868 );
869}
870
871#[test]
872fn number_underscore_prefix() {
873 check(
874 "_123_456",
875 &expect![[r#"
876 [
877 Token {
878 kind: Ident,
879 offset: 0,
880 },
881 ]
882 "#]],
883 );
884}
885
886#[test]
887fn int_dot_dot() {
888 check(
889 "0..",
890 &expect![[r#"
891 [
892 Token {
893 kind: Number(
894 Int(
895 Decimal,
896 ),
897 ),
898 offset: 0,
899 },
900 Token {
901 kind: Single(
902 Dot,
903 ),
904 offset: 1,
905 },
906 Token {
907 kind: Single(
908 Dot,
909 ),
910 offset: 2,
911 },
912 ]
913 "#]],
914 );
915}
916
917#[test]
918fn dot_dot_int() {
919 check(
920 "..0",
921 &expect![[r#"
922 [
923 Token {
924 kind: Single(
925 Dot,
926 ),
927 offset: 0,
928 },
929 Token {
930 kind: Single(
931 Dot,
932 ),
933 offset: 1,
934 },
935 Token {
936 kind: Number(
937 Int(
938 Decimal,
939 ),
940 ),
941 offset: 2,
942 },
943 ]
944 "#]],
945 );
946}
947
948#[test]
949fn dot_dot_dot_int() {
950 check(
951 "...0",
952 &expect![[r#"
953 [
954 Token {
955 kind: Single(
956 Dot,
957 ),
958 offset: 0,
959 },
960 Token {
961 kind: Single(
962 Dot,
963 ),
964 offset: 1,
965 },
966 Token {
967 kind: Single(
968 Dot,
969 ),
970 offset: 2,
971 },
972 Token {
973 kind: Number(
974 Int(
975 Decimal,
976 ),
977 ),
978 offset: 3,
979 },
980 ]
981 "#]],
982 );
983}
984
985#[test]
986fn hexadecimal() {
987 check(
988 "0x123abc",
989 &expect![[r#"
990 [
991 Token {
992 kind: Number(
993 Int(
994 Hexadecimal,
995 ),
996 ),
997 offset: 0,
998 },
999 ]
1000 "#]],
1001 );
1002}
1003
1004#[test]
1005fn bigint() {
1006 check(
1007 "123L",
1008 &expect![[r#"
1009 [
1010 Token {
1011 kind: Number(
1012 BigInt(
1013 Decimal,
1014 ),
1015 ),
1016 offset: 0,
1017 },
1018 ]
1019 "#]],
1020 );
1021}
1022
1023#[test]
1024fn negative() {
1025 check(
1026 "-4",
1027 &expect![[r#"
1028 [
1029 Token {
1030 kind: Single(
1031 Minus,
1032 ),
1033 offset: 0,
1034 },
1035 Token {
1036 kind: Number(
1037 Int(
1038 Decimal,
1039 ),
1040 ),
1041 offset: 1,
1042 },
1043 ]
1044 "#]],
1045 );
1046}
1047
1048#[test]
1049fn positive() {
1050 check(
1051 "+4",
1052 &expect![[r#"
1053 [
1054 Token {
1055 kind: Single(
1056 Plus,
1057 ),
1058 offset: 0,
1059 },
1060 Token {
1061 kind: Number(
1062 Int(
1063 Decimal,
1064 ),
1065 ),
1066 offset: 1,
1067 },
1068 ]
1069 "#]],
1070 );
1071}
1072
1073#[test]
1074fn bigint_hexadecimal() {
1075 check(
1076 "0x123abcL",
1077 &expect![[r#"
1078 [
1079 Token {
1080 kind: Number(
1081 BigInt(
1082 Hexadecimal,
1083 ),
1084 ),
1085 offset: 0,
1086 },
1087 ]
1088 "#]],
1089 );
1090}
1091
1092#[test]
1093fn float() {
1094 check(
1095 "1.23",
1096 &expect![[r#"
1097 [
1098 Token {
1099 kind: Number(
1100 Float,
1101 ),
1102 offset: 0,
1103 },
1104 ]
1105 "#]],
1106 );
1107}
1108
1109#[test]
1110fn leading_zero() {
1111 check(
1112 "0123",
1113 &expect![[r#"
1114 [
1115 Token {
1116 kind: Number(
1117 Int(
1118 Decimal,
1119 ),
1120 ),
1121 offset: 0,
1122 },
1123 ]
1124 "#]],
1125 );
1126}
1127
1128#[test]
1129fn leading_point() {
1130 check(
1131 ".123",
1132 &expect![[r#"
1133 [
1134 Token {
1135 kind: Single(
1136 Dot,
1137 ),
1138 offset: 0,
1139 },
1140 Token {
1141 kind: Number(
1142 Int(
1143 Decimal,
1144 ),
1145 ),
1146 offset: 1,
1147 },
1148 ]
1149 "#]],
1150 );
1151}
1152
1153#[test]
1154fn trailing_point() {
1155 check(
1156 "123.",
1157 &expect![[r#"
1158 [
1159 Token {
1160 kind: Number(
1161 Float,
1162 ),
1163 offset: 0,
1164 },
1165 ]
1166 "#]],
1167 );
1168}
1169
1170#[test]
1171fn exp() {
1172 check(
1173 "1e23",
1174 &expect![[r#"
1175 [
1176 Token {
1177 kind: Number(
1178 Float,
1179 ),
1180 offset: 0,
1181 },
1182 ]
1183 "#]],
1184 );
1185}
1186
1187#[test]
1188fn exp_plus() {
1189 check(
1190 "1e+23",
1191 &expect![[r#"
1192 [
1193 Token {
1194 kind: Number(
1195 Float,
1196 ),
1197 offset: 0,
1198 },
1199 ]
1200 "#]],
1201 );
1202}
1203
1204#[test]
1205fn exp_minus() {
1206 check(
1207 "1e-23",
1208 &expect![[r#"
1209 [
1210 Token {
1211 kind: Number(
1212 Float,
1213 ),
1214 offset: 0,
1215 },
1216 ]
1217 "#]],
1218 );
1219}
1220
1221#[test]
1222fn leading_point_exp() {
1223 check(
1224 ".25e2",
1225 &expect![[r#"
1226 [
1227 Token {
1228 kind: Single(
1229 Dot,
1230 ),
1231 offset: 0,
1232 },
1233 Token {
1234 kind: Number(
1235 Float,
1236 ),
1237 offset: 1,
1238 },
1239 ]
1240 "#]],
1241 );
1242}
1243
1244#[test]
1245fn leading_zero_point() {
1246 check(
1247 "0.25",
1248 &expect![[r#"
1249 [
1250 Token {
1251 kind: Number(
1252 Float,
1253 ),
1254 offset: 0,
1255 },
1256 ]
1257 "#]],
1258 );
1259}
1260
1261#[test]
1262fn leading_zero_zero_point() {
1263 check(
1264 "00.25",
1265 &expect![[r#"
1266 [
1267 Token {
1268 kind: Number(
1269 Float,
1270 ),
1271 offset: 0,
1272 },
1273 ]
1274 "#]],
1275 );
1276}
1277
1278#[test]
1279fn leading_zero_exp() {
1280 check(
1281 "0.25e2",
1282 &expect![[r#"
1283 [
1284 Token {
1285 kind: Number(
1286 Float,
1287 ),
1288 offset: 0,
1289 },
1290 ]
1291 "#]],
1292 );
1293}
1294
1295#[test]
1296fn unknown() {
1297 check(
1298 "##",
1299 &expect![[r#"
1300 [
1301 Token {
1302 kind: Unknown,
1303 offset: 0,
1304 },
1305 Token {
1306 kind: Unknown,
1307 offset: 1,
1308 },
1309 ]
1310 "#]],
1311 );
1312}
1313
1314#[test]
1315fn float_hexadecimal() {
1316 check(
1317 "0x123.45",
1318 &expect![[r#"
1319 [
1320 Token {
1321 kind: Number(
1322 Int(
1323 Hexadecimal,
1324 ),
1325 ),
1326 offset: 0,
1327 },
1328 Token {
1329 kind: Single(
1330 Dot,
1331 ),
1332 offset: 5,
1333 },
1334 Token {
1335 kind: Number(
1336 Int(
1337 Decimal,
1338 ),
1339 ),
1340 offset: 6,
1341 },
1342 ]
1343 "#]],
1344 );
1345}
1346