diff --git a/app/imports/api/creature/computation/newEngine/computeComputation/tests/computeConstants.testFn.js b/app/imports/api/creature/computation/newEngine/computeComputation/tests/computeConstants.testFn.js new file mode 100644 index 00000000..8bf8b91d --- /dev/null +++ b/app/imports/api/creature/computation/newEngine/computeComputation/tests/computeConstants.testFn.js @@ -0,0 +1,28 @@ +import { buildComputationFromProps } from '/imports/api/creature/computation/newEngine/buildCreatureComputation.js'; +import { assert } from 'chai'; +import computeCreatureComputation from '../../computeCreatureComputation.js'; +import clean from '../../utility/cleanProp.testFn.js'; + +export default function(){ + const computation = buildComputationFromProps(testProperties); + computeCreatureComputation(computation); + const prop = id => computation.propsById[id]; + assert.equal(prop('attId').value, 6); +} + +var testProperties = [ + clean({ + _id: 'constId', + type: 'constant', + variableName: 'arrayConstant', + calculation: '[2, 4, 6, 8, 10]', + }), + clean({ + _id: 'attId', + type: 'attribute', + baseValue: { + calculation: 'arrayConstant[3]', + }, + ancestors: [{id: 'charId'}], + }), +]; diff --git a/app/imports/api/creature/computation/newEngine/computeComputation/tests/index.js b/app/imports/api/creature/computation/newEngine/computeComputation/tests/index.js index 1ab60e82..490272e0 100644 --- a/app/imports/api/creature/computation/newEngine/computeComputation/tests/index.js +++ b/app/imports/api/creature/computation/newEngine/computeComputation/tests/index.js @@ -1,6 +1,7 @@ import computeAction from './computeAction.testFn.js'; import computeAttribute from './computeAttribute.testFn.js'; import computeClasses from './computeClasses.testFn.js'; +import computeConstants from './computeConstants.testFn.js'; export default [{ text: 'Computes actions', @@ -11,4 +12,7 @@ export default [{ },{ text: 'Computes classes', fn: computeClasses, +},{ + text: 'Computes constants', + fn: computeConstants, }]; diff --git a/app/imports/parser/parseTree/SymbolNode.js b/app/imports/parser/parseTree/SymbolNode.js index 8f5e4bb9..814ea261 100644 --- a/app/imports/parser/parseTree/SymbolNode.js +++ b/app/imports/parser/parseTree/SymbolNode.js @@ -9,18 +9,22 @@ export default class SymbolNode extends ParseNode { toString(){ return `${this.name}` } - compile(scope, context){ + compile(scope, context, calledFromReduce = false){ let value = scope && scope[this.name]; let type = typeof value; - // For parse nodes, compile and return - if (value instanceof ParseNode){ - return value.compile(scope, context); - } // For objects, default to their .value if (type === 'object'){ value = value.value; type = typeof value; } + // For parse nodes, compile and return + if (value instanceof ParseNode){ + if (calledFromReduce){ + return value.reduce(scope, context); + } else { + return value.compile(scope, context); + } + } if (type === 'string' || type === 'number' || type === 'boolean'){ return new ConstantNode({value, type}); } else if (type === 'undefined'){ @@ -32,7 +36,7 @@ export default class SymbolNode extends ParseNode { } } reduce(scope, context){ - let result = this.compile(scope); + let result = this.compile(scope, context, true); if (result instanceof SymbolNode){ if (context) context.storeError({ type: 'info',