You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2010/01/20 17:22:00 UTC
svn commit: r901257 - in /qpid/trunk/qpid/python/qpid: lexer.py
tests/address.py
Author: rhs
Date: Wed Jan 20 16:22:00 2010
New Revision: 901257
URL: http://svn.apache.org/viewvc?rev=901257&view=rev
Log:
modified address test suite to work against external address parser
Modified:
qpid/trunk/qpid/python/qpid/lexer.py
qpid/trunk/qpid/python/qpid/tests/address.py
Modified: qpid/trunk/qpid/python/qpid/lexer.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/lexer.py?rev=901257&r1=901256&r2=901257&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/lexer.py (original)
+++ qpid/trunk/qpid/python/qpid/lexer.py Wed Jan 20 16:22:00 2010
@@ -64,7 +64,7 @@
if self.value is None:
return repr(self.type)
else:
- return "%s(%r)" % (self.type, self.value)
+ return "%s(%s)" % (self.type, self.value)
class LexError(Exception):
@@ -96,6 +96,12 @@
self.types = types
self.eof = eof
self.rexp = rexp
+ self.byname = {}
+ for t in self.types + [eof]:
+ self.byname[t.name] = t
+
+ def type(self, name):
+ return self.byname[name]
def lex(self, st):
pos = 0
Modified: qpid/trunk/qpid/python/qpid/tests/address.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/tests/address.py?rev=901257&r1=901256&r2=901257&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/tests/address.py (original)
+++ qpid/trunk/qpid/python/qpid/tests/address.py Wed Jan 20 16:22:00 2010
@@ -17,22 +17,114 @@
# under the License.
#
+
+from subprocess import Popen, PIPE, STDOUT
from qpid.tests import Test
-from qpid.address import lex, parse, ParseError, EOF, ID, NUMBER, SYM, WSPACE
+from qpid.address import lex, parse, ParseError, EOF, ID, NUMBER, SYM, WSPACE, \
+ LEXER
+from qpid.lexer import Token
+from qpid.harness import Skipped
from parser import ParserBase
+def indent(st):
+ return " " + st.replace("\n", "\n ")
+
+def pprint_address(name, subject, options):
+ return "NAME: %s\nSUBJECT: %s\nOPTIONS: %s" % \
+ (pprint(name), pprint(subject), pprint(options))
+
+def pprint(o):
+ if isinstance(o, dict):
+ return pprint_map(o)
+ elif isinstance(o, list):
+ return pprint_list(o)
+ elif isinstance(o, basestring):
+ return pprint_string(o)
+ else:
+ return repr(o)
+
+def pprint_map(m):
+ items = ["%s: %s" % (pprint(k), pprint(v)) for k, v in m.items()]
+ items.sort()
+ return pprint_items("{", items, "}")
+
+def pprint_list(l):
+ return pprint_items("[", [pprint(x) for x in l], "]")
+
+def pprint_items(start, items, end):
+ if items:
+ return "%s\n%s\n%s" % (start, ",\n".join([indent(i) for i in items]), end)
+ else:
+ return "%s%s" % (start, end)
+
+def pprint_string(s):
+ result = "'"
+ for c in s:
+ if c == "'":
+ result += "\\'"
+ elif c == "\n":
+ result += "\\n"
+ elif ord(c) >= 0x80:
+ result += "\\u%04x" % ord(c)
+ else:
+ result += c
+ result += "'"
+ return result
+
class AddressTests(ParserBase, Test):
EXCLUDE = (WSPACE, EOF)
+ def fields(self, line, n):
+ result = line.split(":", n - 1)
+ result.extend([None]*(n - len(result)))
+ return result
+
+ def call(self, parser, mode, input):
+ try:
+ po = Popen([parser, mode], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
+ except OSError, e:
+ raise Skipped("%s: %s" % (e, parser))
+ out, _ = po.communicate(input=input)
+ return out
+
+ def parser(self):
+ return self.config.defines.get("address.parser")
+
def do_lex(self, st):
- return lex(st)
+ parser = self.parser()
+ if parser:
+ out = self.call(parser, "lex", st)
+ lines = out.split("\n")
+ toks = []
+ for line in lines:
+ if line.strip():
+ name, position, value = self.fields(line, 3)
+ toks.append(Token(LEXER.type(name), value, position, st))
+ return toks
+ else:
+ return lex(st)
def do_parse(self, st):
return parse(st)
def valid(self, addr, name=None, subject=None, options=None):
- ParserBase.valid(self, addr, (name, subject, options))
+ parser = self.parser()
+ if parser:
+ got = self.call(parser, "parse", addr)
+ expected = "%s\n" % pprint_address(name, subject, options)
+ assert expected == got, "expected\n<EXP>%s</EXP>\ngot\n<GOT>%s</GOT>" % (expected, got)
+ else:
+ ParserBase.valid(self, addr, (name, subject, options))
+
+ def invalid(self, addr, error=None):
+ parser = self.parser()
+ if parser:
+ got = self.call(parser, "parse", addr)
+ expected = "ERROR: %s\n" % error
+ assert expected == got, "expected %r, got %r" % (expected, got)
+ else:
+ ParserBase.invalid(self, addr, error)
def testDashInId1(self):
self.lex("foo-bar", ID)
@@ -125,14 +217,14 @@
def testNoName(self):
self.invalid("; {key: value}",
- "unexpected token SEMI(';') line:1,0:; {key: value}")
+ "unexpected token SEMI(;) line:1,0:; {key: value}")
def testEmpty(self):
self.invalid("", "unexpected token EOF line:1,0:")
def testNoNameSlash(self):
self.invalid("/asdf; {key: value}",
- "unexpected token SLASH('/') line:1,0:/asdf; {key: value}")
+ "unexpected token SLASH(/) line:1,0:/asdf; {key: value}")
def testBadOptions1(self):
self.invalid("name/subject; {",
@@ -156,7 +248,7 @@
def testBadOptions5(self):
self.invalid("name/subject; { key: value asdf",
- "expecting (COMMA, RBRACE), got ID('asdf') "
+ "expecting (COMMA, RBRACE), got ID(asdf) "
"line:1,27:name/subject; { key: value asdf")
def testBadOptions6(self):
@@ -166,7 +258,7 @@
def testBadOptions7(self):
self.invalid("name/subject; { key: value } asdf",
- "expecting EOF, got ID('asdf') "
+ "expecting EOF, got ID(asdf) "
"line:1,29:name/subject; { key: value } asdf")
def testList1(self):
@@ -185,19 +277,19 @@
def testBadList1(self):
self.invalid("name/subject; { key: [ }", "expecting (NUMBER, STRING, ID, LBRACE, LBRACK), "
- "got RBRACE('}') line:1,23:name/subject; { key: [ }")
+ "got RBRACE(}) line:1,23:name/subject; { key: [ }")
def testBadList2(self):
self.invalid("name/subject; { key: [ 1 }", "expecting (COMMA, RBRACK), "
- "got RBRACE('}') line:1,25:name/subject; { key: [ 1 }")
+ "got RBRACE(}) line:1,25:name/subject; { key: [ 1 }")
def testBadList3(self):
self.invalid("name/subject; { key: [ 1 2 }", "expecting (COMMA, RBRACK), "
- "got NUMBER('2') line:1,25:name/subject; { key: [ 1 2 }")
+ "got NUMBER(2) line:1,25:name/subject; { key: [ 1 2 }")
def testBadList4(self):
self.invalid("name/subject; { key: [ 1 2 ] }", "expecting (COMMA, RBRACK), "
- "got NUMBER('2') line:1,25:name/subject; { key: [ 1 2 ] }")
+ "got NUMBER(2) line:1,25:name/subject; { key: [ 1 2 ] }")
def testMap1(self):
self.valid("name/subject; { 'key': value }",
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org