"use strict"; var assert = require("assert"), SubtractExpression = require("../../../../lib/pipeline/expressions/SubtractExpression"), Expression = require("../../../../lib/pipeline/expressions/Expression"), VariablesIdGenerator = require("../../../../lib/pipeline/expressions/VariablesIdGenerator"), VariablesParseState = require("../../../../lib/pipeline/expressions/VariablesParseState"); // Mocha one-liner to make these tests self-hosted if(!module.parent)return(require.cache[__filename]=null,(new(require("mocha"))({ui:"exports",reporter:"spec",grep:process.env.TEST_GREP})).addFile(__filename).run(process.exit)); exports.SubtractExpression = { "constructor()": { "should not throw Error when constructing without args": function() { assert.doesNotThrow(function() { new SubtractExpression(); }); }, }, "#getOpName()": { "should return the correct op name; $subtract": function() { assert.equal(new SubtractExpression().getOpName(), "$subtract"); }, }, "#evaluateInternal()": { "should return the result of subtraction between two numbers": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), result = expr.evaluate({a:2, b:1}), expected = 1; assert.strictEqual(result, expected); }, "should return null if left is null": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), result = expr.evaluate({a:null, b:1}), expected = null; assert.strictEqual(result, expected); }, "should return null if left is undefined": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), result = expr.evaluate({a:undefined, b:1}), expected = null; assert.strictEqual(result, expected); }, "should return null if right is null": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), result = expr.evaluate({a:2, b:null}), expected = null; assert.strictEqual(result, expected); }, "should return null if right is undefined": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), result = expr.evaluate({a:2, b:undefined}), expected = null; assert.strictEqual(result, expected); }, "should subtract 2 dates": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), date2 = new Date("Jan 3 1990"), date1 = new Date("Jan 1 1990"), result = expr.evaluate({a:date2, b:date1}), expected = date2 - date1; assert.strictEqual(result, expected); }, "should subtract a number of millis from a date": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), date2 = new Date("Jan 3 1990"), millis = 24 * 60 * 60 * 1000, result = expr.evaluate({a:date2, b:millis}), expected = date2 - millis; assert.strictEqual( JSON.stringify(result), JSON.stringify(expected) ); }, "should throw if left is not a date or number": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), date2 = {}, date1 = new Date(); assert.throws(function() { expr.evaluate({a:date2, b:date1}); }); }, "should throw if right is not a date or number": function() { var idGenerator = new VariablesIdGenerator(), vps = new VariablesParseState(idGenerator), expr = Expression.parseOperand({$subtract:["$a", "$b"]}, vps), date2 = new Date(), date1 = {}; assert.throws(function() { expr.evaluate({a:date2, b:date1}); }); }, }, }; if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit);