diff options
author | Philip Withnall <philip.withnall@collabora.co.uk> | 2015-03-31 17:12:42 +0100 |
---|---|---|
committer | Philip Withnall <philip.withnall@collabora.co.uk> | 2015-04-01 12:23:41 +0100 |
commit | 4a7e8b0d72ae9d7b8395f899732a1c40145c38fe (patch) | |
tree | 242bfbaf2a2623afb5e4d43dd5325e6a0f9d14a2 /tests | |
parent | 2699b11503550bcfde7a31bf867e4cf780d3d5f9 (diff) | |
download | gobject-introspection-wip/api-diff.tar.gz |
WIP work to add g-ir-diffwip/api-diff
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/scanner/test_comparator.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/tests/scanner/test_comparator.py b/tests/scanner/test_comparator.py new file mode 100755 index 00000000..b6b2649e --- /dev/null +++ b/tests/scanner/test_comparator.py @@ -0,0 +1,114 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# TODO: copyright + +import unittest +import tempfile +import os +import sys +import __builtin__ + + +os.environ['GI_SCANNER_DISABLE_CACHE'] = '1' +path = os.getenv('UNINSTALLED_INTROSPECTION_SRCDIR', None) +assert path is not None +sys.path.insert(0, path) + +# Not correct, but enough to get the tests going uninstalled +__builtin__.__dict__['DATADIR'] = path + +from giscanner.girparser import GIRParser +from giscanner.gircomparator import GIRComparator +from giscanner.message import MessageLogger, WARNING, ERROR, FATAL + + +class TestComparatorErrors(unittest.TestCase): + def _create_temp_gir_file(self, xml): + tmp_fd, tmp_name = tempfile.mkstemp(suffix='.gir', text=True) + file = os.fdopen(tmp_fd, 'wt') + file.write(xml) + file.close() + + return tmp_name + + def _test_comparator(self, old_xml, new_xml, wrap=True): + # Wrap the files in a repository and namespace for convenience. + if wrap: + old_xml = self._wrap_gir(old_xml) + new_xml = self._wrap_gir(new_xml) + + old_tmpfile = self._create_temp_gir_file(old_xml) + new_tmpfile = self._create_temp_gir_file(new_xml) + + old_parser = GIRParser() + new_parser = GIRParser() + + old_parser.parse(old_tmpfile) + new_parser.parse(new_tmpfile) + + old_namespace = old_parser.get_namespace() + new_namespace = new_parser.get_namespace() + + os.unlink(new_tmpfile) + os.unlink(old_tmpfile) + + self.assertNotEqual(old_namespace, None) + self.assertNotEqual(new_namespace, None) + + return GIRComparator(old_namespace, new_namespace) + + def _wrap_gir(self, xml): + return ('<?xml version="1.0"?>' + '<repository version="1.2" ' + 'xmlns="http://www.gtk.org/introspection/core/1.0" ' + 'xmlns:c="http://www.gtk.org/introspection/c/1.0">' + '<include name="GObject" version="2.0"/>' + '<include name="Gio" version="2.0"/>' + '<namespace name="N" ' + 'version="1.0" ' + 'shared-library="libtest-1.0.so.0" ' + 'c:identifier-prefixes="Test" ' + 'c:symbol-prefixes="test">' + '%s' + '</namespace>' + '</repository>') % xml + + def assertSuccess(self, old_xml, new_xml, wrap=True): + comparator = self._test_comparator(old_xml, new_xml, wrap) + self.assertEqual(comparator.compare(), 0) + + def assertErrors(self, old_xml, new_xml, errors, wrap=True): + comparator = self._test_comparator(old_xml, new_xml, wrap) + self.assertNotEqual(comparator.compare(), 0) + + output = comparator.get_output() + self.assertEqual(output, errors) + + def assertInfos(self, old_xml, new_xml, infos, wrap=True): + comparator = self._test_comparator(old_xml, new_xml, wrap) + self.assertEqual(comparator.compare(), 0) + + output = comparator.get_output() + self.assertEqual(output, infos) + + def test_alias_type_changed(self): + self.assertErrors( + '<alias name="A"><type name="GObject.Object"/></alias>', + '<alias name="A"><type name="Gio.InputStream"/></alias>', + [ + (GIRComparator.OUTPUT_FORWARDS_INCOMPATIBLE, + 'Alias ‘N.A’ has changed type from ‘GObject.Object’ to its ' + 'subtype ‘Gio.InputStream’.'), + ]) + self.assertErrors( + '<alias name="A"><type name="Gio.InputStream"/></alias>', + '<alias name="A"><type name="GObject.Object"/></alias>', + [ + (GIRComparator.OUTPUT_BACKWARDS_INCOMPATIBLE, + 'Alias ‘N.A’ has changed type from ‘Gio.InputStream’ to ' + '‘GObject.Object’.'), + ]) + + +if __name__ == '__main__': + unittest.main() |