rsmp_schemer 0.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +9 -8
  3. data/lib/rsmp_schemer/schemer.rb +2 -2
  4. data/lib/rsmp_schemer/version.rb +1 -1
  5. data/schemas/core_3.1.5/.gitignore +1 -0
  6. data/schemas/core_3.1.5/schema/core/alarm.json +36 -40
  7. data/schemas/core_3.1.5/schema/core/alarm_issue.json +44 -0
  8. data/schemas/core_3.1.5/schema/core/alarm_suspend_resume.json +3 -0
  9. data/schemas/core_3.1.5/schema/core/alarm_suspended_resumed.json +44 -0
  10. data/schemas/core_3.1.5/schema/core/command_response.json +1 -1
  11. data/schemas/core_3.1.5/schema/core/status_response.json +1 -1
  12. data/schemas/core_3.1.5/schema/core/status_update.json +1 -1
  13. data/schemas/core_3.1.5/spec/core/alarm_issue_spec.rb +299 -0
  14. data/schemas/core_3.1.5/spec/core/alarm_resume_spec.rb +93 -0
  15. data/schemas/core_3.1.5/spec/core/alarm_resumed_spec.rb +277 -0
  16. data/schemas/core_3.1.5/spec/core/alarm_suspend_spec.rb +93 -0
  17. data/schemas/core_3.1.5/spec/core/alarm_suspended_spec.rb +277 -0
  18. data/schemas/core_3.1.5/spec/core/version_spec.rb +3 -2
  19. data/schemas/tlc_1.0.10/schema/tlc/statuses/S0001.json +1 -1
  20. data/schemas/tlc_1.0.10/schema/tlc/statuses/statuses.json +1 -257
  21. data/schemas/tlc_1.0.13/schema/tlc/statuses/S0001.json +1 -1
  22. data/schemas/tlc_1.0.13/schema/tlc/statuses/S0023.json +1 -1
  23. data/schemas/tlc_1.0.13/schema/tlc/statuses/statuses.json +1 -99
  24. data/schemas/tlc_1.0.13/spec/tlc/S0023_spec.rb +96 -0
  25. data/schemas/tlc_1.0.14/schema/tlc/statuses/S0001.json +1 -1
  26. data/schemas/tlc_1.0.14/schema/tlc/statuses/S0023.json +1 -1
  27. data/schemas/tlc_1.0.14/schema/tlc/statuses/statuses.json +0 -34
  28. data/schemas/tlc_1.0.14/spec/tlc/S0023_spec.rb +96 -0
  29. data/schemas/tlc_1.0.15/schema/tlc/statuses/S0001.json +1 -1
  30. data/schemas/tlc_1.0.15/schema/tlc/statuses/S0023.json +1 -1
  31. data/schemas/tlc_1.0.15/spec/tlc/S0023_spec.rb +96 -0
  32. data/schemas/tlc_1.0.7/schema/tlc/statuses/S0001.json +1 -1
  33. data/schemas/tlc_1.0.7/schema/tlc/statuses/statuses.json +1 -77
  34. data/schemas/tlc_1.0.8/schema/tlc/statuses/S0001.json +1 -1
  35. data/schemas/tlc_1.0.8/schema/tlc/statuses/statuses.json +1 -77
  36. data/schemas/tlc_1.0.9/schema/tlc/statuses/S0001.json +1 -1
  37. data/schemas/tlc_1.0.9/schema/tlc/statuses/statuses.json +1 -77
  38. metadata +15 -6
  39. data/schemas/core_3.1.5/examples/validate.rb +0 -35
  40. data/schemas/core_3.1.5/spec/core/alarm_request_spec.rb +0 -72
  41. data/schemas/core_3.1.5/spec/core/alarm_spec.rb +0 -298
@@ -28,30 +28,14 @@
28
28
  "S0019",
29
29
  "S0020",
30
30
  "S0021",
