
import test_appliance

from yaml import *

class TestErrors(test_appliance.TestAppliance):

    def _testErrors(self, test_name, invalid_filename):
        #self._load(invalid_filename)
        self.failUnlessRaises(YAMLError, lambda: self._load(invalid_filename))

    def _testStringErrors(self, test_name, invalid_filename):
        #self._load_string(invalid_filename)
        self.failUnlessRaises(YAMLError, lambda: self._load_string(invalid_filename))

    def _load(self, filename):
        try:
            reader = Reader(file(filename, 'rb'))
            scanner = Scanner(reader)
            parser = Parser(scanner)
            composer = Composer(parser)
            resolver = Resolver(composer)
            constructor = Constructor(resolver)
            return list(constructor)
        except YAMLError, exc:
        #except ScannerError, exc:
        #except ParserError, exc:
        #except ComposerError, exc:
        #except ConstructorError, exc:
            #print '.'*70
            #print "%s:" % exc.__class__.__name__, exc
            raise

    def _load_string(self, filename):
        try:
            reader = Reader(file(filename, 'rb').read())
            scanner = Scanner(reader)
            parser = Parser(scanner)
            composer = Composer(parser)
            resolver = Resolver(composer)
            constructor = Constructor(resolver)
            return list(constructor)
        except YAMLError, exc:
        #except ScannerError, exc:
        #except ParserError, exc:
        #except ComposerError, exc:
        #except ConstructorError, exc:
            #print '.'*70
            #print "%s:" % filename
            #print "%s:" % exc.__class__.__name__, exc
            raise

TestErrors.add_tests('testErrors', '.error-message')
TestErrors.add_tests('testStringErrors', '.error-message')

