GTMatchExpression_test.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. GTMatchExpression = require("../../../lib/matcher/GTMatchExpression");
  8. exports.GTMatchExpression = {
  9. "should handle invalid End of Object Operand": function() {
  10. var e = new GTMatchExpression();
  11. var s = e.init("",{});
  12. assert.strictEqual(s.code, ErrorCodes.BAD_VALUE);
  13. },
  14. "should match scalars":function() {
  15. var e = new GTMatchExpression();
  16. var s = e.init("a",5);
  17. assert.strictEqual(s.code, ErrorCodes.OK);
  18. assert.ok( e.matchesJSON({"a":5.5}) );
  19. assert.ok( ! e.matchesJSON({"a":4}) );
  20. },
  21. "should match array value": function() {
  22. var e = new GTMatchExpression();
  23. var s = e.init("a",5);
  24. assert.strictEqual(s.code, ErrorCodes.OK);
  25. assert.ok( e.matchesJSON({"a":[3,5.5]}) );
  26. assert.ok( ! e.matchesJSON({"a":[2,4]}) );
  27. },
  28. "should match whole array": function() {
  29. var e = new GTMatchExpression();
  30. var s = e.init("a",[5]);
  31. assert.strictEqual(s.code, ErrorCodes.OK);
  32. assert.ok( ! e.matchesJSON({"a":[4]}) );
  33. assert.ok( ! e.matchesJSON({"a":[5]}) );
  34. assert.ok( e.matchesJSON({"a":[6]}) );
  35. // Nested array.
  36. // XXX: The following assertion documents current behavior.
  37. assert.ok( e.matchesJSON({"a":[[4]]}) );
  38. assert.ok( e.matchesJSON({"a":[[5]]}) );
  39. assert.ok( e.matchesJSON({"a":[[6]]}) );
  40. },
  41. "should match null" : function() {
  42. var e = new GTMatchExpression();
  43. var s = e.init("a",null);
  44. assert.strictEqual(s.code, ErrorCodes.OK);
  45. assert.ok( !e.matchesJSON({}) );
  46. assert.ok( !e.matchesJSON({"a":null}) );
  47. assert.ok( ! e.matchesJSON({"a":4}) );
  48. // A non-existent field is treated same way as an empty bson object
  49. assert.ok( ! e.matchesJSON({"b":4}) );
  50. },
  51. "should match dot notation null" : function() {
  52. var e = new GTMatchExpression();
  53. var s = e.init("a.b",null);
  54. assert.strictEqual(s.code, ErrorCodes.OK);
  55. assert(!e.matchesJSON({}) );
  56. assert(!e.matchesJSON({"a":null}) );
  57. assert(!e.matchesJSON({"a":4}));
  58. assert(!e.matchesJSON({"a":{}}));
  59. assert(!e.matchesJSON({"a":[{b:null}]}));
  60. assert(!e.matchesJSON({"a":[{a:4},{b:4}]}));
  61. assert(!e.matchesJSON({"a":[4]}));
  62. assert(!e.matchesJSON({"a":[{b:4}]}));
  63. },
  64. "should match MinKey": function() {
  65. var operand = {a:new BSON.MinKey()},
  66. e = new GTMatchExpression();
  67. var s = e.init("a",operand.a);
  68. assert.strictEqual(s.code, ErrorCodes.OK);
  69. assert(!e.matchesJSON({"a":new BSON.MinKey()}, null));
  70. assert(e.matchesJSON({"a":new BSON.MaxKey()}, null));
  71. assert(e.matchesJSON({"a":4}), null);
  72. },
  73. "should match MaxKey": function() {
  74. var operand = {a:new BSON.MaxKey()},
  75. e = new GTMatchExpression();
  76. var s = e.init("a",operand.a);
  77. assert.strictEqual(s.code, ErrorCodes.OK);
  78. assert(!e.matchesJSON({"a":new BSON.MaxKey()}, null));
  79. assert(!e.matchesJSON({"a":new BSON.MinKey()}, null));
  80. assert(!e.matchesJSON({"a":4}), null);
  81. },
  82. "should handle elemMatchKey":function() {
  83. var e = new GTMatchExpression();
  84. var s = e.init("a",5);
  85. var m = new MatchDetails();
  86. m.requestElemMatchKey();
  87. assert.strictEqual(s.code, ErrorCodes.OK);
  88. assert(!e.matchesJSON({"a":4}, m));
  89. assert(!m.hasElemMatchKey());
  90. assert(e.matchesJSON({"a":6}, m) );
  91. assert(!m.hasElemMatchKey() );
  92. assert(e.matchesJSON({"a":[2,6,5]}, m));
  93. assert(m.hasElemMatchKey());
  94. assert.strictEqual("1", m.elemMatchKey());
  95. },
  96. };