| 
					
				 | 
			
			
				@@ -0,0 +1,118 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var assert = require("assert"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AvgAccumulator = require("../../../../lib/pipeline/accumulators/AvgAccumulator"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	FieldPathExpression = require("../../../../lib/pipeline/expressions/FieldPathExpression"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function createAccumulator(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var avgAccumulator = new AvgAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	avgAccumulator.addOperand(new FieldPathExpression("b") ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return avgAccumulator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+module.exports = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"AvgAccumulator": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"constructor()": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should not throw Error when constructing without args": function testConstructor(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.doesNotThrow(function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					new AvgAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"#getOpName()": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should return the correct op name; $avg": function testOpName(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(new AvgAccumulator().getOpName(), "$avg"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"#evaluate()": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate no documents": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(avgAccumulator.getValue(), 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate one document with a field that is NaN": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:Number("foo")}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// NaN is unequal to itself 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.notStrictEqual(avgAccumulator.getValue(), avgAccumulator.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate one document and avg it's value": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:5}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(avgAccumulator.getValue(), 5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate and avg two ints": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:5}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:7}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(avgAccumulator.getValue(), 6); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate and avg two ints overflow": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:Number.MAX_VALUE}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:Number.MAX_VALUE}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(Number.isFinite(avgAccumulator.getValue()), false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate and avg two negative ints": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:-5}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:-7}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(avgAccumulator.getValue(), -6); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//TODO Not sure how to do this in Javascript 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			"should evaluate and avg two negative ints overflow": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				avgAccumulator.evaluate({b:Number.MIN_VALUE}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				avgAccumulator.evaluate({b:7}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				assert.strictEqual(avgAccumulator.getValue(), Number.MAX_VALUE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate and avg int and float": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:8.5}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:7}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(avgAccumulator.getValue(), 7.75); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate and avg one Number and a NaN sum to NaN": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:8}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:Number("bar")}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// NaN is unequal to itself 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.notStrictEqual(avgAccumulator.getValue(), avgAccumulator.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"should evaluate and avg a null value to 0": function testStuff(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var avgAccumulator = createAccumulator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				avgAccumulator.evaluate({b:null}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				assert.strictEqual(avgAccumulator.getValue(), 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |