diff options
Diffstat (limited to 'gobject/tests/mkenums.py')
-rw-r--r-- | gobject/tests/mkenums.py | 382 |
1 files changed, 240 insertions, 142 deletions
diff --git a/gobject/tests/mkenums.py b/gobject/tests/mkenums.py index 22a100505..ae0c683e0 100644 --- a/gobject/tests/mkenums.py +++ b/gobject/tests/mkenums.py @@ -32,7 +32,7 @@ import unittest import taptestrunner -Result = collections.namedtuple('Result', ('info', 'out', 'err', 'subs')) +Result = collections.namedtuple("Result", ("info", "out", "err", "subs")) class TestMkenums(unittest.TestCase): @@ -47,8 +47,9 @@ class TestMkenums(unittest.TestCase): parsing and generation code out into a library and unit test that, and convert this test to just check command line behaviour. """ + # Track the cwd, we want to back out to that to clean up our tempdir - cwd = '' + cwd = "" rspfile = False def setUp(self): @@ -56,14 +57,14 @@ class TestMkenums(unittest.TestCase): self.tmpdir = tempfile.TemporaryDirectory() self.cwd = os.getcwd() os.chdir(self.tmpdir.name) - print('tmpdir:', self.tmpdir.name) - if 'G_TEST_BUILDDIR' in os.environ: - self.__mkenums = \ - os.path.join(os.environ['G_TEST_BUILDDIR'], '..', - 'glib-mkenums') + print("tmpdir:", self.tmpdir.name) + if "G_TEST_BUILDDIR" in os.environ: + self.__mkenums = os.path.join( + os.environ["G_TEST_BUILDDIR"], "..", "glib-mkenums" + ) else: - self.__mkenums = shutil.which('glib-mkenums') - print('rspfile: {}, mkenums:'.format(self.rspfile), self.__mkenums) + self.__mkenums = shutil.which("glib-mkenums") + print("rspfile: {}, mkenums:".format(self.rspfile), self.__mkenums) def tearDown(self): os.chdir(self.cwd) @@ -71,10 +72,12 @@ class TestMkenums(unittest.TestCase): def _write_rspfile(self, argv): import shlex - with tempfile.NamedTemporaryFile(dir=self.tmpdir.name, mode='w', - delete=False) as f: - contents = ' '.join([shlex.quote(arg) for arg in argv]) - print('Response file contains:', contents) + + with tempfile.NamedTemporaryFile( + dir=self.tmpdir.name, mode="w", delete=False + ) as f: + contents = " ".join([shlex.quote(arg) for arg in argv]) + print("Response file contains:", contents) f.write(contents) f.flush() return f.name @@ -82,60 +85,62 @@ class TestMkenums(unittest.TestCase): def runMkenums(self, *args): if self.rspfile: rspfile = self._write_rspfile(args) - args = ['@' + rspfile] + args = ["@" + rspfile] argv = [self.__mkenums] # shebang lines are not supported on native # Windows consoles - if os.name == 'nt': + if os.name == "nt": argv.insert(0, sys.executable) argv.extend(args) - print('Running:', argv) + print("Running:", argv) env = os.environ.copy() - env['LC_ALL'] = 'C.UTF-8' - print('Environment:', env) + env["LC_ALL"] = "C.UTF-8" + print("Environment:", env) # We want to ensure consistent line endings... - info = subprocess.run(argv, timeout=self.timeout_seconds, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=env, - universal_newlines=True) + info = subprocess.run( + argv, + timeout=self.timeout_seconds, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env, + universal_newlines=True, + ) info.check_returncode() out = info.stdout.strip() err = info.stderr.strip() # Known substitutions for standard boilerplate subs = { - 'standard_top_comment': - 'This file is generated by glib-mkenums, do not modify ' - 'it. This code is licensed under the same license as the ' - 'containing project. Note that it links to GLib, so must ' - 'comply with the LGPL linking clauses.', - 'standard_bottom_comment': 'Generated data ends here' + "standard_top_comment": "This file is generated by glib-mkenums, do not modify " + "it. This code is licensed under the same license as the " + "containing project. Note that it links to GLib, so must " + "comply with the LGPL linking clauses.", + "standard_bottom_comment": "Generated data ends here", } result = Result(info, out, err, subs) - print('Output:', result.out) + print("Output:", result.out) return result def runMkenumsWithTemplate(self, template_contents, *args): - with tempfile.NamedTemporaryFile(dir=self.tmpdir.name, - suffix='.template', - delete=False) as template_file: + with tempfile.NamedTemporaryFile( + dir=self.tmpdir.name, suffix=".template", delete=False + ) as template_file: # Write out the template. - template_file.write(template_contents.encode('utf-8')) - print(template_file.name + ':', template_contents) + template_file.write(template_contents.encode("utf-8")) + print(template_file.name + ":", template_contents) template_file.flush() - return self.runMkenums('--template', template_file.name, *args) + return self.runMkenums("--template", template_file.name, *args) def runMkenumsWithAllSubstitutions(self, *args): - '''Run glib-mkenums with a template which outputs all substitutions.''' - template_contents = ''' + """Run glib-mkenums with a template which outputs all substitutions.""" + template_contents = """ /*** BEGIN file-header ***/ file-header /*** END file-header ***/ @@ -203,51 +208,66 @@ comment: @comment@ /*** BEGIN file-tail ***/ file-tail /*** END file-tail ***/ -''' +""" return self.runMkenumsWithTemplate(template_contents, *args) - def runMkenumsWithHeader(self, h_contents, encoding='utf-8'): - with tempfile.NamedTemporaryFile(dir=self.tmpdir.name, - suffix='.h', - delete=False) as h_file: + def runMkenumsWithHeader(self, h_contents, encoding="utf-8"): + with tempfile.NamedTemporaryFile( + dir=self.tmpdir.name, suffix=".h", delete=False + ) as h_file: # Write out the header to be scanned. h_file.write(h_contents.encode(encoding)) - print(h_file.name + ':', h_contents) + print(h_file.name + ":", h_contents) h_file.flush() # Run glib-mkenums with a template which outputs all substitutions. result = self.runMkenumsWithAllSubstitutions(h_file.name) # Known substitutions for generated filenames. - result.subs.update({ - 'filename': h_file.name, - 'basename': os.path.basename(h_file.name), - }) + result.subs.update( + {"filename": h_file.name, "basename": os.path.basename(h_file.name),} + ) return result - def assertSingleEnum(self, result, enum_name_camel, enum_name_lower, - enum_name_upper, enum_name_short, enum_prefix, - enum_since, type_lower, type_camel, type_upper, - value_name, value_nick, value_num): + def assertSingleEnum( + self, + result, + enum_name_camel, + enum_name_lower, + enum_name_upper, + enum_name_short, + enum_prefix, + enum_since, + type_lower, + type_camel, + type_upper, + value_name, + value_nick, + value_num, + ): """Assert that out (from runMkenumsWithHeader()) contains a single enum and value matching the given arguments.""" - subs = dict({ - 'enum_name_camel': enum_name_camel, - 'enum_name_lower': enum_name_lower, - 'enum_name_upper': enum_name_upper, - 'enum_name_short': enum_name_short, - 'enum_prefix': enum_prefix, - 'enum_since': enum_since, - 'type_lower': type_lower, - 'type_camel': type_camel, - 'type_upper': type_upper, - 'value_name': value_name, - 'value_nick': value_nick, - 'value_num': value_num, - }, **result.subs) - - self.assertEqual(''' + subs = dict( + { + "enum_name_camel": enum_name_camel, + "enum_name_lower": enum_name_lower, + "enum_name_upper": enum_name_upper, + "enum_name_short": enum_name_short, + "enum_prefix": enum_prefix, + "enum_since": enum_since, + "type_lower": type_lower, + "type_camel": type_camel, + "type_upper": type_upper, + "value_name": value_name, + "value_nick": value_nick, + "value_num": value_num, + }, + **result.subs + ) + + self.assertEqual( + """ comment comment: {standard_top_comment} @@ -297,38 +317,51 @@ file-tail comment comment: {standard_bottom_comment} -'''.format(**subs).strip(), result.out) +""".format( + **subs + ).strip(), + result.out, + ) def test_help(self): """Test the --help argument.""" - result = self.runMkenums('--help') - self.assertIn('usage: glib-mkenums', result.out) + result = self.runMkenums("--help") + self.assertIn("usage: glib-mkenums", result.out) def test_no_args(self): """Test running with no arguments at all.""" result = self.runMkenums() - self.assertEqual('', result.err) - self.assertEqual('''/* {standard_top_comment} */ + self.assertEqual("", result.err) + self.assertEqual( + """/* {standard_top_comment} */ -/* {standard_bottom_comment} */'''.format(**result.subs), - result.out.strip()) +/* {standard_bottom_comment} */""".format( + **result.subs + ), + result.out.strip(), + ) def test_empty_template(self): """Test running with an empty template and no header files.""" - result = self.runMkenumsWithTemplate('') - self.assertEqual('', result.err) - self.assertEqual('''/* {standard_top_comment} */ + result = self.runMkenumsWithTemplate("") + self.assertEqual("", result.err) + self.assertEqual( + """/* {standard_top_comment} */ -/* {standard_bottom_comment} */'''.format(**result.subs), - result.out.strip()) +/* {standard_bottom_comment} */""".format( + **result.subs + ), + result.out.strip(), + ) def test_no_headers(self): """Test running with a complete template, but no header files.""" result = self.runMkenumsWithAllSubstitutions() - self.assertEqual('', result.err) - self.assertEqual(''' + self.assertEqual("", result.err) + self.assertEqual( + """ comment comment: {standard_top_comment} @@ -338,13 +371,18 @@ file-tail comment comment: {standard_bottom_comment} -'''.format(**result.subs).strip(), result.out) +""".format( + **result.subs + ).strip(), + result.out, + ) def test_empty_header(self): """Test an empty header.""" - result = self.runMkenumsWithHeader('') - self.assertEqual('', result.err) - self.assertEqual(''' + result = self.runMkenumsWithHeader("") + self.assertEqual("", result.err) + self.assertEqual( + """ comment comment: {standard_top_comment} @@ -354,94 +392,134 @@ file-tail comment comment: {standard_bottom_comment} -'''.format(**result.subs).strip(), result.out) +""".format( + **result.subs + ).strip(), + result.out, + ) def test_enum_name(self): """Test typedefs with an enum and a typedef name. Bug #794506.""" - h_contents = ''' + h_contents = """ typedef enum _SomeEnumIdentifier { ENUM_VALUE } SomeEnumIdentifier; - ''' + """ result = self.runMkenumsWithHeader(h_contents) - self.assertEqual('', result.err) - self.assertSingleEnum(result, 'SomeEnumIdentifier', - 'some_enum_identifier', 'SOME_ENUM_IDENTIFIER', - 'ENUM_IDENTIFIER', 'SOME', '', 'enum', 'Enum', - 'ENUM', 'ENUM_VALUE', 'value', '0') + self.assertEqual("", result.err) + self.assertSingleEnum( + result, + "SomeEnumIdentifier", + "some_enum_identifier", + "SOME_ENUM_IDENTIFIER", + "ENUM_IDENTIFIER", + "SOME", + "", + "enum", + "Enum", + "ENUM", + "ENUM_VALUE", + "value", + "0", + ) def test_non_utf8_encoding(self): """Test source files with non-UTF-8 encoding. Bug #785113.""" - h_contents = ''' + h_contents = """ /* Copyright © La Peña */ typedef enum { ENUM_VALUE } SomeEnumIdentifier; - ''' - result = self.runMkenumsWithHeader(h_contents, encoding='iso-8859-1') - self.assertIn('WARNING: UnicodeWarning: ', result.err) - self.assertSingleEnum(result, 'SomeEnumIdentifier', - 'some_enum_identifier', 'SOME_ENUM_IDENTIFIER', - 'ENUM_IDENTIFIER', 'SOME', '', 'enum', 'Enum', - 'ENUM', 'ENUM_VALUE', 'value', '0') + """ + result = self.runMkenumsWithHeader(h_contents, encoding="iso-8859-1") + self.assertIn("WARNING: UnicodeWarning: ", result.err) + self.assertSingleEnum( + result, + "SomeEnumIdentifier", + "some_enum_identifier", + "SOME_ENUM_IDENTIFIER", + "ENUM_IDENTIFIER", + "SOME", + "", + "enum", + "Enum", + "ENUM", + "ENUM_VALUE", + "value", + "0", + ) def test_reproducible(self): """Test builds are reproducible regardless of file ordering. Bug #691436.""" - template_contents = 'template' + template_contents = "template" - h_contents1 = ''' + h_contents1 = """ typedef enum { FIRST, } Header1; - ''' + """ - h_contents2 = ''' + h_contents2 = """ typedef enum { SECOND, } Header2; - ''' + """ - with tempfile.NamedTemporaryFile(dir=self.tmpdir.name, - suffix='1.h', delete=False) as h_file1, \ - tempfile.NamedTemporaryFile(dir=self.tmpdir.name, - suffix='2.h', delete=False) as h_file2: + with tempfile.NamedTemporaryFile( + dir=self.tmpdir.name, suffix="1.h", delete=False + ) as h_file1, tempfile.NamedTemporaryFile( + dir=self.tmpdir.name, suffix="2.h", delete=False + ) as h_file2: # Write out the headers. - h_file1.write(h_contents1.encode('utf-8')) - h_file2.write(h_contents2.encode('utf-8')) + h_file1.write(h_contents1.encode("utf-8")) + h_file2.write(h_contents2.encode("utf-8")) h_file1.flush() h_file2.flush() # Run glib-mkenums with the headers in one order, and then again # in another order. - result1 = self.runMkenumsWithTemplate(template_contents, - h_file1.name, h_file2.name) - self.assertEqual('', result1.err) + result1 = self.runMkenumsWithTemplate( + template_contents, h_file1.name, h_file2.name + ) + self.assertEqual("", result1.err) - result2 = self.runMkenumsWithTemplate(template_contents, - h_file2.name, h_file1.name) - self.assertEqual('', result2.err) + result2 = self.runMkenumsWithTemplate( + template_contents, h_file2.name, h_file1.name + ) + self.assertEqual("", result2.err) # The output should be the same. self.assertEqual(result1.out, result2.out) def test_no_nick(self): """Test trigraphs with a desc but no nick. Issue #1360.""" - h_contents = ''' + h_contents = """ typedef enum { GEGL_SAMPLER_NEAREST = 0, /*< desc="nearest" >*/ } GeglSamplerType; - ''' + """ result = self.runMkenumsWithHeader(h_contents) - self.assertEqual('', result.err) - self.assertSingleEnum(result, 'GeglSamplerType', - 'gegl_sampler_type', 'GEGL_SAMPLER_TYPE', - 'SAMPLER_TYPE', 'GEGL', '', 'enum', 'Enum', - 'ENUM', 'GEGL_SAMPLER_NEAREST', 'nearest', '0') + self.assertEqual("", result.err) + self.assertSingleEnum( + result, + "GeglSamplerType", + "gegl_sampler_type", + "GEGL_SAMPLER_TYPE", + "SAMPLER_TYPE", + "GEGL", + "", + "enum", + "Enum", + "ENUM", + "GEGL_SAMPLER_NEAREST", + "nearest", + "0", + ) def test_filename_basename_in_fhead_ftail(self): - template_contents = ''' + template_contents = """ /*** BEGIN file-header ***/ file-header filename: @filename@ @@ -457,18 +535,21 @@ comment: @comment@ file-tail filename: @filename@ basename: @basename@ -/*** END file-tail ***/''' +/*** END file-tail ***/""" result = self.runMkenumsWithTemplate(template_contents) self.assertEqual( textwrap.dedent( - ''' + """ WARNING: @filename@ used in file-header section. WARNING: @basename@ used in file-header section. WARNING: @filename@ used in file-tail section. WARNING: @basename@ used in file-tail section. - ''').strip(), - result.err) - self.assertEqual(''' + """ + ).strip(), + result.err, + ) + self.assertEqual( + """ comment comment: {standard_top_comment} @@ -482,27 +563,44 @@ basename: @basename@ comment comment: {standard_bottom_comment} -'''.format(**result.subs).strip(), result.out) +""".format( + **result.subs + ).strip(), + result.out, + ) def test_since(self): """Test user-provided 'since' version handling https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1492""" - h_contents = ''' + h_contents = """ typedef enum { /*< since=1.0 >*/ QMI_WMS_MESSAGE_PROTOCOL_CDMA = 0, } QmiWmsMessageProtocol; - ''' + """ result = self.runMkenumsWithHeader(h_contents) - self.assertEqual('', result.err) - self.assertSingleEnum(result, 'QmiWmsMessageProtocol', - 'qmi_wms_message_protocol', 'QMI_WMS_MESSAGE_PROTOCOL', - 'WMS_MESSAGE_PROTOCOL', 'QMI', '1.0', 'enum', 'Enum', - 'ENUM', 'QMI_WMS_MESSAGE_PROTOCOL_CDMA', 'cdma', '0') + self.assertEqual("", result.err) + self.assertSingleEnum( + result, + "QmiWmsMessageProtocol", + "qmi_wms_message_protocol", + "QMI_WMS_MESSAGE_PROTOCOL", + "WMS_MESSAGE_PROTOCOL", + "QMI", + "1.0", + "enum", + "Enum", + "ENUM", + "QMI_WMS_MESSAGE_PROTOCOL_CDMA", + "cdma", + "0", + ) + class TestRspMkenums(TestMkenums): - '''Run all tests again in @rspfile mode''' + """Run all tests again in @rspfile mode""" + rspfile = True -if __name__ == '__main__': +if __name__ == "__main__": unittest.main(testRunner=taptestrunner.TAPTestRunner()) |