[pypy-commit] pypy default: merge
fijal
noreply at buildbot.pypy.org
Wed Sep 12 20:27:53 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r57301:b116e59777da
Date: 2012-09-12 20:27 +0200
http://bitbucket.org/pypy/pypy/changeset/b116e59777da/
Log: merge
diff --git a/pypy/rlib/parsing/test/test_tree.py b/pypy/rlib/parsing/test/test_tree.py
new file mode 100644
--- /dev/null
+++ b/pypy/rlib/parsing/test/test_tree.py
@@ -0,0 +1,90 @@
+import py
+
+from pypy.rlib.parsing.tree import Nonterminal, Symbol
+from pypy.rlib.parsing.lexer import Token, SourcePos
+
+class TestTreeAppLevel(object):
+
+ def test_nonterminal_simple(self):
+ pos = SourcePos(1,2,3)
+ tree = Nonterminal(symbol="a",
+ children=[
+ Symbol(symbol="b",
+ additional_info="b",
+ token=Token(name="B",
+ source="b",
+ source_pos=pos))])
+ assert tree.getsourcepos() == pos
+
+ def test_nonterminal_nested(self):
+ pos = SourcePos(1,2,3)
+ tree = Nonterminal(symbol="a",
+ children=[
+ Nonterminal(symbol="c",
+ children=[
+ Symbol(symbol="b",
+ additional_info="b",
+ token=Token(name="B",
+ source="b",
+ source_pos=pos))])])
+ assert tree.getsourcepos() == pos
+
+ def test_nonterminal_simple_empty(self):
+ tree = Nonterminal(symbol="a",
+ children=[])
+ assert len(tree.children) == 0 # trivial
+ py.test.raises(IndexError, tree.getsourcepos)
+
+ def test_nonterminal_nested_empty(self):
+ tree = Nonterminal(symbol="a",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[])])])])])])])
+ assert len(tree.children) != 0 # the not-so-trivial part.
+ py.test.raises(IndexError, tree.getsourcepos)
+
+class BaseTestTreeTranslated(object):
+
+ def compile(self, f):
+ raise NotImplementedError
+
+ def test_nonterminal_simple_empty(self):
+ def foo():
+ tree = Nonterminal(symbol="a",
+ children=[])
+ return tree.getsourcepos()
+ f = self.compile(foo)
+ py.test.raises(IndexError, f)
+
+ def test_nonterminal_nested_empty(self):
+ def foo():
+ tree = Nonterminal(symbol="a",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[Nonterminal(symbol="c",
+ children=[])])])])])])])
+ return tree.getsourcepos()
+ f = self.compile(foo)
+ py.test.raises(IndexError, f)
+
+
+class TestTreeTranslatedLLType(BaseTestTreeTranslated):
+
+ def compile(self, f):
+ from pypy.translator.c.test.test_genc import compile
+ return compile(f, [])
+
+class TestTreeTranslatedOOType(BaseTestTreeTranslated):
+
+ def compile(self, f):
+ from pypy.translator.cli.test.runtest import compile_function
+ return compile_function(f, [], auto_raise_exc=True, exctrans=True)
+
+
diff --git a/pypy/rlib/parsing/tree.py b/pypy/rlib/parsing/tree.py
--- a/pypy/rlib/parsing/tree.py
+++ b/pypy/rlib/parsing/tree.py
@@ -53,7 +53,10 @@
self.symbol = symbol
def getsourcepos(self):
- return self.children[0].getsourcepos()
+ try:
+ return self.children[0].getsourcepos()
+ except IndexError:
+ raise
def __str__(self):
return "%s(%s)" % (self.symbol, ", ".join([str(c) for c in self.children]))
More information about the pypy-commit
mailing list