diff --git a/driver-core/src/test/functional/com/mongodb/client/model/AggregatesTest.java b/driver-core/src/test/functional/com/mongodb/client/model/AggregatesTest.java index 5ed5ac7cf32..719d895ff41 100644 --- a/driver-core/src/test/functional/com/mongodb/client/model/AggregatesTest.java +++ b/driver-core/src/test/functional/com/mongodb/client/model/AggregatesTest.java @@ -29,6 +29,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.math.RoundingMode; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -234,13 +235,13 @@ public void testGeoNear() { + " 'coordinates' : [ -73.9928, 40.7193 ]\n" + " },\n" + " 'dist' : {\n" - + " 'calculated' : 9.539931676365992,\n" + + " 'calculated' : 9.5399,\n" + " 'location' : {\n" + " 'type' : 'Point',\n" + " 'coordinates' : [ -73.9928, 40.7193 ]\n" + " }\n" + " }\n" - + "}]"); + + "}]", 4, RoundingMode.FLOOR); } @Test diff --git a/driver-core/src/test/functional/com/mongodb/client/model/OperationTest.java b/driver-core/src/test/functional/com/mongodb/client/model/OperationTest.java index 80360adb1bb..9a215c7260c 100644 --- a/driver-core/src/test/functional/com/mongodb/client/model/OperationTest.java +++ b/driver-core/src/test/functional/com/mongodb/client/model/OperationTest.java @@ -23,6 +23,8 @@ import com.mongodb.lang.Nullable; import org.bson.BsonArray; import org.bson.BsonDocument; +import org.bson.BsonDouble; +import org.bson.BsonValue; import org.bson.Document; import org.bson.codecs.BsonDocumentCodec; import org.bson.codecs.DecoderContext; @@ -31,9 +33,12 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static com.mongodb.ClusterFixture.checkReferenceCountReachesTarget; @@ -110,6 +115,37 @@ protected void assertResults(final List pipeline, final String expectedRes assertEquals(expectedResults, results); } + protected void assertResults(final List pipeline, final String expectedResultsAsString, + final int scale, final RoundingMode roundingMode) { + List expectedResults = parseToList(expectedResultsAsString); + List results = getCollectionHelper().aggregate(pipeline); + assertEquals(adjustScale(expectedResults, scale, roundingMode), adjustScale(results, scale, roundingMode)); + } + + private static List adjustScale(final List documents, final int scale, final RoundingMode roundingMode) { + documents.replaceAll(value -> adjustScale(value, scale, roundingMode).asDocument()); + return documents; + } + + private static BsonValue adjustScale(final BsonValue value, final int scale, final RoundingMode roundingMode) { + if (value.isDouble()) { + double scaledDoubleValue = BigDecimal.valueOf(value.asDouble().doubleValue()) + .setScale(scale, roundingMode) + .doubleValue(); + return new BsonDouble(scaledDoubleValue); + } else if (value.isDocument()) { + for (Map.Entry entry : value.asDocument().entrySet()) { + entry.setValue(adjustScale(entry.getValue(), scale, roundingMode)); + } + } else if (value.isArray()) { + BsonArray array = value.asArray(); + for (int i = 0; i < array.size(); i++) { + array.set(i, adjustScale(array.get(i), scale, roundingMode)); + } + } + return value; + } + protected List aggregateWithWindowFields(@Nullable final Object partitionBy, final WindowOutputField output, final Bson sortSpecification) {