mirror of https://github.com/mongodb/mongo
127 lines
5.2 KiB
JavaScript
127 lines
5.2 KiB
JavaScript
// Tests constructing NumberDecimal with various types
|
|
|
|
let col = db.d_constructors;
|
|
col.drop();
|
|
|
|
// Insert some sample data.
|
|
|
|
assert.commandWorked(
|
|
col.insert([
|
|
{d: NumberDecimal("1")},
|
|
{d: NumberDecimal(1)},
|
|
{d: NumberDecimal(NumberLong("1"))},
|
|
{d: NumberDecimal(NumberInt("1"))},
|
|
{d: NumberDecimal("NaN")},
|
|
{d: NumberDecimal("-NaN")},
|
|
]),
|
|
"Initial insertion of decimals failed",
|
|
);
|
|
|
|
let exactDoubleString = "1427247692705959881058285969449495136382746624";
|
|
let exactDoubleTinyString =
|
|
"0.00000000000000000000000000000000000000000000000000000000000062230152778611417071440640537801242405902521687211671331011166147896988340353834411839448231257136169569665895551224821247160434722900390625";
|
|
|
|
assert.throws(NumberDecimal, [exactDoubleString], "Unexpected success in creating invalid Decimal128");
|
|
assert.throws(NumberDecimal, [exactDoubleTinyString], "Unexpected success in creating invalid Decimal128");
|
|
assert.throws(NumberDecimal, ["some garbage"], "Unexpected success in creating invalid Decimal128");
|
|
|
|
// Find values with various types and NumberDecimal constructed types
|
|
assert.eq(col.find({"d": NumberDecimal("1")}).count(), "4");
|
|
assert.eq(col.find({"d": NumberDecimal(1)}).count(), "4");
|
|
assert.eq(col.find({"d": NumberDecimal(NumberLong(1))}).count(), "4");
|
|
assert.eq(col.find({"d": NumberDecimal(NumberInt(1))}).count(), "4");
|
|
assert.eq(col.find({"d": 1}).count(), "4");
|
|
assert.eq(col.find({"d": NumberLong(1)}).count(), "4");
|
|
assert.eq(col.find({"d": NumberInt(1)}).count(), "4");
|
|
// NaN and -NaN are both evaluated to NaN
|
|
assert.eq(col.find({"d": NumberDecimal("NaN")}).count(), 2);
|
|
|
|
// Verify that shell 'assert.eq' considers precision during comparison.
|
|
assert.neq(NumberDecimal("1"), NumberDecimal("1.000"));
|
|
assert.neq(NumberDecimal("0"), NumberDecimal("-0"));
|
|
|
|
// Verify the behavior of 'numberDecimalsEqual' helper.
|
|
assert(numberDecimalsEqual(NumberDecimal("10.20"), NumberDecimal("10.2")));
|
|
assert.throws(() => numberDecimalsEqual(NumberDecimal("10.20"), NumberDecimal("10.2"), "Third parameter"));
|
|
assert.throws(() => numberDecimalsEqual(NumberDecimal("10.20"), "Wrong parameter type"));
|
|
|
|
// Verify the behavior of 'numberDecimalsAlmostEqual' helper.
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("10001"), NumberDecimal("10002"), 3));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("10001"), NumberDecimal("10002"), 5));
|
|
|
|
// Regression tests for BF-24149.
|
|
assert(
|
|
numberDecimalsAlmostEqual(
|
|
NumberDecimal("905721242210.0455427920454969568"),
|
|
NumberDecimal("905721242210.0453137831269007622941"),
|
|
15,
|
|
),
|
|
);
|
|
|
|
assert(
|
|
!numberDecimalsAlmostEqual(
|
|
NumberDecimal("905721242210.0455427920454969568"),
|
|
NumberDecimal("905721242210.0453137831269007622941"),
|
|
16,
|
|
),
|
|
);
|
|
|
|
// Verify helper works the same with negative numers.
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("-10001"), NumberDecimal("-10002"), 3));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("-10001"), NumberDecimal("-10002"), 5));
|
|
assert(
|
|
numberDecimalsAlmostEqual(
|
|
NumberDecimal("-905721242210.0455427920454969568"),
|
|
NumberDecimal("-905721242210.0453137831269007622941"),
|
|
15,
|
|
),
|
|
);
|
|
assert(
|
|
!numberDecimalsAlmostEqual(
|
|
NumberDecimal("-905721242210.0455427920454969568"),
|
|
NumberDecimal("-905721242210.0453137831269007622941"),
|
|
16,
|
|
),
|
|
);
|
|
|
|
// Verify mixed-sign arguments aren't equal.
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("10001"), NumberDecimal("-10002"), 3));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("-10001"), NumberDecimal("10002"), 3));
|
|
assert(
|
|
!numberDecimalsAlmostEqual(
|
|
NumberDecimal("-905721242210.0455427920454969568"),
|
|
NumberDecimal("905721242210.0453137831269007622941"),
|
|
10,
|
|
),
|
|
);
|
|
assert(
|
|
!numberDecimalsAlmostEqual(
|
|
NumberDecimal("905721242210.0455427920454969568"),
|
|
NumberDecimal("-905721242210.0453137831269007622941"),
|
|
10,
|
|
),
|
|
);
|
|
|
|
// Regression test for BF-25335
|
|
assert(
|
|
numberDecimalsAlmostEqual(
|
|
NumberDecimal("-104735446372966662851.0135276410897"),
|
|
NumberDecimal("-104735446372966750508.0426966190306"),
|
|
10,
|
|
),
|
|
);
|
|
// Regression test for BF-25390
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("-331.0000000000"), NumberDecimal("-331"), 10));
|
|
|
|
// Verify numberDecimalsAlmostEqual() works with 0.
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("0"), NumberDecimal("0"), 10));
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("0"), NumberDecimal("0.0000000000000001"), 10));
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("0.0000000000000001"), NumberDecimal("0"), 10));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("1.00000000000000"), NumberDecimal("1.1"), 10));
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("1.00000000000000"), NumberDecimal("1.00000000000001"), 10));
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("Infinity"), NumberDecimal("Infinity"), 10));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("Infinity"), NumberDecimal("-Infinity"), 10));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("Infinity"), NumberDecimal("NaN"), 10));
|
|
assert(numberDecimalsAlmostEqual(NumberDecimal("NaN"), NumberDecimal("NaN"), 10));
|
|
assert(!numberDecimalsAlmostEqual(NumberDecimal("0"), NumberDecimal("0.000001"), 10));
|