summaryrefslogtreecommitdiff
path: root/gobject/tests/mkenums.py
diff options
context:
space:
mode:
Diffstat (limited to 'gobject/tests/mkenums.py')
-rw-r--r--gobject/tests/mkenums.py382
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())