
import yaml
import test_constructor
import pprint

def test_representer_types(code_filename, verbose=False):
    test_constructor._make_objects()
    for allow_unicode in [False, True]:
        native1 = test_constructor._load_code(open(code_filename, 'rb').read())
        native2 = None
        try:
            output = yaml.dump(native1, Dumper=test_constructor.MyDumper,
                        allow_unicode=allow_unicode)
            native2 = yaml.load(output, Loader=test_constructor.MyLoader)
            try:
                if native1 == native2:
                    continue
            except TypeError:
                pass
            value1 = test_constructor._serialize_value(native1)
            value2 = test_constructor._serialize_value(native2)
            if verbose:
                print "SERIALIZED NATIVE1:"
                print value1
                print "SERIALIZED NATIVE2:"
                print value2
            assert value1 == value2, (native1, native2)
        finally:
            if verbose:
                print "NATIVE1:"
                pprint.pprint(native1)
                print "NATIVE2:"
                pprint.pprint(native2)
                print "OUTPUT:"
                print output

test_representer_types.unittest = ['.code']

if __name__ == '__main__':
    import test_appliance
    test_appliance.run(globals())

