AnyElementTrueExpression_test.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. "use strict";
  2. var assert = require("assert"),
  3. VariablesIdGenerator = require("../../../../lib/pipeline/expressions/VariablesIdGenerator"),
  4. VariablesParseState = require("../../../../lib/pipeline/expressions/VariablesParseState"),
  5. AnyElementTrueExpression = require("../../../../lib/pipeline/expressions/AnyElementTrueExpression"),
  6. Expression = require("../../../../lib/pipeline/expressions/Expression");
  7. // Mocha one-liner to make these tests self-hosted
  8. 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));
  9. var ExpectedResultBase = (function() {
  10. var klass = function ExpectedResultBase(overrides) {
  11. //NOTE: DEVIATION FROM MONGO: using this base class to make things easier to initialize
  12. for (var key in overrides)
  13. this[key] = overrides[key];
  14. }, proto = klass.prototype;
  15. proto.run = function() {
  16. var spec = this.getSpec,
  17. args = spec.input;
  18. if (spec.expected !== undefined && spec.expected !== null) {
  19. var fields = spec.expected;
  20. for (var fieldFirst in fields) {
  21. var fieldSecond = fields[fieldFirst],
  22. expected = fieldSecond;
  23. // obj = {<fieldFirst>: args}; //NOTE: DEVIATION FROM MONGO: see parseExpression below
  24. var idGenerator = new VariablesIdGenerator(),
  25. vps = new VariablesParseState(idGenerator),
  26. expr = Expression.parseExpression(fieldFirst, args, vps),
  27. result = expr.evaluate({}),
  28. errMsg = "for expression " + fieldFirst +
  29. " with argument " + JSON.stringify(args) +
  30. " full tree " + JSON.stringify(expr.serialize(false)) +
  31. " expected: " + JSON.stringify(expected) +
  32. " but got: " + JSON.stringify(result);
  33. assert.deepEqual(result, expected, errMsg);
  34. //TODO test optimize here
  35. }
  36. }
  37. if (spec.error !== undefined && spec.error !== null) {
  38. var asserters = spec.error,
  39. n = asserters.length;
  40. for (var i = 0; i < n; ++i) {
  41. // var obj2 = {<asserters[i]>: args}; //NOTE: DEVIATION FROM MONGO: see parseExpression below
  42. var idGenerator2 = new VariablesIdGenerator(),
  43. vps2 = new VariablesParseState(idGenerator2);
  44. assert.throws(function() {
  45. // NOTE: parse and evaluatation failures are treated the same
  46. expr = Expression.parseExpression(asserters[i], args, vps2);
  47. expr.evaluate({});
  48. }); // jshint ignore:line
  49. }
  50. }
  51. };
  52. return klass;
  53. })();
  54. exports.AnyElementTrueExpression = {
  55. "constructor()": {
  56. "should construct instance": function() {
  57. assert(new AnyElementTrueExpression() instanceof AnyElementTrueExpression);
  58. assert(new AnyElementTrueExpression() instanceof Expression);
  59. },
  60. "should error if given args": function() {
  61. assert.throws(function() {
  62. new AnyElementTrueExpression("bad stuff");
  63. });
  64. },
  65. },
  66. "#getOpName()": {
  67. "should return the correct op name; $anyElementTrue": function() {
  68. assert.equal(new AnyElementTrueExpression().getOpName(), "$anyElementTrue");
  69. },
  70. },
  71. "#evaluate()": {
  72. "should return false if just false": function JustFalse() {
  73. new ExpectedResultBase({
  74. getSpec: {
  75. input: [[false]],
  76. expected: {
  77. // $allElementsTrue: false,
  78. $anyElementTrue: false,
  79. }
  80. }
  81. }).run();
  82. },
  83. "should return true if just true": function JustTrue() {
  84. new ExpectedResultBase({
  85. getSpec: {
  86. input: [[true]],
  87. expected: {
  88. // $allElementsTrue: true,
  89. $anyElementTrue: true,
  90. }
  91. }
  92. }).run();
  93. },
  94. "should return false if one true and one false": function OneTrueOneFalse() {
  95. new ExpectedResultBase({
  96. getSpec: {
  97. input: [[true, false]],
  98. expected: {
  99. // $allElementsTrue: false,
  100. $anyElementTrue: true,
  101. }
  102. }
  103. }).run();
  104. },
  105. "should return true if empty": function Empty() {
  106. new ExpectedResultBase({
  107. getSpec: {
  108. input: [[]],
  109. expected: {
  110. // $allElementsTrue: true,
  111. $anyElementTrue: false,
  112. }
  113. }
  114. }).run();
  115. },
  116. "should return true if truthy int": function TrueViaInt() {
  117. new ExpectedResultBase({
  118. getSpec: {
  119. input: [[1]],
  120. expected: {
  121. // $allElementsTrue: true,
  122. $anyElementTrue: true,
  123. }
  124. }
  125. }).run();
  126. },
  127. "should return false if falsy int": function FalseViaInt() {
  128. new ExpectedResultBase({
  129. getSpec: {
  130. input: [[0]],
  131. expected: {
  132. // $allElementsTrue: false,
  133. $anyElementTrue: false,
  134. }
  135. }
  136. }).run();
  137. },
  138. "should error if given null instead of array": function FalseViaInt() {
  139. new ExpectedResultBase({
  140. getSpec: {
  141. input: [null],
  142. error: [
  143. // "$allElementsTrue",
  144. "$anyElementTrue",
  145. ]
  146. }
  147. }).run();
  148. },
  149. },
  150. };