diff --git a/test/test_chordpro/test_parser.py b/test/test_chordpro/test_parser.py index fd30a9b3..82a02fb6 100644 --- a/test/test_chordpro/test_parser.py +++ b/test/test_chordpro/test_parser.py @@ -2,6 +2,7 @@ # pylint: disable=too-few-public-methods +import contextlib import glob import os import unittest @@ -33,6 +34,28 @@ class FileTest(unittest.TestCase, metaclass=dynamic.DynamicTest): maxDiff = None + @staticmethod + @contextlib.contextmanager + def chdir(): + """Context to temporarry change current directory to this file directory + """ + olddir = os.getcwd() + os.chdir(resource_filename(__name__, "")) + yield + os.chdir(olddir) + + def assertRender(self, destformat, sourcename, destname): # pylint: disable=invalid-name + """Assert that `sourcename` is correctly rendered as `destname` in `destformat`. + """ + with self.chdir(): + with open_read(destname) as expectfile: + with disable_logging(): + song = self.song_plugins[LANGUAGES[destformat]]['sgc'](sourcename, self.config) + self.assertMultiLineEqual( + song.render(output=sourcename).strip(), + expectfile.read().strip(), + ) + @classmethod def _iter_testmethods(cls): """Iterate over song files to test.""" @@ -40,33 +63,25 @@ class FileTest(unittest.TestCase, metaclass=dynamic.DynamicTest): cls.config = DEFAULT_CONFIG if 'datadir' not in cls.config: cls.config['datadir'] = [] - cls.config['datadir'].append(resource_filename(__name__, 'datadir')) + cls.config['datadir'].append('datadir') cls.song_plugins = files.load_plugins( datadirs=cls.config['datadir'], root_modules=['songs'], keyword='SONG_RENDERERS', ) - for source in sorted(glob.glob(os.path.join( - os.path.dirname(__file__), - '*.source', - ))): - base = os.path.relpath(source, os.getcwd())[:-len(".source")] - for dest in LANGUAGES: - destname = "{}.{}".format(base, dest) - if not os.path.exists(destname): - continue - yield ( - "test_{}_{}".format(os.path.basename(base), dest), - cls._create_test(base, dest), - ) - if os.path.basename(base) == 'newline': + with cls.chdir(): + for source in sorted(glob.glob('*.source')): + base = source[:-len(".source")] + for dest in LANGUAGES: + destname = "{}.{}".format(base, dest) + if not os.path.exists(destname): + continue yield ( - "test_crlf_{}_{}".format(os.path.basename(base), dest), - cls._create_crlf_test(base, dest), + "test_{}_{}".format(base, dest), + cls._create_test(base, dest), ) - @classmethod def _create_test(cls, base, dest): """Return a function testing that `base` compilation in `dest` format. @@ -76,51 +91,24 @@ class FileTest(unittest.TestCase, metaclass=dynamic.DynamicTest): """Test that `base` is correctly parsed and rendered.""" if base is None or dest is None: return - destname = "{}.{}".format(base, dest) - with open_read(destname) as expectfile: - chordproname = "{}.source".format(base) - with disable_logging(): - self.assertMultiLineEqual( - self.song_plugins[LANGUAGES[dest]]['sgc'](chordproname, self.config).render( - output=chordproname, - ).strip(), - expectfile.read().strip(), - ) + self.assertRender(dest, "{}.source".format(base), "{}.{}".format(base, dest)) test_parse_render.__doc__ = ( "Test that '{base}' is correctly parsed and rendererd into '{format}' format." ).format(base=os.path.basename(base), format=dest) return test_parse_render - @classmethod - def _create_crlf_test(cls, base, dest): - """Transform the `base` line endings into CRLF and test the compilation. + def test_clrf(self): + """Test that source is correctly parsed and rendered when line endings are CRLF. """ - - def test_parse_render(self): - """Test that `base` is correctly parsed and rendered when line endings are CRLF. - """ - if base is None or dest is None: - return - originalname = "{}.source".format(base) - chordproname = "{}.crlf.source".format(base) + originalname = "newline.source" + chordproname = "newline.crlf.source" + with self.chdir(): with open_read(originalname) as originalfile: with open(chordproname, 'w') as chordprofile: for line in originalfile: chordprofile.write(line.replace('\n', '\r\n')) - destname = "{}.{}".format(base, dest) - with open_read(destname) as expectfile: - with disable_logging(): - self.assertMultiLineEqual( - self.song_plugins[LANGUAGES[dest]]['sgc'](chordproname, self.config).render( - output=chordproname, - ).strip(), - expectfile.read().strip(), - ) + for dest in LANGUAGES: + with self.subTest(dest): + self.assertRender(dest, chordproname, "newline.{}".format(dest)) os.remove(chordproname) - - test_parse_render.__doc__ = ( - "Test that '{base}' is correctly parsed and rendererd into '{format}' format with CRLF." - ).format(base=os.path.basename(base), format=dest) - return test_parse_render -