31
- "S0022",
32
- "S0023",
33
- "S0024",
34
- "S0025",
35
- "S0026",
36
- "S0027",
37
- "S0028",
38
- "S0029",
39
- "S0030",
40
- "S0031",
41
31
  "S0091",
42
32
  "S0092",
43
33
  "S0095",
44
34
  "S0096",
45
- "S0097",
46
- "S0098",
47
35
  "S0201",
48
36
  "S0202",
49
37
  "S0203",
50
- "S0204",
51
- "S0205",
52
- "S0206",
53
- "S0207",
54
- "S0208"
38
+ "S0204"
55
39
  ]
56
40
  }
57
41
  }
@@ -371,156 +355,6 @@
371
355
  "$ref" : "S0021.json"
372
356
  }
373
357
  },
374
- {
375
- "if" : {
376
- "required" : [
377
- "sCI"
378
- ],
379
- "properties" : {
380
- "sCI" : {
381
- "const" : "S0022"
382
- }
383
- }
384
- },
385
- "then" : {
386
- "$ref" : "S0022.json"
387
- }
388
- },
389
- {
390
- "if" : {
391
- "required" : [
392
- "sCI"
393
- ],
394
- "properties" : {
395
- "sCI" : {
396
- "const" : "S0023"
397
- }
398
- }
399
- },
400
- "then" : {
401
- "$ref" : "S0023.json"
402
- }
403
- },
404
- {
405
- "if" : {
406
- "required" : [
407
- "sCI"
408
- ],
409
- "properties" : {
410
- "sCI" : {
411
- "const" : "S0024"
412
- }
413
- }
414
- },
415
- "then" : {
416
- "$ref" : "S0024.json"
417
- }
418
- },
419
- {
420
- "if" : {
421
- "required" : [
422
- "sCI"
423
- ],
424
- "properties" : {
425
- "sCI" : {
426
- "const" : "S0025"
427
- }
428
- }
429
- },
430
- "then" : {
431
- "$ref" : "S0025.json"
432
- }
433
- },
434
- {
435
- "if" : {
436
- "required" : [
437
- "sCI"
438
- ],
439
- "properties" : {
440
- "sCI" : {
441
- "const" : "S0026"
442
- }
443
- }
444
- },
445
- "then" : {
446
- "$ref" : "S0026.json"
447
- }
448
- },
449
- {
450
- "if" : {
451
- "required" : [
452
- "sCI"
453
- ],
454
- "properties" : {
455
- "sCI" : {
456
- "const" : "S0027"
457
- }
458
- }
459
- },
460
- "then" : {
461
- "$ref" : "S0027.json"
462
- }
463
- },
464
- {
465
- "if" : {
466
- "required" : [
467
- "sCI"
468
- ],
469
- "properties" : {
470
- "sCI" : {
471
- "const" : "S0028"
472
- }
473
- }
474
- },
475
- "then" : {
476
- "$ref" : "S0028.json"
477
- }
478
- },
479
- {
480
- "if" : {
481
- "required" : [
482
- "sCI"
483
- ],
484
- "properties" : {
485
- "sCI" : {
486
- "const" : "S0029"
487
- }
488
- }
489
- },
490
- "then" : {
491
- "$ref" : "S0029.json"
492
- }
493
- },
494
- {
495
- "if" : {
496
- "required" : [
497
- "sCI"
498
- ],
499
- "properties" : {
500
- "sCI" : {
501
- "const" : "S0030"
502
- }
503
- }
504
- },
505
- "then" : {
506
- "$ref" : "S0030.json"
507
- }
508
- },
509
- {
510
- "if" : {
511
- "required" : [
512
- "sCI"
513
- ],
514
- "properties" : {
515
- "sCI" : {
516
- "const" : "S0031"
517
- }
518
- }
519
- },
520
- "then" : {
521
- "$ref" : "S0031.json"
522
- }
523
- },
524
358
  {
525
359
  "if" : {
526
360
  "required" : [
@@ -581,36 +415,6 @@
581
415
  "$ref" : "S0096.json"
582
416
  }
583
417
  },
584
- {
585
- "if" : {
586
- "required" : [
587
- "sCI"
588
- ],
589
- "properties" : {
590
- "sCI" : {
591
- "const" : "S0097"
592
- }
593
- }
594
- },
595
- "then" : {
596
- "$ref" : "S0097.json"
597
- }
598
- },
599
- {
600
- "if" : {
601
- "required" : [
602
- "sCI"
603
- ],
604
- "properties" : {
605
- "sCI" : {
606
- "const" : "S0098"
607
- }
608
- }
609
- },
610
- "then" : {
611
- "$ref" : "S0098.json"
612
- }
613
- },
614
418
  {
615
419
  "if" : {
616
420
  "required" : [
@@ -670,66 +474,6 @@
670
474
  "then" : {
671
475
  "$ref" : "S0204.json"
672
476
  }
673
- },
674
- {
675
- "if" : {
676
- "required" : [
677
- "sCI"
678
- ],
679
- "properties" : {
680
- "sCI" : {
681
- "const" : "S0205"
682
- }
683
- }
684
- },
685
- "then" : {
686
- "$ref" : "S0205.json"
687
- }
688
- },
689
- {
690
- "if" : {
691
- "required" : [
692
- "sCI"
693
- ],
694
- "properties" : {
695
- "sCI" : {
696
- "const" : "S0206"
697
- }
698
- }
699
- },
700
- "then" : {
701
- "$ref" : "S0206.json"
702
- }
703
- },
704
- {
705
- "if" : {
706
- "required" : [
707
- "sCI"
708
- ],
709
- "properties" : {
710
- "sCI" : {
711
- "const" : "S0207"
712
- }
713
- }
714
- },
715
- "then" : {
716
- "$ref" : "S0207.json"
717
- }
718
- },
719
- {
720
- "if" : {
721
- "required" : [
722
- "sCI"
723
- ],
724
- "properties" : {
725
- "sCI" : {
726
- "const" : "S0208"
727
- }
728
- }
729
- },
730
- "then" : {
731
- "$ref" : "S0208.json"
732
- }
733
477
  }
734
478
  ]
735
479
  }
@@ -29,7 +29,7 @@
29
29
  "s" : {
30
30
  "description" : "Signal group status as text field",
31
31
  "type" : "string",
32
- "pattern" : "^[a-hA-G0-9N-P]+$"
32
+ "pattern" : "^[a-hA-G0-9N-P]*$"
33
33
  }
34
34
  }
