MapExpression_test.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. "use strict";
  2. var assert = require("assert"),
  3. MapExpression = require("../../../../lib/pipeline/expressions/MapExpression"),
  4. Expression = require("../../../../lib/pipeline/expressions/Expression"),
  5. AddExpression = require("../../../../lib/pipeline/expressions/AddExpression"), // jshint ignore:line
  6. IfNullExpression = require("../../../../lib/pipeline/expressions/IfNullExpression"), // jshint ignore:line
  7. Variables = require("../../../../lib/pipeline/expressions/Variables"),
  8. VariablesIdGenerator = require("../../../../lib/pipeline/expressions/VariablesIdGenerator"),
  9. VariablesParseState = require("../../../../lib/pipeline/expressions/VariablesParseState"),
  10. DepsTracker = require("../../../../lib/pipeline/DepsTracker"),
  11. utils = require("./utils"),
  12. constify = utils.constify,
  13. expressionToJson = utils.expressionToJson;
  14. // Mocha one-liner to make these tests self-hosted
  15. 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));
  16. exports.MapExpression = {
  17. "constructor()": {
  18. "should accept 4 arguments": function () {
  19. new MapExpression(1, 2, 3, 4);
  20. },
  21. "should accept only 4 arguments": function () {
  22. assert.throws(function () { new MapExpression(); });
  23. assert.throws(function () { new MapExpression(1); });
  24. assert.throws(function () { new MapExpression(1, 2); });
  25. assert.throws(function () { new MapExpression(1, 2, 3); });
  26. assert.throws(function () { new MapExpression(1, 2, 3, 4, 5); });
  27. },
  28. },
  29. "#optimize()": {
  30. "should optimize both $map.input and $map.in": function() {
  31. var spec = {$map:{
  32. input: {$ifNull:[null, {$const:[1,2,3]}]},
  33. as: "i",
  34. in: {$add:["$$i","$$i",1,2]},
  35. }},
  36. idGenerator = new VariablesIdGenerator(),
  37. vps = new VariablesParseState(idGenerator),
  38. expr = Expression.parseOperand(spec, vps),
  39. optimized = expr.optimize();
  40. assert.strictEqual(optimized, expr, "should be same reference");
  41. assert.deepEqual(expressionToJson(optimized._input), {$const:[1,2,3]});
  42. assert.deepEqual(expressionToJson(optimized._each), constify({$add:["$$i","$$i",1,2]}));
  43. },
  44. },
  45. "#serialize()": {
  46. "should serialize to consistent order": function() {
  47. var spec = {$map:{
  48. as: "i",
  49. in: {$add:["$$i","$$i"]},
  50. input: {$const:[1,2,3]},
  51. }},
  52. expected = {$map:{
  53. input: {$const:[1,2,3]},
  54. as: "i",
  55. in: {$add:["$$i","$$i"]},
  56. }},
  57. idGenerator = new VariablesIdGenerator(),
  58. vps = new VariablesParseState(idGenerator),
  59. expr = Expression.parseOperand(spec, vps);
  60. assert.deepEqual(expressionToJson(expr), expected);
  61. },
  62. },
  63. "#evaluate()": {
  64. "should be able to map over a simple array": function() {
  65. var spec = {$map:{
  66. input: {$const:[1,2,3]},
  67. as: "i",
  68. in: {$add:["$$i","$$i"]},
  69. }},
  70. idGenerator = new VariablesIdGenerator(),
  71. vps = new VariablesParseState(idGenerator),
  72. expr = Expression.parseOperand(spec, vps),
  73. vars = new Variables(1, {}); // must set numVars (usually handled by doc src)
  74. assert.deepEqual(expr.evaluate(vars), [2, 4, 6]);
  75. },
  76. },
  77. "#addDependencies()": {
  78. "should add dependencies to both $map.input and $map.in": function () {
  79. var spec = {$map:{
  80. input: "$inputArray",
  81. as: "i",
  82. in: {$add:["$$i","$someConst"]},
  83. }},
  84. idGenerator = new VariablesIdGenerator(),
  85. vps = new VariablesParseState(idGenerator),
  86. expr = Expression.parseOperand(spec, vps),
  87. deps = new DepsTracker();
  88. expr.addDependencies(deps);
  89. assert.strictEqual(Object.keys(deps.fields).length, 2);
  90. assert.strictEqual("inputArray" in deps.fields, true);
  91. assert.strictEqual("someConst" in deps.fields, true);
  92. assert.strictEqual(deps.needWholeDocument, false);
  93. assert.strictEqual(deps.needTextScore, false);
  94. },
  95. },
  96. };