StrcasecmpExpression_test.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. "use strict";
  2. var assert = require("assert"),
  3. StrcasecmpExpression = require("../../../../lib/pipeline/expressions/StrcasecmpExpression"),
  4. Expression = require("../../../../lib/pipeline/expressions/Expression"),
  5. VariablesIdGenerator = require("../../../../lib/pipeline/expressions/VariablesIdGenerator"),
  6. VariablesParseState = require("../../../../lib/pipeline/expressions/VariablesParseState"),
  7. utils = require("./utils"),
  8. constify = utils.constify,
  9. expressionToJson = utils.expressionToJson;
  10. // Mocha one-liner to make these tests self-hosted
  11. if(!module.parent)return(require.cache[__filename]=null,(new(require("mocha"))({ui:"exports",reporter:"spec",grep:process.env.TEST_GREP})).addFile(__filename).run(process.exit));
  12. var TestBase = function TestBase(overrides) {
  13. //NOTE: DEVIATION FROM MONGO: using this base class to make things easier to initialize
  14. for (var key in overrides)
  15. this[key] = overrides[key];
  16. },
  17. ExpectedResultBase = (function() {
  18. var klass = function ExpectedResultBase() {
  19. base.apply(this, arguments);
  20. }, base = TestBase, proto = klass.prototype = Object.create(base.prototype);
  21. proto.run = function(){
  22. this.assertResult(this.expectedResult, this.spec());
  23. this.assertResult(-this.expectedResult, this.reverseSpec());
  24. };
  25. proto.spec = function() { return {$strcasecmp:[this.a, this.b]}; };
  26. proto.reverseSpec = function() { return {$strcasecmp:[this.b, this.a]}; };
  27. proto.assertResult = function(expectedResult, spec) {
  28. var specElement = spec,
  29. idGenerator = new VariablesIdGenerator(),
  30. vps = new VariablesParseState(idGenerator),
  31. expression = Expression.parseOperand(specElement, vps);
  32. assert.deepEqual(constify(spec), expressionToJson(expression));
  33. assert.equal(expectedResult, expression.evaluate({}));
  34. };
  35. return klass;
  36. })();
  37. exports.StrcasecmpExpression = {
  38. "constructor()": {
  39. "should construct instance": function() {
  40. assert(new StrcasecmpExpression() instanceof StrcasecmpExpression);
  41. assert(new StrcasecmpExpression() instanceof Expression);
  42. },
  43. "should error if given args": function() {
  44. assert.throws(function() {
  45. new StrcasecmpExpression("bad stuff");
  46. });
  47. },
  48. },
  49. "#getOpName()": {
  50. "should return the correct op name; $strcasecmp": function(){
  51. assert.equal(new StrcasecmpExpression().getOpName(), "$strcasecmp");
  52. },
  53. },
  54. "#evaluate()": {
  55. "should return '_ab' == '_AB' (w/ null begin)": function NullBegin() {
  56. new ExpectedResultBase({
  57. a: "\0ab",
  58. b: "\0AB",
  59. expectedResult: 0,
  60. }).run();
  61. },
  62. "should return 'ab_' == 'aB_' (w/ null end)": function NullEnd() {
  63. new ExpectedResultBase({
  64. a: "ab\0",
  65. b: "aB\0",
  66. expectedResult: 0,
  67. }).run();
  68. },
  69. "should return 'a_a' < 'a_B' (w/ null middle)": function NullMiddleLt() {
  70. new ExpectedResultBase({
  71. a: "a\0a",
  72. b: "a\0B",
  73. expectedResult: -1,
  74. }).run();
  75. },
  76. "should return 'a_b' == 'a_B' (w/ null middle)": function NullMiddleEq() {
  77. new ExpectedResultBase({
  78. a: "a\0b",
  79. b: "a\0B",
  80. expectedResult: 0,
  81. }).run();
  82. },
  83. "should return 'a_c' > 'a_B' (w/ null middle)": function NullMiddleGt() {
  84. new ExpectedResultBase({
  85. a: "a\0c",
  86. b: "a\0B",
  87. expectedResult: 1,
  88. }).run();
  89. },
  90. },
  91. };