Handle errors in readExpr

This commit is contained in:
John J. Camilleri
2021-10-08 12:54:36 +02:00
parent a27cf6a17b
commit 71536e8e37
2 changed files with 75 additions and 64 deletions

View File

@@ -201,6 +201,9 @@ function newNGF (abstract_name: string, path?: string): PGFGrammar {
function readExpr (str: string): Expr { function readExpr (str: string): Expr {
const txt = PgfText_FromString(str) const txt = PgfText_FromString(str)
const expr = runtime.pgf_read_expr(txt, unmarshaller.ref()) const expr = runtime.pgf_read_expr(txt, unmarshaller.ref())
if (ref.isNull(expr)) {
throw new PGFError('unable to parse expression')
}
return ref.readObject(expr) as Expr return ref.readObject(expr) as Expr
} }

View File

@@ -210,79 +210,87 @@ describe('abstract syntax', () => {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
describe('expressions', () => { describe('expressions', () => {
test('small integer', () => { test('invalid', () => {
const e1 = PGF.readExpr('123') expect(() => {
const e2 = new PGF.ExprLit(123) PGF.readExpr('->')
const e3 = new PGF.ExprLit(456) }).toThrow(PGF.PGFError)
expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3)
}) })
test('negative integer', () => { describe('literals', () => {
const e1 = PGF.readExpr('-123') test('small integer', () => {
const e2 = new PGF.ExprLit(-123) const e1 = PGF.readExpr('123')
const e3 = new PGF.ExprLit(-456) const e2 = new PGF.ExprLit(123)
expect(e1).toEqual(e2) const e3 = new PGF.ExprLit(456)
expect(e1).not.toEqual(e3) expect(e1).toEqual(e2)
}) expect(e1).not.toEqual(e3)
})
test('big integer', () => { test('negative integer', () => {
const e1 = PGF.readExpr('774763251095801167872') const e1 = PGF.readExpr('-123')
const e2 = new PGF.ExprLit(BigInt('774763251095801167872')) const e2 = new PGF.ExprLit(-123)
expect(e1).toEqual(e2) const e3 = new PGF.ExprLit(-456)
}) expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3)
})
test('negative big integer', () => { test('big integer', () => {
const e1 = PGF.readExpr('-774763251095801167872') const e1 = PGF.readExpr('774763251095801167872')
const e2 = new PGF.ExprLit(BigInt('-774763251095801167872')) const e2 = new PGF.ExprLit(BigInt('774763251095801167872'))
expect(e1).toEqual(e2) expect(e1).toEqual(e2)
}) })
test('really big integer', () => { test('negative big integer', () => {
const e1 = PGF.readExpr('7747632510958011678729003251095801167999') const e1 = PGF.readExpr('-774763251095801167872')
const e2 = new PGF.ExprLit(BigInt('7747632510958011678729003251095801167999')) const e2 = new PGF.ExprLit(BigInt('-774763251095801167872'))
const e3 = new PGF.ExprLit(BigInt('7747632510958011678729003251095801167990')) expect(e1).toEqual(e2)
expect(e1).toEqual(e2) })
expect(e1).not.toEqual(e3)
})
test('negative really big integer', () => { test('really big integer', () => {
const e1 = PGF.readExpr('-7747632510958011678729003251095801167999') const e1 = PGF.readExpr('7747632510958011678729003251095801167999')
const e2 = new PGF.ExprLit(BigInt('-7747632510958011678729003251095801167999')) const e2 = new PGF.ExprLit(BigInt('7747632510958011678729003251095801167999'))
const e3 = new PGF.ExprLit(BigInt('-7747632510958011678729003251095801167990')) const e3 = new PGF.ExprLit(BigInt('7747632510958011678729003251095801167990'))
expect(e1).toEqual(e2) expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3) expect(e1).not.toEqual(e3)
}) })
test('float', () => { test('negative really big integer', () => {
const e1 = PGF.readExpr('3.142') const e1 = PGF.readExpr('-7747632510958011678729003251095801167999')
const e2 = new PGF.ExprLit(3.142) const e2 = new PGF.ExprLit(BigInt('-7747632510958011678729003251095801167999'))
const e3 = new PGF.ExprLit(2.014) const e3 = new PGF.ExprLit(BigInt('-7747632510958011678729003251095801167990'))
expect(e1).toEqual(e2) expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3) expect(e1).not.toEqual(e3)
}) })
test('negative float', () => { test('float', () => {
const e1 = PGF.readExpr('-3.142') const e1 = PGF.readExpr('3.142')
const e2 = new PGF.ExprLit(-3.142) const e2 = new PGF.ExprLit(3.142)
const e3 = new PGF.ExprLit(-2.014) const e3 = new PGF.ExprLit(2.014)
expect(e1).toEqual(e2) expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3) expect(e1).not.toEqual(e3)
}) })
test('string', () => { test('negative float', () => {
const e1 = PGF.readExpr('"abc"') const e1 = PGF.readExpr('-3.142')
const e2 = new PGF.ExprLit('abc') const e2 = new PGF.ExprLit(-3.142)
const e3 = new PGF.ExprLit('def') const e3 = new PGF.ExprLit(-2.014)
expect(e1).toEqual(e2) expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3) expect(e1).not.toEqual(e3)
}) })
test('string unicode', () => { test('string', () => {
const e1 = PGF.readExpr('"açġħ"') const e1 = PGF.readExpr('"abc"')
const e2 = new PGF.ExprLit('açġħ') const e2 = new PGF.ExprLit('abc')
const e3 = new PGF.ExprLit('acgh') const e3 = new PGF.ExprLit('def')
expect(e1).toEqual(e2) expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3) expect(e1).not.toEqual(e3)
})
test('string unicode', () => {
const e1 = PGF.readExpr('"açġħ"')
const e2 = new PGF.ExprLit('açġħ')
const e3 = new PGF.ExprLit('acgh')
expect(e1).toEqual(e2)
expect(e1).not.toEqual(e3)
})
}) })
}) })