Ignore:
Timestamp:
02/19/06 17:17:28 (9 years ago)
Author:
xi
Message:

Parser is done. Add iterator interfaces for Scanner and Parser.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/pyyaml3000/tests/test_structure.py

    r48 r51  
    1313        try: 
    1414            parser = Parser(Scanner(Reader(file(data_filename, 'rb')))) 
    15             node1 = parser.parse() 
    16             node1 = [self._convert(n) for n in node1] 
     15            node1 = [] 
     16            while not parser.check(StreamEndEvent): 
     17                node1.append(self._convert(parser)) 
     18            parser.get() 
    1719            if len(node1) == 1: 
    1820                node1 = node1[0] 
     
    2628            raise 
    2729 
    28     def _convert(self, node): 
    29         if isinstance(node, ScalarNode): 
    30             return True 
    31         elif isinstance(node, SequenceNode): 
     30    def _convert(self, parser): 
     31        if parser.check(ScalarEvent): 
     32            event = parser.get() 
     33            if event.tag or event.anchor or event.value: 
     34                return True 
     35            else: 
     36                return None 
     37        elif parser.check(SequenceEvent): 
     38            parser.get() 
    3239            sequence = [] 
    33             for item in node.value: 
    34                 sequence.append(self._convert(item)) 
     40            while not parser.check(CollectionEndEvent): 
     41                sequence.append(self._convert(parser)) 
     42            parser.get() 
    3543            return sequence 
    36         elif isinstance(node, MappingNode): 
     44        elif parser.check(MappingEvent): 
     45            parser.get() 
    3746            mapping = [] 
    38             for key, value in node.value: 
    39                 mapping.append((self._convert(key), self._convert(value))) 
     47            while not parser.check(CollectionEndEvent): 
     48                key = self._convert(parser) 
     49                value = self._convert(parser) 
     50                mapping.append((key, value)) 
     51            parser.get() 
    4052            return mapping 
    41         elif isinstance(node, AliasNode): 
     53        elif parser.check(AliasEvent): 
     54            parser.get() 
    4255            return '*' 
    4356        else: 
    44             return node 
     57            parser.get() 
     58            return '?' 
    4559 
    4660TestStructure.add_tests('testStructure', '.data', '.structure') 
     
    4963 
    5064    def _testParser(self, test_name, data_filename, canonical_filename): 
    51         documents1 = None 
    52         documents2 = None 
     65        events1 = None 
     66        events2 = None 
    5367        try: 
    5468            parser = Parser(Scanner(Reader(file(data_filename, 'rb')))) 
    55             documents1 = parser.parse() 
    56             canonical = test_appliance.CanonicalParser(canonical_filename, file(canonical_filename, 'rb').read()) 
    57             documents2 = canonical.parse() 
    58             self._compare(documents1, documents2) 
     69            events1 = list(iter(parser)) 
     70            canonical = test_appliance.CanonicalParser(file(canonical_filename, 'rb').read()) 
     71            events2 = canonical.parse() 
     72            self._compare(events1, events2) 
    5973        except: 
    6074            print 
     
    6377            print "DATA2:" 
    6478            print file(canonical_filename, 'rb').read() 
    65             print "DOCUMENTS1:", documents1 
    66             print "DOCUMENTS2:", documents2 
     79            print "EVENTS1:", events1 
     80            print "EVENTS2:", events2 
    6781            raise 
    6882 
    69     def _compare(self, value1, value2): 
    70         if value1 is None and hasattr(value2, 'tag') and value2.tag == 'tag:yaml.org,2002:null': 
    71             return 
    72         self.failUnlessEqual(type(value1), type(value2)) 
    73         if isinstance(value1, list) or isinstance(value1, tuple): 
    74             self.failUnlessEqual(len(value1), len(value2)) 
    75             for item1, item2 in zip(value1, value2): 
    76                 self._compare(item1, item2) 
    77         else: 
    78             self.failUnlessEqual(value1.__class__.__name__, value2.__class__.__name__) 
    79             if isinstance(value1, SequenceNode): # or isinstance(value1, MappingNode): 
    80                 self._compare(value1.value, value2.value) 
    81             elif isinstance(value1, ScalarNode): 
    82                 self.failUnlessEqual(value1.value, value2.value) 
     83    def _compare(self, events1, events2): 
     84        self.failUnlessEqual(len(events1), len(events2)) 
     85        for event1, event2 in zip(events1, events2): 
     86            self.failUnlessEqual(event1.__class__, event2.__class__) 
     87            if isinstance(event1, AliasEvent): 
     88                #self.failUnlessEqual(event1.name, event2.name) 
     89                pass 
     90            elif isinstance(event1, ScalarEvent): 
     91                #self.failUnlessEqual(event1.anchor, event2.anchor) 
     92                #self.failUnlessEqual(event1.tag, event2.tag) 
     93                self.failUnlessEqual(event1.value, event2.value) 
     94            if isinstance(event1, CollectionEvent): 
     95                #self.failUnlessEqual(event1.anchor, event2.anchor) 
     96                #self.failUnlessEqual(event1.tag, event2.tag) 
     97                pass 
     98 
    8399 
    84100TestParser.add_tests('testParser', '.data', '.canonical') 
     
    87103 
    88104    def _testParserOnCanonical(self, test_name, canonical_filename): 
    89         documents1 = None 
    90         documents2 = None 
     105        events1 = None 
     106        events2 = None 
    91107        try: 
    92108            parser = Parser(Scanner(Reader(file(canonical_filename, 'rb')))) 
    93             documents1 = parser.parse() 
    94             canonical = test_appliance.CanonicalParser(canonical_filename, file(canonical_filename, 'rb').read()) 
    95             documents2 = canonical.parse() 
    96             self._compare(documents1, documents2) 
     109            events1 = list(iter(parser)) 
     110            canonical = test_appliance.CanonicalParser(file(canonical_filename, 'rb').read()) 
     111            events2 = canonical.parse() 
     112            self._compare(events1, events2) 
    97113        except: 
    98114            print 
    99115            print "DATA:" 
    100116            print file(canonical_filename, 'rb').read() 
    101             print "DOCUMENTS1:", documents1 
    102             print "DOCUMENTS2:", documents2 
     117            print "EVENTS1:", events1 
     118            print "EVENTS2:", events2 
    103119            raise 
    104120 
    105     def _compare(self, value1, value2): 
    106         if value1 is None and hasattr(value2, 'tag') and value2.tag == 'tag:yaml.org,2002:null': 
    107             return 
    108         self.failUnlessEqual(type(value1), type(value2)) 
    109         if isinstance(value1, list) or isinstance(value1, tuple): 
    110             self.failUnlessEqual(len(value1), len(value2)) 
    111             for item1, item2 in zip(value1, value2): 
    112                 self._compare(item1, item2) 
    113         else: 
    114             self.failUnlessEqual(value1.__class__.__name__, value2.__class__.__name__) 
    115             if isinstance(value1, SequenceNode) or isinstance(value1, MappingNode): 
    116                 self._compare(value1.value, value2.value) 
    117             elif isinstance(value1, ScalarNode): 
    118                 self.failUnlessEqual(value1.value, value2.value) 
     121    def _compare(self, events1, events2): 
     122        self.failUnlessEqual(len(events1), len(events2)) 
     123        for event1, event2 in zip(events1, events2): 
     124            self.failUnlessEqual(event1.__class__, event2.__class__) 
     125            if isinstance(event1, AliasEvent): 
     126                self.failUnlessEqual(event1.name, event2.name) 
     127            elif isinstance(event1, ScalarEvent): 
     128                self.failUnlessEqual(event1.anchor, event2.anchor) 
     129                self.failUnlessEqual(event1.tag, event2.tag) 
     130                self.failUnlessEqual(event1.value, event2.value) 
     131            if isinstance(event1, CollectionEvent): 
     132                self.failUnlessEqual(event1.anchor, event2.anchor) 
     133                self.failUnlessEqual(event1.tag, event2.tag) 
    119134 
    120135TestParserOnCanonical.add_tests('testParserOnCanonical', '.canonical') 
Note: See TracChangeset for help on using the changeset viewer.