LTEMatchExpression_test.js 4.0 KB

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