dgc 0.0.7

A parser and validator for the EU Digital Green Certificate (dgc) a.k.a. greenpass
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
#[cfg(test)]
use dgc::*;
// Tests the library against some of the test data available at <https://github.com/eu-digital-green-certificates/dgc-testdata>
use rstest::rstest;
use serde_json::Value;
use std::fs;
use std::path::PathBuf;

#[rstest]
#[case::common_2dcode_raw_b1_json("common/2DCode/raw/B1.json")]
#[case::common_2dcode_raw_cbo1_json("common/2DCode/raw/CBO1.json")]
#[case::common_2dcode_raw_cbo2_json("common/2DCode/raw/CBO2.json")]
#[case::common_2dcode_raw_co1_json("common/2DCode/raw/CO1.json")]
#[case::common_2dcode_raw_co10_json("common/2DCode/raw/CO10.json")]
#[case::common_2dcode_raw_co11_json("common/2DCode/raw/CO11.json")]
#[case::common_2dcode_raw_co12_json("common/2DCode/raw/CO12.json")]
#[case::common_2dcode_raw_co13_json("common/2DCode/raw/CO13.json")]
#[case::common_2dcode_raw_co14_json("common/2DCode/raw/CO14.json")]
#[case::common_2dcode_raw_co15_json("common/2DCode/raw/CO15.json")]
#[case::common_2dcode_raw_co16_json("common/2DCode/raw/CO16.json")]
#[case::common_2dcode_raw_co17_json("common/2DCode/raw/CO17.json")]
#[case::common_2dcode_raw_co18_json("common/2DCode/raw/CO18.json")]
#[case::common_2dcode_raw_co19_json("common/2DCode/raw/CO19.json")]
#[case::common_2dcode_raw_co2_json("common/2DCode/raw/CO2.json")]
#[case::common_2dcode_raw_co20_json("common/2DCode/raw/CO20.json")]
#[case::common_2dcode_raw_co21_json("common/2DCode/raw/CO21.json")]
#[case::common_2dcode_raw_co22_json("common/2DCode/raw/CO22.json")]
#[case::common_2dcode_raw_co23_json("common/2DCode/raw/CO23.json")]
#[case::common_2dcode_raw_co28_json("common/2DCode/raw/CO28.json")]
#[case::common_2dcode_raw_co3_json("common/2DCode/raw/CO3.json")]
#[case::common_2dcode_raw_co5_json("common/2DCode/raw/CO5.json")]
#[case::common_2dcode_raw_co6_json("common/2DCode/raw/CO6.json")]
#[case::common_2dcode_raw_co7_json("common/2DCode/raw/CO7.json")]
#[case::common_2dcode_raw_co8_json("common/2DCode/raw/CO8.json")]
#[case::common_2dcode_raw_co9_json("common/2DCode/raw/CO9.json")]
#[case::common_2dcode_raw_dgc1_json("common/2DCode/raw/DGC1.json")]
#[case::common_2dcode_raw_dgc2_json("common/2DCode/raw/DGC2.json")]
#[case::common_2dcode_raw_dgc3_json("common/2DCode/raw/DGC3.json")]
#[case::common_2dcode_raw_dgc4_json("common/2DCode/raw/DGC4.json")]
#[case::common_2dcode_raw_dgc5_json("common/2DCode/raw/DGC5.json")]
#[case::common_2dcode_raw_dgc6_json("common/2DCode/raw/DGC6.json")]
#[case::common_2dcode_raw_h1_json("common/2DCode/raw/H1.json")]
#[case::common_2dcode_raw_h2_json("common/2DCode/raw/H2.json")]
#[case::common_2dcode_raw_h3_json("common/2DCode/raw/H3.json")]
#[case::common_2dcode_raw_q1_json("common/2DCode/raw/Q1.json")]
#[case::common_2dcode_raw_z1_json("common/2DCode/raw/Z1.json")]
#[case::common_2dcode_raw_z2_json("common/2DCode/raw/Z2.json")]
#[case::ae_2dcode_raw_test_json("AE/2DCode/raw/test.json")]
#[case::ae_2dcode_raw_vaccine_json("AE/2DCode/raw/vaccine.json")]
#[case::at_2dcode_raw_1_json("AT/2DCode/raw/1.json")]
#[case::at_2dcode_raw_2_json("AT/2DCode/raw/2.json")]
#[case::at_2dcode_raw_3_json("AT/2DCode/raw/3.json")]
#[case::at_2dcode_raw_4_json("AT/2DCode/raw/4.json")]
#[case::be_2dcode_raw_1_json("BE/2DCode/raw/1.json")]
#[case::be_2dcode_raw_2_json("BE/2DCode/raw/2.json")]
#[case::be_2dcode_raw_3_json("BE/2DCode/raw/3.json")]
#[case::be_2dcode_raw_4_json("BE/2DCode/raw/4.json")]
#[case::be_2dcode_raw_5_json("BE/2DCode/raw/5.json")]
#[case::bg_2dcode_raw_1_json("BG/2DCode/raw/1.json")]
#[case::bg_2dcode_raw_2_json("BG/2DCode/raw/2.json")]
#[case::bg_2dcode_raw_3_json("BG/2DCode/raw/3.json")]
#[case::bg_2dcode_raw_4_json("BG/2DCode/raw/4.json")]
#[case::bg_2dcode_raw_5_json("BG/2DCode/raw/5.json")]
#[case::ch_2dcode_raw_1_json("CH/2DCode/raw/1.json")]
#[case::ch_2dcode_raw_2_json("CH/2DCode/raw/2.json")]
#[case::ch_2dcode_raw_3_json("CH/2DCode/raw/3.json")]
#[case::cy_2dcode_raw_5_json("CY/2DCode/raw/5.json")]
#[case::cy_2dcode_raw_6_json("CY/2DCode/raw/6.json")]
#[case::cy_2dcode_raw_7_json("CY/2DCode/raw/7.json")]
#[case::cy_2dcode_raw_8_json("CY/2DCode/raw/8.json")]
#[case::cz_2dcode_raw_1_json("CZ/2DCode/raw/1.json")]
#[case::cz_2dcode_raw_11_json("CZ/2DCode/raw/11.json")]
#[case::cz_2dcode_raw_12_json("CZ/2DCode/raw/12.json")]
#[case::cz_2dcode_raw_13_json("CZ/2DCode/raw/13.json")]
#[case::cz_2dcode_raw_14_json("CZ/2DCode/raw/14.json")]
#[case::cz_2dcode_raw_15_json("CZ/2DCode/raw/15.json")]
#[case::cz_2dcode_raw_2_json("CZ/2DCode/raw/2.json")]
#[case::cz_2dcode_raw_3_json("CZ/2DCode/raw/3.json")]
#[case::cz_2dcode_raw_4_json("CZ/2DCode/raw/4.json")]
#[case::cz_2dcode_raw_5_json("CZ/2DCode/raw/5.json")]
#[case::de_2dcode_raw_1_json("DE/2DCode/raw/1.json")]
#[case::de_2dcode_raw_2_json("DE/2DCode/raw/2.json")]
#[case::de_2dcode_raw_3_json("DE/2DCode/raw/3.json")]
#[case::de_2dcode_raw_4_json("DE/2DCode/raw/4.json")]
#[case::dk_2dcode_raw_1_json("DK/2DCode/raw/1.json")]
#[case::dk_2dcode_raw_10_json("DK/2DCode/raw/10.json")]
#[case::dk_2dcode_raw_11_json("DK/2DCode/raw/11.json")]
#[case::dk_2dcode_raw_12_json("DK/2DCode/raw/12.json")]
#[case::dk_2dcode_raw_2_json("DK/2DCode/raw/2.json")]
#[case::dk_2dcode_raw_3_json("DK/2DCode/raw/3.json")]
#[case::dk_2dcode_raw_4_json("DK/2DCode/raw/4.json")]
#[case::dk_2dcode_raw_5_json("DK/2DCode/raw/5.json")]
#[case::dk_2dcode_raw_7_json("DK/2DCode/raw/7.json")]
#[case::dk_2dcode_raw_8_json("DK/2DCode/raw/8.json")]
#[case::es_2dcode_raw_1001_json("ES/2DCode/raw/1001.json")]
#[case::es_2dcode_raw_1002_json("ES/2DCode/raw/1002.json")]
#[case::es_2dcode_raw_1003_json("ES/2DCode/raw/1003.json")]
#[case::es_2dcode_raw_101_json("ES/2DCode/raw/101.json")]
#[case::es_2dcode_raw_102_json("ES/2DCode/raw/102.json")]
#[case::es_2dcode_raw_103_json("ES/2DCode/raw/103.json")]
#[case::es_2dcode_raw_1101_json("ES/2DCode/raw/1101.json")]
#[case::es_2dcode_raw_1102_json("ES/2DCode/raw/1102.json")]
#[case::es_2dcode_raw_1103_json("ES/2DCode/raw/1103.json")]
#[case::es_2dcode_raw_1501_json("ES/2DCode/raw/1501.json")]
#[case::es_2dcode_raw_1502_json("ES/2DCode/raw/1502.json")]
#[case::es_2dcode_raw_1503_json("ES/2DCode/raw/1503.json")]
#[case::es_2dcode_raw_201_json("ES/2DCode/raw/201.json")]
#[case::es_2dcode_raw_202_json("ES/2DCode/raw/202.json")]
#[case::es_2dcode_raw_203_json("ES/2DCode/raw/203.json")]
#[case::es_2dcode_raw_2101_json("ES/2DCode/raw/2101.json")]
#[case::es_2dcode_raw_2102_json("ES/2DCode/raw/2102.json")]
#[case::es_2dcode_raw_2103_json("ES/2DCode/raw/2103.json")]
#[ignore = "Key is P-384. See #34"]
#[case::es_2dcode_raw_401_json("ES/2DCode/raw/401.json")]
#[ignore = "Key is P-384. See #34"]
#[case::es_2dcode_raw_402_json("ES/2DCode/raw/402.json")]
#[ignore = "Key is P-384. See #34"]
#[case::es_2dcode_raw_403_json("ES/2DCode/raw/403.json")]
#[case::es_2dcode_raw_501_json("ES/2DCode/raw/501.json")]
#[case::es_2dcode_raw_502_json("ES/2DCode/raw/502.json")]
#[case::es_2dcode_raw_503_json("ES/2DCode/raw/503.json")]
#[case::es_2dcode_raw_701_json("ES/2DCode/raw/701.json")]
#[case::es_2dcode_raw_702_json("ES/2DCode/raw/702.json")]
#[case::es_2dcode_raw_703_json("ES/2DCode/raw/703.json")]
#[case::fi_2dcode_raw_1_json("FI/2DCode/raw/1.json")]
#[case::fi_2dcode_raw_10_json("FI/2DCode/raw/10.json")]
#[case::fi_2dcode_raw_2_json("FI/2DCode/raw/2.json")]
#[case::fi_2dcode_raw_3_json("FI/2DCode/raw/3.json")]
#[case::fi_2dcode_raw_4_json("FI/2DCode/raw/4.json")]
#[case::fi_2dcode_raw_5_json("FI/2DCode/raw/5.json")]
#[case::fi_2dcode_raw_6_json("FI/2DCode/raw/6.json")]
#[case::fi_2dcode_raw_7_json("FI/2DCode/raw/7.json")]
#[case::fi_2dcode_raw_8_json("FI/2DCode/raw/8.json")]
#[case::fi_2dcode_raw_9_json("FI/2DCode/raw/9.json")]
#[case::fr_2dcode_raw_dcc_test_0001_json("FR/2DCode/raw/DCC_Test_0001.json")]
#[case::fr_2dcode_raw_dcc_test_0002_json("FR/2DCode/raw/DCC_Test_0002.json")]
#[case::fr_2dcode_raw_dcc_test_0003_json("FR/2DCode/raw/DCC_Test_0003.json")]
#[case::fr_2dcode_raw_dcc_test_0004_json("FR/2DCode/raw/DCC_Test_0004.json")]
#[case::fr_2dcode_raw_dcc_test_0005_json("FR/2DCode/raw/DCC_Test_0005.json")]
#[case::fr_2dcode_raw_dcc_test_0006_json("FR/2DCode/raw/DCC_Test_0006.json")]
#[case::fr_2dcode_raw_dcc_test_0007_json("FR/2DCode/raw/DCC_Test_0007.json")]
#[case::fr_2dcode_raw_dcc_test_0008_json("FR/2DCode/raw/DCC_Test_0008.json")]
#[case::fr_2dcode_raw_dcc_test_0010_json("FR/2DCode/raw/DCC_Test_0010.json")]
#[case::fr_2dcode_raw_dcc_test_0011_json("FR/2DCode/raw/DCC_Test_0011.json")]
#[case::fr_2dcode_raw_dcc_test_0012_json("FR/2DCode/raw/DCC_Test_0012.json")]
#[case::fr_2dcode_raw_dcc_test_0013_json("FR/2DCode/raw/DCC_Test_0013.json")]
#[case::fr_2dcode_raw_dcc_test_0014_json("FR/2DCode/raw/DCC_Test_0014.json")]
#[case::fr_2dcode_raw_dcc_test_0015_json("FR/2DCode/raw/DCC_Test_0015.json")]
#[case::fr_2dcode_raw_dcc_test_0016_json("FR/2DCode/raw/DCC_Test_0016.json")]
#[case::fr_2dcode_raw_dcc_test_0017_json("FR/2DCode/raw/DCC_Test_0017.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00001_raw_json("FR/2DCode/raw/DGC_QrCode_00001_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00002_raw_json("FR/2DCode/raw/DGC_QrCode_00002_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00003_raw_json("FR/2DCode/raw/DGC_QrCode_00003_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00004_raw_json("FR/2DCode/raw/DGC_QrCode_00004_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00005_raw_json("FR/2DCode/raw/DGC_QrCode_00005_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00006_raw_json("FR/2DCode/raw/DGC_QrCode_00006_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00007_raw_json("FR/2DCode/raw/DGC_QrCode_00007_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00008_raw_json("FR/2DCode/raw/DGC_QrCode_00008_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00009_raw_json("FR/2DCode/raw/DGC_QrCode_00009_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00010_raw_json("FR/2DCode/raw/DGC_QrCode_00010_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00011_raw_json("FR/2DCode/raw/DGC_QrCode_00011_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00012_raw_json("FR/2DCode/raw/DGC_QrCode_00012_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00013_raw_json("FR/2DCode/raw/DGC_QrCode_00013_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00014_raw_json("FR/2DCode/raw/DGC_QrCode_00014_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00015_raw_json("FR/2DCode/raw/DGC_QrCode_00015_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00016_raw_json("FR/2DCode/raw/DGC_QrCode_00016_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00017_raw_json("FR/2DCode/raw/DGC_QrCode_00017_Raw.json")]
#[case::fr_2dcode_raw_dgc_qrcode_00018_raw_json("FR/2DCode/raw/DGC_QrCode_00018_Raw.json")]
#[case::fr_2dcode_raw_recovery_ok_json("FR/2DCode/raw/recovery_ok.json")]
#[ignore = "some dates in the given JSON seem wrong"]
#[case::fr_2dcode_raw_test_pcr_ok_json("FR/2DCode/raw/test_pcr_ok.json")]
#[case::fr_2dcode_raw_vaccin_ok_json("FR/2DCode/raw/vaccin_ok.json")]
#[case::ge_2dcode_raw_1_json("GE/2DCode/raw/1.json")]
#[case::ge_2dcode_raw_2_json("GE/2DCode/raw/2.json")]
#[case::ge_2dcode_raw_3_json("GE/2DCode/raw/3.json")]
#[case::gr_2dcode_raw_1_json("GR/2DCode/raw/1.json")]
#[case::gr_2dcode_raw_2_json("GR/2DCode/raw/2.json")]
#[case::gr_2dcode_raw_3_json("GR/2DCode/raw/3.json")]
#[case::gr_2dcode_raw_4_json("GR/2DCode/raw/4.json")]
#[case::hr_2dcode_raw_1_json("HR/2DCode/raw/1.json")]
#[case::hr_2dcode_raw_2_json("HR/2DCode/raw/2.json")]
#[case::hr_2dcode_raw_3_json("HR/2DCode/raw/3.json")]
#[case::hr_2dcode_raw_4_json("HR/2DCode/raw/4.json")]
#[case::hu_2dcode_raw_1_json("HU/2DCode/raw/1.json")]
#[case::hu_2dcode_raw_2_json("HU/2DCode/raw/2.json")]
#[case::hu_2dcode_raw_3_json("HU/2DCode/raw/3.json")]
#[case::hu_2dcode_raw_4_json("HU/2DCode/raw/4.json")]
#[case::ie_2dcode_raw_1_json("IE/2DCode/Raw/1.json")]
#[case::ie_2dcode_raw_2_json("IE/2DCode/Raw/2.json")]
#[case::ie_2dcode_raw_3_json("IE/2DCode/Raw/3.json")]
#[case::ie_2dcode_raw_4_json("IE/2DCode/Raw/4.json")]
#[case::is_2dcode_raw_1_json("IS/2DCode/raw/1.json")]
#[case::is_2dcode_raw_2_json("IS/2DCode/raw/2.json")]
#[case::is_2dcode_raw_3_json("IS/2DCode/raw/3.json")]
#[case::is_2dcode_raw_4_json("IS/2DCode/raw/4.json")]
#[case::is_2dcode_raw_5_json("IS/2DCode/raw/5.json")]
#[case::it_2dcode_raw_1_json("IT/2DCode/raw/1.json")]
#[case::it_2dcode_raw_2_json("IT/2DCode/raw/2.json")]
#[case::it_2dcode_raw_3_json("IT/2DCode/raw/3.json")]
#[case::it_2dcode_raw_4_json("IT/2DCode/raw/4.json")]
#[case::li_2dcode_raw_1_json("LI/2DCode/raw/1.json")]
#[case::li_2dcode_raw_2_json("LI/2DCode/raw/2.json")]
#[case::li_2dcode_raw_3_json("LI/2DCode/raw/3.json")]
#[case::li_2dcode_raw_4_json("LI/2DCode/raw/4.json")]
#[case::lt_2dcode_raw_1_json("LT/2DCode/raw/1.json")]
#[case::lt_2dcode_raw_2_json("LT/2DCode/raw/2.json")]
#[case::lt_2dcode_raw_3_json("LT/2DCode/raw/3.json")]
#[case::lt_2dcode_raw_4_json("LT/2DCode/raw/4.json")]
#[case::lu_2dcode_raw_incert_r_dcc_naat_json("LU/2DCode/raw/INCERT_R_DCC_NAAT.json")]
#[case::lu_2dcode_raw_incert_r_dcc_rat_json("LU/2DCode/raw/INCERT_R_DCC_RAT.json")]
#[case::lu_2dcode_raw_incert_r_dcc_recovery_json("LU/2DCode/raw/INCERT_R_DCC_Recovery.json")]
#[case::lu_2dcode_raw_incert_r_dcc_vaccination_json("LU/2DCode/raw/INCERT_R_DCC_Vaccination.json")]
#[case::lv_2dcode_raw_1_json("LV/2DCode/raw/1.json")]
#[case::lv_2dcode_raw_2_json("LV/2DCode/raw/2.json")]
#[case::lv_2dcode_raw_3_json("LV/2DCode/raw/3.json")]
#[case::nl_2dcode_raw_000_nl_test_json("NL/2DCode/raw/000-NL-test.json")]
#[case::nl_2dcode_raw_001_nl_test_json("NL/2DCode/raw/001-NL-test.json")]
#[case::nl_2dcode_raw_002_nl_test_json("NL/2DCode/raw/002-NL-test.json")]
#[case::nl_2dcode_raw_003_nl_test_json("NL/2DCode/raw/003-NL-test.json")]
#[case::nl_2dcode_raw_004_nl_test_json("NL/2DCode/raw/004-NL-test.json")]
#[case::nl_2dcode_raw_005_nl_test_json("NL/2DCode/raw/005-NL-test.json")]
#[case::nl_2dcode_raw_006_nl_test_json("NL/2DCode/raw/006-NL-test.json")]
#[case::nl_2dcode_raw_007_nl_test_json("NL/2DCode/raw/007-NL-test.json")]
#[case::nl_2dcode_raw_008_nl_test_json("NL/2DCode/raw/008-NL-test.json")]
#[case::nl_2dcode_raw_009_nl_test_json("NL/2DCode/raw/009-NL-test.json")]
#[case::nl_2dcode_raw_010_nl_test_json("NL/2DCode/raw/010-NL-test.json")]
#[case::nl_2dcode_raw_011_nl_test_json("NL/2DCode/raw/011-NL-test.json")]
#[case::nl_2dcode_raw_012_nl_test_json("NL/2DCode/raw/012-NL-test.json")]
#[case::nl_2dcode_raw_013_nl_test_json("NL/2DCode/raw/013-NL-test.json")]
#[case::nl_2dcode_raw_014_nl_test_json("NL/2DCode/raw/014-NL-test.json")]
#[case::nl_2dcode_raw_015_nl_test_json("NL/2DCode/raw/015-NL-test.json")]
#[case::nl_2dcode_raw_016_nl_test_json("NL/2DCode/raw/016-NL-test.json")]
#[case::nl_2dcode_raw_017_nl_test_json("NL/2DCode/raw/017-NL-test.json")]
#[case::nl_2dcode_raw_018_nl_test_json("NL/2DCode/raw/018-NL-test.json")]
#[case::nl_2dcode_raw_019_nl_test_json("NL/2DCode/raw/019-NL-test.json")]
#[case::nl_2dcode_raw_020_nl_test_json("NL/2DCode/raw/020-NL-test.json")]
#[case::nl_2dcode_raw_021_nl_test_json("NL/2DCode/raw/021-NL-test.json")]
#[case::nl_2dcode_raw_022_nl_test_json("NL/2DCode/raw/022-NL-test.json")]
#[case::nl_2dcode_raw_023_nl_test_json("NL/2DCode/raw/023-NL-test.json")]
#[case::nl_2dcode_raw_024_nl_test_json("NL/2DCode/raw/024-NL-test.json")]
#[case::nl_2dcode_raw_025_nl_test_json("NL/2DCode/raw/025-NL-test.json")]
#[case::nl_2dcode_raw_026_nl_test_json("NL/2DCode/raw/026-NL-test.json")]
#[case::nl_2dcode_raw_027_nl_test_json("NL/2DCode/raw/027-NL-test.json")]
#[case::nl_2dcode_raw_028_nl_test_json("NL/2DCode/raw/028-NL-test.json")]
#[case::nl_2dcode_raw_029_nl_test_json("NL/2DCode/raw/029-NL-test.json")]
#[case::nl_2dcode_raw_030_nl_test_json("NL/2DCode/raw/030-NL-test.json")]
#[case::nl_2dcode_raw_031_nl_test_json("NL/2DCode/raw/031-NL-test.json")]
#[case::nl_2dcode_raw_032_nl_test_json("NL/2DCode/raw/032-NL-test.json")]
#[case::nl_2dcode_raw_033_nl_test_json("NL/2DCode/raw/033-NL-test.json")]
#[case::nl_2dcode_raw_034_nl_test_json("NL/2DCode/raw/034-NL-test.json")]
#[case::nl_2dcode_raw_035_nl_test_json("NL/2DCode/raw/035-NL-test.json")]
#[case::nl_2dcode_raw_036_nl_test_json("NL/2DCode/raw/036-NL-test.json")]
#[case::nl_2dcode_raw_037_nl_test_json("NL/2DCode/raw/037-NL-test.json")]
#[case::nl_2dcode_raw_038_nl_test_json("NL/2DCode/raw/038-NL-test.json")]
#[case::nl_2dcode_raw_039_nl_test_json("NL/2DCode/raw/039-NL-test.json")]
#[case::nl_2dcode_raw_040_nl_test_json("NL/2DCode/raw/040-NL-test.json")]
#[case::nl_2dcode_raw_041_nl_test_json("NL/2DCode/raw/041-NL-test.json")]
#[case::nl_2dcode_raw_042_nl_test_json("NL/2DCode/raw/042-NL-test.json")]
#[case::nl_2dcode_raw_043_nl_test_json("NL/2DCode/raw/043-NL-test.json")]
#[case::nl_2dcode_raw_044_nl_test_json("NL/2DCode/raw/044-NL-test.json")]
#[case::nl_2dcode_raw_045_nl_test_json("NL/2DCode/raw/045-NL-test.json")]
#[case::nl_2dcode_raw_046_nl_test_json("NL/2DCode/raw/046-NL-test.json")]
#[case::nl_2dcode_raw_047_nl_test_json("NL/2DCode/raw/047-NL-test.json")]
#[case::nl_2dcode_raw_048_nl_test_json("NL/2DCode/raw/048-NL-test.json")]
#[case::nl_2dcode_raw_049_nl_test_json("NL/2DCode/raw/049-NL-test.json")]
#[case::nl_2dcode_raw_050_nl_test_json("NL/2DCode/raw/050-NL-test.json")]
#[case::nl_2dcode_raw_051_nl_test_json("NL/2DCode/raw/051-NL-test.json")]
#[case::nl_2dcode_raw_052_nl_test_json("NL/2DCode/raw/052-NL-test.json")]
#[case::nl_2dcode_raw_053_nl_test_json("NL/2DCode/raw/053-NL-test.json")]
#[case::nl_2dcode_raw_054_nl_test_json("NL/2DCode/raw/054-NL-test.json")]
#[case::nl_2dcode_raw_055_nl_test_json("NL/2DCode/raw/055-NL-test.json")]
#[case::nl_2dcode_raw_056_nl_test_json("NL/2DCode/raw/056-NL-test.json")]
#[case::nl_2dcode_raw_057_nl_test_json("NL/2DCode/raw/057-NL-test.json")]
#[case::nl_2dcode_raw_058_nl_test_json("NL/2DCode/raw/058-NL-test.json")]
#[case::nl_2dcode_raw_059_nl_test_json("NL/2DCode/raw/059-NL-test.json")]
#[case::nl_2dcode_raw_060_nl_test_json("NL/2DCode/raw/060-NL-test.json")]
#[case::nl_2dcode_raw_061_nl_test_json("NL/2DCode/raw/061-NL-test.json")]
#[case::nl_2dcode_raw_062_nl_test_json("NL/2DCode/raw/062-NL-test.json")]
#[case::nl_2dcode_raw_063_nl_test_json("NL/2DCode/raw/063-NL-test.json")]
#[case::nl_2dcode_raw_064_nl_test_json("NL/2DCode/raw/064-NL-test.json")]
#[case::nl_2dcode_raw_065_nl_test_json("NL/2DCode/raw/065-NL-test.json")]
#[case::nl_2dcode_raw_066_nl_test_json("NL/2DCode/raw/066-NL-test.json")]
#[case::nl_2dcode_raw_067_nl_test_json("NL/2DCode/raw/067-NL-test.json")]
#[case::nl_2dcode_raw_068_nl_test_json("NL/2DCode/raw/068-NL-test.json")]
#[case::nl_2dcode_raw_069_nl_test_json("NL/2DCode/raw/069-NL-test.json")]
#[case::nl_2dcode_raw_070_nl_test_json("NL/2DCode/raw/070-NL-test.json")]
#[case::nl_2dcode_raw_071_nl_test_json("NL/2DCode/raw/071-NL-test.json")]
#[case::nl_2dcode_raw_072_nl_vaccination_json("NL/2DCode/raw/072-NL-vaccination.json")]
#[case::nl_2dcode_raw_073_nl_vaccination_json("NL/2DCode/raw/073-NL-vaccination.json")]
#[case::nl_2dcode_raw_074_nl_vaccination_json("NL/2DCode/raw/074-NL-vaccination.json")]
#[case::nl_2dcode_raw_075_nl_vaccination_json("NL/2DCode/raw/075-NL-vaccination.json")]
#[case::nl_2dcode_raw_076_nl_vaccination_json("NL/2DCode/raw/076-NL-vaccination.json")]
#[case::nl_2dcode_raw_077_nl_vaccination_json("NL/2DCode/raw/077-NL-vaccination.json")]
#[case::nl_2dcode_raw_078_nl_vaccination_json("NL/2DCode/raw/078-NL-vaccination.json")]
#[case::nl_2dcode_raw_079_nl_vaccination_json("NL/2DCode/raw/079-NL-vaccination.json")]
#[case::nl_2dcode_raw_080_nl_vaccination_json("NL/2DCode/raw/080-NL-vaccination.json")]
#[case::nl_2dcode_raw_081_nl_vaccination_json("NL/2DCode/raw/081-NL-vaccination.json")]
#[case::nl_2dcode_raw_082_nl_vaccination_json("NL/2DCode/raw/082-NL-vaccination.json")]
#[case::nl_2dcode_raw_083_nl_vaccination_json("NL/2DCode/raw/083-NL-vaccination.json")]
#[case::nl_2dcode_raw_084_nl_vaccination_json("NL/2DCode/raw/084-NL-vaccination.json")]
#[case::nl_2dcode_raw_085_nl_vaccination_json("NL/2DCode/raw/085-NL-vaccination.json")]
#[case::nl_2dcode_raw_086_nl_vaccination_json("NL/2DCode/raw/086-NL-vaccination.json")]
#[case::nl_2dcode_raw_087_nl_vaccination_json("NL/2DCode/raw/087-NL-vaccination.json")]
#[case::nl_2dcode_raw_088_nl_vaccination_json("NL/2DCode/raw/088-NL-vaccination.json")]
#[case::nl_2dcode_raw_089_nl_vaccination_json("NL/2DCode/raw/089-NL-vaccination.json")]
#[case::nl_2dcode_raw_090_nl_vaccination_json("NL/2DCode/raw/090-NL-vaccination.json")]
#[case::nl_2dcode_raw_091_nl_vaccination_json("NL/2DCode/raw/091-NL-vaccination.json")]
#[case::nl_2dcode_raw_092_nl_vaccination_json("NL/2DCode/raw/092-NL-vaccination.json")]
#[case::nl_2dcode_raw_093_nl_vaccination_json("NL/2DCode/raw/093-NL-vaccination.json")]
#[case::nl_2dcode_raw_094_nl_vaccination_json("NL/2DCode/raw/094-NL-vaccination.json")]
#[case::nl_2dcode_raw_095_nl_vaccination_json("NL/2DCode/raw/095-NL-vaccination.json")]
#[case::nl_2dcode_raw_096_nl_vaccination_json("NL/2DCode/raw/096-NL-vaccination.json")]
#[case::nl_2dcode_raw_097_nl_vaccination_json("NL/2DCode/raw/097-NL-vaccination.json")]
#[case::nl_2dcode_raw_098_nl_vaccination_json("NL/2DCode/raw/098-NL-vaccination.json")]
#[case::nl_2dcode_raw_099_nl_vaccination_json("NL/2DCode/raw/099-NL-vaccination.json")]
#[case::nl_2dcode_raw_100_nl_vaccination_json("NL/2DCode/raw/100-NL-vaccination.json")]
#[case::nl_2dcode_raw_101_nl_vaccination_json("NL/2DCode/raw/101-NL-vaccination.json")]
#[case::nl_2dcode_raw_102_nl_vaccination_json("NL/2DCode/raw/102-NL-vaccination.json")]
#[case::nl_2dcode_raw_103_nl_vaccination_json("NL/2DCode/raw/103-NL-vaccination.json")]
#[case::nl_2dcode_raw_104_nl_vaccination_json("NL/2DCode/raw/104-NL-vaccination.json")]
#[case::nl_2dcode_raw_105_nl_vaccination_json("NL/2DCode/raw/105-NL-vaccination.json")]
#[case::nl_2dcode_raw_106_nl_vaccination_json("NL/2DCode/raw/106-NL-vaccination.json")]
#[case::nl_2dcode_raw_107_nl_vaccination_json("NL/2DCode/raw/107-NL-vaccination.json")]
#[case::nl_2dcode_raw_108_nl_vaccination_json("NL/2DCode/raw/108-NL-vaccination.json")]
#[case::nl_2dcode_raw_109_nl_vaccination_json("NL/2DCode/raw/109-NL-vaccination.json")]
#[case::nl_2dcode_raw_110_nl_vaccination_json("NL/2DCode/raw/110-NL-vaccination.json")]
#[case::nl_2dcode_raw_111_nl_vaccination_json("NL/2DCode/raw/111-NL-vaccination.json")]
#[case::nl_2dcode_raw_112_nl_vaccination_json("NL/2DCode/raw/112-NL-vaccination.json")]
#[case::nl_2dcode_raw_113_nl_vaccination_json("NL/2DCode/raw/113-NL-vaccination.json")]
#[case::nl_2dcode_raw_114_nl_vaccination_json("NL/2DCode/raw/114-NL-vaccination.json")]
#[case::nl_2dcode_raw_115_nl_vaccination_json("NL/2DCode/raw/115-NL-vaccination.json")]
#[case::nl_2dcode_raw_116_nl_vaccination_json("NL/2DCode/raw/116-NL-vaccination.json")]
#[case::nl_2dcode_raw_117_nl_vaccination_json("NL/2DCode/raw/117-NL-vaccination.json")]
#[case::nl_2dcode_raw_118_nl_vaccination_json("NL/2DCode/raw/118-NL-vaccination.json")]
#[case::nl_2dcode_raw_119_nl_vaccination_json("NL/2DCode/raw/119-NL-vaccination.json")]
#[case::nl_2dcode_raw_120_nl_vaccination_json("NL/2DCode/raw/120-NL-vaccination.json")]
#[case::nl_2dcode_raw_121_nl_vaccination_json("NL/2DCode/raw/121-NL-vaccination.json")]
#[case::nl_2dcode_raw_122_nl_vaccination_json("NL/2DCode/raw/122-NL-vaccination.json")]
#[case::nl_2dcode_raw_123_nl_vaccination_json("NL/2DCode/raw/123-NL-vaccination.json")]
#[case::nl_2dcode_raw_124_nl_vaccination_json("NL/2DCode/raw/124-NL-vaccination.json")]
#[case::nl_2dcode_raw_125_nl_vaccination_json("NL/2DCode/raw/125-NL-vaccination.json")]
#[case::nl_2dcode_raw_126_nl_vaccination_json("NL/2DCode/raw/126-NL-vaccination.json")]
#[case::nl_2dcode_raw_127_nl_vaccination_json("NL/2DCode/raw/127-NL-vaccination.json")]
#[case::nl_2dcode_raw_128_nl_vaccination_json("NL/2DCode/raw/128-NL-vaccination.json")]
#[case::nl_2dcode_raw_129_nl_vaccination_json("NL/2DCode/raw/129-NL-vaccination.json")]
#[case::nl_2dcode_raw_130_nl_vaccination_json("NL/2DCode/raw/130-NL-vaccination.json")]
#[case::nl_2dcode_raw_131_nl_vaccination_json("NL/2DCode/raw/131-NL-vaccination.json")]
#[case::nl_2dcode_raw_132_nl_vaccination_json("NL/2DCode/raw/132-NL-vaccination.json")]
#[case::nl_2dcode_raw_133_nl_vaccination_json("NL/2DCode/raw/133-NL-vaccination.json")]
#[case::nl_2dcode_raw_134_nl_vaccination_json("NL/2DCode/raw/134-NL-vaccination.json")]
#[case::nl_2dcode_raw_135_nl_vaccination_json("NL/2DCode/raw/135-NL-vaccination.json")]
#[case::nl_2dcode_raw_136_nl_vaccination_json("NL/2DCode/raw/136-NL-vaccination.json")]
#[case::nl_2dcode_raw_137_nl_vaccination_json("NL/2DCode/raw/137-NL-vaccination.json")]
#[case::nl_2dcode_raw_138_nl_vaccination_json("NL/2DCode/raw/138-NL-vaccination.json")]
#[case::nl_2dcode_raw_139_nl_vaccination_json("NL/2DCode/raw/139-NL-vaccination.json")]
#[case::nl_2dcode_raw_140_nl_vaccination_json("NL/2DCode/raw/140-NL-vaccination.json")]
#[case::nl_2dcode_raw_141_nl_vaccination_json("NL/2DCode/raw/141-NL-vaccination.json")]
#[case::nl_2dcode_raw_142_nl_vaccination_json("NL/2DCode/raw/142-NL-vaccination.json")]
#[case::nl_2dcode_raw_143_nl_vaccination_json("NL/2DCode/raw/143-NL-vaccination.json")]
#[case::nl_2dcode_raw_144_nl_recovery_json("NL/2DCode/raw/144-NL-recovery.json")]
#[case::nl_2dcode_raw_145_nl_recovery_json("NL/2DCode/raw/145-NL-recovery.json")]
#[case::nl_2dcode_raw_146_nl_recovery_json("NL/2DCode/raw/146-NL-recovery.json")]
#[case::nl_2dcode_raw_147_nl_recovery_json("NL/2DCode/raw/147-NL-recovery.json")]
#[case::nl_2dcode_raw_148_nl_recovery_json("NL/2DCode/raw/148-NL-recovery.json")]
#[case::nl_2dcode_raw_149_nl_recovery_json("NL/2DCode/raw/149-NL-recovery.json")]
#[case::nl_2dcode_raw_150_nl_recovery_json("NL/2DCode/raw/150-NL-recovery.json")]
#[case::nl_2dcode_raw_151_nl_recovery_json("NL/2DCode/raw/151-NL-recovery.json")]
#[case::nl_2dcode_raw_152_nl_recovery_json("NL/2DCode/raw/152-NL-recovery.json")]
#[case::nl_2dcode_raw_153_nl_recovery_json("NL/2DCode/raw/153-NL-recovery.json")]
#[case::nl_2dcode_raw_154_nl_recovery_json("NL/2DCode/raw/154-NL-recovery.json")]
#[case::nl_2dcode_raw_155_nl_recovery_json("NL/2DCode/raw/155-NL-recovery.json")]
#[case::nl_2dcode_raw_156_nl_recovery_json("NL/2DCode/raw/156-NL-recovery.json")]
#[case::nl_2dcode_raw_157_nl_recovery_json("NL/2DCode/raw/157-NL-recovery.json")]
#[case::nl_2dcode_raw_158_nl_recovery_json("NL/2DCode/raw/158-NL-recovery.json")]
#[case::nl_2dcode_raw_159_nl_recovery_json("NL/2DCode/raw/159-NL-recovery.json")]
#[case::nl_2dcode_raw_160_nl_recovery_json("NL/2DCode/raw/160-NL-recovery.json")]
#[case::nl_2dcode_raw_161_nl_recovery_json("NL/2DCode/raw/161-NL-recovery.json")]
#[case::nl_2dcode_raw_162_nl_recovery_json("NL/2DCode/raw/162-NL-recovery.json")]
#[case::nl_2dcode_raw_163_nl_recovery_json("NL/2DCode/raw/163-NL-recovery.json")]
#[case::nl_2dcode_raw_164_nl_recovery_json("NL/2DCode/raw/164-NL-recovery.json")]
#[case::nl_2dcode_raw_165_nl_recovery_json("NL/2DCode/raw/165-NL-recovery.json")]
#[case::nl_2dcode_raw_166_nl_recovery_json("NL/2DCode/raw/166-NL-recovery.json")]
#[case::nl_2dcode_raw_167_nl_recovery_json("NL/2DCode/raw/167-NL-recovery.json")]
#[case::nl_2dcode_raw_168_nl_recovery_json("NL/2DCode/raw/168-NL-recovery.json")]
#[case::nl_2dcode_raw_169_nl_recovery_json("NL/2DCode/raw/169-NL-recovery.json")]
#[case::nl_2dcode_raw_170_nl_recovery_json("NL/2DCode/raw/170-NL-recovery.json")]
#[case::nl_2dcode_raw_171_nl_recovery_json("NL/2DCode/raw/171-NL-recovery.json")]
#[case::nl_2dcode_raw_172_nl_recovery_json("NL/2DCode/raw/172-NL-recovery.json")]
#[case::nl_2dcode_raw_173_nl_recovery_json("NL/2DCode/raw/173-NL-recovery.json")]
#[case::nl_2dcode_raw_174_nl_recovery_json("NL/2DCode/raw/174-NL-recovery.json")]
#[case::nl_2dcode_raw_175_nl_recovery_json("NL/2DCode/raw/175-NL-recovery.json")]
#[case::nl_2dcode_raw_176_nl_recovery_json("NL/2DCode/raw/176-NL-recovery.json")]
#[case::nl_2dcode_raw_177_nl_recovery_json("NL/2DCode/raw/177-NL-recovery.json")]
#[case::nl_2dcode_raw_178_nl_recovery_json("NL/2DCode/raw/178-NL-recovery.json")]
#[case::nl_2dcode_raw_179_nl_recovery_json("NL/2DCode/raw/179-NL-recovery.json")]
#[case::nl_2dcode_raw_180_nl_recovery_json("NL/2DCode/raw/180-NL-recovery.json")]
#[case::nl_2dcode_raw_181_nl_recovery_json("NL/2DCode/raw/181-NL-recovery.json")]
#[case::nl_2dcode_raw_182_nl_recovery_json("NL/2DCode/raw/182-NL-recovery.json")]
#[case::nl_2dcode_raw_183_nl_recovery_json("NL/2DCode/raw/183-NL-recovery.json")]
#[case::nl_2dcode_raw_184_nl_recovery_json("NL/2DCode/raw/184-NL-recovery.json")]
#[case::nl_2dcode_raw_185_nl_recovery_json("NL/2DCode/raw/185-NL-recovery.json")]
#[case::nl_2dcode_raw_186_nl_recovery_json("NL/2DCode/raw/186-NL-recovery.json")]
#[case::nl_2dcode_raw_187_nl_recovery_json("NL/2DCode/raw/187-NL-recovery.json")]
#[case::nl_2dcode_raw_188_nl_recovery_json("NL/2DCode/raw/188-NL-recovery.json")]
#[case::nl_2dcode_raw_189_nl_recovery_json("NL/2DCode/raw/189-NL-recovery.json")]
#[case::nl_2dcode_raw_190_nl_recovery_json("NL/2DCode/raw/190-NL-recovery.json")]
#[case::nl_2dcode_raw_191_nl_recovery_json("NL/2DCode/raw/191-NL-recovery.json")]
#[case::nl_2dcode_raw_192_nl_recovery_json("NL/2DCode/raw/192-NL-recovery.json")]
#[case::nl_2dcode_raw_193_nl_recovery_json("NL/2DCode/raw/193-NL-recovery.json")]
#[case::nl_2dcode_raw_194_nl_recovery_json("NL/2DCode/raw/194-NL-recovery.json")]
#[case::nl_2dcode_raw_195_nl_recovery_json("NL/2DCode/raw/195-NL-recovery.json")]
#[case::nl_2dcode_raw_196_nl_recovery_json("NL/2DCode/raw/196-NL-recovery.json")]
#[case::nl_2dcode_raw_197_nl_recovery_json("NL/2DCode/raw/197-NL-recovery.json")]
#[case::nl_2dcode_raw_198_nl_recovery_json("NL/2DCode/raw/198-NL-recovery.json")]
#[case::nl_2dcode_raw_199_nl_recovery_json("NL/2DCode/raw/199-NL-recovery.json")]
#[case::nl_2dcode_raw_200_nl_recovery_json("NL/2DCode/raw/200-NL-recovery.json")]
#[case::nl_2dcode_raw_201_nl_recovery_json("NL/2DCode/raw/201-NL-recovery.json")]
#[case::nl_2dcode_raw_202_nl_recovery_json("NL/2DCode/raw/202-NL-recovery.json")]
#[case::nl_2dcode_raw_203_nl_recovery_json("NL/2DCode/raw/203-NL-recovery.json")]
#[case::nl_2dcode_raw_204_nl_recovery_json("NL/2DCode/raw/204-NL-recovery.json")]
#[case::nl_2dcode_raw_205_nl_recovery_json("NL/2DCode/raw/205-NL-recovery.json")]
#[case::nl_2dcode_raw_206_nl_recovery_json("NL/2DCode/raw/206-NL-recovery.json")]
#[case::nl_2dcode_raw_207_nl_recovery_json("NL/2DCode/raw/207-NL-recovery.json")]
#[case::nl_2dcode_raw_208_nl_recovery_json("NL/2DCode/raw/208-NL-recovery.json")]
#[case::nl_2dcode_raw_209_nl_recovery_json("NL/2DCode/raw/209-NL-recovery.json")]
#[case::nl_2dcode_raw_210_nl_recovery_json("NL/2DCode/raw/210-NL-recovery.json")]
#[case::nl_2dcode_raw_211_nl_recovery_json("NL/2DCode/raw/211-NL-recovery.json")]
#[case::nl_2dcode_raw_212_nl_recovery_json("NL/2DCode/raw/212-NL-recovery.json")]
#[case::nl_2dcode_raw_213_nl_recovery_json("NL/2DCode/raw/213-NL-recovery.json")]
#[case::nl_2dcode_raw_214_nl_recovery_json("NL/2DCode/raw/214-NL-recovery.json")]
#[case::nl_2dcode_raw_215_nl_recovery_json("NL/2DCode/raw/215-NL-recovery.json")]
#[case::nl_2dcode_raw_216_nl_test_wrong_key_json("NL/2DCode/raw/216-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_217_nl_test_wrong_key_json("NL/2DCode/raw/217-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_218_nl_test_wrong_key_json("NL/2DCode/raw/218-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_219_nl_test_wrong_key_json("NL/2DCode/raw/219-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_220_nl_test_wrong_key_json("NL/2DCode/raw/220-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_221_nl_test_wrong_key_json("NL/2DCode/raw/221-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_222_nl_test_wrong_key_json("NL/2DCode/raw/222-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_223_nl_test_wrong_key_json("NL/2DCode/raw/223-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_224_nl_test_wrong_key_json("NL/2DCode/raw/224-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_225_nl_test_wrong_key_json("NL/2DCode/raw/225-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_226_nl_test_wrong_key_json("NL/2DCode/raw/226-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_227_nl_test_wrong_key_json("NL/2DCode/raw/227-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_228_nl_test_wrong_key_json("NL/2DCode/raw/228-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_229_nl_test_wrong_key_json("NL/2DCode/raw/229-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_230_nl_test_wrong_key_json("NL/2DCode/raw/230-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_231_nl_test_wrong_key_json("NL/2DCode/raw/231-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_232_nl_test_wrong_key_json("NL/2DCode/raw/232-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_233_nl_test_wrong_key_json("NL/2DCode/raw/233-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_234_nl_test_wrong_key_json("NL/2DCode/raw/234-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_235_nl_test_wrong_key_json("NL/2DCode/raw/235-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_236_nl_test_wrong_key_json("NL/2DCode/raw/236-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_237_nl_test_wrong_key_json("NL/2DCode/raw/237-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_238_nl_test_wrong_key_json("NL/2DCode/raw/238-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_239_nl_test_wrong_key_json("NL/2DCode/raw/239-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_240_nl_test_wrong_key_json("NL/2DCode/raw/240-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_241_nl_test_wrong_key_json("NL/2DCode/raw/241-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_242_nl_test_wrong_key_json("NL/2DCode/raw/242-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_243_nl_test_wrong_key_json("NL/2DCode/raw/243-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_244_nl_test_wrong_key_json("NL/2DCode/raw/244-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_245_nl_test_wrong_key_json("NL/2DCode/raw/245-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_246_nl_test_wrong_key_json("NL/2DCode/raw/246-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_247_nl_test_wrong_key_json("NL/2DCode/raw/247-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_248_nl_test_wrong_key_json("NL/2DCode/raw/248-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_249_nl_test_wrong_key_json("NL/2DCode/raw/249-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_250_nl_test_wrong_key_json("NL/2DCode/raw/250-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_251_nl_test_wrong_key_json("NL/2DCode/raw/251-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_252_nl_test_wrong_key_json("NL/2DCode/raw/252-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_253_nl_test_wrong_key_json("NL/2DCode/raw/253-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_254_nl_test_wrong_key_json("NL/2DCode/raw/254-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_255_nl_test_wrong_key_json("NL/2DCode/raw/255-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_256_nl_test_wrong_key_json("NL/2DCode/raw/256-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_257_nl_test_wrong_key_json("NL/2DCode/raw/257-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_258_nl_test_wrong_key_json("NL/2DCode/raw/258-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_259_nl_test_wrong_key_json("NL/2DCode/raw/259-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_260_nl_test_wrong_key_json("NL/2DCode/raw/260-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_261_nl_test_wrong_key_json("NL/2DCode/raw/261-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_262_nl_test_wrong_key_json("NL/2DCode/raw/262-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_263_nl_test_wrong_key_json("NL/2DCode/raw/263-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_264_nl_test_wrong_key_json("NL/2DCode/raw/264-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_265_nl_test_wrong_key_json("NL/2DCode/raw/265-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_266_nl_test_wrong_key_json("NL/2DCode/raw/266-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_267_nl_test_wrong_key_json("NL/2DCode/raw/267-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_268_nl_test_wrong_key_json("NL/2DCode/raw/268-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_269_nl_test_wrong_key_json("NL/2DCode/raw/269-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_270_nl_test_wrong_key_json("NL/2DCode/raw/270-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_271_nl_test_wrong_key_json("NL/2DCode/raw/271-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_272_nl_test_wrong_key_json("NL/2DCode/raw/272-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_273_nl_test_wrong_key_json("NL/2DCode/raw/273-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_274_nl_test_wrong_key_json("NL/2DCode/raw/274-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_275_nl_test_wrong_key_json("NL/2DCode/raw/275-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_276_nl_test_wrong_key_json("NL/2DCode/raw/276-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_277_nl_test_wrong_key_json("NL/2DCode/raw/277-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_278_nl_test_wrong_key_json("NL/2DCode/raw/278-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_279_nl_test_wrong_key_json("NL/2DCode/raw/279-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_280_nl_test_wrong_key_json("NL/2DCode/raw/280-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_281_nl_test_wrong_key_json("NL/2DCode/raw/281-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_282_nl_test_wrong_key_json("NL/2DCode/raw/282-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_283_nl_test_wrong_key_json("NL/2DCode/raw/283-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_284_nl_test_wrong_key_json("NL/2DCode/raw/284-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_285_nl_test_wrong_key_json("NL/2DCode/raw/285-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_286_nl_test_wrong_key_json("NL/2DCode/raw/286-NL-test+wrong_key.json")]
#[case::nl_2dcode_raw_287_nl_test_wrong_key_json("NL/2DCode/raw/287-NL-test+wrong_key.json")]
#[case::pl_1_0_0_2dcode_raw_1_json("PL/1.0.0/2DCode/raw/1.json")]
#[case::pl_1_0_0_2dcode_raw_10_json("PL/1.0.0/2DCode/raw/10.json")]
#[case::pl_1_0_0_2dcode_raw_11_json("PL/1.0.0/2DCode/raw/11.json")]
#[case::pl_1_0_0_2dcode_raw_12_json("PL/1.0.0/2DCode/raw/12.json")]
#[case::pl_1_0_0_2dcode_raw_13_json("PL/1.0.0/2DCode/raw/13.json")]
#[case::pl_1_0_0_2dcode_raw_14_json("PL/1.0.0/2DCode/raw/14.json")]
#[case::pl_1_0_0_2dcode_raw_2_json("PL/1.0.0/2DCode/raw/2.json")]
#[case::pl_1_0_0_2dcode_raw_3_json("PL/1.0.0/2DCode/raw/3.json")]
#[case::pl_1_0_0_2dcode_raw_4_json("PL/1.0.0/2DCode/raw/4.json")]
#[case::pl_1_0_0_2dcode_raw_5_json("PL/1.0.0/2DCode/raw/5.json")]
#[case::pl_1_0_0_2dcode_raw_6_json("PL/1.0.0/2DCode/raw/6.json")]
#[case::pl_1_0_0_2dcode_raw_7_json("PL/1.0.0/2DCode/raw/7.json")]
#[case::pl_1_0_0_2dcode_raw_8_json("PL/1.0.0/2DCode/raw/8.json")]
#[case::pl_1_0_0_2dcode_raw_9_json("PL/1.0.0/2DCode/raw/9.json")]
#[case::pl_1_2_1_2dcode_raw_1_json("PL/1.2.1/2DCode/raw/1.json")]
#[case::pl_1_2_1_2dcode_raw_10_json("PL/1.2.1/2DCode/raw/10.json")]
#[case::pl_1_2_1_2dcode_raw_11_json("PL/1.2.1/2DCode/raw/11.json")]
#[case::pl_1_2_1_2dcode_raw_12_json("PL/1.2.1/2DCode/raw/12.json")]
#[case::pl_1_2_1_2dcode_raw_13_json("PL/1.2.1/2DCode/raw/13.json")]
#[case::pl_1_2_1_2dcode_raw_14_json("PL/1.2.1/2DCode/raw/14.json")]
#[case::pl_1_2_1_2dcode_raw_2_json("PL/1.2.1/2DCode/raw/2.json")]
#[case::pl_1_2_1_2dcode_raw_3_json("PL/1.2.1/2DCode/raw/3.json")]
#[case::pl_1_2_1_2dcode_raw_4_json("PL/1.2.1/2DCode/raw/4.json")]
#[case::pl_1_2_1_2dcode_raw_5_json("PL/1.2.1/2DCode/raw/5.json")]
#[case::pl_1_2_1_2dcode_raw_6_json("PL/1.2.1/2DCode/raw/6.json")]
#[case::pl_1_2_1_2dcode_raw_7_json("PL/1.2.1/2DCode/raw/7.json")]
#[case::pl_1_2_1_2dcode_raw_8_json("PL/1.2.1/2DCode/raw/8.json")]
#[case::pl_1_2_1_2dcode_raw_9_json("PL/1.2.1/2DCode/raw/9.json")]
#[case::pl_1_3_0_2dcode_raw_1_json("PL/1.3.0/2DCode/raw/1.json")]
#[case::pl_1_3_0_2dcode_raw_10_json("PL/1.3.0/2DCode/raw/10.json")]
#[case::pl_1_3_0_2dcode_raw_11_json("PL/1.3.0/2DCode/raw/11.json")]
#[case::pl_1_3_0_2dcode_raw_12_json("PL/1.3.0/2DCode/raw/12.json")]
#[case::pl_1_3_0_2dcode_raw_13_json("PL/1.3.0/2DCode/raw/13.json")]
#[case::pl_1_3_0_2dcode_raw_14_json("PL/1.3.0/2DCode/raw/14.json")]
#[case::pl_1_3_0_2dcode_raw_2_json("PL/1.3.0/2DCode/raw/2.json")]
#[case::pl_1_3_0_2dcode_raw_3_json("PL/1.3.0/2DCode/raw/3.json")]
#[case::pl_1_3_0_2dcode_raw_4_json("PL/1.3.0/2DCode/raw/4.json")]
#[case::pl_1_3_0_2dcode_raw_5_json("PL/1.3.0/2DCode/raw/5.json")]
#[case::pl_1_3_0_2dcode_raw_6_json("PL/1.3.0/2DCode/raw/6.json")]
#[case::pl_1_3_0_2dcode_raw_7_json("PL/1.3.0/2DCode/raw/7.json")]
#[case::pl_1_3_0_2dcode_raw_8_json("PL/1.3.0/2DCode/raw/8.json")]
#[case::pl_1_3_0_2dcode_raw_9_json("PL/1.3.0/2DCode/raw/9.json")]
#[case::pt_1_0_0_2dcode_raw_1_json("PT/1.0.0/2DCode/raw/1.json")]
#[case::pt_1_0_0_2dcode_raw_2_json("PT/1.0.0/2DCode/raw/2.json")]
#[case::pt_1_0_0_2dcode_raw_3_json("PT/1.0.0/2DCode/raw/3.json")]
#[case::pt_1_0_0_2dcode_raw_4_json("PT/1.0.0/2DCode/raw/4.json")]
#[case::pt_1_0_0_2dcode_raw_5_json("PT/1.0.0/2DCode/raw/5.json")]
#[case::pt_1_3_0_2dcode_raw_1_json("PT/1.3.0/2DCode/raw/1.json")]
#[case::pt_1_3_0_2dcode_raw_2_json("PT/1.3.0/2DCode/raw/2.json")]
#[case::pt_1_3_0_2dcode_raw_3_json("PT/1.3.0/2DCode/raw/3.json")]
#[ignore = "Weird difference in date field (`sc`). Expected '2021-06-30T12:34:56+00:00', found: '2021-06-30T12:34:56Z'."]
#[case::pt_1_3_0_2dcode_raw_4_json("PT/1.3.0/2DCode/raw/4.json")]
#[case::pt_1_3_0_2dcode_raw_5_json("PT/1.3.0/2DCode/raw/5.json")]
#[case::ro_2dcode_raw_1_json("RO/2DCode/raw/1.json")]
#[case::ro_2dcode_raw_2_json("RO/2DCode/raw/2.json")]
#[case::ro_2dcode_raw_3_json("RO/2DCode/raw/3.json")]
#[case::ro_2dcode_raw_4_json("RO/2DCode/raw/4.json")]
#[case::se_2dcode_raw_1_json("SE/2DCode/raw/1.json")]
#[case::se_2dcode_raw_2_json("SE/2DCode/raw/2.json")]
#[case::se_2dcode_raw_3_json("SE/2DCode/raw/3.json")]
#[case::se_2dcode_raw_4_json("SE/2DCode/raw/4.json")]
#[case::se_2dcode_raw_5_json("SE/2DCode/raw/5.json")]
#[case::sg_2dcode_raw_1_json("SG/2DCode/raw/1.json")]
#[case::sg_2dcode_raw_2_json("SG/2DCode/raw/2.json")]
#[case::sg_2dcode_raw_3_json("SG/2DCode/raw/3.json")]
#[case::si_2dcode_raw_rec_json("SI/2DCode/raw/REC.json")]
#[case::si_2dcode_raw_test_ag_json("SI/2DCode/raw/test-AG.json")]
#[case::si_2dcode_raw_test_pcr_json("SI/2DCode/raw/test-PCR.json")]
#[case::si_2dcode_raw_vac_json("SI/2DCode/raw/VAC.json")]
#[case::sk_2dcode_raw_1_json("SK/2DCode/raw/1.json")]
#[case::sk_2dcode_raw_2_json("SK/2DCode/raw/2.json")]
#[case::sk_2dcode_raw_3_json("SK/2DCode/raw/3.json")]
#[case::sk_2dcode_raw_4_json("SK/2DCode/raw/4.json")]
#[case::sk_2dcode_raw_5_json("SK/2DCode/raw/5.json")]
#[case::sk_2dcode_raw_6_json("SK/2DCode/raw/6.json")]
#[case::sk_2dcode_raw_7_json("SK/2DCode/raw/7.json")]
#[case::sk_2dcode_raw_8_json("SK/2DCode/raw/8.json")]
#[case::sm_2dcode_raw_1_json("SM/2DCode/raw/1.json")]
#[case::sm_2dcode_raw_2_json("SM/2DCode/raw/2.json")]
#[case::sm_2dcode_raw_3_json("SM/2DCode/raw/3.json")]
#[case::sm_2dcode_raw_4_json("SM/2DCode/raw/4.json")]
#[case::sm_2dcode_raw_5_json("SM/2DCode/raw/5.json")]
#[case::sm_2dcode_raw_6_json("SM/2DCode/raw/6.json")]
#[case::ua_2dcode_raw_1_json("UA/2DCode/raw/1.json")]
#[case::ua_2dcode_raw_2_json("UA/2DCode/raw/2.json")]
#[case::ua_2dcode_raw_3_json("UA/2DCode/raw/3.json")]
#[case::ua_2dcode_raw_4_json("UA/2DCode/raw/4.json")]
#[case::ua_2dcode_raw_5_json("UA/2DCode/raw/5.json")]
#[case::va_2dcode_raw_1_json("VA/2DCode/raw/1.json")]
#[case::va_2dcode_raw_2_json("VA/2DCode/raw/2.json")]
#[case::va_2dcode_raw_3_json("VA/2DCode/raw/3.json")]
fn test_case(#[case] test_file: &str) {
    let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    path.push("tests");
    path.push("data");
    path.push(test_file);

    let file_content = fs::read_to_string(path).unwrap();
    let test_data: Value = serde_json::from_str(file_content.as_str()).unwrap();

    let raw_hcert = test_data["PREFIX"].as_str().unwrap();

    let cwt = decode_cwt(raw_hcert);
    if !test_data["EXPECTEDRESULTS"]["EXPECTEDUNPREFIX"]
        .as_bool()
        .unwrap_or(true)
    {
        assert!(matches!(cwt, Err(ParseError::InvalidPrefix(_))));
        return;
    }
    if !test_data["EXPECTEDRESULTS"]["EXPECTEDB45DECODE"]
        .as_bool()
        .unwrap_or(true)
    {
        assert!(matches!(cwt, Err(ParseError::Base45Decode(_))));
        return;
    }
    if !test_data["EXPECTEDRESULTS"]["EXPECTEDDECODE"]
        .as_bool()
        .unwrap_or(true)
    {
        assert!(matches!(cwt, Err(ParseError::CwtDecode(_))));
        return;
    }
    if !test_data["EXPECTEDRESULTS"]["EXPECTEDCOMPRESSION"]
        .as_bool()
        .unwrap_or(true)
    {
        assert!(matches!(cwt, Err(ParseError::Deflate(_))));
        return;
    }
    if !test_data["EXPECTEDRESULTS"]["EXPECTEDVERIFY"]
        .as_bool()
        .unwrap_or(true)
    {
        // in some files (e.g. "common/2DCode/raw/CBO2.json") EXPECTEDVERIFY = false
        // is used to indicate malformed codes. So we need to exit early if the file is malformed
        if matches!(cwt, Err(_)) {
            return;
        }
    }
    if !test_data["EXPECTEDRESULTS"]["EXPECTEDSCHEMAVALIDATION"]
        .as_bool()
        .unwrap_or(true)
    {
        // some files (e.g. "common/2DCode/raw/DGC2.json") have a schema that can be decoded but
        // it is considered malformed because it contains multiple certificates.
        // For this reasone we expect a decode error only if there is no sample JSON data
        if test_data.get("JSON").is_none() {
            assert!(matches!(cwt, Err(ParseError::CwtDecode(_))));
            return;
        }
    }

    let cwt = cwt.unwrap();

    // compare the content only if the JSON field is populated in test data
    if test_data.get("JSON").is_some() {
        let cert_content = serde_json::ser::to_string(&test_data["JSON"]).unwrap();
        let expected_cert_payload: Dgc = serde_json::from_str(cert_content.as_str()).unwrap();
        // makes sure that the content of the decoded certificate matches the expectation
        assert_eq!(*cwt.payload.certs.get(&1).unwrap(), expected_cert_payload);
    }

    // Validates signature only if the CERTIFICATE field is populated in test data
    if test_data["TESTCTX"].get("CERTIFICATE").is_some() {
        let mut trustlist = TrustList::default();

        trustlist
            .add_key_from_certificate(test_data["TESTCTX"]["CERTIFICATE"].as_str().unwrap())
            .unwrap();

        let (_, signature_validity) = validate(raw_hcert, &trustlist).unwrap();
        let expected_verify = test_data["EXPECTEDRESULTS"]["EXPECTEDVERIFY"]
            .as_bool()
            .unwrap_or(true);
        assert_eq!(signature_validity.is_valid(), expected_verify);
    }
}