35
35
  }
@@ -26,7 +26,7 @@
26
26
  "s" : {
27
27
  "description" : "Dynamic bands.\nEach dynamic band are written as pp-dd-ee where:\npp=Time plan\ndd=Dynamic band number (from 1-10)\nee=Extension in seconds in this band\n\nEach dynamic band is separated with a comma.\n\nE.g.\npp-dd-ee,pp-dd-ee",
28
28
  "type" : "string",
29
- "pattern" : "^(\\d{1,2}\\-\\d{1,2}-\\d{1,2})(?:,(\\d{1,2}\\-\\d{1,2}-\\d{1,2}))*$"
29
+ "pattern" : "(^$)|(^(?<item>(\\d{1,2})\\-\\d{1,2}-\\d{1,2})(,\\g<item>)*$)"
30
30
  }
31
31
  }
32
32
  }
@@ -36,22 +36,14 @@
36
36
  "S0027",
37
37
  "S0028",
38
38
  "S0029",
39
- "S0030",
40
- "S0031",
41
39
  "S0091",
42
40
  "S0092",
43
41
  "S0095",
44
42
  "S0096",
45
- "S0097",
46
- "S0098",
47
43
  "S0201",
48
44
  "S0202",
49
45
  "S0203",
50
- "S0204",
51
- "S0205",
52
- "S0206",
53
- "S0207",
54
- "S0208"
46
+ "S0204"
55
47
  ]
