rsmp_schemer 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +10 -9
  3. data/lib/rsmp_schemer/version.rb +1 -1
  4. data/rsmp_schemer.gemspec +1 -1
  5. data/schemas/core_3.1.2/schema/core/alarm.json +8 -4
  6. data/schemas/core_3.1.2/spec/core/alarm_spec.rb +15 -0
  7. data/schemas/core_3.1.4/.gitignore +1 -0
  8. data/schemas/core_3.1.4/schema/core/alarm.json +8 -4
  9. data/schemas/core_3.1.4/spec/core/alarm_spec.rb +15 -0
  10. data/schemas/core_3.1.4/spec/core/version_spec.rb +3 -2
  11. data/schemas/core_3.1.5/.gitignore +1 -0
  12. data/schemas/core_3.1.5/schema/core/alarm.json +40 -41
  13. data/schemas/core_3.1.5/schema/core/alarm_issue.json +44 -0
  14. data/schemas/core_3.1.5/schema/core/alarm_suspend_resume.json +3 -0
  15. data/schemas/core_3.1.5/schema/core/alarm_suspended_resumed.json +47 -0
  16. data/schemas/core_3.1.5/schema/core/command_response.json +1 -1
  17. data/schemas/core_3.1.5/schema/core/status_response.json +1 -1
  18. data/schemas/core_3.1.5/schema/core/status_update.json +1 -1
  19. data/schemas/core_3.1.5/spec/core/alarm_issue_spec.rb +299 -0
  20. data/schemas/core_3.1.5/spec/core/alarm_resume_spec.rb +93 -0
  21. data/schemas/core_3.1.5/spec/core/alarm_resumed_spec.rb +277 -0
  22. data/schemas/core_3.1.5/spec/core/alarm_suspend_spec.rb +93 -0
  23. data/schemas/core_3.1.5/spec/core/alarm_suspended_spec.rb +277 -0
  24. data/schemas/core_3.1.5/spec/core/version_spec.rb +3 -2
  25. data/schemas/tlc_1.0.13/schema/tlc/statuses/S0023.json +1 -1
  26. data/schemas/tlc_1.0.13/spec/tlc/S0023_spec.rb +96 -0
  27. data/schemas/tlc_1.0.14/schema/tlc/statuses/S0023.json +1 -1
  28. data/schemas/tlc_1.0.14/spec/tlc/S0023_spec.rb +96 -0
  29. data/schemas/tlc_1.0.15/schema/tlc/statuses/S0023.json +1 -1
  30. data/schemas/tlc_1.0.15/spec/tlc/S0023_spec.rb +96 -0
  31. metadata +18 -11
  32. data/schemas/core_3.1.2/examples/validate.rb +0 -35
  33. data/schemas/core_3.1.4/examples/validate.rb +0 -35
  34. data/schemas/core_3.1.4/spec/core/alarm_request_spec.rb +0 -72
  35. data/schemas/core_3.1.5/examples/validate.rb +0 -35
  36. data/schemas/core_3.1.5/spec/core/alarm_request_spec.rb +0 -72
  37. data/schemas/core_3.1.5/spec/core/alarm_spec.rb +0 -298
