diff options
Diffstat (limited to 'tests/test_structure.py')
-rw-r--r-- | tests/test_structure.py | 129 |
1 files changed, 72 insertions, 57 deletions
diff --git a/tests/test_structure.py b/tests/test_structure.py index 12c87d0..0bffbcd 100644 --- a/tests/test_structure.py +++ b/tests/test_structure.py @@ -12,8 +12,10 @@ class TestStructure(test_appliance.TestAppliance): node2 = eval(file(structure_filename, 'rb').read()) try: parser = Parser(Scanner(Reader(file(data_filename, 'rb')))) - node1 = parser.parse() - node1 = [self._convert(n) for n in node1] + node1 = [] + while not parser.check(StreamEndEvent): + node1.append(self._convert(parser)) + parser.get() if len(node1) == 1: node1 = node1[0] self.failUnlessEqual(node1, node2) @@ -25,97 +27,110 @@ class TestStructure(test_appliance.TestAppliance): print "NODE2:", node2 raise - def _convert(self, node): - if isinstance(node, ScalarNode): - return True - elif isinstance(node, SequenceNode): + def _convert(self, parser): + if parser.check(ScalarEvent): + event = parser.get() + if event.tag or event.anchor or event.value: + return True + else: + return None + elif parser.check(SequenceEvent): + parser.get() sequence = [] - for item in node.value: - sequence.append(self._convert(item)) + while not parser.check(CollectionEndEvent): + sequence.append(self._convert(parser)) + parser.get() return sequence - elif isinstance(node, MappingNode): + elif parser.check(MappingEvent): + parser.get() mapping = [] - for key, value in node.value: - mapping.append((self._convert(key), self._convert(value))) + while not parser.check(CollectionEndEvent): + key = self._convert(parser) + value = self._convert(parser) + mapping.append((key, value)) + parser.get() return mapping - elif isinstance(node, AliasNode): + elif parser.check(AliasEvent): + parser.get() return '*' else: - return node + parser.get() + return '?' TestStructure.add_tests('testStructure', '.data', '.structure') class TestParser(test_appliance.TestAppliance): def _testParser(self, test_name, data_filename, canonical_filename): - documents1 = None - documents2 = None + events1 = None + events2 = None try: parser = Parser(Scanner(Reader(file(data_filename, 'rb')))) - documents1 = parser.parse() - canonical = test_appliance.CanonicalParser(canonical_filename, file(canonical_filename, 'rb').read()) - documents2 = canonical.parse() - self._compare(documents1, documents2) + events1 = list(iter(parser)) + canonical = test_appliance.CanonicalParser(file(canonical_filename, 'rb').read()) + events2 = canonical.parse() + self._compare(events1, events2) except: print print "DATA1:" print file(data_filename, 'rb').read() print "DATA2:" print file(canonical_filename, 'rb').read() - print "DOCUMENTS1:", documents1 - print "DOCUMENTS2:", documents2 + print "EVENTS1:", events1 + print "EVENTS2:", events2 raise - def _compare(self, value1, value2): - if value1 is None and hasattr(value2, 'tag') and value2.tag == 'tag:yaml.org,2002:null': - return - self.failUnlessEqual(type(value1), type(value2)) - if isinstance(value1, list) or isinstance(value1, tuple): - self.failUnlessEqual(len(value1), len(value2)) - for item1, item2 in zip(value1, value2): - self._compare(item1, item2) - else: - self.failUnlessEqual(value1.__class__.__name__, value2.__class__.__name__) - if isinstance(value1, SequenceNode): # or isinstance(value1, MappingNode): - self._compare(value1.value, value2.value) - elif isinstance(value1, ScalarNode): - self.failUnlessEqual(value1.value, value2.value) + def _compare(self, events1, events2): + self.failUnlessEqual(len(events1), len(events2)) + for event1, event2 in zip(events1, events2): + self.failUnlessEqual(event1.__class__, event2.__class__) + if isinstance(event1, AliasEvent): + #self.failUnlessEqual(event1.name, event2.name) + pass + elif isinstance(event1, ScalarEvent): + #self.failUnlessEqual(event1.anchor, event2.anchor) + #self.failUnlessEqual(event1.tag, event2.tag) + self.failUnlessEqual(event1.value, event2.value) + if isinstance(event1, CollectionEvent): + #self.failUnlessEqual(event1.anchor, event2.anchor) + #self.failUnlessEqual(event1.tag, event2.tag) + pass + TestParser.add_tests('testParser', '.data', '.canonical') class TestParserOnCanonical(test_appliance.TestAppliance): def _testParserOnCanonical(self, test_name, canonical_filename): - documents1 = None - documents2 = None + events1 = None + events2 = None try: parser = Parser(Scanner(Reader(file(canonical_filename, 'rb')))) - documents1 = parser.parse() - canonical = test_appliance.CanonicalParser(canonical_filename, file(canonical_filename, 'rb').read()) - documents2 = canonical.parse() - self._compare(documents1, documents2) + events1 = list(iter(parser)) + canonical = test_appliance.CanonicalParser(file(canonical_filename, 'rb').read()) + events2 = canonical.parse() + self._compare(events1, events2) except: print print "DATA:" print file(canonical_filename, 'rb').read() - print "DOCUMENTS1:", documents1 - print "DOCUMENTS2:", documents2 + print "EVENTS1:", events1 + print "EVENTS2:", events2 raise - def _compare(self, value1, value2): - if value1 is None and hasattr(value2, 'tag') and value2.tag == 'tag:yaml.org,2002:null': - return - self.failUnlessEqual(type(value1), type(value2)) - if isinstance(value1, list) or isinstance(value1, tuple): - self.failUnlessEqual(len(value1), len(value2)) - for item1, item2 in zip(value1, value2): - self._compare(item1, item2) - else: - self.failUnlessEqual(value1.__class__.__name__, value2.__class__.__name__) - if isinstance(value1, SequenceNode) or isinstance(value1, MappingNode): - self._compare(value1.value, value2.value) - elif isinstance(value1, ScalarNode): - self.failUnlessEqual(value1.value, value2.value) + def _compare(self, events1, events2): + self.failUnlessEqual(len(events1), len(events2)) + for event1, event2 in zip(events1, events2): + self.failUnlessEqual(event1.__class__, event2.__class__) + if isinstance(event1, AliasEvent): + self.failUnlessEqual(event1.name, event2.name) + elif isinstance(event1, ScalarEvent): + self.failUnlessEqual(event1.anchor, event2.anchor) + self.failUnlessEqual(event1.tag, event2.tag) + self.failUnlessEqual(event1.value, event2.value) + if isinstance(event1, CollectionEvent): + self.failUnlessEqual(event1.anchor, event2.anchor) + self.failUnlessEqual(event1.tag, event2.tag) TestParserOnCanonical.add_tests('testParserOnCanonical', '.canonical') |