LTEMatchExpression.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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:4.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));
  18. assert.ok(lte.matchesSingleElement(equalMatch));
  19. assert.ok(!lte.matchesSingleElement(notMatch));
  20. assert.ok(!lte.matchesSingleElement(notMatchWrongType));
  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 values": function (){
  36. var operand = {$lte:5},
  37. lte = new LTEMatchExpression();
  38. var s = lte.init("a",operand.$lte);
  39. assert.strictEqual(s.code, "OK");
  40. assert.ok(lte.matchesJSON({"a":[6,4.5]}, null));
  41. assert.ok(!lte.matchesJSON({"a":[6,7]}), null);
  42. },
  43. "should match whole arrays": function (){
  44. var operand = {$lte:5},
  45. lte = new LTEMatchExpression();
  46. var s = lte.init("a",operand.$lte);
  47. assert.strictEqual(s.code, "OK");
  48. assert.ok(lte.matchesJSON({"a":[4]}, null));
  49. assert.ok(lte.matchesJSON({"a":[5]}, null));
  50. assert.ok(!lte.matchesJSON({"a":[6]}, null));
  51. // Nested array.
  52. assert.ok(lte.matchesJSON({"a":[[4]]}, null));
  53. assert.ok(lte.matchesJSON({"a":[[5]]}, null));
  54. assert.ok(!lte.matchesJSON({"a":[[6]]}, null));
  55. },
  56. "should match null values": function (){
  57. var operand = {$lte:null},
  58. lte = new LTEMatchExpression();
  59. var s = lte.init("a",operand.$lte);
  60. assert.strictEqual(s.code, "OK");
  61. assert.ok(lte.matchesJSON({}, null));
  62. assert.ok(lte.matchesJSON({"a":null}, null));
  63. assert.ok(!lte.matchesJSON({"a":4}), null);
  64. // A non-existent field is treated same way as an empty bson object
  65. assert.ok(lte.matchesJSON({"b":4}), null);
  66. },
  67. "should match dot notation when null": function (){
  68. var operand = {$lte:null},
  69. lte = new LTEMatchExpression();
  70. var s = lte.init("a.b",operand.$lte);
  71. assert.strictEqual(s.code, "OK");
  72. assert.ok(lte.matchesJSON({}, null));
  73. assert.ok(lte.matchesJSON({"a":null}, null));
  74. assert.ok(lte.matchesJSON({"a":4}), null);
  75. assert.ok(lte.matchesJSON({"a":{}}), null);
  76. assert.ok(lte.matchesJSON({"a":[{b:null}]}), null);
  77. assert.ok(lte.matchesJSON({"a":[{a:4},{b:4}]}), null);
  78. assert.ok(!lte.matchesJSON({"a":[4]}), null);
  79. assert.ok(!lte.matchesJSON({"a":[{b:4}]}), null);
  80. },
  81. "should match MinKey": function (){
  82. var operand = {a:new BSON.MinKey()},
  83. lte = new LTEMatchExpression();
  84. var s = lte.init("a",operand.a);
  85. assert.strictEqual(s.code, "OK");
  86. assert.ok(lte.matchesJSON({"a":new BSON.MinKey()}, null));
  87. assert.ok(!lte.matchesJSON({"a":new BSON.MaxKey()}, null));
  88. assert.ok(!lte.matchesJSON({"a":4}), null);
  89. },
  90. "should match MaxKey": function (){
  91. var operand = {a:new BSON.MaxKey()},
  92. lte = new LTEMatchExpression();
  93. var s = lte.init("a",operand.a);
  94. assert.strictEqual(s.code, "OK");
  95. assert.ok(lte.matchesJSON({"a":new BSON.MaxKey()}, null));
  96. assert.ok(lte.matchesJSON({"a":new BSON.MinKey()}, null));
  97. assert.ok(lte.matchesJSON({"a":4}), null);
  98. },
  99. "should use ElemMatchKey": function(){
  100. var operand = {$lte:5},
  101. lte = new LTEMatchExpression(),
  102. s = lte.init("a",operand.$lte);
  103. assert.strictEqual(s.code, "OK");
  104. var details = new MatchDetails();
  105. details.requestElemMatchKey();
  106. assert(!lte.matchesJSON({a:6}, details));
  107. assert(!details.hasElemMatchKey());
  108. assert(lte.matchesJSON({a:4}, details));
  109. assert(!details.hasElemMatchKey());
  110. assert(lte.matchesJSON({a:[6,2,5]}, details));
  111. assert(details.hasElemMatchKey());
  112. assert.strictEqual(details.elemMatchKey(), "1");
  113. }
  114. }
  115. };
  116. if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit);