LTMatchExpression_test.js 4.3 KB

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