mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
188 lines
4.8 KiB
Python
188 lines
4.8 KiB
Python
#!/usr/bin/env python
|
|
# GF Python bindings
|
|
# Jordi Saludes 2010
|
|
#
|
|
|
|
|
|
import gf
|
|
import unittest
|
|
|
|
samples = [
|
|
(['Odd', ['Number', 89]],
|
|
{'eng': "is 89 odd",
|
|
'spa': "89 es impar"}),
|
|
(['Prime', ['Number', 21]],
|
|
{'eng': "is 21 prime",
|
|
'spa': "21 es primo"})]
|
|
|
|
def lang2iso(l):
|
|
s = rmprefix(l)
|
|
assert s[:5]=="Query"
|
|
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
|
|
hexre = re.compile('0x[0-9a-f]+:[ ]*')
|
|
def rmprefix(obj):
|
|
return `obj`
|
|
# s = `obj`
|
|
# m = hexre.match(s)
|
|
# return m and s[m.end(0):]
|
|
|
|
class TestPgfInfo(unittest.TestCase):
|
|
def pgf(self, path=None):
|
|
path = path or self.path
|
|
return gf.read_pgf(path)
|
|
def setUp(self):
|
|
self.path = 'Query.pgf'
|
|
def test_readPgf(self):
|
|
pgf = self.pgf()
|
|
self.assertNotEqual(pgf,None)
|
|
def test_readNonExistent(self):
|
|
nopath = 'x' + self.path
|
|
self.assertRaises(IOError, self.pgf, nopath)
|
|
def test_startcat(self):
|
|
pgf = self.pgf()
|
|
cat = pgf.startcat()
|
|
self.assertEqual(rmprefix(cat),'Question')
|
|
def test_categories(self):
|
|
pgf = self.pgf()
|
|
cats = [`c` for c in pgf.categories()]
|
|
self.failUnless('Float' in cats)
|
|
self.failUnless('Int' in cats)
|
|
self.failUnless('String' in cats)
|
|
def test_createLanguage(self):
|
|
pgf = self.pgf()
|
|
for lang in 'QueryEng QuerySpa'.split():
|
|
l = gf.read_language(lang)
|
|
self.assertEqual(rmprefix(l),lang)
|
|
def test_functions(self):
|
|
pgf = self.pgf()
|
|
self.assertTrue('Even' in [`f` for f in pgf.functions()])
|
|
def test_function_types(self):
|
|
pgf = self.pgf()
|
|
gftypes = dict((`f`,`pgf.fun_type(f)`) for f in pgf.functions())
|
|
for p in "Prime : Object -> Question; Yes : Answer".split(';'):
|
|
lhs,rhs = [s.strip() for s in p.split(':')]
|
|
self.assertEqual(gftypes[lhs],rhs)
|
|
|
|
class TestParsing(unittest.TestCase):
|
|
def setUp(self):
|
|
self.lexed = samples
|
|
self.lang = 'QueryEng'
|
|
self.pgf = "Query.pgf"
|
|
|
|
def test_parse(self):
|
|
pgf = gf.read_pgf(self.pgf)
|
|
l = gf.read_language(self.lang)
|
|
for abs,cnc in self.lexed:
|
|
rabs = exp2str(abs)
|
|
ps = pgf.parse(l, cnc['eng'])
|
|
self.failUnless(ps)
|
|
pt = rmprefix(ps[0])
|
|
self.assertEqual(pt,rabs)
|
|
|
|
|
|
class TestLinearize(unittest.TestCase):
|
|
def setUp(self):
|
|
self.samples = samples
|
|
self.pgf = gf.read_pgf('Query.pgf')
|
|
self.lang = gf.read_language('QueryEng')
|
|
|
|
def test_Linearize(self):
|
|
l = self.lang
|
|
for abs,cnc in self.samples:
|
|
ts = self.pgf.parse(l, cnc['eng'])
|
|
self.assertEqual(cnc['eng'],self.pgf.linearize(l,ts[0]))
|
|
|
|
class TestTranslate(unittest.TestCase):
|
|
def setUp(self):
|
|
self.samples = samples
|
|
self.pgf = gf.read_pgf('Query.pgf')
|
|
self.langs = [(lang2iso(l),l) for l in self.pgf.languages()]
|
|
|
|
def test_translate(self):
|
|
for abs,cnc in self.samples:
|
|
for i,l in self.langs:
|
|
for j,m in self.langs:
|
|
if i==j: continue
|
|
parsed = self.pgf.parse(l, cnc[i])
|
|
assert len(parsed) == 1
|
|
lin = self.pgf.linearize(m,parsed[0])
|
|
self.assertEqual(lin,cnc[j])
|
|
|
|
class TestUnapplyExpr(unittest.TestCase):
|
|
def setUp(self):
|
|
self.samples = samples
|
|
self.pgf = gf.read_pgf('Query.pgf')
|
|
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):
|
|
lg = 'eng'
|
|
lang = self.langs[lg]
|
|
for abs,cnc in self.samples:
|
|
parsed = self.pgf.parse(lang, cnc[lg])
|
|
uparsed = self.deep_unapp(parsed[0])
|
|
self.assertEqual(abs,uparsed)
|
|
|
|
def test_infer(self):
|
|
lg = 'eng'
|
|
lang = self.langs[lg]
|
|
cnc = self.samples[0][1]
|
|
parsed = self.pgf.parse(lang, cnc[lg])
|
|
exp = parsed[0]
|
|
for t in 'Question Object Int'.split():
|
|
self.assertEqual(`exp.infer(self.pgf)`, t)
|
|
uexp = exp.unapply()
|
|
if type(uexp) != type(2) and type(uexp) != type('2'):
|
|
exp = uexp[1]
|
|
|
|
|
|
class TestComplete(unittest.TestCase):
|
|
def setUp(self):
|
|
self.lexed = samples
|
|
self.pgf = gf.read_pgf('Query.pgf')
|
|
self.langs = dict([(lang2iso(l),l) for l in self.pgf.languages()])
|
|
|
|
def test_complete(self):
|
|
for (_,d) in self.lexed:
|
|
for l,text in d.items():
|
|
lang = self.langs[l]
|
|
for k in range(len(text)):
|
|
if text[k].isdigit() or text[k-1].isdigit(): # No completion for integer literals
|
|
continue
|
|
comps = self.pgf.complete(lang,text[:k])
|
|
self.assertNotEqual(comps, [],
|
|
msg="while completing '%s^%s'" % (text[:k],text[k:]))
|
|
|
|
self.assertTrue(any(w in text for w in comps),
|
|
msg="None of %s is in '%s'" % (comps,text))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|