56
48
  }
57
49
  }
@@ -491,36 +483,6 @@
491
483
  "$ref" : "S0029.json"
492
484
  }
493
485
  },
494
- {
495
- "if" : {
496
- "required" : [
497
- "sCI"
498
- ],
499
- "properties" : {
500
- "sCI" : {
501
- "const" : "S0030"
502
- }
503
- }
504
- },
505
- "then" : {
506
- "$ref" : "S0030.json"
507
- }
508
- },
509
- {
510
- "if" : {
511
- "required" : [
512
- "sCI"
513
- ],
514
- "properties" : {
515
- "sCI" : {
516
- "const" : "S0031"
517
- }
518
- }
519
- },
520
- "then" : {
521
- "$ref" : "S0031.json"
522
- }
523
- },
524
486
  {
525
487
  "if" : {
526
488
  "required" : [
@@ -670,66 +632,6 @@
670
632
  "then" : {
671
633
  "$ref" : "S0204.json"
672
634
  }
673
- },
674
- {
675
- "if" : {
676
- "required" : [
677
- "sCI"
678
- ],
679
- "properties" : {
680
- "sCI" : {
681
- "const" : "S0205"
682
- }
683
- }
684
- },
685
- "then" : {
686
- "$ref" : "S0205.json"
687
- }
688
- },
689
- {
690
- "if" : {
691
- "required" : [
692
- "sCI"
693
- ],
694
- "properties" : {
695
- "sCI" : {
696
- "const" : "S0206"
697
- }
698
- }
699
- },
700
- "then" : {
701
- "$ref" : "S0206.json"
702
- }
703
- },
704
- {
705
- "if" : {
706
- "required" : [
707
- "sCI"
708
- ],
709
- "properties" : {
710
- "sCI" : {
711
- "const" : "S0207"
712
- }
713
- }
714
- },
715
- "then" : {
716
- "$ref" : "S0207.json"
717
- }
718
- },
719
- {
720
- "if" : {
721
- "required" : [
722
- "sCI"
723
- ],
724
- "properties" : {
725
- "sCI" : {
726
- "const" : "S0208"
727
- }
728
- }
729
- },
730
- "then" : {
731
- "$ref" : "S0208.json"
732
- }
733
635
  }
734
636
  ]
735
637
  }
