summaryrefslogtreecommitdiff
path: root/jstests/aggregation
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2012-07-30 22:04:05 -0700
committerAaron <aaron@10gen.com>2012-07-31 20:09:17 -0700
commit2545a67d031b55a468239f6e2775ba5f4140a0a4 (patch)
tree26fdb021aef8b2857b9b37e8ef6d0347b89cce21 /jstests/aggregation
parent2baa7cc10942e5cf1d34c1f382195da268cdc0ab (diff)
downloadmongo-2545a67d031b55a468239f6e2775ba5f4140a0a4.tar.gz
$ifNull functional tests.
Diffstat (limited to 'jstests/aggregation')
-rw-r--r--jstests/aggregation/bugs/ifnull.js61
1 files changed, 61 insertions, 0 deletions
diff --git a/jstests/aggregation/bugs/ifnull.js b/jstests/aggregation/bugs/ifnull.js
new file mode 100644
index 00000000000..55af13bba62
--- /dev/null
+++ b/jstests/aggregation/bugs/ifnull.js
@@ -0,0 +1,61 @@
+// $ifNull returns the result of the first expression if not null or undefined, otherwise of the
+// second expression.
+
+t = db.jstests_aggregation_ifnull;
+t.drop();
+
+t.save( {} );
+
+function assertError( expectedErrorCode, ifNullSpec ) {
+ assert.eq( expectedErrorCode,
+ t.aggregate( { $project:{ a:{ $ifNull:ifNullSpec } } } ).code );
+}
+
+function assertResult( expectedResult, arg0, arg1 ) {
+ assert.eq( expectedResult,
+ t.aggregate( { $project:{ a:{ $ifNull:[ arg0, arg1 ] } } } ).result[ 0 ].a );
+}
+
+// Wrong number of args.
+assertError( 16020, [] );
+assertError( 16020, [1] );
+assertError( 16020, [null] );
+assertError( 16020, [1,1,1] );
+assertError( 16020, [1,1,null] );
+assertError( 16020, [1,1,undefined] );
+
+// First arg non null.
+assertResult( 1, 1, 2 );
+assertResult( 2, 2, 1 );
+assertResult( false, false, 1 );
+assertResult( '', '', 1 );
+assertResult( [], [], 1 );
+assertResult( {}, {}, 1 );
+assertResult( 1, 1, null );
+assertResult( 2, 2, undefined );
+
+// First arg null.
+assertResult( 2, null, 2 );
+assertResult( 1, null, 1 );
+assertResult( null, null, null );
+assertResult( undefined, null, undefined );
+
+// First arg undefined.
+assertResult( 2, undefined, 2 );
+assertResult( 1, undefined, 1 );
+assertResult( null, undefined, null );
+assertResult( undefined, undefined, undefined );
+
+// Computed expression.
+assertResult( 3, { $add:[ 1, 2 ] }, 5 );
+assertResult( 20, '$missingField', { $multiply:[ 4, 5 ] } );
+
+// Divide by 0.
+assertResult( 'div0', { $divide:[ 1, 0 ] }, 'div0' );
+
+// Nested.
+t.drop();
+t.save( { d:'foo' } );
+assertResult( 'foo', '$a', { $ifNull:[ '$b', { $ifNull:[ '$c', '$d' ] } ] } );
+t.update( {}, { $set:{ b:'bar' } } );
+assertResult( 'bar', '$a', { $ifNull:[ '$b', { $ifNull:[ '$c', '$d' ] } ] } );