pimatic
Version:
A home automation server and framework for the Raspberry PI running on node.js
115 lines (109 loc) • 3.24 kB
text/coffeescript
cassert = require "cassert"
assert = require "assert"
Promise = require 'bluebird'
S = require 'string'
util = require 'util'
_ = require 'lodash'
env = require('../startup').env
describe "ExpressionTreeBuilder", ->
varsAst = require '../lib/variables-ast-builder'
describe '#build', ->
tests = [
{
tokens: [1]
result: "num(1)"
},
{
tokens: [1, '+', 2]
result: "add(num(1), num(2))"
},
{
tokens: [1, '+', 2, '-', 3]
result: "sub(add(num(1), num(2)), num(3))"
},
{
tokens: [1, '*', 2, '+', 3]
result: "add(mul(num(1), num(2)), num(3))"
},
{
tokens: [1, '+', 2, '*', 3]
result: "add(num(1), mul(num(2), num(3)))"
},
{
tokens: ['(', 1, '+', 2, ')', '*', 3]
result: "mul(add(num(1), num(2)), num(3))"
},
{
tokens: ['(', '(', 1, '+', 2, ')', '*', 3, ')']
result: "mul(add(num(1), num(2)), num(3))"
}
{
tokens: ['(', '(', '(', 1, '+', 2, ')', ')', '*', 3, ')']
result: "mul(add(num(1), num(2)), num(3))"
}
{
tokens: [1, '+', '$abc', '*', 3]
result: "add(num(1), mul(var(abc), num(3)))"
},
{
tokens: ['random', '(', ')']
result: "fun(random, [])"
},
{
tokens: ['random', '(', 1, ',', 2, ')']
result: "fun(random, [num(1), num(2)])"
},
{
tokens: [2, '*', 'random', '(', 1, ',', 2, ')']
result: "mul(num(2), fun(random, [num(1), num(2)]))"
},
{
tokens: ['random', '(', 1, ',', 2, ')', '*', 3 ]
result: "mul(fun(random, [num(1), num(2)]), num(3))"
}
{
tokens: ['random', '(', '(', 1, ')', ',', 2, ')', '*', 3 ]
result: "mul(fun(random, [num(1), num(2)]), num(3))"
},
{
tokens: ['random', '(', '(', 1, '*', 2, ')', ',', 2, ')', '*', 3 ]
result: "mul(fun(random, [mul(num(1), num(2)), num(2)]), num(3))"
},
{
tokens: ['random', '(', '(', 1, '-', 2, ')', ',', 2, ')', '*', 3 ]
result: "mul(fun(random, [sub(num(1), num(2)), num(2)]), num(3))"
},
{
tokens: ['"foo"']
result: "str('foo')"
},
{
tokens: ['"foo"', '"bar"']
result: "con(str('foo'), str('bar'))"
},
{
tokens: ['"foo"', '"bar"', '"42"']
result: "con(con(str('foo'), str('bar')), str('42'))"
},
{
tokens: ['"foo"', 1]
result: "con(str('foo'), num(1))"
},
{
tokens: ['"foo"', '(', 1, ')']
result: "con(str('foo'), num(1))"
},
{
tokens: ['"foo"', '(', 1, '*', 2, ')', '"bar"']
result: "con(con(str('foo'), mul(num(1), num(2))), str('bar'))"
}
]
for test in tests
do (test) =>
tokensString = _.reduce(test.tokens, (l,r) -> "#{l} #{r}" )
it "should build from tokens #{tokensString}", ->
variables = {abc: {name: 'abc'}}
functions = {random: {}}
builder = new varsAst.ExpressionTreeBuilder(variables, functions)
expr = builder.build(test.tokens)
assert.equal expr.toString(), test.result