10
10
import java .io .FileNotFoundException ;
11
11
import java .io .IOException ;
12
12
import java .io .UncheckedIOException ;
13
+ import java .math .BigDecimal ;
13
14
import java .net .URISyntaxException ;
14
15
import java .net .URL ;
15
16
import java .nio .file .Path ;
@@ -40,7 +41,6 @@ class ComplianceTestRunner {
40
41
private static final NodeToDocumentConverter CONVERTER = new NodeToDocumentConverter ();
41
42
// TODO: Remove these suppressions as remaining functions are supported
42
43
private static final List <String > UNSUPPORTED_FUNCTIONS = List .of (
43
- "to_number" ,
44
44
"to_string" ,
45
45
"to_array" ,
46
46
"merge" ,
@@ -145,8 +145,7 @@ public void run() {
145
145
private static boolean isEqual (Document expected , Document actual ) {
146
146
if (expected == null || actual == null ) {
147
147
return expected == null && actual == null ;
148
- }
149
- if (expected .type ().equals (ShapeType .MAP ) && actual .type ().equals (ShapeType .MAP )) {
148
+ } else if (expected .type ().equals (ShapeType .MAP ) && actual .type ().equals (ShapeType .MAP )) {
150
149
for (var member : expected .getMemberNames ()) {
151
150
var expectedMember = expected .getMember (member );
152
151
var actualMember = actual .getMember (member );
@@ -155,10 +154,32 @@ private static boolean isEqual(Document expected, Document actual) {
155
154
}
156
155
}
157
156
return true ;
157
+ } else if (expected .type ().equals (ShapeType .LIST ) && actual .type ().equals (ShapeType .LIST )) {
158
+ if (expected .size () != actual .size ()) {
159
+ return false ;
160
+ } else {
161
+ for (int i = 0 ; i < expected .size (); i ++) {
162
+ if (!isEqual (expected .asList ().get (i ), actual .asList ().get (i ))) {
163
+ return false ;
164
+ }
165
+ }
166
+ return true ;
167
+ }
168
+ } else if (isNumeric (expected ) && isNumeric (actual )) {
169
+ // Normalize all numbers to BigDecimal to make comparisons work.
170
+ return new BigDecimal (expected .asNumber ().toString ())
171
+ .compareTo (new BigDecimal (actual .asNumber ().toString ())) == 0 ;
158
172
}
159
173
return Objects .equals (expected , actual );
160
174
}
161
175
176
+ private static boolean isNumeric (Document doc ) {
177
+ var type = doc .type ();
178
+ return type == ShapeType .BYTE || type == ShapeType .SHORT || type == ShapeType .INTEGER
179
+ || type == ShapeType .LONG || type == ShapeType .BIG_INTEGER || type == ShapeType .BIG_DECIMAL
180
+ || type == ShapeType .FLOAT || type == ShapeType .DOUBLE || type == ShapeType .INT_ENUM ;
181
+ }
182
+
162
183
private static final class NodeToDocumentConverter implements NodeVisitor <Document > {
163
184
private Document convert (Node node ) {
164
185
return node .accept (this );
0 commit comments