| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- "use strict";
- var assert = require("assert"),
- ElemMatchObjectMatchExpression = require("../../../../lib/pipeline/matcher/ElemMatchObjectMatchExpression.js"),
- ElemMatchValueMatchExpression = require("../../../../lib/pipeline/matcher/ElemMatchValueMatchExpression.js"),
- MatchDetails = require("../../../../lib/pipeline/matcher/MatchDetails.js"),
- LTMatchExpression = require("../../../../lib/pipeline/matcher/LTMatchExpression.js"),
- GTMatchExpression = require("../../../../lib/pipeline/matcher/GTMatchExpression.js");
- module.exports = {
- "ElemMatchValueMatchExpression": {
- "Should match a single element": function() {
- var baseOperand={"$gt":5},
- match={"a":[6]},
- notMatch={"a":[4]},
- gt = new GTMatchExpression(),
- op = new ElemMatchValueMatchExpression();
- assert.strictEqual(gt.init("", baseOperand.$gt).code, 'OK');
- assert.strictEqual(op.init("a", gt).code, 'OK');
- assert.ok(op.matchesSingleElement(match.a));
- assert.ok(!op.matchesSingleElement(notMatch.a));
- },
- "Should match multiple elements": function() {
- var baseOperand1={"$gt":1},
- baseOperand2={"$lt":10},
- notMatch1={"a":[0,1]},
- notMatch2={"a":[10,11]},
- match={"a":[0,5,11]},
- gt = new GTMatchExpression(),
- lt = new LTMatchExpression(),
- op = new ElemMatchValueMatchExpression();
- assert.strictEqual(gt.init("", baseOperand1.$gt).code, 'OK');
- assert.strictEqual(lt.init("", baseOperand2.$lt).code, 'OK');
- assert.strictEqual(op.init("a").code, 'OK');
- op.add(gt);
- op.add(lt);
- assert.ok(!op.matchesSingleElement(notMatch1.a));
- assert.ok(!op.matchesSingleElement(notMatch2.a));
- assert.ok(op.matchesSingleElement(match.a));
- },
- "Should match a non array": function() {
- var baseOperand={"$gt":5},
- gt = new GTMatchExpression(),
- op = new ElemMatchObjectMatchExpression();
- assert.strictEqual(gt.init("", baseOperand.$gt).code, 'OK');
- assert.strictEqual(op.init("a", gt).code, 'OK');
- // Directly nested objects are not matched with $elemMatch. An intervening array is
- // required.
- assert.ok(!op.matches({"a":6},null));
- assert.ok(!op.matches({"a":{"0":6}},null));
- },
- "Should match an array scalar": function() {
- var baseOperand={"$gt":5},
- gt = new GTMatchExpression(),
- op = new ElemMatchValueMatchExpression();
- assert.strictEqual(gt.init("", baseOperand.$gt).code, 'OK');
- assert.strictEqual(op.init("a", gt).code, 'OK');
- assert.ok(op.matches({"a":[6]},null));
- assert.ok(op.matches({"a":[4,6]},null));
- assert.ok(op.matches({"a":[{},7]},null));
- },
- "Should match multiple named values": function() {
- var baseOperand={"$gt":5},
- gt = new GTMatchExpression(),
- op = new ElemMatchValueMatchExpression();
- assert.strictEqual(gt.init("", baseOperand.$gt).code, 'OK');
- assert.strictEqual(op.init("a.b", gt).code, 'OK');
- assert.ok(op.matches({"a":[{"b":[6]}]}, null));
- assert.ok(op.matches({"a":[{"b":[4]}, {"b":[4,6]}]}, null));
- },
- "ElemMatchKey should return the appropriate values": function() {
- var baseOperand={"$gt":6},
- gt = new GTMatchExpression(),
- op = new ElemMatchValueMatchExpression(),
- details = new MatchDetails();
- assert.strictEqual(gt.init("", baseOperand.$gt).code, 'OK');
- assert.strictEqual(op.init("a.b", gt).code, 'OK');
- details.requestElemMatchKey();
- assert.ok(!op.matches({}, details));
- assert.ok(!details.hasElemMatchKey());
- assert.ok(!op.matches({"a":{"b":[2]}}, details));
- assert.ok(!details.hasElemMatchKey());
- assert.ok(op.matches({"a":{"b":[3,7]}}, details));
- assert.ok(details.hasElemMatchKey());
- // The entry within the $elemMatch array is reported.
- assert.strictEqual("1", details.elemMatchKey());
- assert.ok(op.matches({"a":[1, 2, {"b":[3,7]}]}, details));
- assert.ok(details.hasElemMatchKey());
- // The entry within a parent of the $elemMatch array is reported.
- assert.strictEqual("2", details.elemMatchKey());
- }
- }
- };
- if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit);
|