-
Notifications
You must be signed in to change notification settings - Fork 1
/
40_Evaluator.js
77 lines (65 loc) · 2.39 KB
/
40_Evaluator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
var should = require('should');
var _ = require('underscore')._;
var Token = require('../lib/Token.js').Token;
var Types = require('../lib/Token.js').Types;
var Evaluator = require('../lib/Evaluator.js').Evaluator;
describe('Evaluator', function() {
var hpcalc = new Evaluator();
describe('#Evaluator()', function() {
it('should construct a new Evaluator', function() {
hpcalc = new Evaluator();
hpcalc.should.be.an.instanceof(Evaluator);
hpcalc.should.have.property('evaluate');
hpcalc.evaluate.should.be.a('function');
should.ok(hpcalc.hasOwnProperty('result'));
});
});
describe('#tokenize(expression)', function() {
it('should throw on div by zero', function() {
(function() {
hpcalc.evaluate('1/(-1+1)');
}).should.
throw ();
});
it('should throw on mod by zero', function() {
(function() {
hpcalc.evaluate('1%(3+5-2^3)');
}).should.
throw ();
});
it('should memorize variables in the same instance', function() {
hpcalc.evaluate('x=1').should.equal(1);
hpcalc.evaluate('x+1').should.equal(2);
hpcalc.evaluate('x').should.equal(1);
});
it('should not concatenate strings when adding', function() {
hpcalc.variables.set('x', "5");
var actual = hpcalc.evaluate('x+1');
actual.should.equal(6);
});
var tests = {
'1 + 1': 2,
'max(1,2,3,2,1,0,-1)': 3,
'2**3**2': 512,
'-1+1+-1+1': 0,
'-5%4': 3,
'1^2*3/4%5+6-7': -.25,
'-0xA + 3': -7,
'-0b10 + 2': 0,
};
_.each(tests, function(value, key) {
it('should evaluate "' + key + '" = "' + value + '"', function () {
var expected = value;
var actual = hpcalc.evaluate(key);
actual.should.equal(expected);
});
});
});
describe('assignment without LHS', function() {
it('should throw an error', function() {
(function() { hpcalc.evaluate('= sin') }).should.throw();
(function() { hpcalc.evaluate('= sin 3') }).should.throw();
(function() { hpcalc.evaluate('= sin') }).should.throw();
});
});
});