Package Martel :: Package test :: Module test_attrs
[hide private]
[frames] | no frames]

Source Code for Module Martel.test.test_attrs

  1  # Ensure that attributes really work 
  2   
  3  from xml.sax import handler 
  4  import Martel 
  5  from Martel import RecordReader 
  6   
7 -class GrabElements(handler.ContentHandler, handler.ErrorHandler):
8 - def startDocument(self):
9 self.elements = []
10 - def startElement(self, name, attrs):
11 self.elements.append( (name, attrs) )
12 13 ##def fixup_dict(d): 14 ## return d 15 ## dict = {} 16 ## for k, v in d.items(): 17 ## dict[k] = v 18 ## return dict 19
20 -def get_element(format, text = "X"):
21 parser = format.make_parser() 22 grab = GrabElements() 23 parser.setContentHandler(grab) 24 parser.parseString(text) 25 assert len(grab.elements) == 1, len(grab.elements) 26 return grab.elements[0]
27
28 -def cmp_dicts(d1, d2):
29 items1 = d1.items() 30 items1.sort() 31 32 items2 = d2.items() 33 items2.sort() 34 35 return cmp(items1, items2)
36
37 -def check_dicts(d1, d2):
38 if cmp_dicts(d1, d2) != 0: 39 raise AssertionError("No match: %s, %s" % (d1, d2))
40
41 -def check_element( (name1, dict1), (name2, dict2) ):
42 assert name1 == name2, (name1, name2) 43 check_dicts(dict1, dict2)
44 45
46 -def test_none():
47 ele = get_element(Martel.Group("spam", Martel.Str("X"))) 48 check_element(ele, ("spam", {})) 49 50 ele = get_element(Martel.Group("spam", Martel.Str("X"), {})) 51 check_element(ele, ("spam", {}))
52
53 -def test_single():
54 ele = get_element( 55 Martel.Group("spam", Martel.Str("X"), {"format": "swissprot"})) 56 check_element(ele, ("spam", {"format": "swissprot"}))
57
58 -def test_multi():
59 ele = get_element(Martel.Re("(?P<qwe?def=%7Edalke&a=1&b=2&cc=33>X)")) 60 check_element(ele, ("qwe", {"def": "~dalke", 61 "a": "1", 62 "b": "2", 63 "cc": "33"}))
64 -def test_escape():
65 name, attrs = get_element(Martel.Re("(?P<qwe?a=%7E>X)")) 66 check_dicts({"a": "~"}, attrs) 67 68 name, attrs = get_element(Martel.Re("(?P<qwe?a=%7e>X)")) 69 check_dicts({"a": "~"}, attrs) 70 71 name, attrs = get_element(Martel.Re("(?P<qwe?a=>X)")) 72 check_dicts({"a": ""}, attrs) 73 74 name, attrs = get_element(Martel.Re("(?P<qwe?>X)")) 75 check_dicts({}, attrs) 76 77 name, attrs = get_element(Martel.Re("(?P<qwe?a=%48%65%6c%6c%6f>X)")) 78 check_dicts({"a": "Hello"}, attrs) 79 80 name, attrs = get_element(Martel.Re("(?P<qwe?a=%7e%7E&b=%7e%7E>X)")) 81 check_dicts({"a": "~~", "b": "~~"}, attrs) 82 83 name, attrs = get_element(Martel.Re("(?P<qwe?a=%7e%7E&b=>X)")) 84 check_dicts({"a": "~~", "b": ""}, attrs)
85
86 -def test_same_tag():
87 format = Martel.Re("(?P<char?type=a>a+)(?P<char?type=b>b+)") 88 parser = format.make_parser() 89 grab = GrabElements() 90 parser.setContentHandler(grab) 91 parser.parseString("aaabb") 92 assert len(grab.elements) == 2, len(grab.elements) 93 94 check_element(grab.elements[0], ("char", {"type": "a"})) 95 check_element(grab.elements[1], ("char", {"type": "b"}))
96 97
98 -def test_record_parser():
99 format = Martel.Re("(?P<term?field=first>...)" 100 "(?P<term?field=second>...)" 101 "(?P<last>.)\R") 102 format = Martel.ParseRecords("all", {"author": "guido"}, format, 103 RecordReader.CountLines, (1,) ) 104 parser = format.make_parser() 105 grab = GrabElements() 106 parser.setContentHandler(grab) 107 parser.parseString("aaabbbZ\ncccdddZ\n") 108 elements = grab.elements 109 assert len(elements) == 7 110 check_element(elements[0], ("all", {"author": "guido"})) 111 check_element(elements[1], ("term", {"field": "first"})) 112 check_element(elements[2], ("term", {"field": "second"})) 113 check_element(elements[3], ("last", {})) 114 check_element(elements[4], ("term", {"field": "first"})) 115 check_element(elements[5], ("term", {"field": "second"})) 116 check_element(elements[6], ("last", {}))
117 118 145 146
147 -def test():
148 test_none() 149 test_single() 150 test_multi() 151 test_escape() 152 test_same_tag() 153 test_record_parser() 154 test_header_footer_parser()
155 156 if __name__ == "__main__": 157 test() 158