GTMatchExpression.js 3.6 KB

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