1 /******************************************************************************
2 * Copyright (c) 2000-2015 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 ******************************************************************************/
9 // This module tests the 'negative testing' feature of the JSON encoder.
12 /****************** Types ******************/
13 type record of integer IntList;
15 type record of IntList IntListList;
19 charstring str optional
40 variant "JSON: as value";
45 /************ Encoding functions ************/
46 external function f_enc_il(in IntList x) return octetstring
47 with { extension "prototype(convert) encode(JSON)" }
49 external function f_enc_ill(in IntListList x) return octetstring
50 with { extension "prototype(convert) encode(JSON)" }
52 external function f_enc_r(in Rec x) return octetstring
53 with { extension "prototype(convert) encode(JSON)" }
55 external function f_enc_s(in Set x) return octetstring
56 with { extension "prototype(convert) encode(JSON)" }
58 external function f_enc_u(in Uni x) return octetstring
59 with { extension "prototype(convert) encode(JSON)" }
61 external function f_enc_u2(in Uni2 x) return octetstring
62 with { extension "prototype(convert) encode(JSON)" }
64 /************* Erroneous values *************/
65 const IntList il1 := { 0, 1, 2, 3 } with { erroneous([2]) "before := omit all" };
66 const IntList il2 := { 0, 1, 2, 3 } with { erroneous([2]) "after := omit all" };
67 const IntList il3 := { 4, 5, 6 } with { erroneous([1]) "before := boolean:false" };
68 const IntList il4 := { 4, 5, 6 } with { erroneous([1]) "after := boolean:false" };
69 const IntList il5 := { 4, 5, 6 } with { erroneous([1]) "value := boolean:false" };
70 const IntList il6 := { 7, 8, 9 } with { erroneous([0]) "before(raw) := '616263'O" };
71 const IntList il7 := { 7, 8, 9 } with { erroneous([0]) "after(raw) := '616263'O" };
72 const IntList il8 := { 7, 8, 9 } with { erroneous([0]) "value(raw) := '616263'O" };
74 const IntListList ill1 := { il1, il3, il5, il7 };
75 const IntListList ill2 := { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } } with { erroneous([1]) "before := float:3.5"; erroneous([2][2]) "before := omit all" };
77 const Rec r1 := { num := 10, str := "hello" } with { erroneous(num) "before := true" };
78 const Rec r2 := { num := 10, str := "hello" } with { erroneous(num) "after := true" };
79 const Rec r3 := { num := 10, str := "hello" } with { erroneous(num) "value := true" };
80 const Rec r4 := { num := 10, str := "hello" } with { erroneous(str) "value := omit" };
81 const Rec r5 := { num := 10, str := "hello" } with { erroneous(num) "before(raw) := \"abc\"" };
82 const Rec r6 := { num := 10, str := "hello" } with { erroneous(num) "after(raw) := \"abc\"" };
83 const Rec r7 := { num := 10, str := "hello" } with { erroneous(num) "value(raw) := \"abc\"" };
85 const Set s1 := { list := il4, rec := r2, b := false } with { erroneous(rec) "before := omit all" };
86 const Set s2 := { list := il4, rec := r2, b := false } with { erroneous(rec) "after := omit all" };
87 const Set s3 := { list := { 1, 3, 5, 7 }, rec := { num := 2, str := "abc" }, b := true } with { erroneous(list[2]) "after := charstring:""str"""; erroneous(rec.str) "value(raw) := \"abc\"" };
89 const Uni u1 := { i := -6 } with { erroneous(i) "value := \"-6\"" };
90 const Uni u2 := { i := -6 } with { erroneous(i) "value := omit" };
91 const Uni u3 := { i := -6 } with { erroneous(i) "value(raw) := universal charstring:\"abc\"" };
92 const Uni u4 := { os := '1234'O } with { erroneous(i) "value := \"-6\"" }; // non-selected field is erroneous
93 const Uni u5 := { list := { 0, 3, 6 } } with { erroneous(list[2]) "value := \"6\"" };
95 const Uni2 u6 := { i := -6 } with { erroneous(i) "value := \"-6\"" };
96 const Uni2 u7 := { i := -6 } with { erroneous(i) "value := omit" };
97 const Uni2 u8 := { i := -6 } with { erroneous(i) "value(raw) := \"abc\" & char(0,0,1,117)" };
98 const Uni2 u9 := { list := { 0, 3, 6 } } with { erroneous(list[2]) "value := \"6\"" };
100 /******** Test cases for record-ofs ********/
101 testcase tc_record_of_omit_before() runs on CT {
102 var octetstring res := f_enc_il(il1);
103 if (char2oct("[2,3]") == res) { setverdict(pass); }
104 else { setverdict(fail, res); }
107 testcase tc_record_of_omit_after() runs on CT {
108 var octetstring res := f_enc_il(il2);
109 if (char2oct("[0,1,2]") == res) { setverdict(pass); }
110 else { setverdict(fail, res); }
113 testcase tc_record_of_extra_before() runs on CT {
114 var octetstring res := f_enc_il(il3);
115 if (char2oct("[4,false,5,6]") == res) { setverdict(pass); }
116 else { setverdict(fail, res); }
119 testcase tc_record_of_extra_after() runs on CT {
120 var octetstring res := f_enc_il(il4);
121 if (char2oct("[4,5,false,6]") == res) { setverdict(pass); }
122 else { setverdict(fail, res); }
125 testcase tc_record_of_other_value() runs on CT {
126 var octetstring res := f_enc_il(il5);
127 if (char2oct("[4,false,6]") == res) { setverdict(pass); }
128 else { setverdict(fail, res); }
131 testcase tc_record_of_raw_before() runs on CT {
132 var octetstring res := f_enc_il(il6);
133 if (char2oct("[abc7,8,9]") == res) { setverdict(pass); }
134 else { setverdict(fail, res); }
137 testcase tc_record_of_raw_after() runs on CT {
138 var octetstring res := f_enc_il(il7);
139 if (char2oct("[7abc,8,9]") == res) { setverdict(pass); }
140 else { setverdict(fail, res); }
143 testcase tc_record_of_raw_value() runs on CT {
144 var octetstring res := f_enc_il(il8);
145 if (char2oct("[abc8,9]") == res) { setverdict(pass); }
146 else { setverdict(fail, res); }
149 testcase tc_record_of_embedded_values() runs on CT {
150 var octetstring res := f_enc_ill(ill1);
151 if (char2oct("[[2,3],[4,false,5,6],[4,false,6],[7abc,8,9]]") == res) { setverdict(pass); }
152 else { setverdict(fail, res); }
155 testcase tc_record_of_erroneous_in_elements() runs on CT {
156 var octetstring res := f_enc_ill(ill2);
157 if (char2oct("[[1,2,3],3.500000,[4,5],[8]]") == res) { setverdict(pass); }
158 else { setverdict(fail, res); }
161 /***** Test cases for records and sets *****/
162 testcase tc_record_extra_before() runs on CT {
163 var octetstring res := f_enc_r(r1);
164 if (char2oct("{\"BOOLEAN\":true,\"num\":10,\"str\":\"hello\"}") == res) { setverdict(pass); }
165 else { setverdict(fail, res); }
168 testcase tc_record_extra_after() runs on CT {
169 var octetstring res := f_enc_r(r2);
170 if (char2oct("{\"num\":10,\"BOOLEAN\":true,\"str\":\"hello\"}") == res) { setverdict(pass); }
171 else { setverdict(fail, res); }
174 testcase tc_record_other_value() runs on CT {
175 var octetstring res := f_enc_r(r3);
176 if (char2oct("{\"num\":true,\"str\":\"hello\"}") == res) { setverdict(pass); }
177 else { setverdict(fail, res); }
180 testcase tc_record_omit_value() runs on CT {
181 var octetstring res := f_enc_r(r4);
182 if (char2oct("{\"num\":10}") == res) { setverdict(pass); }
183 else { setverdict(fail, res); }
186 testcase tc_record_raw_before() runs on CT {
187 var octetstring res := f_enc_r(r5);
188 if (char2oct("{abc\"num\":10,\"str\":\"hello\"}") == res) { setverdict(pass); }
189 else { setverdict(fail, res); }
192 testcase tc_record_raw_after() runs on CT {
193 var octetstring res := f_enc_r(r6);
194 if (char2oct("{\"num\":10abc,\"str\":\"hello\"}") == res) { setverdict(pass); }
195 else { setverdict(fail, res); }
198 testcase tc_record_raw_value() runs on CT {
199 var octetstring res := f_enc_r(r7);
200 if (char2oct("{abc\"str\":\"hello\"}") == res) { setverdict(pass); }
201 else { setverdict(fail, res); }
204 testcase tc_set_embedded_values_omit_before() runs on CT {
205 var octetstring res := f_enc_s(s1);
206 if (char2oct("{\"rec\":{\"num\":10,\"BOOLEAN\":true,\"str\":\"hello\"},\"b\":false}") == res) { setverdict(pass); }
207 else { setverdict(fail, res); }
210 testcase tc_set_embedded_values_omit_after() runs on CT {
211 var octetstring res := f_enc_s(s2);
212 if (char2oct("{\"list\":[4,5,false,6],\"rec\":{\"num\":10,\"BOOLEAN\":true,\"str\":\"hello\"}}") == res) { setverdict(pass); }
213 else { setverdict(fail, res); }
216 testcase tc_set_erroneous_in_fields() runs on CT {
217 var octetstring res := f_enc_s(s3);
218 if (char2oct("{\"list\":[1,3,5,\"str\",7],\"rec\":{\"num\":2abc},\"b\":true}") == res) { setverdict(pass); }
219 else { setverdict(fail, res); }
222 /********** Test cases for unions **********/
223 testcase tc_union_regular_other_value() runs on CT {
224 var octetstring res := f_enc_u(u1);
225 if (char2oct("{\"i\":\"-6\"}") == res) { setverdict(pass); }
226 else { setverdict(fail, res); }
229 testcase tc_union_regular_omit_value() runs on CT {
230 var octetstring res := f_enc_u(u2);
231 if (char2oct("{}") == res) { setverdict(pass); }
232 else { setverdict(fail, res); }
235 testcase tc_union_regular_raw_value() runs on CT {
236 var octetstring res := f_enc_u(u3);
237 if (char2oct("{abc}") == res) { setverdict(pass); }
238 else { setverdict(fail, res); }
241 testcase tc_union_regular_wrong_alternative() runs on CT {
242 var octetstring res := f_enc_u(u4);
243 if (char2oct("{\"os\":\"1234\"}") == res) { setverdict(pass); }
244 else { setverdict(fail, res); }
247 testcase tc_union_regular_alternative_is_erroneous() runs on CT {
248 var octetstring res := f_enc_u(u5);
249 if (char2oct("{\"list\":[0,3,\"6\"]}") == res) { setverdict(pass); }
250 else { setverdict(fail, res); }
253 testcase tc_union_as_value_other_value() runs on CT {
254 var octetstring res := f_enc_u2(u6);
255 if (char2oct("\"-6\"") == res) { setverdict(pass); }
256 else { setverdict(fail, res); }
259 testcase tc_union_as_value_omit_value() runs on CT {
260 var octetstring res := f_enc_u2(u7);
261 if (char2oct("") == res) { setverdict(pass); }
262 else { setverdict(fail, res); }
265 testcase tc_union_as_value_raw_value() runs on CT {
266 var octetstring res := f_enc_u2(u8);
267 if (unichar2oct("abc" & char(0,0,1,117), "UTF-8") == res) { setverdict(pass); }
268 else { setverdict(fail, res); }
271 testcase tc_union_as_value_alternative_is_erroneous() runs on CT {
272 var octetstring res := f_enc_u2(u9);
273 if (char2oct("[0,3,\"6\"]") == res) { setverdict(pass); }
274 else { setverdict(fail, res); }
277 /*************** Control part ***************/
279 execute(tc_record_of_omit_before());
280 execute(tc_record_of_omit_after());
281 execute(tc_record_of_extra_before());
282 execute(tc_record_of_extra_after());
283 execute(tc_record_of_other_value());
284 execute(tc_record_of_raw_before());
285 execute(tc_record_of_raw_after());
286 execute(tc_record_of_raw_value());
287 execute(tc_record_of_embedded_values());
288 execute(tc_record_of_erroneous_in_elements());
289 execute(tc_record_extra_before());
290 execute(tc_record_extra_after());
291 execute(tc_record_other_value());
292 execute(tc_record_omit_value());
293 execute(tc_record_raw_before());
294 execute(tc_record_raw_after());
295 execute(tc_record_raw_value());
296 execute(tc_set_embedded_values_omit_before());
297 execute(tc_set_embedded_values_omit_after());
298 execute(tc_set_erroneous_in_fields());
299 execute(tc_union_regular_other_value());
300 execute(tc_union_regular_omit_value());
301 execute(tc_union_regular_raw_value());
302 execute(tc_union_regular_wrong_alternative());
303 execute(tc_union_regular_alternative_is_erroneous());
304 execute(tc_union_as_value_other_value());
305 execute(tc_union_as_value_omit_value());
306 execute(tc_union_as_value_raw_value());
307 execute(tc_union_as_value_alternative_is_erroneous());