Completes unit tests for PostScript evaluator and fixes two bugs in the evaluator itself
This commit is contained in:
parent
f8b3444b18
commit
4caf5b694e
@ -659,14 +659,14 @@ var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
|
|||||||
break;
|
break;
|
||||||
case 'neg':
|
case 'neg':
|
||||||
a = stack.pop();
|
a = stack.pop();
|
||||||
stack.push(-b);
|
stack.push(-a);
|
||||||
break;
|
break;
|
||||||
case 'not':
|
case 'not':
|
||||||
a = stack.pop();
|
a = stack.pop();
|
||||||
if (isBool(a) && isBool(b)) {
|
if (isBool(a)) {
|
||||||
stack.push(a && b);
|
stack.push(!a);
|
||||||
} else {
|
} else {
|
||||||
stack.push(a & b);
|
stack.push(~a);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'or':
|
case 'or':
|
||||||
|
@ -81,7 +81,7 @@ describe('function', function() {
|
|||||||
});
|
});
|
||||||
it('handles missing brackets', function() {
|
it('handles missing brackets', function() {
|
||||||
expect(function() { parse('{'); }).toThrow(
|
expect(function() { parse('{'); }).toThrow(
|
||||||
new Error('Unexpected symbol: found undefined expected 1.'));
|
new Error('Unexpected symbol: found undefined expected 1.'));
|
||||||
});
|
});
|
||||||
it('handles junk after the end', function() {
|
it('handles junk after the end', function() {
|
||||||
var number = 3.3;
|
var number = 3.3;
|
||||||
@ -142,21 +142,41 @@ describe('function', function() {
|
|||||||
var expectedStack = [3];
|
var expectedStack = [3];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
it('boolean ands', function() {
|
it('boolean and', function() {
|
||||||
var stack = evaluate('{ true false and }');
|
var stack = evaluate('{ true false and }');
|
||||||
var expectedStack = [false];
|
var expectedStack = [false];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
it('bitwise ands', function() {
|
it('bitwise and', function() {
|
||||||
var stack = evaluate('{ 254 1 and }');
|
var stack = evaluate('{ 254 1 and }');
|
||||||
var expectedStack = [254 & 1];
|
var expectedStack = [254 & 1];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
// TODO atan
|
it('calculates the inverse tangent of a number', function() {
|
||||||
// TODO bitshift
|
var stack = evaluate('{ 90 atan }');
|
||||||
// TODO ceiling
|
var expectedStack = [Math.atan(90)];
|
||||||
// TODO copy
|
expect(stack).toMatchArray(expectedStack);
|
||||||
// TODO cos
|
});
|
||||||
|
it('handles bitshifting ', function() {
|
||||||
|
var stack = evaluate('{ 50 2 bitshift }');
|
||||||
|
var expectedStack = [200];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates the ceiling value', function() {
|
||||||
|
var stack = evaluate('{ 9.9 ceiling }');
|
||||||
|
var expectedStack = [10];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('copies', function() {
|
||||||
|
var stack = evaluate('{ 99 98 2 copy }');
|
||||||
|
var expectedStack = [99, 98, 99, 98];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates the cosine of a number', function() {
|
||||||
|
var stack = evaluate('{ 90 cos }');
|
||||||
|
var expectedStack = [Math.cos(90)];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
it('converts to int', function() {
|
it('converts to int', function() {
|
||||||
var stack = evaluate('{ 9.9 cvi }');
|
var stack = evaluate('{ 9.9 cvi }');
|
||||||
var expectedStack = [9];
|
var expectedStack = [9];
|
||||||
@ -167,24 +187,76 @@ describe('function', function() {
|
|||||||
var expectedStack = [-9];
|
var expectedStack = [-9];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
// TODO cvr
|
it('converts to real', function() {
|
||||||
// TODO div
|
var stack = evaluate('{ 55.34 cvr }');
|
||||||
|
var expectedStack = [55.34];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('divides', function() {
|
||||||
|
var stack = evaluate('{ 6 5 div }');
|
||||||
|
var expectedStack = [1.2];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('maps division by zero to infinity', function() {
|
||||||
|
var stack = evaluate('{ 6 0 div }');
|
||||||
|
var expectedStack = [Infinity];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
it('duplicates', function() {
|
it('duplicates', function() {
|
||||||
var stack = evaluate('{ 99 dup }');
|
var stack = evaluate('{ 99 dup }');
|
||||||
var expectedStack = [99, 99];
|
var expectedStack = [99, 99];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
// TODO eq
|
it('accepts an equality', function() {
|
||||||
|
var stack = evaluate('{ 9 9 eq }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('rejects an inequality', function() {
|
||||||
|
var stack = evaluate('{ 9 8 eq }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
it('exchanges', function() {
|
it('exchanges', function() {
|
||||||
var stack = evaluate('{ 44 99 exch }');
|
var stack = evaluate('{ 44 99 exch }');
|
||||||
var expectedStack = [99, 44];
|
var expectedStack = [99, 44];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
// TODO exp
|
it('handles exponentiation', function() {
|
||||||
// TODO false
|
var stack = evaluate('{ 10 2 exp }');
|
||||||
// TODO floor
|
var expectedStack = [100];
|
||||||
// TODO ge
|
expect(stack).toMatchArray(expectedStack);
|
||||||
// TODO gt
|
});
|
||||||
|
it('pushes false onto the stack', function() {
|
||||||
|
var stack = evaluate('{ false }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates the floor value', function() {
|
||||||
|
var stack = evaluate('{ 9.9 floor }');
|
||||||
|
var expectedStack = [9];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('handles greater than or equal to', function() {
|
||||||
|
var stack = evaluate('{ 10 9 ge }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('rejects less than for greater than or equal to', function() {
|
||||||
|
var stack = evaluate('{ 8 9 ge }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('handles greater than', function() {
|
||||||
|
var stack = evaluate('{ 10 9 gt }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('rejects less than or equal for greater than', function() {
|
||||||
|
var stack = evaluate('{ 9 9 gt }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
it('divides to integer', function() {
|
it('divides to integer', function() {
|
||||||
var stack = evaluate('{ 2 3 idiv }');
|
var stack = evaluate('{ 2 3 idiv }');
|
||||||
var expectedStack = [0];
|
var expectedStack = [0];
|
||||||
@ -200,16 +272,86 @@ describe('function', function() {
|
|||||||
var expectedStack = [4, 3, 2, 1, 3];
|
var expectedStack = [4, 3, 2, 1, 3];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
// TODO le
|
it('handles less than or equal to', function() {
|
||||||
// TODO ln
|
var stack = evaluate('{ 9 10 le }');
|
||||||
// TODO log
|
var expectedStack = [true];
|
||||||
// TODO lt
|
expect(stack).toMatchArray(expectedStack);
|
||||||
// TODO mod
|
});
|
||||||
// TODO mul
|
it('rejects greater than for less than or equal to', function() {
|
||||||
// TODO ne
|
var stack = evaluate('{ 10 9 le }');
|
||||||
// TODO neg
|
var expectedStack = [false];
|
||||||
// TODO not
|
expect(stack).toMatchArray(expectedStack);
|
||||||
// TODO or
|
});
|
||||||
|
it('calculates the natural logarithm', function() {
|
||||||
|
var stack = evaluate('{ 10 ln }');
|
||||||
|
var expectedStack = [Math.log(10)];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates the base 10 logarithm', function() {
|
||||||
|
var stack = evaluate('{ 100 log }');
|
||||||
|
var expectedStack = [2];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('handles less than', function() {
|
||||||
|
var stack = evaluate('{ 9 10 lt }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('rejects greater than or equal to for less than', function() {
|
||||||
|
var stack = evaluate('{ 10 9 lt }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('performs the modulo operation', function() {
|
||||||
|
var stack = evaluate('{ 4 3 mod }');
|
||||||
|
var expectedStack = [1];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('multiplies two numbers (positive result)', function() {
|
||||||
|
var stack = evaluate('{ 9 8 mul }');
|
||||||
|
var expectedStack = [72];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('multiplies two numbers (negative result)', function() {
|
||||||
|
var stack = evaluate('{ 9 -8 mul }');
|
||||||
|
var expectedStack = [-72];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('accepts an inequality', function() {
|
||||||
|
var stack = evaluate('{ 9 8 ne }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('rejects an equality', function() {
|
||||||
|
var stack = evaluate('{ 9 9 ne }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('negates', function() {
|
||||||
|
var stack = evaluate('{ 4.5 neg }');
|
||||||
|
var expectedStack = [-4.5];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('boolean not', function() {
|
||||||
|
var stack = evaluate('{ true not }');
|
||||||
|
var expectedStack = [false];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('bitwise not', function() {
|
||||||
|
var stack = evaluate('{ 12 not }');
|
||||||
|
var expectedStack = [-13];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('boolean or', function() {
|
||||||
|
var stack = evaluate('{ true false or }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('bitwise or', function() {
|
||||||
|
var stack = evaluate('{ 254 1 or }');
|
||||||
|
var expectedStack = [254 | 1];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
it('pops stack', function() {
|
it('pops stack', function() {
|
||||||
var stack = evaluate('{ 1 2 pop }');
|
var stack = evaluate('{ 1 2 pop }');
|
||||||
var expectedStack = [1];
|
var expectedStack = [1];
|
||||||
@ -225,13 +367,51 @@ describe('function', function() {
|
|||||||
var expectedStack = [3, 2, 2, 1];
|
var expectedStack = [3, 2, 2, 1];
|
||||||
expect(stack).toMatchArray(expectedStack);
|
expect(stack).toMatchArray(expectedStack);
|
||||||
});
|
});
|
||||||
// TODO round
|
it('rounds a number', function() {
|
||||||
// TODO sin
|
var stack = evaluate('{ 9.52 round }');
|
||||||
// TODO sqrt
|
var expectedStack = [10];
|
||||||
// TODO sub
|
expect(stack).toMatchArray(expectedStack);
|
||||||
// TODO true
|
});
|
||||||
// TODO truncate
|
it('calculates the sine of a number', function() {
|
||||||
// TODO xor
|
var stack = evaluate('{ 90 sin }');
|
||||||
|
var expectedStack = [Math.sin(90)];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates a square root (integer)', function() {
|
||||||
|
var stack = evaluate('{ 100 sqrt }');
|
||||||
|
var expectedStack = [10];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates a square root (float)', function() {
|
||||||
|
var stack = evaluate('{ 99 sqrt }');
|
||||||
|
var expectedStack = [Math.sqrt(99)];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('subtracts (positive result)', function() {
|
||||||
|
var stack = evaluate('{ 6 4 sub }');
|
||||||
|
var expectedStack = [2];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('subtracts (negative result)', function() {
|
||||||
|
var stack = evaluate('{ 4 6 sub }');
|
||||||
|
var expectedStack = [-2];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('pushes true onto the stack', function() {
|
||||||
|
var stack = evaluate('{ true }');
|
||||||
|
var expectedStack = [true];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('truncates a number', function() {
|
||||||
|
var stack = evaluate('{ 35.004 truncate }');
|
||||||
|
var expectedStack = [35];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
|
it('calculates an exclusive or value', function() {
|
||||||
|
var stack = evaluate('{ 3 9 xor }');
|
||||||
|
var expectedStack = [10];
|
||||||
|
expect(stack).toMatchArray(expectedStack);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user