1+ package com .relogiclabs .jschema .test .negative ;
2+
3+ import com .relogiclabs .jschema .JsonAssert ;
4+ import com .relogiclabs .jschema .JsonSchema ;
5+ import com .relogiclabs .jschema .exception .ScriptRuntimeException ;
6+ import com .relogiclabs .jschema .exception .SystemOperationException ;
7+ import org .junit .jupiter .api .Test ;
8+
9+ import static com .relogiclabs .jschema .message .ErrorCode .DIVD02 ;
10+ import static com .relogiclabs .jschema .message .ErrorCode .ITER01 ;
11+ import static com .relogiclabs .jschema .message .ErrorCode .VARD01 ;
12+ import static org .junit .jupiter .api .Assertions .assertEquals ;
13+ import static org .junit .jupiter .api .Assertions .assertThrows ;
14+
15+ public class ScriptBasicTests {
16+ @ Test
17+ public void When_DuplicateVariableDefinition_ExceptionThrown () {
18+ var schema =
19+ """
20+ %schema:
21+ {
22+ "variableTest": @variableTest #integer
23+ }
24+ %script: {
25+ constraint variableTest() {
26+ var test = 10;
27+ if(true) {
28+ // Variable shadowing in inner scope
29+ var test = 30;
30+ if(test != 30) return fail("Invalid: " + test);
31+ }
32+ if(test != 10) return fail("Invalid: " + test);
33+ // Variable 'test' already defined in this scope
34+ var test = 20;
35+ }
36+ }
37+ """ ;
38+ var json =
39+ """
40+ {
41+ "variableTest": 2
42+ }
43+ """ ;
44+ JsonSchema .isValid (schema , json );
45+ var exception = assertThrows (ScriptRuntimeException .class ,
46+ () -> JsonAssert .isValid (schema , json ));
47+ assertEquals (VARD01 , exception .getCode ());
48+ exception .printStackTrace ();
49+ }
50+
51+ @ Test
52+ public void When_ForeachWithNonIterableValue_ExceptionThrown () {
53+ var schema =
54+ """
55+ %schema:
56+ {
57+ "iteratorTest": @iteratorTest #integer
58+ }
59+ %script: {
60+ constraint iteratorTest() {
61+ foreach(var i in target) print(i);
62+ }
63+ }
64+ """ ;
65+ var json =
66+ """
67+ {
68+ "iteratorTest": 2
69+ }
70+ """ ;
71+ JsonSchema .isValid (schema , json );
72+ var exception = assertThrows (ScriptRuntimeException .class ,
73+ () -> JsonAssert .isValid (schema , json ));
74+ assertEquals (ITER01 , exception .getCode ());
75+ exception .printStackTrace ();
76+ }
77+
78+ @ Test
79+ public void When_WrongIndexAndRangeOutOfBounds_ExceptionThrown () {
80+ var schema =
81+ """
82+ %schema:
83+ {
84+ "indexTest1": @indexArrayTest #array,
85+ "indexTest2": @indexStringTest #string
86+ }
87+ %script: {
88+ constraint indexArrayTest() {
89+ var result1 = tryof(target[10]);
90+ if(find(result1.error, "[INDX04]") < 0)
91+ return fail("Invalid: " + result1);
92+ var result2 = tryof(target[-1]);
93+ if(find(result2.error, "[INDX05]") < 0)
94+ return fail("Invalid: " + result2);
95+ var result3 = tryof(target[10..]);
96+ if(find(result3.error, "[RNGS07]") < 0)
97+ return fail("Invalid: " + result3);
98+ var result4 = tryof(target[..10]);
99+ if(find(result4.error, "[RNGS08]") < 0)
100+ return fail("Invalid: " + result4);
101+ var array = [10, 20];
102+ // only assign at the end of array to add
103+ // use fill function for array of specific size
104+ var result5 = tryof(array[10] = 10);
105+ if(find(result5.error, "[INDX04]") < 0)
106+ return fail("Invalid: " + result5);
107+ }
108+
109+ constraint indexStringTest() {
110+ var result1 = tryof(target[100]);
111+ if(find(result1.error, "[INDX02]") < 0)
112+ return fail("Invalid: " + result1);
113+ var result2 = tryof(target[-1]);
114+ if(find(result2.error, "[INDX03]") < 0)
115+ return fail("Invalid: " + result2);
116+ var result3 = tryof(target[100..]);
117+ if(find(result3.error, "[RNGS04]") < 0)
118+ return fail("Invalid: " + result3);
119+ var result4 = tryof(target[..100]);
120+ if(find(result4.error, "[RNGS05]") < 0)
121+ return fail("Invalid: " + result4);
122+ }
123+ }
124+ """ ;
125+ var json =
126+ """
127+ {
128+ "indexTest1": [1, 2, 3],
129+ "indexTest2": "This is a test"
130+ }
131+ """ ;
132+ //JsonSchema.isValid(schema, json);
133+ JsonAssert .isValid (schema , json );
134+ }
135+
136+ @ Test
137+ public void When_WrongTypeForDifferentOperations_ExceptionThrown () {
138+ var schema =
139+ """
140+ %schema:
141+ {
142+ "operationTest": @operationTest #object
143+ }
144+ %script: {
145+ constraint operationTest() {
146+ var result1 = tryof(target + 10);
147+ if(find(result1.error, "[ADDI01]") < 0)
148+ return fail("Invalid: " + result1);
149+ var result2 = tryof(target - 10);
150+ if(find(result2.error, "[SUBT01]") < 0)
151+ return fail("Invalid: " + result2);
152+ var result3 = tryof(target * 10);
153+ if(find(result3.error, "[MULT01]") < 0)
154+ return fail("Invalid: " + result3);
155+ var result4 = tryof(target / 10);
156+ if(find(result4.error, "[DIVD01]") < 0)
157+ return fail("Invalid: " + result4);
158+ var result5 = tryof(target > 10);
159+ if(find(result5.error, "[RELA01]") < 0)
160+ return fail("Invalid: " + result5);
161+ var result6 = tryof(target >= 10);
162+ if(find(result6.error, "[RELA02]") < 0)
163+ return fail("Invalid: " + result6);
164+ var result7 = tryof(target < 10);
165+ if(find(result7.error, "[RELA03]") < 0)
166+ return fail("Invalid: " + result7);
167+ var result8 = tryof(target <= 10);
168+ if(find(result8.error, "[RELA04]") < 0)
169+ return fail("Invalid: " + result8);
170+ }
171+ }
172+ """ ;
173+ var json =
174+ """
175+ {
176+ "operationTest": {}
177+ }
178+ """ ;
179+ //JsonSchema.isValid(schema, json);
180+ JsonAssert .isValid (schema , json );
181+ }
182+
183+ @ Test
184+ public void When_WrongLValueForIncrementDecrement_ExceptionThrown () {
185+ var schema =
186+ """
187+ %schema:
188+ {
189+ "incDecTest1": @incDecTest1 #object,
190+ "incDecTest2": @incDecTest1 #array
191+ }
192+ %script: {
193+ constraint incDecTest1() {
194+ var t = target;
195+ var result1 = tryof(t++);
196+ if(find(result1.error, "[INCR02]") < 0)
197+ return fail("Invalid: " + result1);
198+ var result2 = tryof(++t);
199+ if(find(result2.error, "[INCR04]") < 0)
200+ return fail("Invalid: " + result2);
201+ var result3 = tryof(t--);
202+ if(find(result3.error, "[DECR02]") < 0)
203+ return fail("Invalid: " + result3);
204+ var result4 = tryof(--t);
205+ if(find(result4.error, "[DECR04]") < 0)
206+ return fail("Invalid: " + result4);
207+ }
208+ }
209+ """ ;
210+ var json =
211+ """
212+ {
213+ "incDecTest1": {},
214+ "incDecTest2": []
215+ }
216+ """ ;
217+ //JsonSchema.isValid(schema, json);
218+ JsonAssert .isValid (schema , json );
219+ }
220+
221+ @ Test
222+ public void When_ReadonlyLValueForOperations_ExceptionThrown () {
223+ var schema =
224+ """
225+ %schema:
226+ {
227+ "lvalueTest1": @lvalueTest1 #object,
228+ "lvalueTest2": @lvalueTest2 #array
229+ }
230+ %script: {
231+ constraint lvalueTest1() {
232+ var result1 = tryof(target.test = 10);
233+ if(find(result1.error, "[PRPS02]") < 0)
234+ return fail("Invalid: " + result1);
235+ var result2 = tryof(target.k1 = 10);
236+ if(find(result2.error, "[ASIN01]") < 0)
237+ return fail("Invalid: " + result2);
238+ }
239+
240+ constraint lvalueTest2() {
241+ var result1 = tryof(target[2] = 10);
242+ if(find(result1.error, "[INDX04]") < 0)
243+ return fail("Invalid: " + result1);
244+ var result2 = tryof(target[0] = 10);
245+ if(find(result2.error, "[ASIN01]") < 0)
246+ return fail("Invalid: " + result2);
247+ }
248+ }
249+ """ ;
250+ var json =
251+ """
252+ {
253+ "lvalueTest1": {"k1": 100},
254+ "lvalueTest2": [100, 200]
255+ }
256+ """ ;
257+ //JsonSchema.isValid(schema, json);
258+ JsonAssert .isValid (schema , json );
259+ }
260+
261+ @ Test
262+ public void When_WrongLValueForMemberAndIndexRangeOperations_ExceptionThrown () {
263+ var schema =
264+ """
265+ %schema:
266+ {
267+ "lvalueTest1": @lvalueTest1 #array,
268+ "lvalueTest2": @lvalueTest2 #object,
269+ "lvalueTest3": @lvalueTest3 #integer
270+ }
271+ %script: {
272+ constraint lvalueTest1() {
273+ var result1 = tryof(target.test = 100);
274+ if(find(result1.error, "[PRPS01]") < 0)
275+ return fail("Invalid: " + result1);
276+ var result2 = tryof(target["test"] = 100);
277+ if(find(result2.error, "[INDX07]") < 0)
278+ return fail("Invalid: " + result2);
279+ }
280+
281+ constraint lvalueTest2() {
282+ var result1 = tryof(target[0] = 100);
283+ if(find(result1.error, "[INDX06]") < 0)
284+ return fail("Invalid: " + result1);
285+ var result2 = tryof(target[0..] = 100);
286+ if(find(result2.error, "[RNGS10]") < 0)
287+ return fail("Invalid: " + result2);
288+ }
289+
290+ constraint lvalueTest3() {
291+ var result1 = tryof(target.test = 10);
292+ if(find(result1.error, "[PRPS01]") < 0)
293+ return fail("Invalid: " + result1);
294+ var result2 = tryof(target[0] = 10);
295+ if(find(result2.error, "[INDX06]") < 0)
296+ return fail("Invalid: " + result2);
297+ var result3 = tryof(target[0..] = 100);
298+ if(find(result3.error, "[RNGS10]") < 0)
299+ return fail("Invalid: " + result3);
300+ }
301+ }
302+ """ ;
303+ var json =
304+ """
305+ {
306+ "lvalueTest1": [10, 20],
307+ "lvalueTest2": { "k1": 10 },
308+ "lvalueTest3": 10
309+ }
310+ """ ;
311+ //JsonSchema.isValid(schema, json);
312+ JsonAssert .isValid (schema , json );
313+ }
314+
315+ @ Test
316+ public void When_RuntimeSystemException_ExceptionThrown () {
317+ // Exception like OutOfMemoryError / DivideByZero etc.
318+ var schema =
319+ """
320+ %schema:
321+ {
322+ "exceptionTest": @exceptionTest #integer
323+ }
324+ %script: {
325+ constraint exceptionTest() {
326+ var result = target / 0;
327+ }
328+ }
329+ """ ;
330+ var json =
331+ """
332+ {
333+ "exceptionTest": 10
334+ }
335+ """ ;
336+ JsonSchema .isValid (schema , json );
337+ var exception = assertThrows (SystemOperationException .class ,
338+ () -> JsonAssert .isValid (schema , json ));
339+ assertEquals (DIVD02 , exception .getCode ());
340+ exception .printStackTrace ();
341+ }
342+ }
0 commit comments