LTMatchExpression.js 4.3 KB

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