UNPKG

expression-calculator

Version:

Calculate expressions without using `eval()`, using LL(1) syntax analyzer.

170 lines (167 loc) 5.17 kB
import assert from 'assert'; import { NUM, VAR, OPER } from './types'; import SyntaxChecker from './syntax'; describe('Syntax Checker Test',function(){ it('1+1',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('1+1') ],[ {type:NUM,value:"1"}, {type:OPER,value:'+'}, {type:NUM,value:"1"} ]); }); it('多次读取',function(){ let checker=new SyntaxChecker('1+1'); assert.deepStrictEqual([ ...checker ],[ {type:NUM,value:"1"}, {type:OPER,value:'+'}, {type:NUM,value:"1"} ]); assert.deepStrictEqual([ ...checker ],[ {type:NUM,value:"1"}, {type:OPER,value:'+'}, {type:NUM,value:"1"} ]); }); it('1 + 1',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('1 + 1') ],[ {type:NUM,value:"1"}, {type:OPER,value:'+'}, {type:NUM,value:"1"} ]); }); it(' a * b+1 ',function(){ assert.deepStrictEqual([ ...new SyntaxChecker(' a * b+1 ') ],[ {type:VAR,value:"a"}, {type:OPER,value:'*'}, {type:VAR,value:"b"}, {type:OPER,value:'+'}, {type:NUM,value:"1"} ]); }); it('0x43 + 0.234 - 1334.3244 * 2e-32 / 0.3e+12 + 1',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('0x43 + 0.234 - 1334.3244 * 2e-32 / 0.3e+12 + 1') ],[ {type:NUM,value:"0x43"}, {type:OPER,value:'+'}, {type:NUM,value:"0.234"}, {type:OPER,value:'-'}, {type:NUM,value:"1334.3244"}, {type:OPER,value:'*'}, {type:NUM,value:"2e-32"}, {type:OPER,value:'/'}, {type:NUM,value:"0.3e+12"}, {type:OPER,value:'+'}, {type:NUM,value:"1"} ]); }); it('数字1+数字2',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('数字1+数字2') ],[ {type:VAR,value:"数字1"}, {type:OPER,value:'+'}, {type:VAR,value:"数字2"} ]); }); it('数字1 ** 数字2',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('数字1 ** 数字2') ],[ {type:VAR,value:"数字1"}, {type:OPER,value:'**'}, {type:VAR,value:"数字2"} ]); }); it('1$1',function(){ assert.throws(()=>[ ...new SyntaxChecker('1$1') ],new SyntaxError('Unexpected Character at position 1')); }); it('!12',function(){ assert.throws(()=>[ ...new SyntaxChecker('!12') ],new SyntaxError('Unexpected Character at position 0')); }); it(' 1 + 1 !',function(){ assert.throws(()=>[ ...new SyntaxChecker(' 1 + 1 !') ],new SyntaxError('Unexpected Character at position 15')); }); it('23.43.23',function(){ assert.throws(()=>[ ...new SyntaxChecker('23.43.23') ],new SyntaxError('Unexpected Character at position 5')); }); it('-1+-1',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('-1+-1') ],[ {type:OPER,value:"NEG"}, {type:NUM,value:"1"}, {type:OPER,value:"+"}, {type:OPER,value:"NEG"}, {type:NUM,value:"1"} ]); }); it('2333+(-1-666)',function(){ assert.deepStrictEqual([ ...new SyntaxChecker('2333+(-1-666)') ],[ {type:NUM,value:"2333"}, {type:OPER,value:"+"}, {type:OPER,value:"("}, {type:OPER,value:"NEG"}, {type:NUM,value:"1"}, {type:OPER,value:"-"}, {type:NUM,value:"666"}, {type:OPER,value:")"} ]); }); }); describe('Syntax Error Test',function(){ it('--1',function(){ assert.throws(()=>[ ...new SyntaxChecker('--1') ],new SyntaxError('Invalid input at position 1')); }); it('---1',function(){ assert.throws(()=>[ ...new SyntaxChecker('---1') ],new SyntaxError('Invalid input at position 1')); }); it('-+-1',function(){ assert.throws(()=>[ ...new SyntaxChecker('-+-1') ],new SyntaxError('Invalid input at position 1')); }); it('-1+--1',function(){ assert.throws(()=>[ ...new SyntaxChecker('-1+--1') ],new SyntaxError('Invalid input at position 4')); }); it('((1+2)',function(){ assert.throws(()=>[ ...new SyntaxChecker('((1+2)') ],new SyntaxError('Bracket mismatch')); }); it('(1+2))',function(){ assert.throws(()=>[ ...new SyntaxChecker('(1+2))') ],new SyntaxError('Bracket mismatch')); }); });