AllElementsTrueExpression_test.js 4.5 KB

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