atproto libraries implementation in ocaml
1{
2 "title": "AT Protocol Compliance Report",
3 "version": "1.0.0",
4 "generated_at": "2026-01-01T22:04:38Z",
5 "repository": "https://github.com/gdiazlo/atproto",
6 "total_tests": 494,
7 "total_passed": 494,
8 "total_failed": 0,
9 "pass_rate": 100,
10 "suites": [
11 {
12 "name": "Syntax Validation",
13 "spec_url": "https://atproto.com/specs/lexicon#string-formats",
14 "total": 448,
15 "passed": 448,
16 "failed": 0,
17 "pass_rate": 100,
18 "categories": [
19 {
20 "name": "Handle",
21 "description": "DNS-like user identifiers",
22 "fixture_file": "handle_syntax_valid.txt, handle_syntax_invalid.txt",
23 "total": 119,
24 "passed": 119,
25 "failed": 0,
26 "pass_rate": 100,
27 "results": [
28 {
29 "input": "A.ISI.EDU",
30 "expected": "valid",
31 "actual": "valid",
32 "passed": true,
33 "error": null
34 },
35 {
36 "input": "XX.LCS.MIT.EDU",
37 "expected": "valid",
38 "actual": "valid",
39 "passed": true,
40 "error": null
41 },
42 {
43 "input": "SRI-NIC.ARPA",
44 "expected": "valid",
45 "actual": "valid",
46 "passed": true,
47 "error": null
48 },
49 {
50 "input": "john.test",
51 "expected": "valid",
52 "actual": "valid",
53 "passed": true,
54 "error": null
55 },
56 {
57 "input": "jan.test",
58 "expected": "valid",
59 "actual": "valid",
60 "passed": true,
61 "error": null
62 },
63 {
64 "input": "a234567890123456789.test",
65 "expected": "valid",
66 "actual": "valid",
67 "passed": true,
68 "error": null
69 },
70 {
71 "input": "john2.test",
72 "expected": "valid",
73 "actual": "valid",
74 "passed": true,
75 "error": null
76 },
77 {
78 "input": "john-john.test",
79 "expected": "valid",
80 "actual": "valid",
81 "passed": true,
82 "error": null
83 },
84 {
85 "input": "john.bsky.app",
86 "expected": "valid",
87 "actual": "valid",
88 "passed": true,
89 "error": null
90 },
91 {
92 "input": "jo.hn",
93 "expected": "valid",
94 "actual": "valid",
95 "passed": true,
96 "error": null
97 },
98 {
99 "input": "a.co",
100 "expected": "valid",
101 "actual": "valid",
102 "passed": true,
103 "error": null
104 },
105 {
106 "input": "a.org",
107 "expected": "valid",
108 "actual": "valid",
109 "passed": true,
110 "error": null
111 },
112 {
113 "input": "joh.n",
114 "expected": "valid",
115 "actual": "valid",
116 "passed": true,
117 "error": null
118 },
119 {
120 "input": "j0.h0",
121 "expected": "valid",
122 "actual": "valid",
123 "passed": true,
124 "error": null
125 },
126 {
127 "input": "jaymome-johnber123456.test",
128 "expected": "valid",
129 "actual": "valid",
130 "passed": true,
131 "error": null
132 },
133 {
134 "input": "jay.mome-johnber123456.test",
135 "expected": "valid",
136 "actual": "valid",
137 "passed": true,
138 "error": null
139 },
140 {
141 "input": "john.test.bsky.app",
142 "expected": "valid",
143 "actual": "valid",
144 "passed": true,
145 "error": null
146 },
147 {
148 "input": "shoooort.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.test",
149 "expected": "valid",
150 "actual": "valid",
151 "passed": true,
152 "error": null
153 },
154 {
155 "input": "short.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.test",
156 "expected": "valid",
157 "actual": "valid",
158 "passed": true,
159 "error": null
160 },
161 {
162 "input": "john.t",
163 "expected": "valid",
164 "actual": "valid",
165 "passed": true,
166 "error": null
167 },
168 {
169 "input": "laptop.local",
170 "expected": "valid",
171 "actual": "valid",
172 "passed": true,
173 "error": null
174 },
175 {
176 "input": "laptop.arpa",
177 "expected": "valid",
178 "actual": "valid",
179 "passed": true,
180 "error": null
181 },
182 {
183 "input": "xn--ls8h.test",
184 "expected": "valid",
185 "actual": "valid",
186 "passed": true,
187 "error": null
188 },
189 {
190 "input": "xn--bcher-kva.tld",
191 "expected": "valid",
192 "actual": "valid",
193 "passed": true,
194 "error": null
195 },
196 {
197 "input": "xn--3jk.com",
198 "expected": "valid",
199 "actual": "valid",
200 "passed": true,
201 "error": null
202 },
203 {
204 "input": "xn--w3d.com",
205 "expected": "valid",
206 "actual": "valid",
207 "passed": true,
208 "error": null
209 },
210 {
211 "input": "xn--vqb.com",
212 "expected": "valid",
213 "actual": "valid",
214 "passed": true,
215 "error": null
216 },
217 {
218 "input": "xn--ppd.com",
219 "expected": "valid",
220 "actual": "valid",
221 "passed": true,
222 "error": null
223 },
224 {
225 "input": "xn--cs9a.com",
226 "expected": "valid",
227 "actual": "valid",
228 "passed": true,
229 "error": null
230 },
231 {
232 "input": "xn--8r9a.com",
233 "expected": "valid",
234 "actual": "valid",
235 "passed": true,
236 "error": null
237 },
238 {
239 "input": "xn--cfd.com",
240 "expected": "valid",
241 "actual": "valid",
242 "passed": true,
243 "error": null
244 },
245 {
246 "input": "xn--5jk.com",
247 "expected": "valid",
248 "actual": "valid",
249 "passed": true,
250 "error": null
251 },
252 {
253 "input": "xn--2lb.com",
254 "expected": "valid",
255 "actual": "valid",
256 "passed": true,
257 "error": null
258 },
259 {
260 "input": "expyuzz4wqqyqhjn.onion",
261 "expected": "valid",
262 "actual": "valid",
263 "passed": true,
264 "error": null
265 },
266 {
267 "input": "friend.expyuzz4wqqyqhjn.onion",
268 "expected": "valid",
269 "actual": "valid",
270 "passed": true,
271 "error": null
272 },
273 {
274 "input": "g2zyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion",
275 "expected": "valid",
276 "actual": "valid",
277 "passed": true,
278 "error": null
279 },
280 {
281 "input": "friend.g2zyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion",
282 "expected": "valid",
283 "actual": "valid",
284 "passed": true,
285 "error": null
286 },
287 {
288 "input": "friend.g2zyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion",
289 "expected": "valid",
290 "actual": "valid",
291 "passed": true,
292 "error": null
293 },
294 {
295 "input": "2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion",
296 "expected": "valid",
297 "actual": "valid",
298 "passed": true,
299 "error": null
300 },
301 {
302 "input": "friend.2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion",
303 "expected": "valid",
304 "actual": "valid",
305 "passed": true,
306 "error": null
307 },
308 {
309 "input": "12345.test",
310 "expected": "valid",
311 "actual": "valid",
312 "passed": true,
313 "error": null
314 },
315 {
316 "input": "8.cn",
317 "expected": "valid",
318 "actual": "valid",
319 "passed": true,
320 "error": null
321 },
322 {
323 "input": "4chan.org",
324 "expected": "valid",
325 "actual": "valid",
326 "passed": true,
327 "error": null
328 },
329 {
330 "input": "4chan.o-g",
331 "expected": "valid",
332 "actual": "valid",
333 "passed": true,
334 "error": null
335 },
336 {
337 "input": "blah.4chan.org",
338 "expected": "valid",
339 "actual": "valid",
340 "passed": true,
341 "error": null
342 },
343 {
344 "input": "thing.a01",
345 "expected": "valid",
346 "actual": "valid",
347 "passed": true,
348 "error": null
349 },
350 {
351 "input": "120.0.0.1.com",
352 "expected": "valid",
353 "actual": "valid",
354 "passed": true,
355 "error": null
356 },
357 {
358 "input": "0john.test",
359 "expected": "valid",
360 "actual": "valid",
361 "passed": true,
362 "error": null
363 },
364 {
365 "input": "9sta--ck.com",
366 "expected": "valid",
367 "actual": "valid",
368 "passed": true,
369 "error": null
370 },
371 {
372 "input": "99stack.com",
373 "expected": "valid",
374 "actual": "valid",
375 "passed": true,
376 "error": null
377 },
378 {
379 "input": "0ohn.test",
380 "expected": "valid",
381 "actual": "valid",
382 "passed": true,
383 "error": null
384 },
385 {
386 "input": "john.t--t",
387 "expected": "valid",
388 "actual": "valid",
389 "passed": true,
390 "error": null
391 },
392 {
393 "input": "thing.0aa.thing",
394 "expected": "valid",
395 "actual": "valid",
396 "passed": true,
397 "error": null
398 },
399 {
400 "input": "stack.com",
401 "expected": "valid",
402 "actual": "valid",
403 "passed": true,
404 "error": null
405 },
406 {
407 "input": "sta-ck.com",
408 "expected": "valid",
409 "actual": "valid",
410 "passed": true,
411 "error": null
412 },
413 {
414 "input": "sta---ck.com",
415 "expected": "valid",
416 "actual": "valid",
417 "passed": true,
418 "error": null
419 },
420 {
421 "input": "sta--ck9.com",
422 "expected": "valid",
423 "actual": "valid",
424 "passed": true,
425 "error": null
426 },
427 {
428 "input": "stack99.com",
429 "expected": "valid",
430 "actual": "valid",
431 "passed": true,
432 "error": null
433 },
434 {
435 "input": "sta99ck.com",
436 "expected": "valid",
437 "actual": "valid",
438 "passed": true,
439 "error": null
440 },
441 {
442 "input": "google.com.uk",
443 "expected": "valid",
444 "actual": "valid",
445 "passed": true,
446 "error": null
447 },
448 {
449 "input": "google.co.in",
450 "expected": "valid",
451 "actual": "valid",
452 "passed": true,
453 "error": null
454 },
455 {
456 "input": "google.com",
457 "expected": "valid",
458 "actual": "valid",
459 "passed": true,
460 "error": null
461 },
462 {
463 "input": "maselkowski.pl",
464 "expected": "valid",
465 "actual": "valid",
466 "passed": true,
467 "error": null
468 },
469 {
470 "input": "m.maselkowski.pl",
471 "expected": "valid",
472 "actual": "valid",
473 "passed": true,
474 "error": null
475 },
476 {
477 "input": "xn--masekowski-d0b.pl",
478 "expected": "valid",
479 "actual": "valid",
480 "passed": true,
481 "error": null
482 },
483 {
484 "input": "xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s",
485 "expected": "valid",
486 "actual": "valid",
487 "passed": true,
488 "error": null
489 },
490 {
491 "input": "xn--stackoverflow.com",
492 "expected": "valid",
493 "actual": "valid",
494 "passed": true,
495 "error": null
496 },
497 {
498 "input": "stackoverflow.xn--com",
499 "expected": "valid",
500 "actual": "valid",
501 "passed": true,
502 "error": null
503 },
504 {
505 "input": "stackoverflow.co.uk",
506 "expected": "valid",
507 "actual": "valid",
508 "passed": true,
509 "error": null
510 },
511 {
512 "input": "xn--masekowski-d0b.pl",
513 "expected": "valid",
514 "actual": "valid",
515 "passed": true,
516 "error": null
517 },
518 {
519 "input": "xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s",
520 "expected": "valid",
521 "actual": "valid",
522 "passed": true,
523 "error": null
524 },
525 {
526 "input": "did:thing.test",
527 "expected": "invalid",
528 "actual": "invalid",
529 "passed": true,
530 "error": null
531 },
532 {
533 "input": "did:thing",
534 "expected": "invalid",
535 "actual": "invalid",
536 "passed": true,
537 "error": null
538 },
539 {
540 "input": "john-.test",
541 "expected": "invalid",
542 "actual": "invalid",
543 "passed": true,
544 "error": null
545 },
546 {
547 "input": "john.0",
548 "expected": "invalid",
549 "actual": "invalid",
550 "passed": true,
551 "error": null
552 },
553 {
554 "input": "john.-",
555 "expected": "invalid",
556 "actual": "invalid",
557 "passed": true,
558 "error": null
559 },
560 {
561 "input": "xn--bcher-.tld",
562 "expected": "invalid",
563 "actual": "invalid",
564 "passed": true,
565 "error": null
566 },
567 {
568 "input": "john..test",
569 "expected": "invalid",
570 "actual": "invalid",
571 "passed": true,
572 "error": null
573 },
574 {
575 "input": "jo_hn.test",
576 "expected": "invalid",
577 "actual": "invalid",
578 "passed": true,
579 "error": null
580 },
581 {
582 "input": "-john.test",
583 "expected": "invalid",
584 "actual": "invalid",
585 "passed": true,
586 "error": null
587 },
588 {
589 "input": ".john.test",
590 "expected": "invalid",
591 "actual": "invalid",
592 "passed": true,
593 "error": null
594 },
595 {
596 "input": "jo!hn.test",
597 "expected": "invalid",
598 "actual": "invalid",
599 "passed": true,
600 "error": null
601 },
602 {
603 "input": "jo%hn.test",
604 "expected": "invalid",
605 "actual": "invalid",
606 "passed": true,
607 "error": null
608 },
609 {
610 "input": "jo&hn.test",
611 "expected": "invalid",
612 "actual": "invalid",
613 "passed": true,
614 "error": null
615 },
616 {
617 "input": "jo@hn.test",
618 "expected": "invalid",
619 "actual": "invalid",
620 "passed": true,
621 "error": null
622 },
623 {
624 "input": "jo*hn.test",
625 "expected": "invalid",
626 "actual": "invalid",
627 "passed": true,
628 "error": null
629 },
630 {
631 "input": "jo|hn.test",
632 "expected": "invalid",
633 "actual": "invalid",
634 "passed": true,
635 "error": null
636 },
637 {
638 "input": "jo:hn.test",
639 "expected": "invalid",
640 "actual": "invalid",
641 "passed": true,
642 "error": null
643 },
644 {
645 "input": "jo/hn.test",
646 "expected": "invalid",
647 "actual": "invalid",
648 "passed": true,
649 "error": null
650 },
651 {
652 "input": "john💩.test",
653 "expected": "invalid",
654 "actual": "invalid",
655 "passed": true,
656 "error": null
657 },
658 {
659 "input": "bücher.test",
660 "expected": "invalid",
661 "actual": "invalid",
662 "passed": true,
663 "error": null
664 },
665 {
666 "input": "john .test",
667 "expected": "invalid",
668 "actual": "invalid",
669 "passed": true,
670 "error": null
671 },
672 {
673 "input": "john.test.",
674 "expected": "invalid",
675 "actual": "invalid",
676 "passed": true,
677 "error": null
678 },
679 {
680 "input": "john",
681 "expected": "invalid",
682 "actual": "invalid",
683 "passed": true,
684 "error": null
685 },
686 {
687 "input": "john.",
688 "expected": "invalid",
689 "actual": "invalid",
690 "passed": true,
691 "error": null
692 },
693 {
694 "input": ".john",
695 "expected": "invalid",
696 "actual": "invalid",
697 "passed": true,
698 "error": null
699 },
700 {
701 "input": "john.test.",
702 "expected": "invalid",
703 "actual": "invalid",
704 "passed": true,
705 "error": null
706 },
707 {
708 "input": ".john.test",
709 "expected": "invalid",
710 "actual": "invalid",
711 "passed": true,
712 "error": null
713 },
714 {
715 "input": " john.test",
716 "expected": "invalid",
717 "actual": "invalid",
718 "passed": true,
719 "error": null
720 },
721 {
722 "input": "john.test ",
723 "expected": "invalid",
724 "actual": "invalid",
725 "passed": true,
726 "error": null
727 },
728 {
729 "input": "joh-.test",
730 "expected": "invalid",
731 "actual": "invalid",
732 "passed": true,
733 "error": null
734 },
735 {
736 "input": "john.-est",
737 "expected": "invalid",
738 "actual": "invalid",
739 "passed": true,
740 "error": null
741 },
742 {
743 "input": "john.tes-",
744 "expected": "invalid",
745 "actual": "invalid",
746 "passed": true,
747 "error": null
748 },
749 {
750 "input": "shoooort.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.loooooooooooooooooooooooooong.test",
751 "expected": "invalid",
752 "actual": "invalid",
753 "passed": true,
754 "error": null
755 },
756 {
757 "input": "short.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.test",
758 "expected": "invalid",
759 "actual": "invalid",
760 "passed": true,
761 "error": null
762 },
763 {
764 "input": "org",
765 "expected": "invalid",
766 "actual": "invalid",
767 "passed": true,
768 "error": null
769 },
770 {
771 "input": "ai",
772 "expected": "invalid",
773 "actual": "invalid",
774 "passed": true,
775 "error": null
776 },
777 {
778 "input": "gg",
779 "expected": "invalid",
780 "actual": "invalid",
781 "passed": true,
782 "error": null
783 },
784 {
785 "input": "io",
786 "expected": "invalid",
787 "actual": "invalid",
788 "passed": true,
789 "error": null
790 },
791 {
792 "input": "cn.8",
793 "expected": "invalid",
794 "actual": "invalid",
795 "passed": true,
796 "error": null
797 },
798 {
799 "input": "thing.0aa",
800 "expected": "invalid",
801 "actual": "invalid",
802 "passed": true,
803 "error": null
804 },
805 {
806 "input": "thing.0aa",
807 "expected": "invalid",
808 "actual": "invalid",
809 "passed": true,
810 "error": null
811 },
812 {
813 "input": "127.0.0.1",
814 "expected": "invalid",
815 "actual": "invalid",
816 "passed": true,
817 "error": null
818 },
819 {
820 "input": "192.168.0.142",
821 "expected": "invalid",
822 "actual": "invalid",
823 "passed": true,
824 "error": null
825 },
826 {
827 "input": "fe80::7325:8a97:c100:94b",
828 "expected": "invalid",
829 "actual": "invalid",
830 "passed": true,
831 "error": null
832 },
833 {
834 "input": "2600:3c03::f03c:9100:feb0:af1f",
835 "expected": "invalid",
836 "actual": "invalid",
837 "passed": true,
838 "error": null
839 },
840 {
841 "input": "-notvalid.at-all",
842 "expected": "invalid",
843 "actual": "invalid",
844 "passed": true,
845 "error": null
846 },
847 {
848 "input": "-thing.com",
849 "expected": "invalid",
850 "actual": "invalid",
851 "passed": true,
852 "error": null
853 },
854 {
855 "input": "www.masełkowski.pl.com",
856 "expected": "invalid",
857 "actual": "invalid",
858 "passed": true,
859 "error": null
860 }
861 ]
862 },
863 {
864 "name": "DID",
865 "description": "Decentralized Identifiers",
866 "fixture_file": "did_syntax_valid.txt, did_syntax_invalid.txt",
867 "total": 42,
868 "passed": 42,
869 "failed": 0,
870 "pass_rate": 100,
871 "results": [
872 {
873 "input": "did:method:val",
874 "expected": "valid",
875 "actual": "valid",
876 "passed": true,
877 "error": null
878 },
879 {
880 "input": "did:method:VAL",
881 "expected": "valid",
882 "actual": "valid",
883 "passed": true,
884 "error": null
885 },
886 {
887 "input": "did:method:val123",
888 "expected": "valid",
889 "actual": "valid",
890 "passed": true,
891 "error": null
892 },
893 {
894 "input": "did:method:123",
895 "expected": "valid",
896 "actual": "valid",
897 "passed": true,
898 "error": null
899 },
900 {
901 "input": "did:method:val-two",
902 "expected": "valid",
903 "actual": "valid",
904 "passed": true,
905 "error": null
906 },
907 {
908 "input": "did:method:val_two",
909 "expected": "valid",
910 "actual": "valid",
911 "passed": true,
912 "error": null
913 },
914 {
915 "input": "did:method:val.two",
916 "expected": "valid",
917 "actual": "valid",
918 "passed": true,
919 "error": null
920 },
921 {
922 "input": "did:method:val:two",
923 "expected": "valid",
924 "actual": "valid",
925 "passed": true,
926 "error": null
927 },
928 {
929 "input": "did:method:val%BB",
930 "expected": "valid",
931 "actual": "valid",
932 "passed": true,
933 "error": null
934 },
935 {
936 "input": "did:method:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv",
937 "expected": "valid",
938 "actual": "valid",
939 "passed": true,
940 "error": null
941 },
942 {
943 "input": "did:m:v",
944 "expected": "valid",
945 "actual": "valid",
946 "passed": true,
947 "error": null
948 },
949 {
950 "input": "did:method::::val",
951 "expected": "valid",
952 "actual": "valid",
953 "passed": true,
954 "error": null
955 },
956 {
957 "input": "did:method:-",
958 "expected": "valid",
959 "actual": "valid",
960 "passed": true,
961 "error": null
962 },
963 {
964 "input": "did:method:-:_:.:%ab",
965 "expected": "valid",
966 "actual": "valid",
967 "passed": true,
968 "error": null
969 },
970 {
971 "input": "did:method:.",
972 "expected": "valid",
973 "actual": "valid",
974 "passed": true,
975 "error": null
976 },
977 {
978 "input": "did:method:_",
979 "expected": "valid",
980 "actual": "valid",
981 "passed": true,
982 "error": null
983 },
984 {
985 "input": "did:method::.",
986 "expected": "valid",
987 "actual": "valid",
988 "passed": true,
989 "error": null
990 },
991 {
992 "input": "did:onion:2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid",
993 "expected": "valid",
994 "actual": "valid",
995 "passed": true,
996 "error": null
997 },
998 {
999 "input": "did:example:123456789abcdefghi",
1000 "expected": "valid",
1001 "actual": "valid",
1002 "passed": true,
1003 "error": null
1004 },
1005 {
1006 "input": "did:plc:7iza6de2dwap2sbkpav7c6c6",
1007 "expected": "valid",
1008 "actual": "valid",
1009 "passed": true,
1010 "error": null
1011 },
1012 {
1013 "input": "did:web:example.com",
1014 "expected": "valid",
1015 "actual": "valid",
1016 "passed": true,
1017 "error": null
1018 },
1019 {
1020 "input": "did:web:localhost%3A1234",
1021 "expected": "valid",
1022 "actual": "valid",
1023 "passed": true,
1024 "error": null
1025 },
1026 {
1027 "input": "did:key:zQ3shZc2QzApp2oymGvQbzP8eKheVshBHbU4ZYjeXqwSKEn6N",
1028 "expected": "valid",
1029 "actual": "valid",
1030 "passed": true,
1031 "error": null
1032 },
1033 {
1034 "input": "did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a",
1035 "expected": "valid",
1036 "actual": "valid",
1037 "passed": true,
1038 "error": null
1039 },
1040 {
1041 "input": "did",
1042 "expected": "invalid",
1043 "actual": "invalid",
1044 "passed": true,
1045 "error": null
1046 },
1047 {
1048 "input": "didmethodval",
1049 "expected": "invalid",
1050 "actual": "invalid",
1051 "passed": true,
1052 "error": null
1053 },
1054 {
1055 "input": "method:did:val",
1056 "expected": "invalid",
1057 "actual": "invalid",
1058 "passed": true,
1059 "error": null
1060 },
1061 {
1062 "input": "did:method:",
1063 "expected": "invalid",
1064 "actual": "invalid",
1065 "passed": true,
1066 "error": null
1067 },
1068 {
1069 "input": "didmethod:val",
1070 "expected": "invalid",
1071 "actual": "invalid",
1072 "passed": true,
1073 "error": null
1074 },
1075 {
1076 "input": "did:methodval)",
1077 "expected": "invalid",
1078 "actual": "invalid",
1079 "passed": true,
1080 "error": null
1081 },
1082 {
1083 "input": ":did:method:val",
1084 "expected": "invalid",
1085 "actual": "invalid",
1086 "passed": true,
1087 "error": null
1088 },
1089 {
1090 "input": "did.method.val",
1091 "expected": "invalid",
1092 "actual": "invalid",
1093 "passed": true,
1094 "error": null
1095 },
1096 {
1097 "input": "did:method:val:",
1098 "expected": "invalid",
1099 "actual": "invalid",
1100 "passed": true,
1101 "error": null
1102 },
1103 {
1104 "input": "did:method:val%",
1105 "expected": "invalid",
1106 "actual": "invalid",
1107 "passed": true,
1108 "error": null
1109 },
1110 {
1111 "input": "DID:method:val",
1112 "expected": "invalid",
1113 "actual": "invalid",
1114 "passed": true,
1115 "error": null
1116 },
1117 {
1118 "input": "did:METHOD:val",
1119 "expected": "invalid",
1120 "actual": "invalid",
1121 "passed": true,
1122 "error": null
1123 },
1124 {
1125 "input": "did:m123:val",
1126 "expected": "invalid",
1127 "actual": "invalid",
1128 "passed": true,
1129 "error": null
1130 },
1131 {
1132 "input": "did:method:val/two",
1133 "expected": "invalid",
1134 "actual": "invalid",
1135 "passed": true,
1136 "error": null
1137 },
1138 {
1139 "input": "did:method:val?two",
1140 "expected": "invalid",
1141 "actual": "invalid",
1142 "passed": true,
1143 "error": null
1144 },
1145 {
1146 "input": "did:method:val#two",
1147 "expected": "invalid",
1148 "actual": "invalid",
1149 "passed": true,
1150 "error": null
1151 },
1152 {
1153 "input": "did:method:val%",
1154 "expected": "invalid",
1155 "actual": "invalid",
1156 "passed": true,
1157 "error": null
1158 },
1159 {
1160 "input": "did:method:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv",
1161 "expected": "invalid",
1162 "actual": "invalid",
1163 "passed": true,
1164 "error": null
1165 }
1166 ]
1167 },
1168 {
1169 "name": "NSID",
1170 "description": "Namespaced Identifiers",
1171 "fixture_file": "nsid_syntax_valid.txt, nsid_syntax_invalid.txt",
1172 "total": 52,
1173 "passed": 52,
1174 "failed": 0,
1175 "pass_rate": 100,
1176 "results": [
1177 {
1178 "input": "com.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.foo",
1179 "expected": "valid",
1180 "actual": "valid",
1181 "passed": true,
1182 "error": null
1183 },
1184 {
1185 "input": "com.example.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
1186 "expected": "valid",
1187 "actual": "valid",
1188 "passed": true,
1189 "error": null
1190 },
1191 {
1192 "input": "com.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.foo",
1193 "expected": "valid",
1194 "actual": "valid",
1195 "passed": true,
1196 "error": null
1197 },
1198 {
1199 "input": "com.example.fooBar",
1200 "expected": "valid",
1201 "actual": "valid",
1202 "passed": true,
1203 "error": null
1204 },
1205 {
1206 "input": "com.example.fooBarV2",
1207 "expected": "valid",
1208 "actual": "valid",
1209 "passed": true,
1210 "error": null
1211 },
1212 {
1213 "input": "net.users.bob.ping",
1214 "expected": "valid",
1215 "actual": "valid",
1216 "passed": true,
1217 "error": null
1218 },
1219 {
1220 "input": "a.b.c",
1221 "expected": "valid",
1222 "actual": "valid",
1223 "passed": true,
1224 "error": null
1225 },
1226 {
1227 "input": "m.xn--masekowski-d0b.pl",
1228 "expected": "valid",
1229 "actual": "valid",
1230 "passed": true,
1231 "error": null
1232 },
1233 {
1234 "input": "one.two.three",
1235 "expected": "valid",
1236 "actual": "valid",
1237 "passed": true,
1238 "error": null
1239 },
1240 {
1241 "input": "one.two.three.four-and.FiVe",
1242 "expected": "valid",
1243 "actual": "valid",
1244 "passed": true,
1245 "error": null
1246 },
1247 {
1248 "input": "one.2.three",
1249 "expected": "valid",
1250 "actual": "valid",
1251 "passed": true,
1252 "error": null
1253 },
1254 {
1255 "input": "a-0.b-1.c",
1256 "expected": "valid",
1257 "actual": "valid",
1258 "passed": true,
1259 "error": null
1260 },
1261 {
1262 "input": "a0.b1.cc",
1263 "expected": "valid",
1264 "actual": "valid",
1265 "passed": true,
1266 "error": null
1267 },
1268 {
1269 "input": "cn.8.lex.stuff",
1270 "expected": "valid",
1271 "actual": "valid",
1272 "passed": true,
1273 "error": null
1274 },
1275 {
1276 "input": "test.12345.record",
1277 "expected": "valid",
1278 "actual": "valid",
1279 "passed": true,
1280 "error": null
1281 },
1282 {
1283 "input": "a01.thing.record",
1284 "expected": "valid",
1285 "actual": "valid",
1286 "passed": true,
1287 "error": null
1288 },
1289 {
1290 "input": "a.0.c",
1291 "expected": "valid",
1292 "actual": "valid",
1293 "passed": true,
1294 "error": null
1295 },
1296 {
1297 "input": "xn--fiqs8s.xn--fiqa61au8b7zsevnm8ak20mc4a87e.record.two",
1298 "expected": "valid",
1299 "actual": "valid",
1300 "passed": true,
1301 "error": null
1302 },
1303 {
1304 "input": "a0.b1.c3",
1305 "expected": "valid",
1306 "actual": "valid",
1307 "passed": true,
1308 "error": null
1309 },
1310 {
1311 "input": "com.example.f00",
1312 "expected": "valid",
1313 "actual": "valid",
1314 "passed": true,
1315 "error": null
1316 },
1317 {
1318 "input": "onion.expyuzz4wqqyqhjn.spec.getThing",
1319 "expected": "valid",
1320 "actual": "valid",
1321 "passed": true,
1322 "error": null
1323 },
1324 {
1325 "input": "onion.g2zyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.lex.deleteThing",
1326 "expected": "valid",
1327 "actual": "valid",
1328 "passed": true,
1329 "error": null
1330 },
1331 {
1332 "input": "org.4chan.lex.getThing",
1333 "expected": "valid",
1334 "actual": "valid",
1335 "passed": true,
1336 "error": null
1337 },
1338 {
1339 "input": "cn.8.lex.stuff",
1340 "expected": "valid",
1341 "actual": "valid",
1342 "passed": true,
1343 "error": null
1344 },
1345 {
1346 "input": "onion.2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.lex.deleteThing",
1347 "expected": "valid",
1348 "actual": "valid",
1349 "passed": true,
1350 "error": null
1351 },
1352 {
1353 "input": "com.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.foo",
1354 "expected": "invalid",
1355 "actual": "invalid",
1356 "passed": true,
1357 "error": null
1358 },
1359 {
1360 "input": "com.example.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
1361 "expected": "invalid",
1362 "actual": "invalid",
1363 "passed": true,
1364 "error": null
1365 },
1366 {
1367 "input": "com.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.foo",
1368 "expected": "invalid",
1369 "actual": "invalid",
1370 "passed": true,
1371 "error": null
1372 },
1373 {
1374 "input": "com.example.foo.*",
1375 "expected": "invalid",
1376 "actual": "invalid",
1377 "passed": true,
1378 "error": null
1379 },
1380 {
1381 "input": "com.example.foo.blah*",
1382 "expected": "invalid",
1383 "actual": "invalid",
1384 "passed": true,
1385 "error": null
1386 },
1387 {
1388 "input": "com.example.foo.*blah",
1389 "expected": "invalid",
1390 "actual": "invalid",
1391 "passed": true,
1392 "error": null
1393 },
1394 {
1395 "input": "com.exa💩ple.thing",
1396 "expected": "invalid",
1397 "actual": "invalid",
1398 "passed": true,
1399 "error": null
1400 },
1401 {
1402 "input": "a-0.b-1.c-3",
1403 "expected": "invalid",
1404 "actual": "invalid",
1405 "passed": true,
1406 "error": null
1407 },
1408 {
1409 "input": "a-0.b-1.c-o",
1410 "expected": "invalid",
1411 "actual": "invalid",
1412 "passed": true,
1413 "error": null
1414 },
1415 {
1416 "input": "1.0.0.127.record",
1417 "expected": "invalid",
1418 "actual": "invalid",
1419 "passed": true,
1420 "error": null
1421 },
1422 {
1423 "input": "0two.example.foo",
1424 "expected": "invalid",
1425 "actual": "invalid",
1426 "passed": true,
1427 "error": null
1428 },
1429 {
1430 "input": "example.com",
1431 "expected": "invalid",
1432 "actual": "invalid",
1433 "passed": true,
1434 "error": null
1435 },
1436 {
1437 "input": "com.example",
1438 "expected": "invalid",
1439 "actual": "invalid",
1440 "passed": true,
1441 "error": null
1442 },
1443 {
1444 "input": "a.",
1445 "expected": "invalid",
1446 "actual": "invalid",
1447 "passed": true,
1448 "error": null
1449 },
1450 {
1451 "input": ".one.two.three",
1452 "expected": "invalid",
1453 "actual": "invalid",
1454 "passed": true,
1455 "error": null
1456 },
1457 {
1458 "input": "one.two.three ",
1459 "expected": "invalid",
1460 "actual": "invalid",
1461 "passed": true,
1462 "error": null
1463 },
1464 {
1465 "input": "one.two..three",
1466 "expected": "invalid",
1467 "actual": "invalid",
1468 "passed": true,
1469 "error": null
1470 },
1471 {
1472 "input": "one .two.three",
1473 "expected": "invalid",
1474 "actual": "invalid",
1475 "passed": true,
1476 "error": null
1477 },
1478 {
1479 "input": " one.two.three",
1480 "expected": "invalid",
1481 "actual": "invalid",
1482 "passed": true,
1483 "error": null
1484 },
1485 {
1486 "input": "com.exa💩ple.thing",
1487 "expected": "invalid",
1488 "actual": "invalid",
1489 "passed": true,
1490 "error": null
1491 },
1492 {
1493 "input": "com.atproto.feed.p@st",
1494 "expected": "invalid",
1495 "actual": "invalid",
1496 "passed": true,
1497 "error": null
1498 },
1499 {
1500 "input": "com.atproto.feed.p_st",
1501 "expected": "invalid",
1502 "actual": "invalid",
1503 "passed": true,
1504 "error": null
1505 },
1506 {
1507 "input": "com.atproto.feed.p*st",
1508 "expected": "invalid",
1509 "actual": "invalid",
1510 "passed": true,
1511 "error": null
1512 },
1513 {
1514 "input": "com.atproto.feed.po#t",
1515 "expected": "invalid",
1516 "actual": "invalid",
1517 "passed": true,
1518 "error": null
1519 },
1520 {
1521 "input": "com.atproto.feed.p!ot",
1522 "expected": "invalid",
1523 "actual": "invalid",
1524 "passed": true,
1525 "error": null
1526 },
1527 {
1528 "input": "com.example-.foo",
1529 "expected": "invalid",
1530 "actual": "invalid",
1531 "passed": true,
1532 "error": null
1533 },
1534 {
1535 "input": "com.example.fooBar.2",
1536 "expected": "invalid",
1537 "actual": "invalid",
1538 "passed": true,
1539 "error": null
1540 }
1541 ]
1542 },
1543 {
1544 "name": "TID",
1545 "description": "Timestamp Identifiers",
1546 "fixture_file": "tid_syntax_valid.txt, tid_syntax_invalid.txt",
1547 "total": 13,
1548 "passed": 13,
1549 "failed": 0,
1550 "pass_rate": 100,
1551 "results": [
1552 {
1553 "input": "3jzfcijpj2z2a",
1554 "expected": "valid",
1555 "actual": "valid",
1556 "passed": true,
1557 "error": null
1558 },
1559 {
1560 "input": "7777777777777",
1561 "expected": "valid",
1562 "actual": "valid",
1563 "passed": true,
1564 "error": null
1565 },
1566 {
1567 "input": "3zzzzzzzzzzzz",
1568 "expected": "valid",
1569 "actual": "valid",
1570 "passed": true,
1571 "error": null
1572 },
1573 {
1574 "input": "2222222222222",
1575 "expected": "valid",
1576 "actual": "valid",
1577 "passed": true,
1578 "error": null
1579 },
1580 {
1581 "input": "3jzfcijpj2z21",
1582 "expected": "invalid",
1583 "actual": "invalid",
1584 "passed": true,
1585 "error": null
1586 },
1587 {
1588 "input": "0000000000000",
1589 "expected": "invalid",
1590 "actual": "invalid",
1591 "passed": true,
1592 "error": null
1593 },
1594 {
1595 "input": "3JZFCIJPJ2Z2A",
1596 "expected": "invalid",
1597 "actual": "invalid",
1598 "passed": true,
1599 "error": null
1600 },
1601 {
1602 "input": "3jzfcijpj2z2aa",
1603 "expected": "invalid",
1604 "actual": "invalid",
1605 "passed": true,
1606 "error": null
1607 },
1608 {
1609 "input": "3jzfcijpj2z2",
1610 "expected": "invalid",
1611 "actual": "invalid",
1612 "passed": true,
1613 "error": null
1614 },
1615 {
1616 "input": "222",
1617 "expected": "invalid",
1618 "actual": "invalid",
1619 "passed": true,
1620 "error": null
1621 },
1622 {
1623 "input": "3jzf-cij-pj2z-2a",
1624 "expected": "invalid",
1625 "actual": "invalid",
1626 "passed": true,
1627 "error": null
1628 },
1629 {
1630 "input": "zzzzzzzzzzzzz",
1631 "expected": "invalid",
1632 "actual": "invalid",
1633 "passed": true,
1634 "error": null
1635 },
1636 {
1637 "input": "kjzfcijpj2z2a",
1638 "expected": "invalid",
1639 "actual": "invalid",
1640 "passed": true,
1641 "error": null
1642 }
1643 ]
1644 },
1645 {
1646 "name": "Record Key",
1647 "description": "Record key identifiers",
1648 "fixture_file": "recordkey_syntax_valid.txt, recordkey_syntax_invalid.txt",
1649 "total": 27,
1650 "passed": 27,
1651 "failed": 0,
1652 "pass_rate": 100,
1653 "results": [
1654 {
1655 "input": "self",
1656 "expected": "valid",
1657 "actual": "valid",
1658 "passed": true,
1659 "error": null
1660 },
1661 {
1662 "input": "example.com",
1663 "expected": "valid",
1664 "actual": "valid",
1665 "passed": true,
1666 "error": null
1667 },
1668 {
1669 "input": "~1.2-3_",
1670 "expected": "valid",
1671 "actual": "valid",
1672 "passed": true,
1673 "error": null
1674 },
1675 {
1676 "input": "dHJ1ZQ",
1677 "expected": "valid",
1678 "actual": "valid",
1679 "passed": true,
1680 "error": null
1681 },
1682 {
1683 "input": "_",
1684 "expected": "valid",
1685 "actual": "valid",
1686 "passed": true,
1687 "error": null
1688 },
1689 {
1690 "input": "literal:self",
1691 "expected": "valid",
1692 "actual": "valid",
1693 "passed": true,
1694 "error": null
1695 },
1696 {
1697 "input": "pre:fix",
1698 "expected": "valid",
1699 "actual": "valid",
1700 "passed": true,
1701 "error": null
1702 },
1703 {
1704 "input": ":",
1705 "expected": "valid",
1706 "actual": "valid",
1707 "passed": true,
1708 "error": null
1709 },
1710 {
1711 "input": "-",
1712 "expected": "valid",
1713 "actual": "valid",
1714 "passed": true,
1715 "error": null
1716 },
1717 {
1718 "input": "_",
1719 "expected": "valid",
1720 "actual": "valid",
1721 "passed": true,
1722 "error": null
1723 },
1724 {
1725 "input": "~",
1726 "expected": "valid",
1727 "actual": "valid",
1728 "passed": true,
1729 "error": null
1730 },
1731 {
1732 "input": "...",
1733 "expected": "valid",
1734 "actual": "valid",
1735 "passed": true,
1736 "error": null
1737 },
1738 {
1739 "input": "self.",
1740 "expected": "valid",
1741 "actual": "valid",
1742 "passed": true,
1743 "error": null
1744 },
1745 {
1746 "input": "lang:",
1747 "expected": "valid",
1748 "actual": "valid",
1749 "passed": true,
1750 "error": null
1751 },
1752 {
1753 "input": ":lang",
1754 "expected": "valid",
1755 "actual": "valid",
1756 "passed": true,
1757 "error": null
1758 },
1759 {
1760 "input": "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
1761 "expected": "valid",
1762 "actual": "valid",
1763 "passed": true,
1764 "error": null
1765 },
1766 {
1767 "input": "alpha/beta",
1768 "expected": "invalid",
1769 "actual": "invalid",
1770 "passed": true,
1771 "error": null
1772 },
1773 {
1774 "input": ".",
1775 "expected": "invalid",
1776 "actual": "invalid",
1777 "passed": true,
1778 "error": null
1779 },
1780 {
1781 "input": "..",
1782 "expected": "invalid",
1783 "actual": "invalid",
1784 "passed": true,
1785 "error": null
1786 },
1787 {
1788 "input": "@handle",
1789 "expected": "invalid",
1790 "actual": "invalid",
1791 "passed": true,
1792 "error": null
1793 },
1794 {
1795 "input": "any space",
1796 "expected": "invalid",
1797 "actual": "invalid",
1798 "passed": true,
1799 "error": null
1800 },
1801 {
1802 "input": "any+space",
1803 "expected": "invalid",
1804 "actual": "invalid",
1805 "passed": true,
1806 "error": null
1807 },
1808 {
1809 "input": "number[3]",
1810 "expected": "invalid",
1811 "actual": "invalid",
1812 "passed": true,
1813 "error": null
1814 },
1815 {
1816 "input": "number(3)",
1817 "expected": "invalid",
1818 "actual": "invalid",
1819 "passed": true,
1820 "error": null
1821 },
1822 {
1823 "input": "\"quote\"",
1824 "expected": "invalid",
1825 "actual": "invalid",
1826 "passed": true,
1827 "error": null
1828 },
1829 {
1830 "input": "dHJ1ZQ==",
1831 "expected": "invalid",
1832 "actual": "invalid",
1833 "passed": true,
1834 "error": null
1835 },
1836 {
1837 "input": "ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
1838 "expected": "invalid",
1839 "actual": "invalid",
1840 "passed": true,
1841 "error": null
1842 }
1843 ]
1844 },
1845 {
1846 "name": "AT-URI",
1847 "description": "AT Protocol URIs",
1848 "fixture_file": "aturi_syntax_valid.txt, aturi_syntax_invalid.txt",
1849 "total": 95,
1850 "passed": 95,
1851 "failed": 0,
1852 "pass_rate": 100,
1853 "results": [
1854 {
1855 "input": "at://did:plc:asdf123",
1856 "expected": "valid",
1857 "actual": "valid",
1858 "passed": true,
1859 "error": null
1860 },
1861 {
1862 "input": "at://user.bsky.social",
1863 "expected": "valid",
1864 "actual": "valid",
1865 "passed": true,
1866 "error": null
1867 },
1868 {
1869 "input": "at://did:plc:asdf123/com.atproto.feed.post",
1870 "expected": "valid",
1871 "actual": "valid",
1872 "passed": true,
1873 "error": null
1874 },
1875 {
1876 "input": "at://did:plc:asdf123/com.atproto.feed.post/record",
1877 "expected": "valid",
1878 "actual": "valid",
1879 "passed": true,
1880 "error": null
1881 },
1882 {
1883 "input": "at://did:plc:asdf123/com.atproto.feed.post/oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
1884 "expected": "valid",
1885 "actual": "valid",
1886 "passed": true,
1887 "error": null
1888 },
1889 {
1890 "input": "at://did:plc:asdf123",
1891 "expected": "valid",
1892 "actual": "valid",
1893 "passed": true,
1894 "error": null
1895 },
1896 {
1897 "input": "at://user.bsky.social",
1898 "expected": "valid",
1899 "actual": "valid",
1900 "passed": true,
1901 "error": null
1902 },
1903 {
1904 "input": "at://did:plc:asdf123/com.atproto.feed.post",
1905 "expected": "valid",
1906 "actual": "valid",
1907 "passed": true,
1908 "error": null
1909 },
1910 {
1911 "input": "at://did:plc:asdf123/com.atproto.feed.post/record",
1912 "expected": "valid",
1913 "actual": "valid",
1914 "passed": true,
1915 "error": null
1916 },
1917 {
1918 "input": "at://did:plc:asdf123/com.atproto.feed.post/asdf123",
1919 "expected": "valid",
1920 "actual": "valid",
1921 "passed": true,
1922 "error": null
1923 },
1924 {
1925 "input": "at://did:plc:asdf123/com.atproto.feed.post/asdf123",
1926 "expected": "valid",
1927 "actual": "valid",
1928 "passed": true,
1929 "error": null
1930 },
1931 {
1932 "input": "at://did:plc:asdf123/com.atproto.feed.post/a",
1933 "expected": "valid",
1934 "actual": "valid",
1935 "passed": true,
1936 "error": null
1937 },
1938 {
1939 "input": "at://did:plc:asdf123/com.atproto.feed.post/asdf-123",
1940 "expected": "valid",
1941 "actual": "valid",
1942 "passed": true,
1943 "error": null
1944 },
1945 {
1946 "input": "at://did:abc:123",
1947 "expected": "valid",
1948 "actual": "valid",
1949 "passed": true,
1950 "error": null
1951 },
1952 {
1953 "input": "at://did:abc:123/io.nsid.someFunc/record-key",
1954 "expected": "valid",
1955 "actual": "valid",
1956 "passed": true,
1957 "error": null
1958 },
1959 {
1960 "input": "at://did:abc:123/io.nsid.someFunc/self.",
1961 "expected": "valid",
1962 "actual": "valid",
1963 "passed": true,
1964 "error": null
1965 },
1966 {
1967 "input": "at://did:abc:123/io.nsid.someFunc/lang:",
1968 "expected": "valid",
1969 "actual": "valid",
1970 "passed": true,
1971 "error": null
1972 },
1973 {
1974 "input": "at://did:abc:123/io.nsid.someFunc/:",
1975 "expected": "valid",
1976 "actual": "valid",
1977 "passed": true,
1978 "error": null
1979 },
1980 {
1981 "input": "at://did:abc:123/io.nsid.someFunc/-",
1982 "expected": "valid",
1983 "actual": "valid",
1984 "passed": true,
1985 "error": null
1986 },
1987 {
1988 "input": "at://did:abc:123/io.nsid.someFunc/_",
1989 "expected": "valid",
1990 "actual": "valid",
1991 "passed": true,
1992 "error": null
1993 },
1994 {
1995 "input": "at://did:abc:123/io.nsid.someFunc/~",
1996 "expected": "valid",
1997 "actual": "valid",
1998 "passed": true,
1999 "error": null
2000 },
2001 {
2002 "input": "at://did:abc:123/io.nsid.someFunc/...",
2003 "expected": "valid",
2004 "actual": "valid",
2005 "passed": true,
2006 "error": null
2007 },
2008 {
2009 "input": "at://did:plc:asdf123/com.atproto.feed.postV2",
2010 "expected": "valid",
2011 "actual": "valid",
2012 "passed": true,
2013 "error": null
2014 },
2015 {
2016 "input": "a://did:plc:asdf123",
2017 "expected": "invalid",
2018 "actual": "invalid",
2019 "passed": true,
2020 "error": null
2021 },
2022 {
2023 "input": "at//did:plc:asdf123",
2024 "expected": "invalid",
2025 "actual": "invalid",
2026 "passed": true,
2027 "error": null
2028 },
2029 {
2030 "input": "at:/a/did:plc:asdf123",
2031 "expected": "invalid",
2032 "actual": "invalid",
2033 "passed": true,
2034 "error": null
2035 },
2036 {
2037 "input": "at:/did:plc:asdf123",
2038 "expected": "invalid",
2039 "actual": "invalid",
2040 "passed": true,
2041 "error": null
2042 },
2043 {
2044 "input": "AT://did:plc:asdf123",
2045 "expected": "invalid",
2046 "actual": "invalid",
2047 "passed": true,
2048 "error": null
2049 },
2050 {
2051 "input": "http://did:plc:asdf123",
2052 "expected": "invalid",
2053 "actual": "invalid",
2054 "passed": true,
2055 "error": null
2056 },
2057 {
2058 "input": "://did:plc:asdf123",
2059 "expected": "invalid",
2060 "actual": "invalid",
2061 "passed": true,
2062 "error": null
2063 },
2064 {
2065 "input": "at:did:plc:asdf123",
2066 "expected": "invalid",
2067 "actual": "invalid",
2068 "passed": true,
2069 "error": null
2070 },
2071 {
2072 "input": "at:/did:plc:asdf123",
2073 "expected": "invalid",
2074 "actual": "invalid",
2075 "passed": true,
2076 "error": null
2077 },
2078 {
2079 "input": "at:///did:plc:asdf123",
2080 "expected": "invalid",
2081 "actual": "invalid",
2082 "passed": true,
2083 "error": null
2084 },
2085 {
2086 "input": "at://:/did:plc:asdf123",
2087 "expected": "invalid",
2088 "actual": "invalid",
2089 "passed": true,
2090 "error": null
2091 },
2092 {
2093 "input": "at:/ /did:plc:asdf123",
2094 "expected": "invalid",
2095 "actual": "invalid",
2096 "passed": true,
2097 "error": null
2098 },
2099 {
2100 "input": "at://did:plc:asdf123 ",
2101 "expected": "invalid",
2102 "actual": "invalid",
2103 "passed": true,
2104 "error": null
2105 },
2106 {
2107 "input": "at://did:plc:asdf123/ ",
2108 "expected": "invalid",
2109 "actual": "invalid",
2110 "passed": true,
2111 "error": null
2112 },
2113 {
2114 "input": " at://did:plc:asdf123",
2115 "expected": "invalid",
2116 "actual": "invalid",
2117 "passed": true,
2118 "error": null
2119 },
2120 {
2121 "input": "at://did:plc:asdf123/com.atproto.feed.post ",
2122 "expected": "invalid",
2123 "actual": "invalid",
2124 "passed": true,
2125 "error": null
2126 },
2127 {
2128 "input": "at://did:plc:asdf123/com.atproto.feed.post# ",
2129 "expected": "invalid",
2130 "actual": "invalid",
2131 "passed": true,
2132 "error": null
2133 },
2134 {
2135 "input": "at://did:plc:asdf123/com.atproto.feed.post#/ ",
2136 "expected": "invalid",
2137 "actual": "invalid",
2138 "passed": true,
2139 "error": null
2140 },
2141 {
2142 "input": "at://did:plc:asdf123/com.atproto.feed.post#/frag ",
2143 "expected": "invalid",
2144 "actual": "invalid",
2145 "passed": true,
2146 "error": null
2147 },
2148 {
2149 "input": "at://did:plc:asdf123/com.atproto.feed.post#fr ag",
2150 "expected": "invalid",
2151 "actual": "invalid",
2152 "passed": true,
2153 "error": null
2154 },
2155 {
2156 "input": "//did:plc:asdf123",
2157 "expected": "invalid",
2158 "actual": "invalid",
2159 "passed": true,
2160 "error": null
2161 },
2162 {
2163 "input": "at://name",
2164 "expected": "invalid",
2165 "actual": "invalid",
2166 "passed": true,
2167 "error": null
2168 },
2169 {
2170 "input": "at://name.0",
2171 "expected": "invalid",
2172 "actual": "invalid",
2173 "passed": true,
2174 "error": null
2175 },
2176 {
2177 "input": "at://diD:plc:asdf123",
2178 "expected": "invalid",
2179 "actual": "invalid",
2180 "passed": true,
2181 "error": null
2182 },
2183 {
2184 "input": "at://did:plc:asdf123/com.atproto.feed.p@st",
2185 "expected": "invalid",
2186 "actual": "invalid",
2187 "passed": true,
2188 "error": null
2189 },
2190 {
2191 "input": "at://did:plc:asdf123/com.atproto.feed.p$st",
2192 "expected": "invalid",
2193 "actual": "invalid",
2194 "passed": true,
2195 "error": null
2196 },
2197 {
2198 "input": "at://did:plc:asdf123/com.atproto.feed.p%st",
2199 "expected": "invalid",
2200 "actual": "invalid",
2201 "passed": true,
2202 "error": null
2203 },
2204 {
2205 "input": "at://did:plc:asdf123/com.atproto.feed.p&st",
2206 "expected": "invalid",
2207 "actual": "invalid",
2208 "passed": true,
2209 "error": null
2210 },
2211 {
2212 "input": "at://did:plc:asdf123/com.atproto.feed.p()t",
2213 "expected": "invalid",
2214 "actual": "invalid",
2215 "passed": true,
2216 "error": null
2217 },
2218 {
2219 "input": "at://did:plc:asdf123/com.atproto.feed_post",
2220 "expected": "invalid",
2221 "actual": "invalid",
2222 "passed": true,
2223 "error": null
2224 },
2225 {
2226 "input": "at://did:plc:asdf123/-com.atproto.feed.post",
2227 "expected": "invalid",
2228 "actual": "invalid",
2229 "passed": true,
2230 "error": null
2231 },
2232 {
2233 "input": "at://did:plc:asdf@123/com.atproto.feed.post",
2234 "expected": "invalid",
2235 "actual": "invalid",
2236 "passed": true,
2237 "error": null
2238 },
2239 {
2240 "input": "at://DID:plc:asdf123",
2241 "expected": "invalid",
2242 "actual": "invalid",
2243 "passed": true,
2244 "error": null
2245 },
2246 {
2247 "input": "at://user.bsky.123",
2248 "expected": "invalid",
2249 "actual": "invalid",
2250 "passed": true,
2251 "error": null
2252 },
2253 {
2254 "input": "at://bsky",
2255 "expected": "invalid",
2256 "actual": "invalid",
2257 "passed": true,
2258 "error": null
2259 },
2260 {
2261 "input": "at://did:plc:",
2262 "expected": "invalid",
2263 "actual": "invalid",
2264 "passed": true,
2265 "error": null
2266 },
2267 {
2268 "input": "at://did:plc:",
2269 "expected": "invalid",
2270 "actual": "invalid",
2271 "passed": true,
2272 "error": null
2273 },
2274 {
2275 "input": "at://frag",
2276 "expected": "invalid",
2277 "actual": "invalid",
2278 "passed": true,
2279 "error": null
2280 },
2281 {
2282 "input": "at://did:plc:asdf123/com.atproto.feed.post/oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
2283 "expected": "invalid",
2284 "actual": "invalid",
2285 "passed": true,
2286 "error": null
2287 },
2288 {
2289 "input": "at://user.bsky.social//",
2290 "expected": "invalid",
2291 "actual": "invalid",
2292 "passed": true,
2293 "error": null
2294 },
2295 {
2296 "input": "at://user.bsky.social//com.atproto.feed.post",
2297 "expected": "invalid",
2298 "actual": "invalid",
2299 "passed": true,
2300 "error": null
2301 },
2302 {
2303 "input": "at://user.bsky.social/com.atproto.feed.post//",
2304 "expected": "invalid",
2305 "actual": "invalid",
2306 "passed": true,
2307 "error": null
2308 },
2309 {
2310 "input": "at://did:plc:asdf123/com.atproto.feed.post/asdf123/more/more',",
2311 "expected": "invalid",
2312 "actual": "invalid",
2313 "passed": true,
2314 "error": null
2315 },
2316 {
2317 "input": "at://did:plc:asdf123/short/stuff",
2318 "expected": "invalid",
2319 "actual": "invalid",
2320 "passed": true,
2321 "error": null
2322 },
2323 {
2324 "input": "at://did:plc:asdf123/12345",
2325 "expected": "invalid",
2326 "actual": "invalid",
2327 "passed": true,
2328 "error": null
2329 },
2330 {
2331 "input": "at://did:plc:asdf123/",
2332 "expected": "invalid",
2333 "actual": "invalid",
2334 "passed": true,
2335 "error": null
2336 },
2337 {
2338 "input": "at://user.bsky.social/",
2339 "expected": "invalid",
2340 "actual": "invalid",
2341 "passed": true,
2342 "error": null
2343 },
2344 {
2345 "input": "at://did:plc:asdf123/com.atproto.feed.post/",
2346 "expected": "invalid",
2347 "actual": "invalid",
2348 "passed": true,
2349 "error": null
2350 },
2351 {
2352 "input": "at://did:plc:asdf123/com.atproto.feed.post/record/",
2353 "expected": "invalid",
2354 "actual": "invalid",
2355 "passed": true,
2356 "error": null
2357 },
2358 {
2359 "input": "at://did:plc:asdf123/com.atproto.feed.post/record/#/frag",
2360 "expected": "invalid",
2361 "actual": "invalid",
2362 "passed": true,
2363 "error": null
2364 },
2365 {
2366 "input": "at://did:plc:asdf123/com.atproto.feed.post/asdf123/asdf",
2367 "expected": "invalid",
2368 "actual": "invalid",
2369 "passed": true,
2370 "error": null
2371 },
2372 {
2373 "input": "at://did:plc:asdf123#",
2374 "expected": "invalid",
2375 "actual": "invalid",
2376 "passed": true,
2377 "error": null
2378 },
2379 {
2380 "input": "at://did:plc:asdf123##",
2381 "expected": "invalid",
2382 "actual": "invalid",
2383 "passed": true,
2384 "error": null
2385 },
2386 {
2387 "input": "at://did:plc:asdf123#/asdf#/asdf",
2388 "expected": "invalid",
2389 "actual": "invalid",
2390 "passed": true,
2391 "error": null
2392 },
2393 {
2394 "input": "at://did:plc:asdf123/com.atproto.feed.post/%23",
2395 "expected": "invalid",
2396 "actual": "invalid",
2397 "passed": true,
2398 "error": null
2399 },
2400 {
2401 "input": "at://did:plc:asdf123/com.atproto.feed.post/$@!*)(:,;~.sdf123",
2402 "expected": "invalid",
2403 "actual": "invalid",
2404 "passed": true,
2405 "error": null
2406 },
2407 {
2408 "input": "at://did:plc:asdf123/com.atproto.feed.post/~'sdf123\")",
2409 "expected": "invalid",
2410 "actual": "invalid",
2411 "passed": true,
2412 "error": null
2413 },
2414 {
2415 "input": "at://did:plc:asdf123/com.atproto.feed.post/$",
2416 "expected": "invalid",
2417 "actual": "invalid",
2418 "passed": true,
2419 "error": null
2420 },
2421 {
2422 "input": "at://did:plc:asdf123/com.atproto.feed.post/@",
2423 "expected": "invalid",
2424 "actual": "invalid",
2425 "passed": true,
2426 "error": null
2427 },
2428 {
2429 "input": "at://did:plc:asdf123/com.atproto.feed.post/!",
2430 "expected": "invalid",
2431 "actual": "invalid",
2432 "passed": true,
2433 "error": null
2434 },
2435 {
2436 "input": "at://did:plc:asdf123/com.atproto.feed.post/*",
2437 "expected": "invalid",
2438 "actual": "invalid",
2439 "passed": true,
2440 "error": null
2441 },
2442 {
2443 "input": "at://did:plc:asdf123/com.atproto.feed.post/(",
2444 "expected": "invalid",
2445 "actual": "invalid",
2446 "passed": true,
2447 "error": null
2448 },
2449 {
2450 "input": "at://did:plc:asdf123/com.atproto.feed.post/,",
2451 "expected": "invalid",
2452 "actual": "invalid",
2453 "passed": true,
2454 "error": null
2455 },
2456 {
2457 "input": "at://did:plc:asdf123/com.atproto.feed.post/;",
2458 "expected": "invalid",
2459 "actual": "invalid",
2460 "passed": true,
2461 "error": null
2462 },
2463 {
2464 "input": "at://did:plc:asdf123/com.atproto.feed.post/abc%30123",
2465 "expected": "invalid",
2466 "actual": "invalid",
2467 "passed": true,
2468 "error": null
2469 },
2470 {
2471 "input": "at://did:plc:asdf123/com.atproto.feed.post/%30",
2472 "expected": "invalid",
2473 "actual": "invalid",
2474 "passed": true,
2475 "error": null
2476 },
2477 {
2478 "input": "at://did:plc:asdf123/com.atproto.feed.post/%3",
2479 "expected": "invalid",
2480 "actual": "invalid",
2481 "passed": true,
2482 "error": null
2483 },
2484 {
2485 "input": "at://did:plc:asdf123/com.atproto.feed.post/%",
2486 "expected": "invalid",
2487 "actual": "invalid",
2488 "passed": true,
2489 "error": null
2490 },
2491 {
2492 "input": "at://did:plc:asdf123/com.atproto.feed.post/%zz",
2493 "expected": "invalid",
2494 "actual": "invalid",
2495 "passed": true,
2496 "error": null
2497 },
2498 {
2499 "input": "at://did:plc:asdf123/com.atproto.feed.post/%%%",
2500 "expected": "invalid",
2501 "actual": "invalid",
2502 "passed": true,
2503 "error": null
2504 },
2505 {
2506 "input": "at://did:plc:asdf123/com.atproto.feed.post/.",
2507 "expected": "invalid",
2508 "actual": "invalid",
2509 "passed": true,
2510 "error": null
2511 },
2512 {
2513 "input": "at://did:plc:asdf123/com.atproto.feed.post/..",
2514 "expected": "invalid",
2515 "actual": "invalid",
2516 "passed": true,
2517 "error": null
2518 }
2519 ]
2520 },
2521 {
2522 "name": "Datetime",
2523 "description": "ISO 8601 datetime strings",
2524 "fixture_file": "datetime_syntax_valid.txt, datetime_syntax_invalid.txt",
2525 "total": 79,
2526 "passed": 79,
2527 "failed": 0,
2528 "pass_rate": 100,
2529 "results": [
2530 {
2531 "input": "1985-04-12T23:20:50.123Z",
2532 "expected": "valid",
2533 "actual": "valid",
2534 "passed": true,
2535 "error": null
2536 },
2537 {
2538 "input": "1985-04-12T23:20:50.000Z",
2539 "expected": "valid",
2540 "actual": "valid",
2541 "passed": true,
2542 "error": null
2543 },
2544 {
2545 "input": "2000-01-01T00:00:00.000Z",
2546 "expected": "valid",
2547 "actual": "valid",
2548 "passed": true,
2549 "error": null
2550 },
2551 {
2552 "input": "1985-04-12T23:20:50.123456Z",
2553 "expected": "valid",
2554 "actual": "valid",
2555 "passed": true,
2556 "error": null
2557 },
2558 {
2559 "input": "1985-04-12T23:20:50.120Z",
2560 "expected": "valid",
2561 "actual": "valid",
2562 "passed": true,
2563 "error": null
2564 },
2565 {
2566 "input": "1985-04-12T23:20:50.120000Z",
2567 "expected": "valid",
2568 "actual": "valid",
2569 "passed": true,
2570 "error": null
2571 },
2572 {
2573 "input": "1985-04-12T23:20:50.1235678912345Z",
2574 "expected": "valid",
2575 "actual": "valid",
2576 "passed": true,
2577 "error": null
2578 },
2579 {
2580 "input": "1985-04-12T23:20:50.100Z",
2581 "expected": "valid",
2582 "actual": "valid",
2583 "passed": true,
2584 "error": null
2585 },
2586 {
2587 "input": "1985-04-12T23:20:50Z",
2588 "expected": "valid",
2589 "actual": "valid",
2590 "passed": true,
2591 "error": null
2592 },
2593 {
2594 "input": "1985-04-12T23:20:50.0Z",
2595 "expected": "valid",
2596 "actual": "valid",
2597 "passed": true,
2598 "error": null
2599 },
2600 {
2601 "input": "1985-04-12T23:20:50.123+00:00",
2602 "expected": "valid",
2603 "actual": "valid",
2604 "passed": true,
2605 "error": null
2606 },
2607 {
2608 "input": "1985-04-12T23:20:50.123-07:00",
2609 "expected": "valid",
2610 "actual": "valid",
2611 "passed": true,
2612 "error": null
2613 },
2614 {
2615 "input": "1985-04-12T23:20:50.123+07:00",
2616 "expected": "valid",
2617 "actual": "valid",
2618 "passed": true,
2619 "error": null
2620 },
2621 {
2622 "input": "1985-04-12T23:20:50.123+01:45",
2623 "expected": "valid",
2624 "actual": "valid",
2625 "passed": true,
2626 "error": null
2627 },
2628 {
2629 "input": "0985-04-12T23:20:50.123-07:00",
2630 "expected": "valid",
2631 "actual": "valid",
2632 "passed": true,
2633 "error": null
2634 },
2635 {
2636 "input": "1985-04-12T23:20:50.123-07:00",
2637 "expected": "valid",
2638 "actual": "valid",
2639 "passed": true,
2640 "error": null
2641 },
2642 {
2643 "input": "0123-01-01T00:00:00.000Z",
2644 "expected": "valid",
2645 "actual": "valid",
2646 "passed": true,
2647 "error": null
2648 },
2649 {
2650 "input": "1985-04-12T23:20:50.1Z",
2651 "expected": "valid",
2652 "actual": "valid",
2653 "passed": true,
2654 "error": null
2655 },
2656 {
2657 "input": "1985-04-12T23:20:50.12Z",
2658 "expected": "valid",
2659 "actual": "valid",
2660 "passed": true,
2661 "error": null
2662 },
2663 {
2664 "input": "1985-04-12T23:20:50.123Z",
2665 "expected": "valid",
2666 "actual": "valid",
2667 "passed": true,
2668 "error": null
2669 },
2670 {
2671 "input": "1985-04-12T23:20:50.1234Z",
2672 "expected": "valid",
2673 "actual": "valid",
2674 "passed": true,
2675 "error": null
2676 },
2677 {
2678 "input": "1985-04-12T23:20:50.12345Z",
2679 "expected": "valid",
2680 "actual": "valid",
2681 "passed": true,
2682 "error": null
2683 },
2684 {
2685 "input": "1985-04-12T23:20:50.123456Z",
2686 "expected": "valid",
2687 "actual": "valid",
2688 "passed": true,
2689 "error": null
2690 },
2691 {
2692 "input": "1985-04-12T23:20:50.1234567Z",
2693 "expected": "valid",
2694 "actual": "valid",
2695 "passed": true,
2696 "error": null
2697 },
2698 {
2699 "input": "1985-04-12T23:20:50.12345678Z",
2700 "expected": "valid",
2701 "actual": "valid",
2702 "passed": true,
2703 "error": null
2704 },
2705 {
2706 "input": "1985-04-12T23:20:50.123456789Z",
2707 "expected": "valid",
2708 "actual": "valid",
2709 "passed": true,
2710 "error": null
2711 },
2712 {
2713 "input": "1985-04-12T23:20:50.1234567890Z",
2714 "expected": "valid",
2715 "actual": "valid",
2716 "passed": true,
2717 "error": null
2718 },
2719 {
2720 "input": "1985-04-12T23:20:50.12345678901Z",
2721 "expected": "valid",
2722 "actual": "valid",
2723 "passed": true,
2724 "error": null
2725 },
2726 {
2727 "input": "1985-04-12T23:20:50.123456789012Z",
2728 "expected": "valid",
2729 "actual": "valid",
2730 "passed": true,
2731 "error": null
2732 },
2733 {
2734 "input": "0010-12-31T23:00:00.000Z",
2735 "expected": "valid",
2736 "actual": "valid",
2737 "passed": true,
2738 "error": null
2739 },
2740 {
2741 "input": "1000-12-31T23:00:00.000Z",
2742 "expected": "valid",
2743 "actual": "valid",
2744 "passed": true,
2745 "error": null
2746 },
2747 {
2748 "input": "1900-12-31T23:00:00.000Z",
2749 "expected": "valid",
2750 "actual": "valid",
2751 "passed": true,
2752 "error": null
2753 },
2754 {
2755 "input": "3001-12-31T23:00:00.000Z",
2756 "expected": "valid",
2757 "actual": "valid",
2758 "passed": true,
2759 "error": null
2760 },
2761 {
2762 "input": "1985-04-12T23:20:50.123z",
2763 "expected": "invalid",
2764 "actual": "invalid",
2765 "passed": true,
2766 "error": null
2767 },
2768 {
2769 "input": "01985-04-12T23:20:50.123Z",
2770 "expected": "invalid",
2771 "actual": "invalid",
2772 "passed": true,
2773 "error": null
2774 },
2775 {
2776 "input": "985-04-12T23:20:50.123Z",
2777 "expected": "invalid",
2778 "actual": "invalid",
2779 "passed": true,
2780 "error": null
2781 },
2782 {
2783 "input": "1985-04-12T23:20:50.Z",
2784 "expected": "invalid",
2785 "actual": "invalid",
2786 "passed": true,
2787 "error": null
2788 },
2789 {
2790 "input": "1985-04-32T23;20:50.123Z",
2791 "expected": "invalid",
2792 "actual": "invalid",
2793 "passed": true,
2794 "error": null
2795 },
2796 {
2797 "input": "1985-04-32T23;20:50.123Z",
2798 "expected": "invalid",
2799 "actual": "invalid",
2800 "passed": true,
2801 "error": null
2802 },
2803 {
2804 "input": "1985—04-32T23;20:50.123Z",
2805 "expected": "invalid",
2806 "actual": "invalid",
2807 "passed": true,
2808 "error": null
2809 },
2810 {
2811 "input": "1985–04-32T23;20:50.123Z",
2812 "expected": "invalid",
2813 "actual": "invalid",
2814 "passed": true,
2815 "error": null
2816 },
2817 {
2818 "input": " 1985-04-12T23:20:50.123Z",
2819 "expected": "invalid",
2820 "actual": "invalid",
2821 "passed": true,
2822 "error": null
2823 },
2824 {
2825 "input": "1985-04-12T23:20:50.123Z ",
2826 "expected": "invalid",
2827 "actual": "invalid",
2828 "passed": true,
2829 "error": null
2830 },
2831 {
2832 "input": "1985-04-12T 23:20:50.123Z",
2833 "expected": "invalid",
2834 "actual": "invalid",
2835 "passed": true,
2836 "error": null
2837 },
2838 {
2839 "input": "1985-4-12T23:20:50.123Z",
2840 "expected": "invalid",
2841 "actual": "invalid",
2842 "passed": true,
2843 "error": null
2844 },
2845 {
2846 "input": "1985-04-2T23:20:50.123Z",
2847 "expected": "invalid",
2848 "actual": "invalid",
2849 "passed": true,
2850 "error": null
2851 },
2852 {
2853 "input": "1985-04-12T3:20:50.123Z",
2854 "expected": "invalid",
2855 "actual": "invalid",
2856 "passed": true,
2857 "error": null
2858 },
2859 {
2860 "input": "1985-04-12T23:0:50.123Z",
2861 "expected": "invalid",
2862 "actual": "invalid",
2863 "passed": true,
2864 "error": null
2865 },
2866 {
2867 "input": "1985-04-12T23:20:5.123Z",
2868 "expected": "invalid",
2869 "actual": "invalid",
2870 "passed": true,
2871 "error": null
2872 },
2873 {
2874 "input": "01985-04-12T23:20:50.123Z",
2875 "expected": "invalid",
2876 "actual": "invalid",
2877 "passed": true,
2878 "error": null
2879 },
2880 {
2881 "input": "1985-004-12T23:20:50.123Z",
2882 "expected": "invalid",
2883 "actual": "invalid",
2884 "passed": true,
2885 "error": null
2886 },
2887 {
2888 "input": "1985-04-012T23:20:50.123Z",
2889 "expected": "invalid",
2890 "actual": "invalid",
2891 "passed": true,
2892 "error": null
2893 },
2894 {
2895 "input": "1985-04-12T023:20:50.123Z",
2896 "expected": "invalid",
2897 "actual": "invalid",
2898 "passed": true,
2899 "error": null
2900 },
2901 {
2902 "input": "1985-04-12T23:020:50.123Z",
2903 "expected": "invalid",
2904 "actual": "invalid",
2905 "passed": true,
2906 "error": null
2907 },
2908 {
2909 "input": "1985-04-12T23:20:050.123Z",
2910 "expected": "invalid",
2911 "actual": "invalid",
2912 "passed": true,
2913 "error": null
2914 },
2915 {
2916 "input": "1985-04-12t23:20:50.123Z",
2917 "expected": "invalid",
2918 "actual": "invalid",
2919 "passed": true,
2920 "error": null
2921 },
2922 {
2923 "input": "1985-04-12T23:20:50.123z",
2924 "expected": "invalid",
2925 "actual": "invalid",
2926 "passed": true,
2927 "error": null
2928 },
2929 {
2930 "input": "1985-04-12T23:20:50.123-00:00",
2931 "expected": "invalid",
2932 "actual": "invalid",
2933 "passed": true,
2934 "error": null
2935 },
2936 {
2937 "input": "1985-04-12_23:20:50.123Z",
2938 "expected": "invalid",
2939 "actual": "invalid",
2940 "passed": true,
2941 "error": null
2942 },
2943 {
2944 "input": "1985-04-12 23:20:50.123Z",
2945 "expected": "invalid",
2946 "actual": "invalid",
2947 "passed": true,
2948 "error": null
2949 },
2950 {
2951 "input": "1985-04-274T23:20:50.123Z",
2952 "expected": "invalid",
2953 "actual": "invalid",
2954 "passed": true,
2955 "error": null
2956 },
2957 {
2958 "input": "1985-04-12T23:20:50.123",
2959 "expected": "invalid",
2960 "actual": "invalid",
2961 "passed": true,
2962 "error": null
2963 },
2964 {
2965 "input": "1985-04-12T23:20:50",
2966 "expected": "invalid",
2967 "actual": "invalid",
2968 "passed": true,
2969 "error": null
2970 },
2971 {
2972 "input": "1985-04-12",
2973 "expected": "invalid",
2974 "actual": "invalid",
2975 "passed": true,
2976 "error": null
2977 },
2978 {
2979 "input": "1985-04-12T23:20Z",
2980 "expected": "invalid",
2981 "actual": "invalid",
2982 "passed": true,
2983 "error": null
2984 },
2985 {
2986 "input": "1985-04-12T23:20:5Z",
2987 "expected": "invalid",
2988 "actual": "invalid",
2989 "passed": true,
2990 "error": null
2991 },
2992 {
2993 "input": "1985-04-12T23:20:50.123",
2994 "expected": "invalid",
2995 "actual": "invalid",
2996 "passed": true,
2997 "error": null
2998 },
2999 {
3000 "input": "+001985-04-12T23:20:50.123Z",
3001 "expected": "invalid",
3002 "actual": "invalid",
3003 "passed": true,
3004 "error": null
3005 },
3006 {
3007 "input": "23:20:50.123Z",
3008 "expected": "invalid",
3009 "actual": "invalid",
3010 "passed": true,
3011 "error": null
3012 },
3013 {
3014 "input": "1985-04-12T23:20:50.123+00",
3015 "expected": "invalid",
3016 "actual": "invalid",
3017 "passed": true,
3018 "error": null
3019 },
3020 {
3021 "input": "1985-04-12T23:20:50.123+00:0",
3022 "expected": "invalid",
3023 "actual": "invalid",
3024 "passed": true,
3025 "error": null
3026 },
3027 {
3028 "input": "1985-04-12T23:20:50.123+0:00",
3029 "expected": "invalid",
3030 "actual": "invalid",
3031 "passed": true,
3032 "error": null
3033 },
3034 {
3035 "input": "1985-04-12T23:20:50.123",
3036 "expected": "invalid",
3037 "actual": "invalid",
3038 "passed": true,
3039 "error": null
3040 },
3041 {
3042 "input": "1985-04-12T23:20:50.123+0000",
3043 "expected": "invalid",
3044 "actual": "invalid",
3045 "passed": true,
3046 "error": null
3047 },
3048 {
3049 "input": "1985-04-12T23:20:50.123+00",
3050 "expected": "invalid",
3051 "actual": "invalid",
3052 "passed": true,
3053 "error": null
3054 },
3055 {
3056 "input": "1985-04-12T23:20:50.123+",
3057 "expected": "invalid",
3058 "actual": "invalid",
3059 "passed": true,
3060 "error": null
3061 },
3062 {
3063 "input": "1985-04-12T23:20:50.123-",
3064 "expected": "invalid",
3065 "actual": "invalid",
3066 "passed": true,
3067 "error": null
3068 },
3069 {
3070 "input": "0000-01-01T00:00:00+01:00",
3071 "expected": "invalid",
3072 "actual": "invalid",
3073 "passed": true,
3074 "error": null
3075 },
3076 {
3077 "input": "-000001-12-31T23:00:00.000Z",
3078 "expected": "invalid",
3079 "actual": "invalid",
3080 "passed": true,
3081 "error": null
3082 }
3083 ]
3084 },
3085 {
3086 "name": "Language",
3087 "description": "BCP-47 language tags",
3088 "fixture_file": "language_syntax_valid.txt, language_syntax_invalid.txt",
3089 "total": 21,
3090 "passed": 21,
3091 "failed": 0,
3092 "pass_rate": 100,
3093 "results": [
3094 {
3095 "input": "ja",
3096 "expected": "valid",
3097 "actual": "valid",
3098 "passed": true,
3099 "error": null
3100 },
3101 {
3102 "input": "ban",
3103 "expected": "valid",
3104 "actual": "valid",
3105 "passed": true,
3106 "error": null
3107 },
3108 {
3109 "input": "pt-BR",
3110 "expected": "valid",
3111 "actual": "valid",
3112 "passed": true,
3113 "error": null
3114 },
3115 {
3116 "input": "hy-Latn-IT-arevela",
3117 "expected": "valid",
3118 "actual": "valid",
3119 "passed": true,
3120 "error": null
3121 },
3122 {
3123 "input": "en-GB",
3124 "expected": "valid",
3125 "actual": "valid",
3126 "passed": true,
3127 "error": null
3128 },
3129 {
3130 "input": "zh-Hant",
3131 "expected": "valid",
3132 "actual": "valid",
3133 "passed": true,
3134 "error": null
3135 },
3136 {
3137 "input": "sgn-BE-NL",
3138 "expected": "valid",
3139 "actual": "valid",
3140 "passed": true,
3141 "error": null
3142 },
3143 {
3144 "input": "es-419",
3145 "expected": "valid",
3146 "actual": "valid",
3147 "passed": true,
3148 "error": null
3149 },
3150 {
3151 "input": "en-GB-boont-r-extended-sequence-x-private",
3152 "expected": "valid",
3153 "actual": "valid",
3154 "passed": true,
3155 "error": null
3156 },
3157 {
3158 "input": "zh-hakka",
3159 "expected": "valid",
3160 "actual": "valid",
3161 "passed": true,
3162 "error": null
3163 },
3164 {
3165 "input": "i-default",
3166 "expected": "valid",
3167 "actual": "valid",
3168 "passed": true,
3169 "error": null
3170 },
3171 {
3172 "input": "i-navajo",
3173 "expected": "valid",
3174 "actual": "valid",
3175 "passed": true,
3176 "error": null
3177 },
3178 {
3179 "input": "de-CH-1901",
3180 "expected": "valid",
3181 "actual": "valid",
3182 "passed": true,
3183 "error": null
3184 },
3185 {
3186 "input": "qaa-Qaaa-QM-x-southern",
3187 "expected": "valid",
3188 "actual": "valid",
3189 "passed": true,
3190 "error": null
3191 },
3192 {
3193 "input": "jaja",
3194 "expected": "invalid",
3195 "actual": "invalid",
3196 "passed": true,
3197 "error": null
3198 },
3199 {
3200 "input": ".",
3201 "expected": "invalid",
3202 "actual": "invalid",
3203 "passed": true,
3204 "error": null
3205 },
3206 {
3207 "input": "123",
3208 "expected": "invalid",
3209 "actual": "invalid",
3210 "passed": true,
3211 "error": null
3212 },
3213 {
3214 "input": "JA",
3215 "expected": "invalid",
3216 "actual": "invalid",
3217 "passed": true,
3218 "error": null
3219 },
3220 {
3221 "input": "j",
3222 "expected": "invalid",
3223 "actual": "invalid",
3224 "passed": true,
3225 "error": null
3226 },
3227 {
3228 "input": "ja-",
3229 "expected": "invalid",
3230 "actual": "invalid",
3231 "passed": true,
3232 "error": null
3233 },
3234 {
3235 "input": "a-DE",
3236 "expected": "invalid",
3237 "actual": "invalid",
3238 "passed": true,
3239 "error": null
3240 }
3241 ]
3242 }
3243 ]
3244 },
3245 {
3246 "name": "Cryptography",
3247 "spec_url": "https://atproto.com/specs/cryptography",
3248 "total": 12,
3249 "passed": 12,
3250 "failed": 0,
3251 "pass_rate": 100,
3252 "categories": [
3253 {
3254 "name": "Signature Verification",
3255 "description": "ECDSA signature verification with low-S normalization",
3256 "fixture_file": "signature-fixtures.json",
3257 "total": 6,
3258 "passed": 6,
3259 "failed": 0,
3260 "pass_rate": 100,
3261 "results": [
3262 {
3263 "input": "valid P-256 key and signature, with low-S signature",
3264 "expected": "valid",
3265 "actual": "valid",
3266 "passed": true,
3267 "error": null
3268 },
3269 {
3270 "input": "valid K-256 key and signature, with low-S signature",
3271 "expected": "valid",
3272 "actual": "valid",
3273 "passed": true,
3274 "error": null
3275 },
3276 {
3277 "input": "P-256 key and signature, with non-low-S signature which is invalid in atproto",
3278 "expected": "invalid",
3279 "actual": "invalid",
3280 "passed": true,
3281 "error": null
3282 },
3283 {
3284 "input": "K-256 key and signature, with non-low-S signature which is invalid in atproto",
3285 "expected": "invalid",
3286 "actual": "invalid",
3287 "passed": true,
3288 "error": null
3289 },
3290 {
3291 "input": "P-256 key and signature, with DER-encoded signature which is invalid in atproto",
3292 "expected": "invalid",
3293 "actual": "invalid",
3294 "passed": true,
3295 "error": null
3296 },
3297 {
3298 "input": "K-256 key and signature, with DER-encoded signature which is invalid in atproto",
3299 "expected": "invalid",
3300 "actual": "invalid",
3301 "passed": true,
3302 "error": null
3303 }
3304 ]
3305 },
3306 {
3307 "name": "P-256 did:key",
3308 "description": "did:key encoding/decoding for P-256 keys",
3309 "fixture_file": "w3c_didkey_P256.json",
3310 "total": 1,
3311 "passed": 1,
3312 "failed": 0,
3313 "pass_rate": 100,
3314 "results": [
3315 {
3316 "input": "did:key:zDnaeTiq1PdzvZXUaMdezchcMJQpBdH2VN4pgrrEhMCCbmwSb",
3317 "expected": "valid",
3318 "actual": "valid",
3319 "passed": true,
3320 "error": null
3321 }
3322 ]
3323 },
3324 {
3325 "name": "K-256 did:key",
3326 "description": "did:key encoding/decoding for K-256 (secp256k1) keys",
3327 "fixture_file": "w3c_didkey_K256.json",
3328 "total": 5,
3329 "passed": 5,
3330 "failed": 0,
3331 "pass_rate": 100,
3332 "results": [
3333 {
3334 "input": "did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme",
3335 "expected": "valid",
3336 "actual": "valid",
3337 "passed": true,
3338 "error": null
3339 },
3340 {
3341 "input": "did:key:zQ3shtxV1FrJfhqE1dvxYRcCknWNjHc3c5X1y3ZSoPDi2aur2",
3342 "expected": "valid",
3343 "actual": "valid",
3344 "passed": true,
3345 "error": null
3346 },
3347 {
3348 "input": "did:key:zQ3shZc2QzApp2oymGvQbzP8eKheVshBHbU4ZYjeXqwSKEn6N",
3349 "expected": "valid",
3350 "actual": "valid",
3351 "passed": true,
3352 "error": null
3353 },
3354 {
3355 "input": "did:key:zQ3shadCps5JLAHcZiuX5YUtWHHL8ysBJqFLWvjZDKAWUBGzy",
3356 "expected": "valid",
3357 "actual": "valid",
3358 "passed": true,
3359 "error": null
3360 },
3361 {
3362 "input": "did:key:zQ3shptjE6JwdkeKN4fcpnYQY3m9Cet3NiHdAfpvSUZBFoKBj",
3363 "expected": "valid",
3364 "actual": "valid",
3365 "passed": true,
3366 "error": null
3367 }
3368 ]
3369 }
3370 ]
3371 },
3372 {
3373 "name": "Data Model (IPLD)",
3374 "spec_url": "https://atproto.com/specs/data-model",
3375 "total": 21,
3376 "passed": 21,
3377 "failed": 0,
3378 "pass_rate": 100,
3379 "categories": [
3380 {
3381 "name": "DAG-CBOR/CID",
3382 "description": "DAG-CBOR encoding and CID computation",
3383 "fixture_file": "data-model-fixtures.json",
3384 "total": 3,
3385 "passed": 3,
3386 "failed": 0,
3387 "pass_rate": 100,
3388 "results": [
3389 {
3390 "input": "fixture[0]",
3391 "expected": "valid",
3392 "actual": "valid",
3393 "passed": true,
3394 "error": null
3395 },
3396 {
3397 "input": "fixture[1]",
3398 "expected": "valid",
3399 "actual": "valid",
3400 "passed": true,
3401 "error": null
3402 },
3403 {
3404 "input": "fixture[2]",
3405 "expected": "valid",
3406 "actual": "valid",
3407 "passed": true,
3408 "error": null
3409 }
3410 ]
3411 },
3412 {
3413 "name": "CID Syntax",
3414 "description": "CID string format validation",
3415 "fixture_file": "cid_syntax_valid.txt, cid_syntax_invalid.txt",
3416 "total": 18,
3417 "passed": 18,
3418 "failed": 0,
3419 "pass_rate": 100,
3420 "results": [
3421 {
3422 "input": "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
3423 "expected": "valid",
3424 "actual": "valid",
3425 "passed": true,
3426 "error": null
3427 },
3428 {
3429 "input": "zdj7WWeQ43G6JJvLWQWZpyHuAMq6uYWRjkBXFad11vE2LHhQ7",
3430 "expected": "valid",
3431 "actual": "valid",
3432 "passed": true,
3433 "error": null
3434 },
3435 {
3436 "input": "bafybeie5gq4jxvzmsym6hjlwxej4rwdoxt7wadqvmmwbqi7r27fclha2va",
3437 "expected": "valid",
3438 "actual": "valid",
3439 "passed": true,
3440 "error": null
3441 },
3442 {
3443 "input": "mBcDxtdWx0aWhhc2g+",
3444 "expected": "valid",
3445 "actual": "valid",
3446 "passed": true,
3447 "error": null
3448 },
3449 {
3450 "input": "z7x3CtScH765HvShXT",
3451 "expected": "valid",
3452 "actual": "valid",
3453 "passed": true,
3454 "error": null
3455 },
3456 {
3457 "input": "zdj7WhuEjrB52m1BisYCtmjH1hSKa7yZ3jEZ9JcXaFRD51wVz",
3458 "expected": "valid",
3459 "actual": "valid",
3460 "passed": true,
3461 "error": null
3462 },
3463 {
3464 "input": "7134036155352661643226414134664076",
3465 "expected": "valid",
3466 "actual": "valid",
3467 "passed": true,
3468 "error": null
3469 },
3470 {
3471 "input": "f017012202c5f688262e0ece8569aa6f94d60aad55ca8d9d83734e4a7430d0cff6588ec2b",
3472 "expected": "valid",
3473 "actual": "valid",
3474 "passed": true,
3475 "error": null
3476 },
3477 {
3478 "input": "example.com",
3479 "expected": "invalid",
3480 "actual": "invalid",
3481 "passed": true,
3482 "error": null
3483 },
3484 {
3485 "input": "https://example.com",
3486 "expected": "invalid",
3487 "actual": "invalid",
3488 "passed": true,
3489 "error": null
3490 },
3491 {
3492 "input": "cid:bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
3493 "expected": "invalid",
3494 "actual": "invalid",
3495 "passed": true,
3496 "error": null
3497 },
3498 {
3499 "input": ".",
3500 "expected": "invalid",
3501 "actual": "invalid",
3502 "passed": true,
3503 "error": null
3504 },
3505 {
3506 "input": "12345",
3507 "expected": "invalid",
3508 "actual": "invalid",
3509 "passed": true,
3510 "error": null
3511 },
3512 {
3513 "input": " bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
3514 "expected": "invalid",
3515 "actual": "invalid",
3516 "passed": true,
3517 "error": null
3518 },
3519 {
3520 "input": "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi ",
3521 "expected": "invalid",
3522 "actual": "invalid",
3523 "passed": true,
3524 "error": null
3525 },
3526 {
3527 "input": "bafybe igdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
3528 "expected": "invalid",
3529 "actual": "invalid",
3530 "passed": true,
3531 "error": null
3532 },
3533 {
3534 "input": "QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR",
3535 "expected": "invalid",
3536 "actual": "invalid",
3537 "passed": true,
3538 "error": null
3539 },
3540 {
3541 "input": "noop",
3542 "expected": "invalid",
3543 "actual": "invalid",
3544 "passed": true,
3545 "error": null
3546 }
3547 ]
3548 }
3549 ]
3550 },
3551 {
3552 "name": "Merkle Search Tree (MST)",
3553 "spec_url": "https://atproto.com/specs/repository#mst-structure",
3554 "total": 13,
3555 "passed": 13,
3556 "failed": 0,
3557 "pass_rate": 100,
3558 "categories": [
3559 {
3560 "name": "Key Heights",
3561 "description": "MST key height calculation",
3562 "fixture_file": "key_heights.json",
3563 "total": 0,
3564 "passed": 0,
3565 "failed": 0,
3566 "pass_rate": 0,
3567 "results": []
3568 },
3569 {
3570 "name": "Common Prefix",
3571 "description": "Common prefix length calculation",
3572 "fixture_file": "common_prefix.json",
3573 "total": 13,
3574 "passed": 13,
3575 "failed": 0,
3576 "pass_rate": 100,
3577 "results": [
3578 {
3579 "input": "prefix[0]: , ",
3580 "expected": "valid",
3581 "actual": "valid",
3582 "passed": true,
3583 "error": null
3584 },
3585 {
3586 "input": "prefix[1]: abc, abc",
3587 "expected": "valid",
3588 "actual": "valid",
3589 "passed": true,
3590 "error": null
3591 },
3592 {
3593 "input": "prefix[2]: , abc",
3594 "expected": "valid",
3595 "actual": "valid",
3596 "passed": true,
3597 "error": null
3598 },
3599 {
3600 "input": "prefix[3]: abc, ",
3601 "expected": "valid",
3602 "actual": "valid",
3603 "passed": true,
3604 "error": null
3605 },
3606 {
3607 "input": "prefix[4]: ab, abc",
3608 "expected": "valid",
3609 "actual": "valid",
3610 "passed": true,
3611 "error": null
3612 },
3613 {
3614 "input": "prefix[5]: abc, ab",
3615 "expected": "valid",
3616 "actual": "valid",
3617 "passed": true,
3618 "error": null
3619 },
3620 {
3621 "input": "prefix[6]: abcde, abc",
3622 "expected": "valid",
3623 "actual": "valid",
3624 "passed": true,
3625 "error": null
3626 },
3627 {
3628 "input": "prefix[7]: abc, abcde",
3629 "expected": "valid",
3630 "actual": "valid",
3631 "passed": true,
3632 "error": null
3633 },
3634 {
3635 "input": "prefix[8]: abcde, abc1",
3636 "expected": "valid",
3637 "actual": "valid",
3638 "passed": true,
3639 "error": null
3640 },
3641 {
3642 "input": "prefix[9]: abcde, abb",
3643 "expected": "valid",
3644 "actual": "valid",
3645 "passed": true,
3646 "error": null
3647 },
3648 {
3649 "input": "prefix[10]: abcde, qbb",
3650 "expected": "valid",
3651 "actual": "valid",
3652 "passed": true,
3653 "error": null
3654 },
3655 {
3656 "input": "prefix[11]: abc, abc\u0000",
3657 "expected": "valid",
3658 "actual": "valid",
3659 "passed": true,
3660 "error": null
3661 },
3662 {
3663 "input": "prefix[12]: abc\u0000, abc",
3664 "expected": "valid",
3665 "actual": "valid",
3666 "passed": true,
3667 "error": null
3668 }
3669 ]
3670 }
3671 ]
3672 }
3673 ]
3674}