@@ -0,0 +1,93 @@
1
+ RSpec.describe "Traffic Light Controller RSMP SXL Schema validation" do
2
+ describe 'Alarm Suspend' do
3
+ let(:message) {{
4
+ "mType" => "rSMsg",
5
+ "type" => "Alarm",
6
+ "mId" => "2a744145-403a-423f-ba80-f38e283a778e",
7
+ "ntsOId" => "",
8
+ "xNId" => "",
9
+ "cId" => "AB+84001=860VA001",
10
+ "aCId" => "A0004",
11
+ "xACId" => "",
12
+ "xNACId" => "",
13
+ "aSp" => "Suspend"
14
+ }}
15
+
16
+ it 'accepts valid alarm suspend' do
17
+ expect( validate(message) ).to be_nil
18
+ end
19
+
20
+ it 'catches missing component id' do
21
+ invalid = message.dup
22
+ invalid.delete 'cId'
23
+ expect( validate(invalid) ).to eq([
24
+ ["", "required", {"missing_keys"=>["cId"]}]
25
+ ])
26
+ end
27
+
28
+ it 'catches missing alarm code id' do
29
+ invalid = message.dup
30
+ invalid.delete 'aCId'
31
+ expect( validate(invalid) ).to eq([
32
+ ["", "required", {"missing_keys"=>["aCId"]}]
33
+ ])
34
+ end
35
+
36
+ it 'catches bad alarm code id' do
37
+ invalid = message.dup
38
+ invalid['aCId'] = "001"
39
+ expect( validate(invalid) ).to eq([
40
+ ["/aCId", "pattern"]
41
+ ])
42
+ end
43
+
44
+ it 'catches wrong alarm code id type' do
45
+ invalid = message.dup
46
+ invalid['aCId'] = 123
47
+ expect( validate(invalid) ).to eq([
48
+ ["/aCId", "string"]
49
+ ])
50
+ end
51
+
52
+ it 'catches missing extended alarm code id' do
53
+ invalid = message.dup
54
+ invalid.delete 'xACId'
55
+ expect( validate(invalid) ).to eq([
56
+ ["", "required", {"missing_keys"=>["xACId"]}]
57
+ ])
58
+ end
59
+
60
+ it 'catches wrong extended alarm code id type' do
61
+ invalid = message.dup
62
+ invalid['xACId'] = 123
63
+ expect( validate(invalid) ).to eq([
64
+ ["/xACId", "string"]
65
+ ])
66
+ end
67
+
68
+ it 'catches missing specialization' do
69
+ invalid = message.dup
70
+ invalid.delete 'aSp'
71
+ expect( validate(invalid) ).to eq([
72
+ ["", "required", {"missing_keys"=>["aSp"]}]
73
+ ])
74
+ end
75
+
76
+ it 'catches bad specialization' do
77
+ invalid = message.dup
78
+ invalid['aSp'] = "Bad"
79
+ expect( validate(invalid) ).to eq([
80
+ ["/aSp", "enum"]
81
+ ])
82
+ end
83
+
84
+ it 'catches wrong specialization type' do
85
+ invalid = message.dup
86
+ invalid['aSp'] = 123
87
+ expect( validate(invalid) ).to eq([
88
+ ["/aSp", "enum"],
89
+ ["/aSp", "string"]
90
+ ])
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,277 @@
1
+ RSpec.describe "Traffic Light Controller RSMP SXL Schema validation" do
2
+ describe 'Alarm Issue' do
3
+ let(:message) {{
4
+ "mType" => "rSMsg",
5
+ "type" => "Alarm",
6
+ "mId" => "2ea7edfc-8e3a-4765-85e7-db844c4702a0",
7
+ "ntsOId" => "",
8
+ "xNId" => "",
9
+ "cId" => "AB+84001=860VA001",
10
+ "aCId" => "A0004",
11
+ "xACId" => "",
12
+ "xNACId" => "",
13
+ "aSp" => "Suspend",
14
+ "ack" => "Acknowledged",
15
+ "aS" => "Active",
16
+ "sS" => "suspended",
17
+ "aTs" => "2015-05-29T08:56:25.390Z",
18
+ "cat" => "D",
19
+ "pri" => "3",
20
+ "rvs" => [
21
+ {
22
+ "n" => "Temp",
23
+ "v" => "-18.5"
24
+ }
25
+ ]
26
+ }}
27
+
28
+ it 'accepts valid alarm suspended' do
29
+ expect( validate(message) ).to be_nil
30
+ end
31
+
32
+ it 'catches missing component id' do
33
+ invalid = message.dup
34
+ invalid.delete 'cId'
35
+ expect( validate(invalid) ).to eq([
36
+ ["", "required", {"missing_keys"=>["cId"]}]
37
+ ])
38
+ end
39
+
40
+ it 'catches missing alarm code id' do
41
+ invalid = message.dup
42
+ invalid.delete 'aCId'
43
+ expect( validate(invalid) ).to eq([
44
+ ["", "required", {"missing_keys"=>["aCId"]}]
45
+ ])
46
+ end
47
+
48
+ it 'catches bad alarm code id' do
49
+ invalid = message.dup
50
+ invalid['aCId'] = "001"
51
+ expect( validate(invalid) ).to eq([
52
+ ["/aCId", "pattern"]
53
+ ])
54
+ end
55
+
56
+ it 'catches wrong alarm code id type' do
57
+ invalid = message.dup
58
+ invalid['aCId'] = 123
59
+ expect( validate(invalid) ).to eq([
60
+ ["/aCId", "string"]
61
+ ])
62
+ end
63
+
64
+ it 'catches missing extended alarm code id' do
65
+ invalid = message.dup
66
+ invalid.delete 'xACId'
67
+ expect( validate(invalid) ).to eq([
68
+ ["", "required", {"missing_keys"=>["xACId"]}]
69
+ ])
70
+ end
71
+
72
+ it 'catches wrong extended alarm code id type' do
73
+ invalid = message.dup
74
+ invalid['xACId'] = 123
75
+ expect( validate(invalid) ).to eq([
76
+ ["/xACId", "string"]
77
+ ])
78
+ end
79
+
80
+ it 'catches missing specialization' do
81
+ invalid = message.dup
82
+ invalid.delete 'aSp'
83
+ expect( validate(invalid) ).to eq([
84
+ ["", "required", {"missing_keys"=>["aSp"]}]
85
+ ])
86
+ end
87
+
88
+ it 'catches bad specialization' do
89
+ invalid = message.dup
90
+ invalid['aSp'] = "Bad"
91
+ expect( validate(invalid) ).to eq([
92
+ ["/aSp", "enum"]
93
+ ])
94
+ end
95
+
96
+ it 'catches wrong specialization type' do
97
+ invalid = message.dup
98
+ invalid['aSp'] = 123
99
+ expect( validate(invalid) ).to eq([
100
+ ["/aSp", "enum"],
101
+ ["/aSp", "string"]
102
+ ])
103
+ end
104
+
105
+ it 'catches missing alarm active status' do
106
+ invalid = message.dup
107
+ invalid.delete 'aS'
108
+ expect( validate(invalid) ).to eq([
109
+ ["", "required", {"missing_keys"=>["aS"]}]
110
+ ])
111
+ end
112
+
113
+ it 'catches bad alarm active status' do
114
+ invalid = message.dup
115
+ invalid['aS'] = "Bad"
116
+ expect( validate(invalid) ).to eq([
117
+ ["/aS", "enum"]
118
+ ])
119
+ end
120
+
121
+ it 'catches wrong alarm active status' do
122
+ invalid = message.dup
123
+ invalid['aS'] = 123
124
+ expect( validate(invalid) ).to eq([
125
+ ["/aS", "enum"],
126
+ ["/aS", "string"]
127
+ ])
128
+ end
129
+
130
+ it 'catches missing alarm acknowledged status' do
131
+ invalid = message.dup
132
+ invalid.delete 'ack'
133
+ expect( validate(invalid) ).to eq([
134
+ ["", "required", {"missing_keys"=>["ack"]}]
135
+ ])
136
+ end
137
+
138
+ it 'catches bad alarm acknowledged status' do
139
+ invalid = message.dup
140
+ invalid['ack'] = "Bad"
141
+ expect( validate(invalid) ).to eq([
142
+ ["/ack", "enum"]
143
+ ])
144
+ end
145
+
146
+ it 'catches wrong alarm acknowledged status type' do
147
+ invalid = message.dup
148
+ invalid['ack'] = 123
149
+ expect( validate(invalid) ).to eq([
150
+ ["/ack", "enum"],
151
+ ["/ack", "string"]
152
+ ])
153
+ end
154
+
155
+ it 'catches missing category' do
156
+ invalid = message.dup
157
+ invalid.delete 'cat'
158
+ expect( validate(invalid) ).to eq([
159
+ ["", "required", {"missing_keys"=>["cat"]}]
160
+ ])
161
+ end
162
+
163
+ it 'catches bad category' do
164
+ invalid = message.dup
165
+ invalid['cat'] = "A"
166
+ expect( validate(invalid) ).to eq([
167
+ ["/cat", "enum"]
168
+ ])
169
+ end
170
+
171
+ it 'catches wrong category' do
172
+ invalid = message.dup
173
+ invalid['cat'] = 123
174
+ expect( validate(invalid) ).to eq([
175
+ ["/cat", "enum"],
176
+ ["/cat", "string"]
177
+ ])
178
+ end
179
+
180
+ it 'catches missing priority' do
181
+ invalid = message.dup
182
+ invalid.delete 'pri'
183
+ expect( validate(invalid) ).to eq([
184
+ ["", "required", {"missing_keys"=>["pri"]}]
185
+ ])
186
+ end
187
+
188
+ it 'catches bad priority' do
189
+ invalid = message.dup
190
+ invalid['pri'] = "4"
191
+ expect( validate(invalid) ).to eq([
192
+ ["/pri", "enum"]
193
+ ])
194
+ end
195
+
196
+ it 'catches wrong priority' do
197
+ invalid = message.dup
198
+ invalid['pri'] = 1
199
+ expect( validate(invalid) ).to eq([
200
+ ["/pri", "enum"],
201
+ ["/pri", "string"]
202
+ ])
203
+ end
204
+
205
+ it 'catches missing timestamp' do
206
+ invalid = message.dup
207
+ invalid.delete 'aTs'
208
+ expect( validate(invalid) ).to eq([
209
+ ["", "required", {"missing_keys"=>["aTs"]}]
210
+ ])
211
+ end
212
+
213
+ it 'catches bad timestamp' do
214
+ invalid = message.dup
215
+ invalid['aTs'] = "yesterday"
216
+ expect( validate(invalid) ).to eq([
217
+ ["/aTs", "pattern"]
218
+ ])
219
+ end
220
+
221
+ it 'catches wrong timestamp type' do
222
+ invalid = message.dup
223
+ invalid['aTs'] = 123
224
+ expect( validate(invalid) ).to eq([
225
+ ["/aTs", "string"]
226
+ ])
227
+ end
228
+
229
+ it 'catches missing rvs' do
230
+ invalid = message.dup
231
+ invalid.delete 'rvs'
232
+ expect( validate(invalid) ).to eq([
233
+ ["", "required", {"missing_keys"=>["rvs"]}]
234
+ ])
235
+ end
236
+
237
+ it 'catches bad rvs type' do
238
+ invalid = message.dup
239
+ invalid["rvs"] = {}
240
+ expect( validate(invalid) ).to eq([
241
+ ["/rvs", "array"]
242
+ ])
243
+ end
244
+
245
+ it 'catches missing alarm name' do
246
+ invalid = message.dup
247
+ invalid["rvs"].first.delete 'n'
248
+ expect( validate(invalid) ).to eq([
249
+ ["/rvs/0", "required", {"missing_keys"=>["n"]}]
250
+ ])
251
+ end
252
+
253
+ it 'catches bad alarm name' do
254
+ invalid = message.dup
255
+ invalid["rvs"].first['n'] = 3
256
+ expect( validate(invalid) ).to eq([
257
+ ["/rvs/0/n", "string"]
258
+ ])
259
+ end
260
+
261
+ it 'catches missing alarm value' do
262
+ invalid = message.dup
263
+ invalid["rvs"].first.delete 'v'
264
+ expect( validate(invalid) ).to eq([
265
+ ["/rvs/0", "required", {"missing_keys"=>["v"]}]
266
+ ])
267
+ end
268
+
269
+ it 'catches bad alarm value' do
270
+ invalid = message.dup
271
+ invalid["rvs"].first['v'] = 3
272
+ expect( validate(invalid) ).to eq([
273
+ ["/rvs/0/v", "string"]
274
+ ])
275
+ end
276
+ end
277
+ end
@@ -10,9 +10,10 @@ RSpec.describe "Traffic Light Controller RSMP SXL Schema validation" do
10
10
  { "vers" => "3.1.1" },
11
11
  { "vers" => "3.1.2" },
12
12
  { "vers" => "3.1.3" },
13
- { "vers" => "3.1.4" }
13
+ { "vers" => "3.1.4" },
14
+ { "vers" => "3.1.5" }
14
15
  ],
15
- "SXL" => "1.1"
16
+ "SXL" => "1.0.15"
16
17
  }}
17
18
 
18
19
  it 'accepts valid message' do
@@ -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
  }
@@ -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
@@ -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
  }
@@ -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
@@ -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
  }