11
11
import com .relogiclabs .jschema .node .JNumber ;
12
12
import com .relogiclabs .jschema .node .JReceiver ;
13
13
import com .relogiclabs .jschema .node .JString ;
14
- import com .relogiclabs .jschema .tree .RuntimeContext ;
15
14
16
15
import java .util .Arrays ;
17
16
@@ -26,17 +25,13 @@ public class ExternalFunctions extends FunctionProvider {
26
25
public static final String SUMEQUAL01 = "SUMEQUAL01" ;
27
26
public static final String MINMAX01 = "MINMAX01" ;
28
27
29
- public ExternalFunctions (RuntimeContext runtime ) {
30
- super (runtime );
31
- }
32
-
33
28
public boolean even (JNumber target ) {
34
- boolean result = ( target . toDouble () % 2 == 0 );
35
- if (! result ) return fail ( new JsonSchemaException (
36
- new ErrorDetail ( EVENFUNC01 , "Number is not even" ),
37
- new ExpectedDetail ( caller , "even number " ),
38
- new ActualDetail ( target , "number " , target , " is odd" )));
39
- return true ;
29
+ // Precision loss is not considered here
30
+ if (target . toDouble () % 2 == 0 ) return true ;
31
+ return fail ( new JsonSchemaException (
32
+ new ErrorDetail ( EVENFUNC01 , "Number is not even " ),
33
+ new ExpectedDetail ( caller , "even number" ),
34
+ new ActualDetail ( target , "number " + target + " is odd" ))) ;
40
35
}
41
36
42
37
public boolean canTest (JNumber target , JString str1 , JBoolean bool1 , JNumber ... args ) {
@@ -48,23 +43,22 @@ public boolean canTest(JNumber target, JString str1, JBoolean bool1, JNumber...
48
43
}
49
44
50
45
public boolean checkAccess (JInteger target , JReceiver userRole ) {
51
- String role = userRole .<JString >getValueNode ().getValue ();
46
+ var role = userRole .<JString >getValueNode ().getValue ();
52
47
if (role .equals ("user" ) && target .getValue () > 5 ) return fail (new JsonSchemaException (
53
- new ErrorDetail (ERRACCESS01 , "Data access incompatible with 'user' role" ),
54
- new ExpectedDetail (caller , "an access at most 5 for 'user' role" ),
55
- new ActualDetail (target , "found access " , target , " which is greater than 5" )));
48
+ new ErrorDetail (ERRACCESS01 , "Data access incompatible with 'user' role" ),
49
+ new ExpectedDetail (caller , "an access at most 5 for 'user' role" ),
50
+ new ActualDetail (target , "found access " + target + " which is greater than 5" )));
56
51
return true ;
57
52
}
58
53
59
54
public boolean condition (JInteger target , JReceiver receiver ) {
60
- long threshold = receiver .<JInteger >getValueNode ().getValue ();
55
+ var threshold = receiver .<JInteger >getValueNode ().getValue ();
61
56
System .out .println ("Received integer: " + threshold );
62
- boolean result = threshold < target .getValue ();
63
- if (!result ) return fail (new JsonSchemaException (
64
- new ErrorDetail (CONDFUNC01 , "Number does not satisfy the condition" ),
65
- new ExpectedDetail (caller , "a number > " , threshold , " of '" , receiver .getName (), "'" ),
66
- new ActualDetail (target , "found number " , target , " <= " , threshold )));
67
- return result ;
57
+ if (threshold < target .getValue ()) return true ;
58
+ return fail (new JsonSchemaException (
59
+ new ErrorDetail (CONDFUNC01 , "Number does not satisfy the condition" ),
60
+ new ExpectedDetail (caller , "a number > " + threshold + " of " + receiver ),
61
+ new ActualDetail (target , "found number " + target + " <= " + threshold )));
68
62
}
69
63
70
64
public boolean conditionAll (JInteger target , JReceiver receiver ) {
@@ -73,11 +67,11 @@ public boolean conditionAll(JInteger target, JReceiver receiver) {
73
67
System .out .println ("Target: " + target );
74
68
System .out .println ("Received integers: " + values );
75
69
boolean result = list .stream ().allMatch (i -> i .getValue () < target .getValue ());
76
- if (! result ) return fail ( new JsonSchemaException (
77
- new ErrorDetail ( CONDFUNC02 , "Number does not satisfy the condition" ),
78
- new ExpectedDetail ( caller , "a number > any of " , values , " of '" , receiver . getName (), "' " ),
79
- new ActualDetail ( target , "found number " , target , " <= some of ", values )));
80
- return true ;
70
+ if (result ) return true ;
71
+ return fail ( new JsonSchemaException (
72
+ new ErrorDetail ( CONDFUNC02 , "Number does not satisfy the condition " ),
73
+ new ExpectedDetail ( caller , "a number > any of " + values + " of " + receiver ),
74
+ new ActualDetail ( target , "found number " + target + " <= some of " + values ))) ;
81
75
}
82
76
83
77
public FutureFunction sumEqual (JInteger target , JReceiver receiver ) {
@@ -89,12 +83,11 @@ public FutureFunction sumEqual(JInteger target, JReceiver receiver) {
89
83
System .out .println ("Target: " + target );
90
84
System .out .println ("Received values: " + expression );
91
85
long result = values .stream ().mapToLong (JInteger ::getValue ).sum ();
92
- if (result != target .getValue ())
93
- return fail (new JsonSchemaException (
94
- new ErrorDetail (SUMEQUAL01 , "Number != sum of " , expression , " = " , result ),
95
- new ExpectedDetail (current , "a number = sum of numbers " , result ),
96
- new ActualDetail (target , "found number " , target , " != " , result )));
97
- return true ;
86
+ if (result == target .getValue ()) return true ;
87
+ return fail (new JsonSchemaException (
88
+ new ErrorDetail (SUMEQUAL01 , "Number != sum of " + expression + " = " + result ),
89
+ new ExpectedDetail (current , "a number = sum of numbers " + result ),
90
+ new ActualDetail (target , "found number " + target + " != " + result )));
98
91
};
99
92
}
100
93
@@ -106,12 +99,11 @@ public FutureFunction minmax(JInteger target, JReceiver min, JReceiver max) {
106
99
var intMax = max .<JInteger >getValueNode ().getValue ();
107
100
System .out .println ("Target: " + target );
108
101
System .out .println ("Received min: " + intMin + ", max: " + intMax );
109
- boolean result = target .getValue () >= intMin && target .getValue () <= intMax ;
110
- if (!result ) return fail (new JsonSchemaException (
111
- new ErrorDetail (MINMAX01 , "Number is outside of range" ),
112
- new ExpectedDetail (current , "a number in range [" , intMin , ", " , intMax , "]" ),
113
- new ActualDetail (target , "found number " , target , " not in range" )));
114
- return true ;
102
+ if (target .getValue () >= intMin && target .getValue () <= intMax ) return true ;
103
+ return fail (new JsonSchemaException (
104
+ new ErrorDetail (MINMAX01 , "Number is outside of range" ),
105
+ new ExpectedDetail (current , "a number in range [" + intMin + ", " + intMax + "]" ),
106
+ new ActualDetail (target , "found number " + target + " not in range" )));
115
107
};
116
108
}
117
109
}
0 commit comments