LTEMatchExpression.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. var assert = require("assert"),
  3. BSON = require("bson"),
  4. MatchDetails = require("../../../../lib/pipeline/matcher/MatchDetails"),
  5. LTEMatchExpression = require("../../../../lib/pipeline/matcher/LTEMatchExpression");
  6. module.exports = {
  7. "LTEMatchExpression": {
  8. "should match element": function (){
  9. var operand = {$lte:5},
  10. match = {a:4.5},
  11. equalMatch = {a:5},
  12. notMatch = {a:6},
  13. notMatchWrongType = {a:"foo"},
  14. lte = new LTEMatchExpression();
  15. var s = lte.init("",operand.$lte);
  16. assert.strictEqual(s.code, "OK");
  17. assert.ok(lte.matchesSingleElement(match.a));
  18. assert.ok(lte.matchesSingleElement(equalMatch.a));
  19. assert.ok(!lte.matchesSingleElement(notMatch.a));
  20. assert.ok(!lte.matchesSingleElement(notMatchWrongType.a));
  21. },
  22. "should not work for invalid eoo operand": function(){
  23. var operand = {},
  24. lte = new LTEMatchExpression();
  25. assert.ok(lte.init("", operand).code !== "OK");
  26. },
  27. "should match scalars properly": function (){
  28. var operand = {$lte:5},
  29. lte = new LTEMatchExpression();
  30. var s = lte.init("a",operand.$lte);
  31. assert.strictEqual(s.code, "OK");
  32. assert.ok(lte.matchesJSON({"a":4.5}, null));
  33. assert.ok(!lte.matchesJSON({"a":6}), null);
  34. },
  35. "should match array value": function() {
  36. var e = new LTEMatchExpression();
  37. var s = e.init("a",5);
  38. assert.strictEqual(s.code, "OK");
  39. assert.ok( e.matchesJSON({"a":[6,4.5]}) );
  40. assert.ok( ! e.matchesJSON({"a":[6,7]}) );
  41. },
  42. "should match whole array" : function() {
  43. var e = new LTEMatchExpression(),
  44. s = e.init("a",[5]);
  45. assert.strictEqual(s.code, "OK");
  46. assert.ok(e.matchesJSON({"a":[4]}));
  47. assert.ok(e.matchesJSON({"a":[5]}));
  48. assert.ok(!e.matchesJSON({"a":[6]}));
  49. assert.ok(e.matchesJSON({"a":[[4]]}));
  50. assert.ok(e.matchesJSON({"a":[[5]]}));
  51. assert.ok(!e.matchesJSON({"a":[[6]]}));
  52. },
  53. "should match null" : function() {
  54. var e = new LTEMatchExpression();
  55. var s = e.init("a",null);
  56. assert.strictEqual(s.code, "OK");
  57. assert.ok( e.matchesJSON({}) );
  58. assert.ok( e.matchesJSON({"a":null}) );
  59. assert.ok( ! e.matchesJSON({"a":4}) );
  60. // A non-existent field is treated same way as an empty bson object
  61. assert.ok( e.matchesJSON({"b":4}) );
  62. },
  63. "should match dot notation null" : function() {
  64. var e = new LTEMatchExpression();
  65. var s = e.init("a.b",null);
  66. assert.strictEqual(s.code, "OK");
  67. assert.ok( e.matchesJSON({}) );
  68. assert.ok( e.matchesJSON({"a":null}) );
  69. assert.ok( e.matchesJSON({"a":4}) );
  70. assert.ok( e.matchesJSON({"a":{}}) );
  71. assert.ok( e.matchesJSON({"a":[{b:null}]}) );
  72. assert.ok( e.matchesJSON({"a":[{a:4},{b:4}]}) );
  73. assert.ok( ! e.matchesJSON({"a":[4]}) );
  74. assert.ok( ! e.matchesJSON({"a":[{b:4}]}) );
  75. },
  76. "should match MinKey": function (){
  77. var operand = {a:new BSON.MinKey()},
  78. e = new LTEMatchExpression();
  79. var s = e.init("a",operand.a);
  80. assert.strictEqual(s.code, "OK");
  81. assert.ok(e.matchesJSON({"a":new BSON.MinKey()}, null));
  82. assert.ok(!e.matchesJSON({"a":new BSON.MaxKey()}, null));
  83. assert.ok(!e.matchesJSON({"a":4}), null);
  84. },
  85. "should match MaxKey": function (){
  86. var operand = {a:new BSON.MaxKey()},
  87. e = new LTEMatchExpression();
  88. var s = e.init("a",operand.a);
  89. assert.strictEqual(s.code, "OK");
  90. assert.ok(e.matchesJSON({"a":new BSON.MaxKey()}, null));
  91. assert.ok(e.matchesJSON({"a":new BSON.MinKey()}, null));
  92. assert.ok(e.matchesJSON({"a":4}), null);
  93. },
  94. "should handle elemMatchKey":function() {
  95. var e = new LTEMatchExpression();
  96. var s = e.init("a",5);
  97. var m = new MatchDetails();
  98. m.requestElemMatchKey();
  99. assert.strictEqual( s.code, "OK" );
  100. assert.ok( ! e.matchesJSON({"a":6}, m) );
  101. assert.ok( ! m.hasElemMatchKey() );
  102. assert.ok( e.matchesJSON({"a":4}, m) );
  103. assert.ok( ! m.hasElemMatchKey() );
  104. assert.ok( e.matchesJSON({"a":[6,2,5]}, m));
  105. assert.ok( m.hasElemMatchKey());
  106. assert.strictEqual("1", m.elemMatchKey());
  107. }
  108. }
  109. };
  110. if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit);