mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-26 19:28:54 -06:00
Handle errors in readExpr
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user