@@ -0,0 +1,96 @@
1
+ RSpec.describe "Traffic Light Controller RSMP SXL Schema validation" do
2
+ let(:message) {{
3
+ "mType" => "rSMsg",
4
+ "mId" => "4173c2c8-a933-43cb-9425-66d4613731ed",
5
+ "type" => "StatusResponse",
6
+ "cId" => "O+14439=481WA001",
7
+ "sTs" => "2015-06-08T09:15:18.266Z",
8
+ "sS" => [
9
+ { "sCI" => "S0023", "n" => "status", "s" => "", "q" => "recent" }
10
+ ]
11
+ }}
12
+
13
+ it 'accepts empty list' do
14
+ message["sS"][0]['s'] = ''
15
+ expect( validate(message) ).to be_nil
16
+ end
17
+ it 'accepts one digit' do
18
+ message["sS"][0]['s'] = '1-1-0'
19
+ expect( validate(message) ).to be_nil
20
+ end
21
+
22
+ it 'accepts two digits' do
23
+ message["sS"][0]['s'] = '01-01-20'
24
+ expect( validate(message) ).to be_nil
25
+ end
26
+
27
+ it 'rejects three digits or more' do
28
+ message["sS"][0]['s'] = '01-01-100'
29
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
30
+
31
+ message["sS"][0]['s'] = '100-01-01'
32
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
33
+ end
34
+
35
+ it 'accepts comma-separated items' do
36
+ message["sS"][0]['s'] = '1-1-0,1-2-0'
37
+ expect( validate(message) ).to be_nil
38
+
39
+ message["sS"][0]['s'] = '1-1-0,1-2-0,2-4-5'
40
+ expect( validate(message) ).to be_nil
41
+ end
42
+
43
+ it 'rejects comma-separated lists with spaces' do
44
+ message["sS"][0]['s'] = '1-1-0, 1-2-0'
45
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
46
+
47
+ message["sS"][0]['s'] = '1-1-0 ,1-2-0'
48
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
49
+ end
50
+
51
+ it 'rejects comma-separated lists with trailing comma' do
52
+ message["sS"][0]['s'] = '1-1-0,'
53
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
54
+ end
55
+
56
+ it 'rejects comma-separated lists with leading comma' do
57
+ message["sS"][0]['s'] = ',1-1-0'
58
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
59
+ end
60
+
61
+ it 'rejects comma-separated lists with empty items' do
62
+ message["sS"][0]['s'] = '1-1-0,,1-2-0'
63
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
64
+ end
65
+
66
+ it 'rejects negatives' do
67
+ message["sS"][0]['s'] = '-1-2-3'
68
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
69
+
70
+ message["sS"][0]['s'] = '1--2-3'
71
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
72
+
73
+ message["sS"][0]['s'] = '1-2--3'
74
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
75
+ end
76
+
77
+ it 'rejects floats' do
78
+ message["sS"][0]['s'] = '.1-2-3'
79
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
80
+
81
+ message["sS"][0]['s'] = '1-.2-3'
82
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
83
+
84
+ message["sS"][0]['s'] = '1-2-.3'
85
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
86
+
87
+ message["sS"][0]['s'] = '1.-2-3'
88
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
89
+
90
+ message["sS"][0]['s'] = '1-2.-3'
91
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
92
+
93
+ message["sS"][0]['s'] = '1-2-3.'
94
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
95
+ end
96
+ end
@@ -29,7 +29,7 @@
29
29
  "s" : {
30
30
  "description" : "Signal group status as text field",
31
31
  "type" : "string",
32
- "pattern" : "^[a-hA-G0-9N-P]+$"
32
+ "pattern" : "^[a-hA-G0-9N-P]*$"
33
33
  }
34
34
  }
35
35
  }
@@ -26,7 +26,7 @@
26
26
  "s" : {
27
27
  "description" : "Dynamic bands.\nEach dynamic band are written as pp-dd-ee where:\npp=Time plan\ndd=Dynamic band number (from 1-10)\nee=Extension in seconds in this band\n\nEach dynamic band is separated with a comma.\n\nE.g.\npp-dd-ee,pp-dd-ee",
28
28
  "type" : "string",
29
- "pattern" : "^(\\d{1,2}\\-\\d{1,2}-\\d{1,2})(?:,(\\d{1,2}\\-\\d{1,2}-\\d{1,2}))*$"
29
+ "pattern" : "(^$)|(^(?<item>(\\d{1,2})\\-\\d{1,2}-\\d{1,2})(,\\g<item>)*$)"
30
30
  }
31
31
  }
32
32
  }
@@ -36,14 +36,10 @@
36
36
  "S0027",
37
37
  "S0028",
38
38
  "S0029",
39
- "S0030",
40
- "S0031",
41
39
  "S0091",
42
40
  "S0092",
43
41
  "S0095",
44
42
  "S0096",
45
- "S0097",
46
- "S0098",
47
43
  "S0201",
48
44
  "S0202",
49
45
  "S0203",
@@ -491,36 +487,6 @@
491
487
  "$ref" : "S0029.json"
492
488
  }
493
489
  },
