forked from GitHub/gf-core
Added testing of Expr unapplying in py-bindings.
This commit is contained in:
@@ -7,6 +7,9 @@ exdir=../../examples/tutorial/embedded
|
|||||||
|
|
||||||
build: gf.so
|
build: gf.so
|
||||||
|
|
||||||
|
test:
|
||||||
|
python test.py
|
||||||
|
|
||||||
gf.so: PyGF.hs gfmodule.c Query.pgf
|
gf.so: PyGF.hs gfmodule.c Query.pgf
|
||||||
ghc $(import) --make -fglasgow-exts -O2 -no-hs-main -c $<
|
ghc $(import) --make -fglasgow-exts -O2 -no-hs-main -c $<
|
||||||
ghc -O2 --make -fglasgow-exts -no-hs-main -optl '-shared' \
|
ghc -O2 --make -fglasgow-exts -no-hs-main -optl '-shared' \
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import unittest
|
|||||||
|
|
||||||
|
|
||||||
samples = [
|
samples = [
|
||||||
("Odd (Number 89)",
|
(['Odd', ['Number', 89]],
|
||||||
{'eng': "is 89 odd",
|
{'eng': "is 89 odd",
|
||||||
'spa': "89 es impar"}),
|
'spa': "89 es impar"}),
|
||||||
("Prime (Number 21)",
|
(['Prime', ['Number', 21]],
|
||||||
{'eng': "is 21 prime",
|
{'eng': "is 21 prime",
|
||||||
'spa': "21 es primo"})]
|
'spa': "21 es primo"})]
|
||||||
|
|
||||||
@@ -21,6 +21,22 @@ def lang2iso(l):
|
|||||||
assert(s[:5],"Query")
|
assert(s[:5],"Query")
|
||||||
return s[5:].lower()
|
return s[5:].lower()
|
||||||
|
|
||||||
|
def exp2str(e):
|
||||||
|
def e2s(e,n):
|
||||||
|
if type(e) == type([2]):
|
||||||
|
f = e[0]
|
||||||
|
sr = ' '.join([e2s(arg,n+1) for arg in e[1:]])
|
||||||
|
ret =f + ' ' + sr
|
||||||
|
return n and '('+ret+')' or ret
|
||||||
|
elif type(e) == type('2'):
|
||||||
|
return e
|
||||||
|
elif type(e) == type(2):
|
||||||
|
return `e`
|
||||||
|
else:
|
||||||
|
raise ValueError, "Do not know how to render " + `e`
|
||||||
|
return e2s(e,0)
|
||||||
|
|
||||||
|
|
||||||
import re
|
import re
|
||||||
hexre = re.compile('0x[0-9a-f]+:[ ]*')
|
hexre = re.compile('0x[0-9a-f]+:[ ]*')
|
||||||
def rmprefix(obj):
|
def rmprefix(obj):
|
||||||
@@ -68,10 +84,11 @@ class TestParsing(unittest.TestCase):
|
|||||||
pgf = gf.read_pgf(self.pgf)
|
pgf = gf.read_pgf(self.pgf)
|
||||||
l = gf.read_language(self.lang)
|
l = gf.read_language(self.lang)
|
||||||
for abs,cnc in self.lexed:
|
for abs,cnc in self.lexed:
|
||||||
|
rabs = exp2str(abs)
|
||||||
ps = pgf.parse(cnc['eng'], l)
|
ps = pgf.parse(cnc['eng'], l)
|
||||||
self.failUnless(ps)
|
self.failUnless(ps)
|
||||||
pt = rmprefix(ps[0])
|
pt = rmprefix(ps[0])
|
||||||
self.assertEqual(pt,abs)
|
self.assertEqual(pt,rabs)
|
||||||
|
|
||||||
|
|
||||||
class TestLinearize(unittest.TestCase):
|
class TestLinearize(unittest.TestCase):
|
||||||
@@ -104,16 +121,26 @@ class TestTranslate(unittest.TestCase):
|
|||||||
|
|
||||||
class TestUnapplyExpr(unittest.TestCase):
|
class TestUnapplyExpr(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
self.samples = samples
|
||||||
self.pgf = gf.read_pgf('Query.pgf')
|
self.pgf = gf.read_pgf('Query.pgf')
|
||||||
self.langs = dict([(lang2iso(l),l) for l in self.pgf.languages()])
|
self.langs = dict([(lang2iso(l),l) for l in self.pgf.languages()])
|
||||||
|
|
||||||
|
def deep_unapp(self,exp):
|
||||||
|
exp = exp.unapply()
|
||||||
|
if type(exp) == type([2]):
|
||||||
|
f = exp[0]
|
||||||
|
return [`f`] + map(self.deep_unapp,exp[1:])
|
||||||
|
else:
|
||||||
|
return exp
|
||||||
|
|
||||||
|
|
||||||
def test_unapply(self):
|
def test_unapply(self):
|
||||||
ps = self.pgf.parse('is 23 odd',self.langs['eng'])
|
lg = 'eng'
|
||||||
f,es = ps[0].unapply()
|
lang = self.langs[lg]
|
||||||
self.assertEqual(`f`,'Odd')
|
for abs,cnc in self.samples:
|
||||||
f,es = es.unapply()
|
parsed = self.pgf.parse(cnc[lg],lang)
|
||||||
self.assertEqual(`f`,'Number')
|
uparsed = self.deep_unapp(parsed[0])
|
||||||
self.assertEqual(es.unapply(),23)
|
self.assertEqual(abs,uparsed)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user