diff options
Diffstat (limited to 'jstests/core/shell/bson.js')
-rw-r--r-- | jstests/core/shell/bson.js | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/jstests/core/shell/bson.js b/jstests/core/shell/bson.js new file mode 100644 index 00000000000..7139c6d3e1e --- /dev/null +++ b/jstests/core/shell/bson.js @@ -0,0 +1,133 @@ +/** + * This tests mongo shell functions bsonWoCompare & bsonBinaryEqual. + */ + +(function() { +'use strict'; + +var t = db.getCollection("bson"); +t.drop(); +function testObjectsAreEqual(obj1, obj2, equalityFunc, func_name) { + var assert_msg = func_name + " " + tojson(obj1) + " " + tojson(obj2); + assert(equalityFunc(obj1, obj2), assert_msg); +} + +function testObjectsAreNotEqual(obj1, obj2, equalityFunc, func_name) { + var assert_msg = func_name + " " + tojson(obj1) + " " + tojson(obj2); + assert(!equalityFunc(obj1, obj2), assert_msg); +} + +function runTests(func, testFunc) { + // Tests on numbers. + testObjectsAreEqual(0, 0, func, testFunc); + testObjectsAreEqual(-5, -5, func, testFunc); + testObjectsAreEqual(1.1, 1.1, func, testFunc); + testObjectsAreEqual(1, 1, func, testFunc); + testObjectsAreEqual(1.1, 1.10, func, testFunc); + var nl0 = new NumberLong("18014398509481984"); + var nl1 = new NumberLong("18014398509481985"); + testObjectsAreEqual(nl0, nl0, func, testFunc); + testObjectsAreNotEqual(nl0, nl1, func, testFunc); + + // Test on key name. + t.insertMany([{a: 0}, {A: 0}]); + testObjectsAreNotEqual(t.findOne({a: 0}), t.findOne({A: 0}), func, testFunc); + + // Tests on strings. + testObjectsAreEqual("abc", "abc", func, testFunc); + testObjectsAreNotEqual("abc", "aBc", func, testFunc); + + // Tests on boolean. + testObjectsAreEqual(true, true, func, testFunc); + testObjectsAreNotEqual(true, false, func, testFunc); + testObjectsAreEqual(false, false, func, testFunc); + + // Tests on date & timestamp. + var d0 = new Date(0); + var d1 = new Date(1); + var ts0 = new Timestamp(0, 1); + var ts1 = new Timestamp(1, 1); + testObjectsAreEqual(d0, d0, func, testFunc); + testObjectsAreNotEqual(d0, d1, func, testFunc); + testObjectsAreNotEqual(d1, ts1, func, testFunc); + testObjectsAreEqual(ts0, ts0, func, testFunc); + testObjectsAreNotEqual(ts0, ts1, func, testFunc); + + // Tests on regex. + testObjectsAreEqual(/3/, /3/, func, testFunc); + testObjectsAreNotEqual(/3/, /3/i, func, testFunc); + + // Tests on DBPointer. + var dbp0 = new DBPointer("test", new ObjectId()); + var dbp1 = new DBPointer("test", new ObjectId()); + testObjectsAreEqual(dbp0, dbp0, func, testFunc); + testObjectsAreNotEqual(dbp0, dbp1, func, testFunc); + + // Tests on JavaScript. + var js0 = Function.prototype; + var js1 = function() {}; + testObjectsAreEqual(js0, Function.prototype, func, testFunc); + testObjectsAreNotEqual(js0, js1, func, testFunc); + + // Tests on arrays. + testObjectsAreEqual([0, 1], [0, 1], func, testFunc); + testObjectsAreNotEqual([0, 1], [0], func, testFunc); + testObjectsAreNotEqual([1, 0], [0, 1], func, testFunc); + + // Tests on BinData & HexData. + testObjectsAreEqual(new BinData(0, "JANgqwetkqwklEWRbWERKKJREtbq"), + new BinData(0, "JANgqwetkqwklEWRbWERKKJREtbq"), + func, + testFunc); + testObjectsAreEqual(new BinData(0, "AAaa"), new BinData(0, "AAaa"), func, testFunc); + testObjectsAreNotEqual(new BinData(0, "AAaa"), new BinData(0, "aaAA"), func, testFunc); + + testObjectsAreEqual(new HexData(0, "AAaa"), new HexData(0, "AAaa"), func, testFunc); + testObjectsAreEqual(new HexData(0, "AAaa"), new HexData(0, "aaAA"), func, testFunc); + testObjectsAreNotEqual(new HexData(0, "AAaa"), new BinData(0, "AAaa"), func, testFunc); + + // Tests on ObjectId + testObjectsAreEqual(new ObjectId("57d1b31cd311a43091fe592f"), + new ObjectId("57d1b31cd311a43091fe592f"), + func, + testFunc); + testObjectsAreNotEqual(new ObjectId("57d1b31cd311a43091fe592f"), + new ObjectId("57d1b31ed311a43091fe5930"), + func, + testFunc); + + // Tests on miscellaneous types. + testObjectsAreEqual(NaN, NaN, func, testFunc); + testObjectsAreEqual(null, null, func, testFunc); + testObjectsAreNotEqual(null, -null, func, testFunc); + testObjectsAreEqual(MinKey, MinKey, func, testFunc); + testObjectsAreEqual(MaxKey, MaxKey, func, testFunc); + testObjectsAreNotEqual(MinKey, MaxKey, func, testFunc); + + // Test on object ordering. + testObjectsAreNotEqual({a: 1, b: 2}, {b: 2, a: 1}, func, testFunc); +} + +// Create wrapper function for bsonWoCompare, such that it returns boolean result. +var bsonWoCompareWrapper = function(obj1, obj2) { + return bsonWoCompare(obj1, obj2) === 0; +}; + +// Run the tests which work the same for both comparators. +runTests(bsonWoCompareWrapper, "bsonWoCompare"); +runTests(bsonBinaryEqual, "bsonBinaryEqual"); + +// Run the tests which differ between comparators. +testObjectsAreEqual(NaN, -NaN, bsonWoCompareWrapper, "bsonWoCompare"); +testObjectsAreNotEqual(NaN, -NaN, bsonBinaryEqual, "bsonBinaryEqual"); +testObjectsAreEqual(1, NumberLong("1"), bsonWoCompareWrapper, "bsonWoCompare"); +testObjectsAreNotEqual(1, NumberLong("1"), bsonBinaryEqual, "bsonBinaryEqual"); +testObjectsAreEqual(1.0, NumberLong("1"), bsonWoCompareWrapper, "bsonWoCompare"); +testObjectsAreNotEqual(1.0, NumberLong("1"), bsonBinaryEqual, "bsonBinaryEqual"); +testObjectsAreEqual(NumberInt("1"), NumberLong("1"), bsonWoCompareWrapper, "bsonWoCompare"); +testObjectsAreNotEqual(NumberInt("1"), NumberLong("1"), bsonBinaryEqual, "bsonBinaryEqual"); +testObjectsAreEqual(NumberInt("1"), NumberDecimal("1.0"), bsonWoCompareWrapper, "bsonWoCompare"); +testObjectsAreNotEqual(NumberInt("1"), NumberDecimal("1.0"), bsonBinaryEqual, "bsonBinaryEqual"); +testObjectsAreEqual(NumberLong("1"), NumberDecimal("1.0"), bsonWoCompareWrapper, "bsonWoCompare"); +testObjectsAreNotEqual(NumberLong("1"), NumberDecimal("1.0"), bsonBinaryEqual, "bsonBinaryEqual"); +})(); |