1111import com .relogiclabs .jschema .node .JNumber ;
1212import com .relogiclabs .jschema .node .JReceiver ;
1313import com .relogiclabs .jschema .node .JString ;
14- import com .relogiclabs .jschema .tree .RuntimeContext ;
1514
1615import java .util .Arrays ;
1716
@@ -26,17 +25,13 @@ public class ExternalFunctions extends FunctionProvider {
2625 public static final String SUMEQUAL01 = "SUMEQUAL01" ;
2726 public static final String MINMAX01 = "MINMAX01" ;
2827
29- public ExternalFunctions (RuntimeContext runtime ) {
30- super (runtime );
31- }
32-
3328 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" ))) ;
4035 }
4136
4237 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...
4843 }
4944
5045 public boolean checkAccess (JInteger target , JReceiver userRole ) {
51- String role = userRole .<JString >getValueNode ().getValue ();
46+ var role = userRole .<JString >getValueNode ().getValue ();
5247 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" )));
5651 return true ;
5752 }
5853
5954 public boolean condition (JInteger target , JReceiver receiver ) {
60- long threshold = receiver .<JInteger >getValueNode ().getValue ();
55+ var threshold = receiver .<JInteger >getValueNode ().getValue ();
6156 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 )));
6862 }
6963
7064 public boolean conditionAll (JInteger target , JReceiver receiver ) {
@@ -73,11 +67,11 @@ public boolean conditionAll(JInteger target, JReceiver receiver) {
7367 System .out .println ("Target: " + target );
7468 System .out .println ("Received integers: " + values );
7569 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 ))) ;
8175 }
8276
8377 public FutureFunction sumEqual (JInteger target , JReceiver receiver ) {
@@ -89,12 +83,11 @@ public FutureFunction sumEqual(JInteger target, JReceiver receiver) {
8983 System .out .println ("Target: " + target );
9084 System .out .println ("Received values: " + expression );
9185 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 )));
9891 };
9992 }
10093
@@ -106,12 +99,11 @@ public FutureFunction minmax(JInteger target, JReceiver min, JReceiver max) {
10699 var intMax = max .<JInteger >getValueNode ().getValue ();
107100 System .out .println ("Target: " + target );
108101 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" )));
115107 };
116108 }
117109}
0 commit comments