diff options
Diffstat (limited to 'jstests/aggregation/bugs/cond.js')
-rw-r--r-- | jstests/aggregation/bugs/cond.js | 93 |
1 files changed, 50 insertions, 43 deletions
diff --git a/jstests/aggregation/bugs/cond.js b/jstests/aggregation/bugs/cond.js index e71f49e25a5..2b4fa8ff16e 100644 --- a/jstests/aggregation/bugs/cond.js +++ b/jstests/aggregation/bugs/cond.js @@ -5,72 +5,79 @@ load('jstests/aggregation/extras/utils.js'); t = db.jstests_aggregation_cond; t.drop(); -t.save( {} ); +t.save({}); -function assertError( expectedErrorCode, condSpec ) { +function assertError(expectedErrorCode, condSpec) { assertErrorCode(t, {$project: {a: {$cond: condSpec}}}, expectedErrorCode); } -function assertResult( expectedResult, arg ) { - assert.eq( expectedResult, - t.aggregate( { $project:{ a:{ $cond:arg } } } ).toArray()[0].a ); +function assertResult(expectedResult, arg) { + assert.eq(expectedResult, t.aggregate({$project: {a: {$cond: arg}}}).toArray()[0].a); } // Wrong number of args. -assertError( 16020, [] ); -assertError( 16020, [1] ); -assertError( 16020, [false] ); -assertError( 16020, [1,1] ); -assertError( 16020, [1,1,null,1] ); -assertError( 16020, [1,1,1,undefined] ); +assertError(16020, []); +assertError(16020, [1]); +assertError(16020, [false]); +assertError(16020, [1, 1]); +assertError(16020, [1, 1, null, 1]); +assertError(16020, [1, 1, 1, undefined]); // Bad object cases -assertError( 17080, {"else":1, then:1} ); -assertError( 17081, {"if":1, "else":1} ); -assertError( 17082, {"if":1, then:1} ); -assertError( 17083, {asdf:1, then:1} ); +assertError(17080, {"else": 1, then: 1}); +assertError(17081, {"if": 1, "else": 1}); +assertError(17082, {"if": 1, then: 1}); +assertError(17083, {asdf: 1, then: 1}); // Literal expressions. -assertResult( 1, [true, 1, 2] ); -assertResult( 2, [false, 1, 2] ); +assertResult(1, [true, 1, 2]); +assertResult(2, [false, 1, 2]); // Order independence for object case -assertResult(1, {"if":true, "then":1, "else":2}); -assertResult(1, {"if":true, "else":2, "then":1}); -assertResult(1, {"then":1, "if":true, "else":2}); -assertResult(1, {"then":1, "else":2, "if":true}); -assertResult(1, {"else":2, "then":1, "if":true}); -assertResult(1, {"else":2, "if":true, "then":1}); +assertResult(1, {"if": true, "then": 1, "else": 2}); +assertResult(1, {"if": true, "else": 2, "then": 1}); +assertResult(1, {"then": 1, "if": true, "else": 2}); +assertResult(1, {"then": 1, "else": 2, "if": true}); +assertResult(1, {"else": 2, "then": 1, "if": true}); +assertResult(1, {"else": 2, "if": true, "then": 1}); // Computed expressions. -assertResult( 1, [{ $and:[] }, { $add:[ 1 ] }, { $add:[ 1, 1 ] }] ); -assertResult( 2, [{ $or:[] }, { $add:[ 1 ] }, { $add:[ 1, 1 ] }] ); +assertResult(1, [{$and: []}, {$add: [1]}, {$add: [1, 1]}]); +assertResult(2, [{$or: []}, {$add: [1]}, {$add: [1, 1]}]); t.drop(); -t.save( { t:true, f:false, x:'foo', y:'bar' } ); +t.save({t: true, f: false, x: 'foo', y: 'bar'}); // Field path expressions. -assertResult( 'foo', ['$t', '$x', '$y'] ); -assertResult( 'bar', ['$f', '$x', '$y'] ); +assertResult('foo', ['$t', '$x', '$y']); +assertResult('bar', ['$f', '$x', '$y']); t.drop(); -t.save( {} ); +t.save({}); // Coerce to bool. -assertResult( 'a', [1, 'a', 'b'] ); -assertResult( 'a', ['', 'a', 'b'] ); -assertResult( 'b', [0, 'a', 'b'] ); +assertResult('a', [1, 'a', 'b']); +assertResult('a', ['', 'a', 'b']); +assertResult('b', [0, 'a', 'b']); // Nested. t.drop(); -t.save( { noonSense:'am', mealCombined:'no' } ); -t.save( { noonSense:'am', mealCombined:'yes' } ); -t.save( { noonSense:'pm', mealCombined:'yes' } ); -t.save( { noonSense:'pm', mealCombined:'no' } ); -assert.eq( [ 'breakfast', 'brunch', 'linner', 'dinner' ], - t.aggregate( { $project:{ a:{ $cond:[ { $eq:[ '$noonSense', 'am' ] }, - { $cond:[ { $eq:[ '$mealCombined', 'yes' ] }, - 'brunch', 'breakfast' ] }, - { $cond:[ { $eq:[ '$mealCombined', 'yes' ] }, - 'linner', 'dinner' ] } ] } } } ) - .map( function( x ) { return x.a; } ) ); +t.save({noonSense: 'am', mealCombined: 'no'}); +t.save({noonSense: 'am', mealCombined: 'yes'}); +t.save({noonSense: 'pm', mealCombined: 'yes'}); +t.save({noonSense: 'pm', mealCombined: 'no'}); +assert.eq(['breakfast', 'brunch', 'linner', 'dinner'], + t.aggregate({ + $project: { + a: { + $cond: [ + {$eq: ['$noonSense', 'am']}, + {$cond: [{$eq: ['$mealCombined', 'yes']}, 'brunch', 'breakfast']}, + {$cond: [{$eq: ['$mealCombined', 'yes']}, 'linner', 'dinner']} + ] + } + } + }) + .map(function(x) { + return x.a; + })); |