494
- {
495
- "if" : {
496
- "required" : [
497
- "sCI"
498
- ],
499
- "properties" : {
500
- "sCI" : {
501
- "const" : "S0030"
502
- }
503
- }
504
- },
505
- "then" : {
506
- "$ref" : "S0030.json"
507
- }
508
- },
509
- {
510
- "if" : {
511
- "required" : [
512
- "sCI"
513
- ],
514
- "properties" : {
515
- "sCI" : {
516
- "const" : "S0031"
517
- }
518
- }
519
- },
520
- "then" : {
521
- "$ref" : "S0031.json"
522
- }
523
- },
524
490
  {
525
491
  "if" : {
526
492
  "required" : [
@@ -0,0 +1,96 @@
1
+ RSpec.describe "Traffic Light Controller RSMP SXL Schema validation" do
2
+ let(:message) {{
3
+ "mType" => "rSMsg",
4
+ "mId" => "4173c2c8-a933-43cb-9425-66d4613731ed",
5
+ "type" => "StatusResponse",
6
+ "cId" => "O+14439=481WA001",
7
+ "sTs" => "2015-06-08T09:15:18.266Z",
8
+ "sS" => [
9
+ { "sCI" => "S0023", "n" => "status", "s" => "", "q" => "recent" }
10
+ ]
11
+ }}
12
+
13
+ it 'accepts empty list' do
14
+ message["sS"][0]['s'] = ''
15
+ expect( validate(message) ).to be_nil
16
+ end
17
+ it 'accepts one digit' do
18
+ message["sS"][0]['s'] = '1-1-0'
19
+ expect( validate(message) ).to be_nil
20
+ end
21
+
22
+ it 'accepts two digits' do
23
+ message["sS"][0]['s'] = '01-01-20'
24
+ expect( validate(message) ).to be_nil
25
+ end
26
+
27
+ it 'rejects three digits or more' do
28
+ message["sS"][0]['s'] = '01-01-100'
29
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
30
+
31
+ message["sS"][0]['s'] = '100-01-01'
32
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
33
+ end
34
+
35
+ it 'accepts comma-separated items' do
36
+ message["sS"][0]['s'] = '1-1-0,1-2-0'
37
+ expect( validate(message) ).to be_nil
38
+
39
+ message["sS"][0]['s'] = '1-1-0,1-2-0,2-4-5'
40
+ expect( validate(message) ).to be_nil
41
+ end
42
+
43
+ it 'rejects comma-separated lists with spaces' do
44
+ message["sS"][0]['s'] = '1-1-0, 1-2-0'
45
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
46
+
47
+ message["sS"][0]['s'] = '1-1-0 ,1-2-0'
48
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
49
+ end
50
+
51
+ it 'rejects comma-separated lists with trailing comma' do
52
+ message["sS"][0]['s'] = '1-1-0,'
53
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
54
+ end
55
+
56
+ it 'rejects comma-separated lists with leading comma' do
57
+ message["sS"][0]['s'] = ',1-1-0'
58
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
59
+ end
60
+
61
+ it 'rejects comma-separated lists with empty items' do
62
+ message["sS"][0]['s'] = '1-1-0,,1-2-0'
63
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
64
+ end
65
+
66
+ it 'rejects negatives' do
67
+ message["sS"][0]['s'] = '-1-2-3'
68
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
69
+
70
+ message["sS"][0]['s'] = '1--2-3'
71
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
72
+
73
+ message["sS"][0]['s'] = '1-2--3'
74
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
75
+ end
76
+
77
+ it 'rejects floats' do
78
+ message["sS"][0]['s'] = '.1-2-3'
79
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
80
+
81
+ message["sS"][0]['s'] = '1-.2-3'
82
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
83
+
84
+ message["sS"][0]['s'] = '1-2-.3'
85
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
86
+
87
+ message["sS"][0]['s'] = '1.-2-3'
88
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
89
+
90
+ message["sS"][0]['s'] = '1-2.-3'
91
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
92
+
93
+ message["sS"][0]['s'] = '1-2-3.'
94
+ expect( validate(message) ).to eq([["/sS/0/s", "pattern"]])
95
+ end
96
+ end