import Martel
from xml.sax import handler, saxutils
import string, StringIO
# Various "macro" definitions so you don't need to come up with your
# own regular expressions.
def must_parse(test_name, parseString, term):
try:
parseString(term)
except Martel.Parser.ParserException:
raise AssertionError("%s: Cannot parse %s" % \
(test_name, repr(term)))
def must_not_parse(test_name, parseString, term):
try:
parseString(term)
except Martel.Parser.ParserException:
pass
else:
raise AssertionError("%s: Could parse %s" % \
(test_name, repr(term)))
class Capture(handler.ContentHandler):
def startDocument(self):
self.capture = []
def startElement(self, name, attrs):
if not self.capture:
self.capture.append( (name, attrs) ) # dup first item
self.capture.append( (name, attrs) )
def endElement(self, name):
self.capture.pop()
def has_group(format, term, name, attr):
parser = format.make_parser()
cap = Capture()
parser.setContentHandler(cap)
try:
parser.parseString(term)
except Martel.Parser.ParserException:
raise AssertionError("Cannot parse %s" % (repr(term),))
assert len(cap.capture) == 1, "Should only have dup of first item"
assert cap.capture[0][0] == name, (cap.capture[0], name)
assert cap.capture[0][1]["x"] == attr, (cap.capture[0][1], attr)
def has_no_group(format, term):
parser = format.make_parser()
cap = Capture()
parser.setContentHandler(cap)
try:
parser.parseString(term)
except Martel.Parser.ParserException:
raise AssertionError("Cannot parse %s" % (repr(term),))
assert not cap.capture, "Should have nothing, not %s" % (cap.capture,)
def test_Float():
parseString = Martel.Float().make_parser().parseString
for head in ("", "-", "+", "-1", "+2", "3"):
for tail in ("", "E0", "E+0", "E-0", "E4", "e+5", "e-6",
"E10", "E-19", "e+28"):
for middle in (".1", "5.", "7.6", "989", ".0001"):
must_parse("Float", parseString, head + middle + tail)
for term in ("1E", ".E", "1.E", "1/", "E0", "1.2E0K",
"=1", "+-1", ".", "e", "-e", "-e0"):
must_not_parse("not Float", parseString, term)
has_group(Martel.Float("spam", {"x": "spot"}), "1.0", "spam", "spot")
has_group(Martel.Float("eggs", {"x": "SPOT"}), "0.8", "eggs", "SPOT")
has_no_group(Martel.Float(), "+1")
def test_Digits():
parseString = Martel.Digits().make_parser().parseString
for term in ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"20", "99", "453", "34653", "34359739467623"):
must_parse("Digits", parseString, term)
for term in ("A", "1A", "123123123T", "-1"):
must_not_parse("not Digits", parseString, term)
has_group(Martel.Digits("spam", {"x": "this"}), "5", "spam", "this")
has_group(Martel.Digits("eggs", {"x": "that"}), "9", "eggs", "that")
has_no_group(Martel.Digits(), "00")
def test_Word():
parseString = Martel.Word().make_parser().parseString
for term in ("Andrew", "Dalke", "was_here", "test12", "12df"):
must_parse("Word", parseString, term)
for term in ("*", "", "this-that"):
must_not_parse("not Word", parseString, term)
has_group(Martel.Word("spam", {"x": "fly"}), "_", "spam", "fly")
has_group(Martel.Word("eggs", {"x": "boy"}), "9", "eggs", "boy")
has_no_group(Martel.Word(), "__")
def test_Spaces():
parseString = Martel.Spaces().make_parser().parseString
for term in (" ", "\t", " ", " \t \t\t "):
must_parse("Spaces", parseString, term)
for term in ("\n", " \n", " X ", ""):
must_not_parse("not Spaces", parseString, term)
has_group(Martel.Spaces("spam", {"x": "pick"}), " "*100,
"spam", "pick")
has_group(Martel.Spaces("eggs", {"x": "name"}), "\t"*200,
"eggs", "name")
has_no_group(Martel.Spaces(), " ")
def test_Unprintable():
parseString = Martel.Unprintable().make_parser().parseString
unprintables = []
for i in range(0, 256):
c = chr(i)
if c in string.printable:
must_not_parse("not Unprintable", parseString, c)
else:
must_parse("Unprintable", parseString, c)
unprintables.append(c)
has_group(Martel.Unprintable("spam", {"x": "import"}),
unprintables[0], "spam", "import")
has_group(Martel.Unprintable("eggs", {"x": "export"}),
unprintables[-1], "eggs", "export")
has_no_group(Martel.Unprintable(), unprintables[1])
def test_Punctuation():
parseString = Martel.Punctuation().make_parser().parseString
for i in range(0, 256):
c = chr(i)
if c in string.punctuation:
must_parse("Punctuation", parseString, c)
else:
must_not_parse("not Punctuation", parseString, c)
has_group(Martel.Punctuation("spam", {"x": "Iran"}),
string.punctuation[0], "spam", "Iran")
has_group(Martel.Punctuation("eggs", {"x": "Iraq"}),
string.punctuation[-1], "eggs", "Iraq")
has_no_group(Martel.Punctuation(), string.punctuation[1])
def test_ToEol():
parser = Martel.ToEol("SantaFe").make_parser()
parseString = parser.parseString
must_parse("ToEol", parseString, "Testing, 1, 2, 3!\n")
must_parse("ToEol", parseString, "Andrew\n")
must_not_parse("ToEol", parseString, "Dalke")
must_not_parse("ToEol", parseString, "This\nis")
must_not_parse("ToEol", parseString, "This\nis a test\n")
file = StringIO.StringIO()
parser.setContentHandler(saxutils.XMLGenerator(file))
parser.parseString("This is a test.\n")
s = file.getvalue()
expect = "This is a test.\n"
assert string.find(s, expect) != -1, ("Got: %s" % (repr(s),))
def test_ToSep():
exp = Martel.Group("test",
Martel.ToSep("colon", ":") + \
Martel.ToSep("space", " ") + \
Martel.ToSep("empty", "!"))
parser = exp.make_parser()
file = StringIO.StringIO()
parser.setContentHandler(saxutils.XMLGenerator(file))
parser.parseString("q:wxy !")
s = file.getvalue()
expect = "q:wxy !"
assert string.find(s, expect) != -1, ("Got: %s" % (repr(s),))
def test_DelimitedFields():
exp = Martel.Group("test", Martel.DelimitedFields("Field", "/"))
parser = exp.make_parser()
file = StringIO.StringIO()
parser.setContentHandler(saxutils.XMLGenerator(file))
parser.parseString("a/b/cde/f//\n")
s = file.getvalue()
expect = "a/b/cde/" \
"f//\n"
assert string.find(s, expect) != -1, ("Got: %s" % (repr(s),))
def test():
test_Digits()
test_Float()
test_Word()
test_Spaces()
test_Unprintable()
test_Punctuation()
test_ToEol()
test_ToSep()
test_DelimitedFields()
if __name__ == "__main__":
test()