From 207472283b7ef744b0181667ce264651f270e86c Mon Sep 17 00:00:00 2001 From: Maveno Date: Thu, 31 Oct 2024 23:31:58 +0100 Subject: [PATCH] nightly combinator tests rc1 --- bin/ffx/test/disposition_combination_2.py | 27 ---- bin/ffx/test/disposition_combination_2_0.py | 24 ---- bin/ffx/test/disposition_combination_2_1.py | 28 ---- bin/ffx/test/disposition_combination_2_2.py | 24 ---- bin/ffx/test/disposition_combination_2_3.py | 23 --- bin/ffx/test/disposition_combination_3.py | 27 ---- bin/ffx/test/disposition_combination_3_0.py | 26 ---- bin/ffx/test/disposition_combination_3_1.py | 31 ---- bin/ffx/test/disposition_combination_3_2.py | 31 ---- bin/ffx/test/disposition_combination_3_3.py | 27 ---- bin/ffx/test/disposition_combination_3_4.py | 24 ---- bin/ffx/test/disposition_combinator_2_2.py | 4 +- bin/ffx/test/helper.py | 31 ++-- bin/ffx/test/jellyfin_combinator.py | 33 +++++ bin/ffx/test/jellyfin_combinator_0.py | 34 +++++ bin/ffx/test/jellyfin_combinator_1.py | 34 +++++ bin/ffx/test/media_combinator.py | 4 +- bin/ffx/test/media_combinator_0.py | 31 ++-- bin/ffx/test/media_combinator_1.py | 34 +++-- bin/ffx/test/media_combinator_2.py | 70 ++++++--- bin/ffx/test/media_combinator_3.py | 55 +++++-- bin/ffx/test/media_combinator_4.py | 67 ++++++--- bin/ffx/test/media_combinator_5.py | 55 +++++-- bin/ffx/test/media_combinator_6.py | 79 +++++++--- bin/ffx/test/media_combinator_7.py | 78 +++++++--- bin/ffx/test/media_tag_combinator.py | 33 +++++ bin/ffx/test/media_tag_combinator_0.py | 31 ++++ bin/ffx/test/media_tag_combinator_1.py | 36 +++++ bin/ffx/test/media_tag_combinator_2.py | 39 +++++ bin/ffx/test/scenario.py | 9 +- bin/ffx/test/scenario_1.py | 151 +++++++++++++------- bin/ffx/test/track_combination.py | 27 ---- bin/ffx/test/track_combination_0.py | 36 ----- bin/ffx/test/track_combination_1.py | 42 ------ bin/ffx/test/track_combination_2.py | 48 ------- bin/ffx/test/track_combination_3.py | 65 --------- bin/ffx/test/track_combination_4.py | 42 ------ bin/ffx/test/track_combination_5.py | 48 ------- bin/ffx/test/track_combination_6.py | 54 ------- bin/ffx/test/track_combination_7.py | 62 -------- bin/ffx/test/track_tag_combinator_2.py | 33 +++++ bin/ffx/test/track_tag_combinator_2_0.py | 32 +++++ bin/ffx/test/track_tag_combinator_2_1.py | 34 +++++ bin/ffx/test/track_tag_combinator_2_2.py | 35 +++++ bin/ffx/test/track_tag_combinator_2_3.py | 37 +++++ bin/ffx/test/track_tag_combinator_3.py | 33 +++++ bin/ffx/test/track_tag_combinator_3_0.py | 36 +++++ bin/ffx/test/track_tag_combinator_3_1.py | 38 +++++ bin/ffx/test/track_tag_combinator_3_2.py | 39 +++++ bin/ffx/test/track_tag_combinator_3_3.py | 38 +++++ bin/ffx/test/track_tag_combinator_3_4.py | 42 ++++++ bin/ffx_tests.py | 2 +- 52 files changed, 1107 insertions(+), 916 deletions(-) delete mode 100644 bin/ffx/test/disposition_combination_2.py delete mode 100644 bin/ffx/test/disposition_combination_2_0.py delete mode 100644 bin/ffx/test/disposition_combination_2_1.py delete mode 100644 bin/ffx/test/disposition_combination_2_2.py delete mode 100644 bin/ffx/test/disposition_combination_2_3.py delete mode 100644 bin/ffx/test/disposition_combination_3.py delete mode 100644 bin/ffx/test/disposition_combination_3_0.py delete mode 100644 bin/ffx/test/disposition_combination_3_1.py delete mode 100644 bin/ffx/test/disposition_combination_3_2.py delete mode 100644 bin/ffx/test/disposition_combination_3_3.py delete mode 100644 bin/ffx/test/disposition_combination_3_4.py create mode 100644 bin/ffx/test/jellyfin_combinator.py create mode 100644 bin/ffx/test/jellyfin_combinator_0.py create mode 100644 bin/ffx/test/jellyfin_combinator_1.py create mode 100644 bin/ffx/test/media_tag_combinator.py create mode 100644 bin/ffx/test/media_tag_combinator_0.py create mode 100644 bin/ffx/test/media_tag_combinator_1.py create mode 100644 bin/ffx/test/media_tag_combinator_2.py delete mode 100644 bin/ffx/test/track_combination.py delete mode 100644 bin/ffx/test/track_combination_0.py delete mode 100644 bin/ffx/test/track_combination_1.py delete mode 100644 bin/ffx/test/track_combination_2.py delete mode 100644 bin/ffx/test/track_combination_3.py delete mode 100644 bin/ffx/test/track_combination_4.py delete mode 100644 bin/ffx/test/track_combination_5.py delete mode 100644 bin/ffx/test/track_combination_6.py delete mode 100644 bin/ffx/test/track_combination_7.py create mode 100644 bin/ffx/test/track_tag_combinator_2.py create mode 100644 bin/ffx/test/track_tag_combinator_2_0.py create mode 100644 bin/ffx/test/track_tag_combinator_2_1.py create mode 100644 bin/ffx/test/track_tag_combinator_2_2.py create mode 100644 bin/ffx/test/track_tag_combinator_2_3.py create mode 100644 bin/ffx/test/track_tag_combinator_3.py create mode 100644 bin/ffx/test/track_tag_combinator_3_0.py create mode 100644 bin/ffx/test/track_tag_combinator_3_1.py create mode 100644 bin/ffx/test/track_tag_combinator_3_2.py create mode 100644 bin/ffx/test/track_tag_combinator_3_3.py create mode 100644 bin/ffx/test/track_tag_combinator_3_4.py diff --git a/bin/ffx/test/disposition_combination_2.py b/bin/ffx/test/disposition_combination_2.py deleted file mode 100644 index 8e7a141..0000000 --- a/bin/ffx/test/disposition_combination_2.py +++ /dev/null @@ -1,27 +0,0 @@ -import os, sys, importlib, glob, inspect - -class DispositionCombination2(): - - def __init__(self, context = None): - self._context = context - self._logger = context['logger'] - self._reportLogger = context['report_logger'] - - def getIdentifier(self): - return self._combinationIdentifier - - @staticmethod - def list(): - basePath = os.path.dirname(__file__) - return [os.path.basename(p)[26:-3] - for p - in glob.glob(f"{ basePath }/disposition_combination_2_*.py", recursive = True) - if p != __file__] - - @staticmethod - def getClassReference(identifier): - importlib.import_module(f"ffx.test.disposition_combination_2_{ identifier }") - for name, obj in inspect.getmembers(sys.modules[f"ffx.test.disposition_combination_2_{ identifier }"]): - #HINT: Excluding DispositionCombination as it seems to be included by import (?) - if inspect.isclass(obj) and name != 'DispositionCombination2' and name.startswith('DispositionCombination2'): - return obj diff --git a/bin/ffx/test/disposition_combination_2_0.py b/bin/ffx/test/disposition_combination_2_0.py deleted file mode 100644 index 3391895..0000000 --- a/bin/ffx/test/disposition_combination_2_0.py +++ /dev/null @@ -1,24 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_2 import DispositionCombination2 - - -class DispositionCombination20(DispositionCombination2): - - COMBINATION_IDENTIFIER = 'D00' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination20.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set(), # 0 - set()) # 1 - - def evaluateTrackDescriptors(self, trackDescriptors): - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - - def shouldFail(self): - return False diff --git a/bin/ffx/test/disposition_combination_2_1.py b/bin/ffx/test/disposition_combination_2_1.py deleted file mode 100644 index a06b16b..0000000 --- a/bin/ffx/test/disposition_combination_2_1.py +++ /dev/null @@ -1,28 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_2 import DispositionCombination2 - - -class DispositionCombination21(DispositionCombination2): - - COMBINATION_IDENTIFIER = 'D10' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination21.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set([TrackDisposition.DEFAULT]), # 0 - set()) # 1 - - def evaluateTrackDescriptors(self, trackDescriptors): - if self._context['use_jellyfin']: - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition" - else: - assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has not set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - - def shouldFail(self): - return False diff --git a/bin/ffx/test/disposition_combination_2_2.py b/bin/ffx/test/disposition_combination_2_2.py deleted file mode 100644 index 72021ae..0000000 --- a/bin/ffx/test/disposition_combination_2_2.py +++ /dev/null @@ -1,24 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_2 import DispositionCombination2 - - -class DispositionCombination22(DispositionCombination2): - - COMBINATION_IDENTIFIER = 'D01' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination22.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set(), # 0 - set([TrackDisposition.DEFAULT])) # 1 - - def evaluateTrackDescriptors(self, trackDescriptors): - assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition" - - def shouldFail(self): - return False diff --git a/bin/ffx/test/disposition_combination_2_3.py b/bin/ffx/test/disposition_combination_2_3.py deleted file mode 100644 index 5fad937..0000000 --- a/bin/ffx/test/disposition_combination_2_3.py +++ /dev/null @@ -1,23 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_2 import DispositionCombination2 - - -class DispositionCombination23(DispositionCombination2): - - COMBINATION_IDENTIFIER = 'D11' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination23.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set([TrackDisposition.DEFAULT]), # 0 - set([TrackDisposition.DEFAULT])) # 1 - - def evaluateTrackDescriptors(self, trackDescriptors): - pass - - def shouldFail(self): - return True diff --git a/bin/ffx/test/disposition_combination_3.py b/bin/ffx/test/disposition_combination_3.py deleted file mode 100644 index e137aa3..0000000 --- a/bin/ffx/test/disposition_combination_3.py +++ /dev/null @@ -1,27 +0,0 @@ -import os, sys, importlib, glob, inspect - -class DispositionCombination3(): - - def __init__(self, context = None): - self._context = context - self._logger = context['logger'] - self._reportLogger = context['report_logger'] - - def getIdentifier(self): - return self._combinationIdentifier - - @staticmethod - def list(): - basePath = os.path.dirname(__file__) - return [os.path.basename(p)[26:-3] - for p - in glob.glob(f"{ basePath }/disposition_combination_3_*.py", recursive = True) - if p != __file__] - - @staticmethod - def getClassReference(identifier): - importlib.import_module(f"ffx.test.disposition_combination_3_{ identifier }") - for name, obj in inspect.getmembers(sys.modules[f"ffx.test.disposition_combination_3_{ identifier }"]): - #HINT: Excluding DispositionCombination as it seems to be included by import (?) - if inspect.isclass(obj) and name != 'DispositionCombination3' and name.startswith('DispositionCombination3'): - return obj diff --git a/bin/ffx/test/disposition_combination_3_0.py b/bin/ffx/test/disposition_combination_3_0.py deleted file mode 100644 index 303782f..0000000 --- a/bin/ffx/test/disposition_combination_3_0.py +++ /dev/null @@ -1,26 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_3 import DispositionCombination3 - - -class DispositionCombination30(DispositionCombination3): - - COMBINATION_IDENTIFIER = 'D000' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination30.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set(), # 0 - set(), # 1 - set()) # 2 - - def evaluateTrackDescriptors(self, trackDescriptors): - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - assert not trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has set default disposition" - - def shouldFail(self): - return False diff --git a/bin/ffx/test/disposition_combination_3_1.py b/bin/ffx/test/disposition_combination_3_1.py deleted file mode 100644 index f11cf8d..0000000 --- a/bin/ffx/test/disposition_combination_3_1.py +++ /dev/null @@ -1,31 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_3 import DispositionCombination3 - - -class DispositionCombination31(DispositionCombination3): - - COMBINATION_IDENTIFIER = 'D100' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination31.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set([TrackDisposition.DEFAULT]), # 0 - set(), # 1 - set()) # 2 - - def evaluateTrackDescriptors(self, trackDescriptors): - if self._context['use_jellyfin']: - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - assert trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has not set default disposition" - else: - assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has not set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - assert not trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has set default disposition" - - def shouldFail(self): - return False \ No newline at end of file diff --git a/bin/ffx/test/disposition_combination_3_2.py b/bin/ffx/test/disposition_combination_3_2.py deleted file mode 100644 index 991da6c..0000000 --- a/bin/ffx/test/disposition_combination_3_2.py +++ /dev/null @@ -1,31 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_3 import DispositionCombination3 - - -class DispositionCombination32(DispositionCombination3): - - COMBINATION_IDENTIFIER = 'D010' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination32.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set(), # 0 - set([TrackDisposition.DEFAULT]), # 1 - set()) # 2 - - def evaluateTrackDescriptors(self, trackDescriptors): - if self._context['use_jellyfin']: - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - assert trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has not set default disposition" - else: - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition" - assert not trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has set default disposition" - - def shouldFail(self): - return False \ No newline at end of file diff --git a/bin/ffx/test/disposition_combination_3_3.py b/bin/ffx/test/disposition_combination_3_3.py deleted file mode 100644 index 2ead619..0000000 --- a/bin/ffx/test/disposition_combination_3_3.py +++ /dev/null @@ -1,27 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_3 import DispositionCombination3 - - -class DispositionCombination33(DispositionCombination3): - - COMBINATION_IDENTIFIER = 'D001' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination33.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set(), # 0 - set(), # 1 - set([TrackDisposition.DEFAULT])) # 2 - - def evaluateTrackDescriptors(self, trackDescriptors): - if self._context['use_jellyfin']: - assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" - assert trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has not set default disposition" - - def shouldFail(self): - return False \ No newline at end of file diff --git a/bin/ffx/test/disposition_combination_3_4.py b/bin/ffx/test/disposition_combination_3_4.py deleted file mode 100644 index 1acb53d..0000000 --- a/bin/ffx/test/disposition_combination_3_4.py +++ /dev/null @@ -1,24 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_disposition import TrackDisposition -from .disposition_combination_3 import DispositionCombination3 - - -class DispositionCombination34(DispositionCombination3): - - COMBINATION_IDENTIFIER = 'D101' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = DispositionCombination34.COMBINATION_IDENTIFIER - - def getDispositionTuple(self): - return (set([TrackDisposition.DEFAULT]), # 0 - set(), # 1 - set([TrackDisposition.DEFAULT])) # 2 - - def evaluateTrackDescriptors(self, trackDescriptors): - pass - - def shouldFail(self): - return True diff --git a/bin/ffx/test/disposition_combinator_2_2.py b/bin/ffx/test/disposition_combinator_2_2.py index 80ef8c1..620d48c 100644 --- a/bin/ffx/test/disposition_combinator_2_2.py +++ b/bin/ffx/test/disposition_combinator_2_2.py @@ -18,8 +18,8 @@ class DispositionCombinator22(DispositionCombinator2): set([TrackDisposition.DEFAULT])) # 1 def assertFunc(self, trackDescriptors): - assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition" - assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition" + assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 index={trackDescriptors[0].getIndex()} [{trackDescriptors[0].getType().label()}:{trackDescriptors[0].getSubIndex()}] has set default disposition" + assert trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 index={trackDescriptors[1].getIndex()} [{trackDescriptors[1].getType().label()}:{trackDescriptors[1].getSubIndex()}] has not set default disposition" def shouldFail(self): return False diff --git a/bin/ffx/test/helper.py b/bin/ffx/test/helper.py index b68cdd4..2111148 100644 --- a/bin/ffx/test/helper.py +++ b/bin/ffx/test/helper.py @@ -44,7 +44,7 @@ def getTimeString(hours: float = 0.0, return f"{hours:02d}:{minutes:02d}:{seconds:02d}.{millis:03d}" -def createAssFile(entries: dict): +def createAssFile(entries: dict, directory = None): # [Script Info] # ; Script generated by FFmpeg/Lavc61.3.100 @@ -63,7 +63,7 @@ def createAssFile(entries: dict): # Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,yolo # Dialogue: 0,0:00:03.00,0:00:04.00,Default,,0,0,0,,zolo # Dialogue: 0,0:00:05.00,0:00:06.00,Default,,0,0,0,,golo - tmpFileName = tempfile.mktemp(suffix=".ass") + tmpFileName = tempfile.mktemp(suffix=".ass", dir = directory) with open(tmpFileName, 'w') as tmpFile: @@ -87,7 +87,7 @@ def createAssFile(entries: dict): return tmpFileName -def createSrtFile(entries: dict): +def createSrtFile(entries: dict, directory = None): # 1 # 00:00:00,000 --> 00:00:02,500 # Welcome to the Example Subtitle File! @@ -100,7 +100,7 @@ def createSrtFile(entries: dict): # 00:00:07,000 --> 00:00:10,500 # You can use SRT files to add subtitles to your videos. - tmpFileName = tempfile.mktemp(suffix=".srt") + tmpFileName = tempfile.mktemp(suffix=".srt", dir = directory) with open(tmpFileName, 'w') as tmpFile: @@ -113,13 +113,13 @@ def createSrtFile(entries: dict): return tmpFileName -def createVttFile(entries: dict): +def createVttFile(entries: dict, directory = None): # WEBVTT # # 01:20:33.050 --> 01:20:35.050 # Yolo - tmpFileName = tempfile.mktemp(suffix=".vtt") + tmpFileName = tempfile.mktemp(suffix=".vtt", dir = directory) with open(tmpFileName, 'w') as tmpFile: @@ -143,7 +143,8 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor, sizeX: int = 1280, sizeY: int = 720, rate: int = 25, - length: int = 10): + length: int = 10, + logger = None): # subtitleFilePath = createVttFile(SHORT_SUBTITLE_SEQUENCE) @@ -217,7 +218,7 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor, # click.echo(f"createMediaTestFile() cache index={cacheIndex} size={len(generatorCache)}") if cacheIndex == -1: - importTokens = ['-i', createVttFile(SHORT_SUBTITLE_SEQUENCE)] + importTokens = ['-i', createVttFile(SHORT_SUBTITLE_SEQUENCE, directory=directory if directory else None)] sourceIndex = len(generatorCache) - 1 if cacheIndex == -1 else cacheIndex mappingTokens += ['-map', f"{sourceIndex}:s:0"] @@ -254,10 +255,18 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor, commandTokens += [outputPath] - # click.echo(f"command sequence: {commandTokens}") + + if not logger is None: + logger.debug(f"createMediaTestFile(): Command sequence: {commandTokens}") + out, err, rc = executeProcess(commandTokens) - #if rc: - # click.echo(f"Creating testfile failed with {rc}: {err}") + + if not logger is None: + if out: + logger.debug(f"createMediaTestFile(): Process output: {out}") + if rc: + logger.debug(f"createMediaTestFile(): Process returned ERROR {rc} ({err})") + return outputPath diff --git a/bin/ffx/test/jellyfin_combinator.py b/bin/ffx/test/jellyfin_combinator.py new file mode 100644 index 0000000..47eb877 --- /dev/null +++ b/bin/ffx/test/jellyfin_combinator.py @@ -0,0 +1,33 @@ +import os, sys, importlib, glob, inspect, itertools + +class JellyfinCombinator(): + + IDENTIFIER = 'jellyfin' + + def __init__(self, context = None): + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + def getIdentifier(self): + return JellyfinCombinator.IDENTIFIER + + @staticmethod + def list(): + basePath = os.path.dirname(__file__) + return [os.path.basename(p)[20:-3] + for p + in glob.glob(f"{ basePath }/jellyfin_combinator_*.py", recursive = True) + if p != __file__] + + @staticmethod + def getClassReference(identifier): + importlib.import_module(f"ffx.test.jellyfin_combinator_{ identifier }") + for name, obj in inspect.getmembers(sys.modules[f"ffx.test.jellyfin_combinator_{ identifier }"]): + #HINT: Excluding MediaCombinator as it seems to be included by import (?) + if inspect.isclass(obj) and name != 'JellyfinCombinator' and name.startswith('JellyfinCombinator'): + return obj + + @staticmethod + def getAllClassReferences(): + return [JellyfinCombinator.getClassReference(i) for i in JellyfinCombinator.list()] diff --git a/bin/ffx/test/jellyfin_combinator_0.py b/bin/ffx/test/jellyfin_combinator_0.py new file mode 100644 index 0000000..035585e --- /dev/null +++ b/bin/ffx/test/jellyfin_combinator_0.py @@ -0,0 +1,34 @@ +import os, sys, importlib, glob, inspect, itertools + +from ffx.track_type import TrackType + +from ffx.track_descriptor import TrackDescriptor +from ffx.media_descriptor import MediaDescriptor + +from .jellyfin_combinator import JellyfinCombinator + + +class JellyfinCombinator0(JellyfinCombinator): + + VARIANT = 'j' + + # def __init__(self, SubCombinators: dict = {}, context = None): + def __init__(self, context = None): + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + # self._SubCombinators = SubCombinators + + def getVariant(self): + return JellyfinCombinator0.VARIANT + + + def getPayload(self): + return False + + def assertFunc(self, testObj = {}): + pass + + def shouldFail(self): + return False diff --git a/bin/ffx/test/jellyfin_combinator_1.py b/bin/ffx/test/jellyfin_combinator_1.py new file mode 100644 index 0000000..3119d39 --- /dev/null +++ b/bin/ffx/test/jellyfin_combinator_1.py @@ -0,0 +1,34 @@ +import os, sys, importlib, glob, inspect, itertools + +from ffx.track_type import TrackType + +from ffx.track_descriptor import TrackDescriptor +from ffx.media_descriptor import MediaDescriptor + +from .jellyfin_combinator import JellyfinCombinator + +class JellyfinCombinator1(JellyfinCombinator): + + VARIANT = 'J' + + # def __init__(self, SubCombinators: dict = {}, context = None): + def __init__(self, context = None): + + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + # self._SubCombinators = SubCombinations + + def getVariant(self): + return JellyfinCombinator1.VARIANT + + + def getPayload(self): + return True + + def assertFunc(self, testObj = {}): + pass + + def shouldFail(self): + return False diff --git a/bin/ffx/test/media_combinator.py b/bin/ffx/test/media_combinator.py index 81cd5e7..4053e35 100644 --- a/bin/ffx/test/media_combinator.py +++ b/bin/ffx/test/media_combinator.py @@ -10,9 +10,7 @@ class MediaCombinator(): self._reportLogger = context['report_logger'] def getIdentifier(self): - return self._identifier - def getVariant(self): - return self._variant + return MediaCombinator.IDENTIFIER @staticmethod def list(): diff --git a/bin/ffx/test/media_combinator_0.py b/bin/ffx/test/media_combinator_0.py index 0566ef5..b16642b 100644 --- a/bin/ffx/test/media_combinator_0.py +++ b/bin/ffx/test/media_combinator_0.py @@ -6,6 +6,8 @@ from ffx.track_descriptor import TrackDescriptor from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator class MediaCombinator0(MediaCombinator): @@ -20,8 +22,9 @@ class MediaCombinator0(MediaCombinator): # self._SubCombinators = SubCombinators - self._identifier = MediaCombinator0.IDENTIFIER - self._variant = MediaCombinator0.VARIANT + def getVariant(self): + return MediaCombinator0.VARIANT + def getPayload(self): @@ -45,7 +48,7 @@ class MediaCombinator0(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): @@ -53,13 +56,21 @@ class MediaCombinator0(MediaCombinator): def getYield(self): - yieldObj = {} + for MTC in MediaTagCombinator.getAllClassReferences(): + + mtc = MTC(self._context) + + yieldObj = {} - yieldObj['identifier'] = MediaCombinator0.IDENTIFIER - yieldObj['variants'] = [MediaCombinator0.VARIANT] - yieldObj['payload'] = self.getPayload() + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + mtc.getVariant()] + yieldObj['payload'] = self.getPayload() - yieldObj['assertFuncs'] = [self.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() + yieldObj['assertSelectors'] = ['M', 'MT'] + yieldObj['assertFuncs'] = [self.assertFunc, + mtc.assertFunc] + yieldObj['shouldFail'] = (self.shouldFail() + | mtc.shouldFail()) - yield yieldObj + yield yieldObj diff --git a/bin/ffx/test/media_combinator_1.py b/bin/ffx/test/media_combinator_1.py index 2c12963..7c7ccd0 100644 --- a/bin/ffx/test/media_combinator_1.py +++ b/bin/ffx/test/media_combinator_1.py @@ -6,6 +6,9 @@ from ffx.track_descriptor import TrackDescriptor from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator + class MediaCombinator1(MediaCombinator): @@ -20,8 +23,9 @@ class MediaCombinator1(MediaCombinator): # self._SubCombinators = SubCombinations - self._identifier = MediaCombinator1.IDENTIFIER - self._variant = MediaCombinator1.VARIANT + def getVariant(self): + return MediaCombinator1.VARIANT + def getPayload(self): @@ -51,7 +55,7 @@ class MediaCombinator1(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): @@ -59,13 +63,23 @@ class MediaCombinator1(MediaCombinator): def getYield(self): - yieldObj = {} + for MTC in MediaTagCombinator.getAllClassReferences(): + + mtc = MTC(self._context) + + yieldObj = {} + + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + mtc.getVariant()] + + yieldObj['payload'] = self.getPayload() - yieldObj['identifier'] = MediaCombinator1.IDENTIFIER - yieldObj['variants'] = [MediaCombinator1.VARIANT] + yieldObj['assertSelectors'] = ['M', 'MT'] + yieldObj['assertFuncs'] = [self.assertFunc, + mtc.assertFunc] - yieldObj['payload'] = self.getPayload() - yieldObj['assertFuncs'] = [self.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() + yieldObj['shouldFail'] = (self.shouldFail() + | mtc.shouldFail()) - yield yieldObj + yield yieldObj diff --git a/bin/ffx/test/media_combinator_2.py b/bin/ffx/test/media_combinator_2.py index 81791f2..4d0778c 100644 --- a/bin/ffx/test/media_combinator_2.py +++ b/bin/ffx/test/media_combinator_2.py @@ -1,4 +1,4 @@ -import os, sys, importlib, glob, inspect, itertools +import os, sys, importlib, glob, inspect, itertools, click from ffx.track_type import TrackType @@ -8,6 +8,10 @@ from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator from .disposition_combinator_2 import DispositionCombinator2 +from .track_tag_combinator_2 import TrackTagCombinator2 +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator + class MediaCombinator2(MediaCombinator): @@ -22,10 +26,11 @@ class MediaCombinator2(MediaCombinator): # self._SubCombinators = SubCombinators - self._identifier = MediaCombinator2.IDENTIFIER - self._variant = MediaCombinator2.VARIANT + def getVariant(self): + return MediaCombinator2.VARIANT + - def getPayload(self, subtitleDispositionTuple = (set(), set())): + def getPayload(self, subtitleDispositionTuple = (set(), set()), subtitleTagTuple = ({}, {})): kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context @@ -41,12 +46,14 @@ class MediaCombinator2(MediaCombinator): kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[0] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[0] trackDescriptor2 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[1] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[1] trackDescriptor3 = TrackDescriptor(**kwargs) kwargs = {} @@ -61,25 +68,48 @@ class MediaCombinator2(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): return False def getYield(self): - - for DC2 in DispositionCombinator2.getAllClassReferences(): - - dc2 = DC2(self._context) - - yieldObj = {} - - yieldObj['identifier'] = MediaCombinator2.IDENTIFIER - yieldObj['variants'] = [MediaCombinator2.VARIANT, f"S:{dc2.getVariant()}"] - - yieldObj['payload'] = self.getPayload(dc2.getPayload()) - yieldObj['assertFuncs'] = [self.assertFunc, dc2.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() | dc2.shouldFail() - - yield yieldObj + + for MTC in MediaTagCombinator.getAllClassReferences(): + for DC2 in DispositionCombinator2.getAllClassReferences(): + for TC2 in TrackTagCombinator2.getAllClassReferences(): + for J in JellyfinCombinator.getAllClassReferences(): + + j = J(self._context) + self._context['use_jellyfin'] = j.getPayload() + + dc2 = DC2(self._context) + tc2 = TC2(self._context) + mtc = MTC(self._context) + + yieldObj = {} + + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + f"S:{dc2.getVariant()}", + f"S:{tc2.getVariant()}", + mtc.getVariant(), + j.getVariant()] + + yieldObj['payload'] = self.getPayload(dc2.getPayload(), tc2.getPayload()) + + yieldObj['assertSelectors'] = ['M', 'SD', 'ST', 'MT', 'J'] + yieldObj['assertFuncs'] = [self.assertFunc, + dc2.assertFunc, + tc2.assertFunc, + mtc.assertFunc, + j.assertFunc] + + yieldObj['shouldFail'] = (self.shouldFail() + | dc2.shouldFail() + | tc2.shouldFail() + | mtc.shouldFail() + | j.shouldFail()) + + yield yieldObj diff --git a/bin/ffx/test/media_combinator_3.py b/bin/ffx/test/media_combinator_3.py index b29ad66..bd8936e 100644 --- a/bin/ffx/test/media_combinator_3.py +++ b/bin/ffx/test/media_combinator_3.py @@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator from .disposition_combinator_3 import DispositionCombinator3 +from .track_tag_combinator_3 import TrackTagCombinator3 +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator class MediaCombinator3(MediaCombinator): @@ -23,11 +26,11 @@ class MediaCombinator3(MediaCombinator): # self._SubCombinators = SubCombinations - self._identifier = MediaCombinator3.IDENTIFIER - self._variant = MediaCombinator3.VARIANT + def getVariant(self): + return MediaCombinator3.VARIANT - def getPayload(self, subtitleDispositionTuple = (set(), set(), set())): + def getPayload(self, subtitleDispositionTuple = (set(), set(), set()), subtitleTagTuple = ({}, {}, {})): kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context @@ -43,18 +46,21 @@ class MediaCombinator3(MediaCombinator): kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[0] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[0] trackDescriptor2 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[1] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[1] trackDescriptor3 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[2] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[2] trackDescriptor4 = TrackDescriptor(**kwargs) kwargs = {} @@ -71,7 +77,7 @@ class MediaCombinator3(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): @@ -79,17 +85,40 @@ class MediaCombinator3(MediaCombinator): def getYield(self): - for DC3 in DispositionCombinator3.getAllClassReferences(): + for MTC in MediaTagCombinator.getAllClassReferences(): + for DC3 in DispositionCombinator3.getAllClassReferences(): + for TC3 in TrackTagCombinator3.getAllClassReferences(): + for J in JellyfinCombinator.getAllClassReferences(): - dc3 = DC3(self._context) + j = J(self._context) + self._context['use_jellyfin'] = j.getPayload() - yieldObj = {} + dc3 = DC3(self._context) + tc3 = TC3(self._context) + mtc = MTC(self._context) - yieldObj['identifier'] = MediaCombinator3.IDENTIFIER - yieldObj['variants'] = [MediaCombinator3.VARIANT, f"S:{dc3.getVariant()}"] + yieldObj = {} - yieldObj['payload'] = self.getPayload(dc3.getPayload()) - yieldObj['assertFuncs'] = [self.assertFunc, dc3.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() | dc3.shouldFail() + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + f"S:{dc3.getVariant()}", + f"S:{tc3.getVariant()}", + mtc.getVariant(), + j.getVariant()] - yield yieldObj + yieldObj['payload'] = self.getPayload(dc3.getPayload(), tc3.getPayload()) + + yieldObj['assertSelectors'] = ['M', 'SD', 'ST', 'MT', 'J'] + yieldObj['assertFuncs'] = [self.assertFunc, + dc3.assertFunc, + tc3.assertFunc, + mtc.assertFunc, + j.assertFunc] + + yieldObj['shouldFail'] = (self.shouldFail() + | dc3.shouldFail() + | tc3.shouldFail() + | mtc.shouldFail() + | j.shouldFail()) + + yield yieldObj diff --git a/bin/ffx/test/media_combinator_4.py b/bin/ffx/test/media_combinator_4.py index 1443994..548bc68 100644 --- a/bin/ffx/test/media_combinator_4.py +++ b/bin/ffx/test/media_combinator_4.py @@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator from .disposition_combinator_2 import DispositionCombinator2 +from .track_tag_combinator_2 import TrackTagCombinator2 +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator class MediaCombinator4(MediaCombinator): @@ -23,10 +26,11 @@ class MediaCombinator4(MediaCombinator): # self._SubCombinators = SubCombinations - self._identifier = MediaCombinator4.IDENTIFIER - self._variant = MediaCombinator4.VARIANT + def getVariant(self): + return MediaCombinator4.VARIANT - def getPayload(self, audioDispositionTuple = (set(), set())): + + def getPayload(self, audioDispositionTuple = (set(), set()), audioTagTuple = ({}, {})): kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context @@ -37,12 +41,14 @@ class MediaCombinator4(MediaCombinator): kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[0] + kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[0] trackDescriptor1 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[1] + kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[1] trackDescriptor2 = TrackDescriptor(**kwargs) kwargs = {} @@ -57,25 +63,48 @@ class MediaCombinator4(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): return False def getYield(self): - - for DC2 in DispositionCombinator2.getAllClassReferences(): - - dc2 = DC2(self._context) - - yieldObj = {} - - yieldObj['identifier'] = MediaCombinator4.IDENTIFIER - yieldObj['variants'] = [MediaCombinator4.VARIANT, f"A:{dc2.getVariant()}"] - - yieldObj['payload'] = self.getPayload(dc2.getPayload()) - yieldObj['assertFuncs'] = [self.assertFunc, dc2.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() | dc2.shouldFail() - - yield yieldObj + + for MTC in MediaTagCombinator.getAllClassReferences(): + for DC2 in DispositionCombinator2.getAllClassReferences(): + for TC2 in TrackTagCombinator2.getAllClassReferences(): + for J in JellyfinCombinator.getAllClassReferences(): + + j = J(self._context) + self._context['use_jellyfin'] = j.getPayload() + + dc2 = DC2(self._context) + tc2 = TC2(self._context) + mtc = MTC(self._context) + + yieldObj = {} + + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + f"A:{dc2.getVariant()}", + f"A:{tc2.getVariant()}", + mtc.getVariant(), + j.getVariant()] + + yieldObj['payload'] = self.getPayload(dc2.getPayload(), tc2.getPayload()) + + yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'MT', 'J'] + yieldObj['assertFuncs'] = [self.assertFunc, + dc2.assertFunc, + tc2.assertFunc, + mtc.assertFunc, + j.assertFunc] + + yieldObj['shouldFail'] = (self.shouldFail() + | dc2.shouldFail() + | tc2.shouldFail() + | mtc.shouldFail() + | j.shouldFail()) + + yield yieldObj diff --git a/bin/ffx/test/media_combinator_5.py b/bin/ffx/test/media_combinator_5.py index 4799045..88e39fb 100644 --- a/bin/ffx/test/media_combinator_5.py +++ b/bin/ffx/test/media_combinator_5.py @@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator from .disposition_combinator_2 import DispositionCombinator2 +from .track_tag_combinator_2 import TrackTagCombinator2 +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator class MediaCombinator5(MediaCombinator): @@ -23,10 +26,11 @@ class MediaCombinator5(MediaCombinator): # self._SubCombinators = SubCombinations - self._identifier = MediaCombinator5.IDENTIFIER - self._variant = MediaCombinator5.VARIANT + def getVariant(self): + return MediaCombinator5.VARIANT - def getPayload(self, audioDispositionTuple = (set(), set())): + + def getPayload(self, audioDispositionTuple = (set(), set()), audioTagTuple = ({}, {})): kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context @@ -37,12 +41,14 @@ class MediaCombinator5(MediaCombinator): kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[0] + kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[0] trackDescriptor1 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[1] + kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[1] trackDescriptor2 = TrackDescriptor(**kwargs) kwargs = {} @@ -64,7 +70,7 @@ class MediaCombinator5(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): @@ -72,17 +78,40 @@ class MediaCombinator5(MediaCombinator): def getYield(self): - for DC2 in DispositionCombinator2.getAllClassReferences(): + for MTC in MediaTagCombinator.getAllClassReferences(): + for DC2 in DispositionCombinator2.getAllClassReferences(): + for TC2 in TrackTagCombinator2.getAllClassReferences(): + for J in JellyfinCombinator.getAllClassReferences(): + + j = J(self._context) + self._context['use_jellyfin'] = j.getPayload() + + dc2 = DC2(self._context) + tc2 = TC2(self._context) + mtc = MTC(self._context) + + yieldObj = {} - dc2 = DC2(self._context) + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + f"A:{dc2.getVariant()}", + f"A:{tc2.getVariant()}", + mtc.getVariant(), + j.getVariant()] - yieldObj = {} + yieldObj['payload'] = self.getPayload(dc2.getPayload(), tc2.getPayload()) - yieldObj['identifier'] = MediaCombinator5.IDENTIFIER - yieldObj['variants'] = [MediaCombinator5.VARIANT, f"A:{dc2.getVariant()}"] + yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'MT', 'J'] + yieldObj['assertFuncs'] = [self.assertFunc, + dc2.assertFunc, + tc2.assertFunc, + mtc.assertFunc, + j.assertFunc] - yieldObj['payload'] = self.getPayload(dc2.getPayload()) - yieldObj['assertFuncs'] = [self.assertFunc, dc2.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() | dc2.shouldFail() + yieldObj['shouldFail'] = (self.shouldFail() + | dc2.shouldFail() + | tc2.shouldFail() + | mtc.shouldFail() + | j.shouldFail()) - yield yieldObj + yield yieldObj diff --git a/bin/ffx/test/media_combinator_6.py b/bin/ffx/test/media_combinator_6.py index 4a2adbd..729201a 100644 --- a/bin/ffx/test/media_combinator_6.py +++ b/bin/ffx/test/media_combinator_6.py @@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator from .disposition_combinator_2 import DispositionCombinator2 +from .track_tag_combinator_2 import TrackTagCombinator2 +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator class MediaCombinator6(MediaCombinator): @@ -23,10 +26,11 @@ class MediaCombinator6(MediaCombinator): # self._SubCombinators = SubCombinations - self._identifier = MediaCombinator6.IDENTIFIER - self._variant = MediaCombinator6.VARIANT + def getVariant(self): + return MediaCombinator6.VARIANT - def getPayload(self, audioDispositionTuple = (set(), set()), subtitleDispositionTuple = (set(), set())): + + def getPayload(self, audioDispositionTuple = (set(), set()), audioTagTuple = ({}, {}), subtitleDispositionTuple = (set(), set()), subtitleTagTuple = ({}, {})): kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context @@ -37,24 +41,28 @@ class MediaCombinator6(MediaCombinator): kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[0] + kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[0] trackDescriptor1 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[1] + kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[1] trackDescriptor2 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[0] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[0] trackDescriptor3 = TrackDescriptor(**kwargs) kwargs = {} kwargs[TrackDescriptor.CONTEXT_KEY] = self._context kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[1] + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[1] trackDescriptor4 = TrackDescriptor(**kwargs) kwargs = {} @@ -71,7 +79,7 @@ class MediaCombinator6(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): @@ -79,19 +87,50 @@ class MediaCombinator6(MediaCombinator): def getYield(self): - for DC2_A in DispositionCombinator2.getAllClassReferences(): - for DC2_S in DispositionCombinator2.getAllClassReferences(): - - dc2a = DC2_A(self._context) - dc2s = DC2_S(self._context) - - yieldObj = {} - - yieldObj['identifier'] = MediaCombinator6.IDENTIFIER - yieldObj['variants'] = [MediaCombinator6.VARIANT, f"A:{dc2a.getVariant()}", f"S:{dc2s.getVariant()}"] - - yieldObj['payload'] = self.getPayload(dc2a.getPayload(), dc2s.getPayload()) - yieldObj['assertFuncs'] = [self.assertFunc, dc2a.assertFunc, dc2s.assertFunc] - yieldObj['shouldFail'] = self.shouldFail() | dc2a.shouldFail() | dc2s.shouldFail() - - yield yieldObj + for MTC in MediaTagCombinator.getAllClassReferences(): + for DC2_A in DispositionCombinator2.getAllClassReferences(): + for TC2_A in TrackTagCombinator2.getAllClassReferences(): + for DC2_S in DispositionCombinator2.getAllClassReferences(): + for TC2_S in TrackTagCombinator2.getAllClassReferences(): + for J in JellyfinCombinator.getAllClassReferences(): + + j = J(self._context) + self._context['use_jellyfin'] = j.getPayload() + + dc2a = DC2_A(self._context) + tc2a = TC2_A(self._context) + dc2s = DC2_S(self._context) + tc2s = TC2_S(self._context) + mtc = MTC(self._context) + + yieldObj = {} + + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + f"A:{dc2a.getVariant()}", + f"A:{tc2a.getVariant()}", + f"S:{dc2s.getVariant()}", + f"S:{tc2s.getVariant()}", + mtc.getVariant(), + j.getVariant()] + + yieldObj['payload'] = self.getPayload(dc2a.getPayload(), tc2a.getPayload(), dc2s.getPayload(), tc2s.getPayload()) + + yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'SD', 'ST', 'MT', 'J'] + yieldObj['assertFuncs'] = [self.assertFunc, + dc2a.assertFunc, + tc2a.assertFunc, + dc2s.assertFunc, + tc2s.assertFunc, + mtc.assertFunc, + j.assertFunc] + + yieldObj['shouldFail'] = (self.shouldFail() + | dc2a.shouldFail() + | tc2a.shouldFail() + | dc2s.shouldFail() + | tc2s.shouldFail() + | mtc.shouldFail() + | j.shouldFail()) + + yield yieldObj diff --git a/bin/ffx/test/media_combinator_7.py b/bin/ffx/test/media_combinator_7.py index a12bff6..070a4b7 100644 --- a/bin/ffx/test/media_combinator_7.py +++ b/bin/ffx/test/media_combinator_7.py @@ -8,8 +8,9 @@ from ffx.media_descriptor import MediaDescriptor from .media_combinator import MediaCombinator from .disposition_combinator_2 import DispositionCombinator2 -from .disposition_combinator_3 import DispositionCombinator3 - +from .track_tag_combinator_3 import TrackTagCombinator3 +from .jellyfin_combinator import JellyfinCombinator +from .media_tag_combinator import MediaTagCombinator class MediaCombinator7(MediaCombinator): @@ -24,8 +25,9 @@ class MediaCombinator7(MediaCombinator): # self._SubCombinators = SubCombinations - self._identifier = MediaCombinator7.IDENTIFIER - self._variant = MediaCombinator7.VARIANT + def getVariant(self): + return MediaCombinator7.VARIANT + def getPayload(self, audioDispositionTuple = (set(), set()), subtitleDispositionTuple = (set(), set(), set())): @@ -79,7 +81,7 @@ class MediaCombinator7(MediaCombinator): return mediaDescriptor - def assertFunc(self, testObj): + def assertFunc(self, testObj = {}): pass def shouldFail(self): @@ -87,21 +89,51 @@ class MediaCombinator7(MediaCombinator): def getYield(self): - for DC2_A in DispositionCombinator2.getAllClassReferences(): - for DC3_S in DispositionCombinator3.getAllClassReferences(): - - dc2a = DC2_A(self._context) - dc3s = DC3_S(self._context) - - yieldObj = {} - - yieldObj['identifier'] = MediaCombinator7.IDENTIFIER - yieldObj['variants'] = [MediaCombinator7.VARIANT, f"A:{dc2a.getVariant()}", f"S:{dc3s.getVariant()}"] - - yieldObj['payload'] = self.getPayload(dc2a.getPayload(), dc3s.getPayload()) - - yieldObj['assertFuncs'] = [self.assertFunc, dc2a.assertFunc, dc3s.assertFunc] - - yieldObj['shouldFail'] = self.shouldFail() | dc2a.shouldFail() | dc3s.shouldFail() - - yield yieldObj + for MTC in MediaTagCombinator.getAllClassReferences(): + for DC2_A in DispositionCombinator2.getAllClassReferences(): + for TC3_A in TrackTagCombinator3.getAllClassReferences(): + for DC2_S in DispositionCombinator2.getAllClassReferences(): + for TC3_S in TrackTagCombinator3.getAllClassReferences(): + for J in JellyfinCombinator.getAllClassReferences(): + + j = J(self._context) + self._context['use_jellyfin'] = j.getPayload() + + dc2a = DC2_A(self._context) + tc3a = TC3_A(self._context) + dc2s = DC2_S(self._context) + tc3s = TC3_S(self._context) + mtc = MTC(self._context) + + yieldObj = {} + + yieldObj['identifier'] = self.getIdentifier() + yieldObj['variants'] = [self.getVariant(), + f"A:{dc2a.getVariant()}", + f"A:{tc3a.getVariant()}", + f"S:{dc2s.getVariant()}", + f"S:{tc3s.getVariant()}", + mtc.getVariant(), + j.getVariant()] + + yieldObj['payload'] = self.getPayload(dc2a.getPayload(), tc3a.getPayload(), dc2s.getPayload(), tc3s.getPayload()) + + yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'SD', 'ST', 'MT', 'J'] + + yieldObj['assertFuncs'] = [self.assertFunc, + dc2a.assertFunc, + tc3a.assertFunc, + dc2s.assertFunc, + tc3s.assertFunc, + mtc.assertFunc, + j.assertFunc] + + yieldObj['shouldFail'] = (self.shouldFail() + | dc2a.shouldFail() + | tc3a.shouldFail() + | dc2s.shouldFail() + | tc3s.shouldFail() + | mtc.shouldFail() + | j.shouldFail()) + + yield yieldObj diff --git a/bin/ffx/test/media_tag_combinator.py b/bin/ffx/test/media_tag_combinator.py new file mode 100644 index 0000000..b434694 --- /dev/null +++ b/bin/ffx/test/media_tag_combinator.py @@ -0,0 +1,33 @@ +import os, sys, importlib, glob, inspect, itertools + +class MediaTagCombinator(): + + IDENTIFIER = 'mediaTag' + + def __init__(self, context = None): + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + def getIdentifier(self): + return MediaTagCombinator.IDENTIFIER + + @staticmethod + def list(): + basePath = os.path.dirname(__file__) + return [os.path.basename(p)[21:-3] + for p + in glob.glob(f"{ basePath }/media_tag_combinator_*.py", recursive = True) + if p != __file__] + + @staticmethod + def getClassReference(identifier): + importlib.import_module(f"ffx.test.media_tag_combinator_{ identifier }") + for name, obj in inspect.getmembers(sys.modules[f"ffx.test.media_tag_combinator_{ identifier }"]): + #HINT: Excluding MediaCombinator as it seems to be included by import (?) + if inspect.isclass(obj) and name != 'MediaTagCombinator' and name.startswith('MediaTagCombinator'): + return obj + + @staticmethod + def getAllClassReferences(): + return [MediaTagCombinator.getClassReference(i) for i in MediaTagCombinator.list()] diff --git a/bin/ffx/test/media_tag_combinator_0.py b/bin/ffx/test/media_tag_combinator_0.py new file mode 100644 index 0000000..1a48d52 --- /dev/null +++ b/bin/ffx/test/media_tag_combinator_0.py @@ -0,0 +1,31 @@ +import os, sys, importlib, glob, inspect, itertools + +from ffx.track_type import TrackType + +from ffx.track_descriptor import TrackDescriptor +from ffx.media_descriptor import MediaDescriptor + +from .media_tag_combinator import MediaTagCombinator + + +class MediaTagCombinator0(MediaTagCombinator): + + VARIANT = 'MT0' + + # def __init__(self, SubCombinators: dict = {}, context = None): + def __init__(self, context = None): + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + def getVariant(self): + return MediaTagCombinator0.VARIANT + + def getPayload(self): + return {} + + def assertFunc(self, testObj = {}): + pass + + def shouldFail(self): + return False diff --git a/bin/ffx/test/media_tag_combinator_1.py b/bin/ffx/test/media_tag_combinator_1.py new file mode 100644 index 0000000..20bdeab --- /dev/null +++ b/bin/ffx/test/media_tag_combinator_1.py @@ -0,0 +1,36 @@ +import os, sys, importlib, glob, inspect, itertools + +from ffx.track_type import TrackType + +from ffx.track_descriptor import TrackDescriptor +from ffx.media_descriptor import MediaDescriptor + +from .media_tag_combinator import MediaTagCombinator + +class MediaTagCombinator1(MediaTagCombinator): + + VARIANT = 'MT1' + + # def __init__(self, SubCombinators: dict = {}, context = None): + def __init__(self, context = None): + + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + # self._SubCombinators = SubCombinations + + def getVariant(self): + return MediaTagCombinator1.VARIANT + + def getPayload(self): + return {'From': 'Encoders'} + + def assertFunc(self, mediaDescriptor: MediaDescriptor): + mediaTags = mediaDescriptor.getTags() + + assert 'From' in mediaTags.keys(), "'From' not in media tag keys" + assert mediaTags.keys()['From'] == 'Encoders', "Media tag value not 'Encoders' for key 'To'" + + def shouldFail(self): + return False diff --git a/bin/ffx/test/media_tag_combinator_2.py b/bin/ffx/test/media_tag_combinator_2.py new file mode 100644 index 0000000..8fdbdd6 --- /dev/null +++ b/bin/ffx/test/media_tag_combinator_2.py @@ -0,0 +1,39 @@ +import os, sys, importlib, glob, inspect, itertools + +from ffx.track_type import TrackType + +from ffx.track_descriptor import TrackDescriptor +from ffx.media_descriptor import MediaDescriptor + +from .media_tag_combinator import MediaTagCombinator + +class MediaTagCombinator2(MediaTagCombinator): + + VARIANT = 'MT2' + + # def __init__(self, SubCombinators: dict = {}, context = None): + def __init__(self, context = None): + + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + # self._SubCombinators = SubCombinations + + def getVariant(self): + return MediaTagCombinator2.VARIANT + + def getPayload(self): + return {'To': 'Fanz', + 'Yolo': 'Holo'} + + def assertFunc(self, mediaDescriptor: MediaDescriptor): + mediaTags = mediaDescriptor.getTags() + + assert 'To' in mediaTags.keys(), "'To' not in media tag keys" + assert mediaTags.keys()['To'] == 'Fanz', "Media tag value not 'Fanz' for key 'To'" + assert 'Yolo' in mediaTags.keys(), "'Yolo' not in media tag keys" + assert mediaTags.keys()['Yolo'] == 'Holo', "Media tag value not 'Holo' for key 'Yolo'" + + def shouldFail(self): + return False diff --git a/bin/ffx/test/scenario.py b/bin/ffx/test/scenario.py index 819e4e8..740dc4b 100644 --- a/bin/ffx/test/scenario.py +++ b/bin/ffx/test/scenario.py @@ -1,4 +1,4 @@ -import os, sys, importlib, glob, inspect +import os, glob, sys, importlib, glob, inspect from ffx.test.helper import createEmptyDirectory @@ -96,6 +96,13 @@ class Scenario(): self._logger = context['logger'] self._reportLogger = context['report_logger'] + + def clearTestDirectory(self): + testFiles = glob.glob("f{self._testDirectory}/*") + for f in testFiles: + os.remove(f) + + @staticmethod def list(): basePath = os.path.dirname(__file__) diff --git a/bin/ffx/test/scenario_1.py b/bin/ffx/test/scenario_1.py index a6d5dc8..9e73861 100644 --- a/bin/ffx/test/scenario_1.py +++ b/bin/ffx/test/scenario_1.py @@ -22,80 +22,123 @@ class Scenario1(Scenario): No tmdb, default parameters""" def __init__(self, context): + + context['use_jellyfin'] = True + context['use_tmdb'] = False + context['use_pattern'] = False + #context['no_prompt'] = False + super().__init__(context) + def job(self, yieldObj: dict): + testContext = self._context.copy() + identifier = yieldObj['identifier'] variantList = yieldObj['variants'] + variantIdentifier = '-'.join(variantList) - mediaDescriptor = yieldObj['payload'] + variantLabel = f"{self.__class__.__name__} Variant {variantIdentifier}" + + sourceMediaDescriptor = yieldObj['payload'] + assertSelectorList: list = yieldObj['assertSelectors'] assertFuncList = yieldObj['assertFuncs'] shouldFail = yieldObj['shouldFail'] - self._logger.info(f"Running Scenario 1 Job {variantIdentifier}") + try: + jellyfinSelectorIndex = assertSelectorList.index('J') + jellyfinVariant = variantList[jellyfinSelectorIndex] + testContext['use_jellyfin'] = jellyfinVariant == 'J' + except ValueError: + jellyfinSelectorIndex = -1 + + # if variantIdentifier != 'VAASS-A:D01-S:D00': + # return + + + self._logger.debug(f"Running Job: {variantLabel}") + + # Phase 1: Setup source files + self.clearTestDirectory() + mediaFilePath = createMediaTestFile(mediaDescriptor=sourceMediaDescriptor, directory=self._testDirectory, logger=self._logger) -# # Phase 1: Setup source files -# mediaFilePath = createMediaTestFile(mediaDescriptor=sourceMediaDescriptor, directory=self._testDirectory) -# # # Phase 2: Prepare database # -# # Phase 3: Run ffx -# commandSequence = [sys.executable, -# self._ffxExecutablePath, -# 'convert', -# mediaFilePath] -# -# self._logger.debug(f"Scenario1.run(): test sequence: {commandSequence}") -# -# out, err, rc = executeProcess(commandSequence, directory = self._testDirectory) -# -# if out: -# self._logger.debug(f"Scenario1.run(): process output: {out}") -# if rc: -# self._logger.error(f"Scenario1.run(): process resultet in error {rc}: {err}") -# -# # Phase 4: Evaluate results -# -# try: -# -# resultFile = os.path.join(self._testDirectory, 'media.webm') -# -# assert os.path.isfile(resultFile), f"Result file 'media.webm' in path '{self._testDirectory}' wasn't created" -# -# resultFileProperties = FileProperties(self._context, resultFile) -# resultMediaDescriptor = resultFileProperties.getMediaDescriptor() -# -# resultMediaTracks = resultMediaDescriptor.getAllTrackDescriptors() -# -# assert len(resultMediaTracks) == 3, f"Result file contains unexpected number of streams" -# -# assert resultMediaTracks[0].getType() == TrackType.VIDEO, f"Stream #0 is not of type video" -# -# assert resultMediaTracks[1].getType() == TrackType.AUDIO, f"Stream #1 is not of type audio" -# assert not resultMediaTracks[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition" -# -# assert resultMediaTracks[2].getType() == TrackType.AUDIO, f"Stream #2 is not of type audio" -# assert resultMediaTracks[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition" -# -# self._reportLogger.info('Scenario 1 test passed') -# -# except AssertionError as ae: -# -# self._reportLogger.error(f"Scenario 1 test failed ({ae})") + # Phase 3: Run ffx + commandSequence = [sys.executable, + self._ffxExecutablePath, + 'convert', + mediaFilePath, + '--no-prompt'] + if not testContext['use_jellyfin']: + commandSequence += ['--no-jellyfin'] - def run(self): + self._logger.debug(f"{variantLabel}: Test sequence: {commandSequence}") - MC_list = MediaCombinator.getAllClassReferences() + out, err, rc = executeProcess(commandSequence, directory = self._testDirectory) - for MC in MC_list: + if out: + self._logger.debug(f"{variantLabel}: Process output: {out}") + if rc: + self._logger.debug(f"{variantLabel}: Process returned ERROR {rc} ({err})") - self._logger.debug(f"MC={MC.__name__}") + # Phase 4: Evaluate results - mc = MC(context = self._context) + try: + + jobFailed = bool(rc) + + self._logger.debug(f"{variantLabel}: Should fail: {shouldFail} / actually failed: {jobFailed}") + + assert jobFailed == shouldFail, f"Process {'failed' if jobFailed else 'did not fail'}" + + if not jobFailed: + + resultFile = os.path.join(self._testDirectory, 'media.webm') + + assert os.path.isfile(resultFile), f"Result file 'media.webm' in path '{self._testDirectory}' wasn't created" + + resultFileProperties = FileProperties(testContext, resultFile) + resultMediaDescriptor = resultFileProperties.getMediaDescriptor() + + resultMediaTracks = resultMediaDescriptor.getAllTrackDescriptors() + + for assertIndex in range(len(assertSelectorList)): + + assertSelector = assertSelectorList[assertIndex] + assertFunc = assertFuncList[assertIndex] + assertVariant = variantList[assertIndex] + + if assertSelector == 'M': + assertFunc() + for variantIndex in range(len(assertVariant)): + assert assertVariant[variantIndex].lower() == resultMediaTracks[variantIndex].getType().indicator(), f"Stream #{variantIndex} is not of type {resultMediaTracks[variantIndex].getType().label()}" + elif assertSelector == 'AD' or assertSelector == 'AT': + assertFunc(resultMediaDescriptor.getAudioTracks()) + + elif assertSelector == 'SD' or assertSelector == 'ST': + assertFunc(resultMediaDescriptor.getSubtitleTracks()) + + elif type(assertSelector) is str: + if assertSelector == 'J': + assertFunc() + + + self._reportLogger.info(f"{variantLabel}: Test passed") + + except AssertionError as ae: + + self._reportLogger.error(f"{variantLabel}: Test FAILED ({ae})") + + + def run(self): + MC_list = MediaCombinator.getAllClassReferences() + for MC in MC_list: + self._logger.debug(f"MC={MC.__name__}") + mc = MC(context = self._context) for y in mc.getYield(): self.job(y) - diff --git a/bin/ffx/test/track_combination.py b/bin/ffx/test/track_combination.py deleted file mode 100644 index ffab98d..0000000 --- a/bin/ffx/test/track_combination.py +++ /dev/null @@ -1,27 +0,0 @@ -import os, sys, importlib, glob, inspect - -class TrackCombination(): - - def __init__(self, context = None): - self._context = context - self._logger = context['logger'] - self._reportLogger = context['report_logger'] - - def getIdentifier(self): - return self._combinationIdentifier - - @staticmethod - def list(): - basePath = os.path.dirname(__file__) - return [os.path.basename(p)[18:-3] - for p - in glob.glob(f"{ basePath }/track_combination_*.py", recursive = True) - if p != __file__] - - @staticmethod - def getClassReference(identifier): - importlib.import_module(f"ffx.test.track_combination_{ identifier }") - for name, obj in inspect.getmembers(sys.modules[f"ffx.test.track_combination_{ identifier }"]): - #HINT: Excluding DispositionCombination as it seems to be included by import (?) - if inspect.isclass(obj) and name != 'TrackCombination' and name.startswith('TrackCombination'): - return obj diff --git a/bin/ffx/test/track_combination_0.py b/bin/ffx/test/track_combination_0.py deleted file mode 100644 index a966cef..0000000 --- a/bin/ffx/test/track_combination_0.py +++ /dev/null @@ -1,36 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination0(TrackCombination): - - COMBINATION_IDENTIFIER = 'VA' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination0.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_combination_1.py b/bin/ffx/test/track_combination_1.py deleted file mode 100644 index 066c0f0..0000000 --- a/bin/ffx/test/track_combination_1.py +++ /dev/null @@ -1,42 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination1(TrackCombination): - - COMBINATION_IDENTIFIER = 'VAS' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination1.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor2 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_combination_2.py b/bin/ffx/test/track_combination_2.py deleted file mode 100644 index 3b865c7..0000000 --- a/bin/ffx/test/track_combination_2.py +++ /dev/null @@ -1,48 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination1(TrackCombination): - - COMBINATION_IDENTIFIER = 'VASS' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination1.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor2 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor3 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2, - trackDescriptor3] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_combination_3.py b/bin/ffx/test/track_combination_3.py deleted file mode 100644 index ac0f069..0000000 --- a/bin/ffx/test/track_combination_3.py +++ /dev/null @@ -1,65 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination -from .disposition_combination_3 import DispositionCombination3 - - -class TrackCombination3(TrackCombination): - - COMBINATION_IDENTIFIER = 'VASSS' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination3.COMBINATION_IDENTIFIER - - def getTrackDescriptors(self, dispositionTuple): - - self._logger.debug(f"getTrackDescriptors(): dispositionTuple={dispositionTuple}") - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = dispositionTuple[0] - trackDescriptor2 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = dispositionTuple[1] - trackDescriptor3 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = dispositionTuple[2] - trackDescriptor4 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2, - trackDescriptor3, - trackDescriptor4] - - def getSubcombinations(self): - for dci in DispositionCombination3.list(): - dispositionCombination = DispositionCombination3.getClassReference(dci)(self._context) - dispositionTuple = dispositionCombination.getDispositionTuple() # tuple of set of dispositions - trackDescriptors = self.getTrackDescriptors(dispositionTuple) - evaluateFunc = dispositionCombination.evaluateTrackDescriptors # assert function - shouldFail = dispositionCombination.shouldFail() # true if this combination should fail - dispositionIdentifier = dispositionCombination.getIdentifier() - yield (trackDescriptors, evaluateFunc, shouldFail, dispositionIdentifier) diff --git a/bin/ffx/test/track_combination_4.py b/bin/ffx/test/track_combination_4.py deleted file mode 100644 index 9e948b8..0000000 --- a/bin/ffx/test/track_combination_4.py +++ /dev/null @@ -1,42 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination4(TrackCombination): - - COMBINATION_IDENTIFIER = 'VAA' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination4.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - trackDescriptor2 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_combination_5.py b/bin/ffx/test/track_combination_5.py deleted file mode 100644 index 794abb5..0000000 --- a/bin/ffx/test/track_combination_5.py +++ /dev/null @@ -1,48 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination5(TrackCombination): - - COMBINATION_IDENTIFIER = 'VAAS' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination5.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - trackDescriptor2 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor3 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2, - trackDescriptor3] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_combination_6.py b/bin/ffx/test/track_combination_6.py deleted file mode 100644 index 29996bf..0000000 --- a/bin/ffx/test/track_combination_6.py +++ /dev/null @@ -1,54 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination6(TrackCombination): - - COMBINATION_IDENTIFIER = 'VAASS' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination6.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - trackDescriptor2 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor3 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor4 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2, - trackDescriptor3, - trackDescriptor4] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_combination_7.py b/bin/ffx/test/track_combination_7.py deleted file mode 100644 index 4c38873..0000000 --- a/bin/ffx/test/track_combination_7.py +++ /dev/null @@ -1,62 +0,0 @@ -import os, sys, importlib, glob, inspect - -from ffx.track_descriptor import TrackDescriptor -from ffx.track_disposition import TrackDisposition -from ffx.track_type import TrackType - -from .track_combination import TrackCombination - - -class TrackCombination7(TrackCombination): - """VAASSS""" - - COMBINATION_IDENTIFIER = 'VAASSS' - - def __init__(self, context): - super().__init__(context) - self._combinationIdentifier = TrackCombination7.COMBINATION_IDENTIFIER - - def getTrackVector(self): - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor0 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor1 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO - # kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT]) - trackDescriptor2 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor3 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor4 = TrackDescriptor(**kwargs) - - kwargs = {} - kwargs[TrackDescriptor.CONTEXT_KEY] = self._context - kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE - trackDescriptor5 = TrackDescriptor(**kwargs) - - return [trackDescriptor0, - trackDescriptor1, - trackDescriptor2, - trackDescriptor3, - trackDescriptor4, - trackDescriptor5] - - def getSubcombinations(self): - return diff --git a/bin/ffx/test/track_tag_combinator_2.py b/bin/ffx/test/track_tag_combinator_2.py new file mode 100644 index 0000000..9d62845 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_2.py @@ -0,0 +1,33 @@ +import os, sys, importlib, glob, inspect, itertools + +class TrackTagCombinator2(): + + IDENTIFIER = 'trackTag2' + + def __init__(self, context = None): + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + def getIdentifier(self): + return TrackTagCombinator2.IDENTIFIER + + @staticmethod + def list(): + basePath = os.path.dirname(__file__) + return [os.path.basename(p)[23:-3] + for p + in glob.glob(f"{ basePath }/track_tag_combinator_2_*.py", recursive = True) + if p != __file__] + + @staticmethod + def getClassReference(identifier): + importlib.import_module(f"ffx.test.track_tag_combinator_2_{ identifier }") + for name, obj in inspect.getmembers(sys.modules[f"ffx.test.track_tag_combinator_2_{ identifier }"]): + #HINT: Excluding DispositionCombination as it seems to be included by import (?) + if inspect.isclass(obj) and name != 'TrackTagCombinator2' and name.startswith('TrackTagCombinator2'): + return obj + + @staticmethod + def getAllClassReferences(): + return [TrackTagCombinator2.getClassReference(i) for i in TrackTagCombinator2.list()] diff --git a/bin/ffx/test/track_tag_combinator_2_0.py b/bin/ffx/test/track_tag_combinator_2_0.py new file mode 100644 index 0000000..33e4c57 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_2_0.py @@ -0,0 +1,32 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_2 import TrackTagCombinator2 + + +class TrackTagCombinator20(TrackTagCombinator2): + + VARIANT = 'T00' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator20.VARIANT + + def getPayload(self): + return ({}, # 0 + {}) # 1 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + def shouldFail(self): + return False diff --git a/bin/ffx/test/track_tag_combinator_2_1.py b/bin/ffx/test/track_tag_combinator_2_1.py new file mode 100644 index 0000000..658fcb5 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_2_1.py @@ -0,0 +1,34 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_2 import TrackTagCombinator2 + + +class TrackTagCombinator21(TrackTagCombinator2): + + VARIANT = 'T10' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator21.VARIANT + + def getPayload(self): + return ({'language': 'fra', 'title': 'Französisch'}, # 0 + {}) # 1 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[0].getTags()['language'] == 'fra', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'fra'" + assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[0].getTags()['title'] == 'Französisch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Französisch'" + + assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + def shouldFail(self): + return False diff --git a/bin/ffx/test/track_tag_combinator_2_2.py b/bin/ffx/test/track_tag_combinator_2_2.py new file mode 100644 index 0000000..5779307 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_2_2.py @@ -0,0 +1,35 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_2 import TrackTagCombinator2 + + +class TrackTagCombinator21(TrackTagCombinator2): + + VARIANT = 'T01' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator21.VARIANT + + def getPayload(self): + return ({}, # 0 + {'language': 'bas', 'title': 'Baskisch'}) # 1 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[1].getTags()['language'] == 'bas', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'bas'" + assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[1].getTags()['title'] == 'Baskisch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Baskisch'" + + def shouldFail(self): + return False + diff --git a/bin/ffx/test/track_tag_combinator_2_3.py b/bin/ffx/test/track_tag_combinator_2_3.py new file mode 100644 index 0000000..86b0ba0 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_2_3.py @@ -0,0 +1,37 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_2 import TrackTagCombinator2 + + +class TrackTagCombinator23(TrackTagCombinator2): + + VARIANT = 'T11' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator23.VARIANT + + def getPayload(self): + return ({'language': 'deu', 'title': 'Deutsch'}, # 0 + {'language': 'jpn', 'title': 'Japanisch'}) # 1 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[0].getTags()['language'] == 'deu', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'deu'" + assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[0].getTags()['title'] == 'Deutsch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Deutsch'" + + assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[1].getTags()['language'] == 'jpn', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'jpn'" + assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[1].getTags()['title'] == 'Japanisch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Japanisch'" + + + def shouldFail(self): + return True diff --git a/bin/ffx/test/track_tag_combinator_3.py b/bin/ffx/test/track_tag_combinator_3.py new file mode 100644 index 0000000..41345f5 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_3.py @@ -0,0 +1,33 @@ +import os, sys, importlib, glob, inspect, itertools + +class TrackTagCombinator3(): + + IDENTIFIER = 'trackTag3' + + def __init__(self, context = None): + self._context = context + self._logger = context['logger'] + self._reportLogger = context['report_logger'] + + def getIdentifier(self): + return TrackTagCombinator3.IDENTIFIER + + @staticmethod + def list(): + basePath = os.path.dirname(__file__) + return [os.path.basename(p)[23:-3] + for p + in glob.glob(f"{ basePath }/track_tag_combinator_3_*.py", recursive = True) + if p != __file__] + + @staticmethod + def getClassReference(identifier): + importlib.import_module(f"ffx.test.track_tag_combinator_3_{ identifier }") + for name, obj in inspect.getmembers(sys.modules[f"ffx.test.track_tag_combinator_3_{ identifier }"]): + #HINT: Excluding DispositionCombination as it seems to be included by import (?) + if inspect.isclass(obj) and name != 'TrackTagCombinator3' and name.startswith('TrackTagCombinator3'): + return obj + + @staticmethod + def getAllClassReferences(): + return [TrackTagCombinator3.getClassReference(i) for i in TrackTagCombinator3.list()] diff --git a/bin/ffx/test/track_tag_combinator_3_0.py b/bin/ffx/test/track_tag_combinator_3_0.py new file mode 100644 index 0000000..93c56b3 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_3_0.py @@ -0,0 +1,36 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_3 import TrackTagCombinator3 + + +class TrackTagCombinator30(TrackTagCombinator3): + + VARIANT = 'T000' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator30.VARIANT + + def getPayload(self): + return ({}, # 0 + {}, # 1 + {}) # 2 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set title tag" + + assert not 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set title tag" + + def shouldFail(self): + return False diff --git a/bin/ffx/test/track_tag_combinator_3_1.py b/bin/ffx/test/track_tag_combinator_3_1.py new file mode 100644 index 0000000..0037bae --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_3_1.py @@ -0,0 +1,38 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_3 import TrackTagCombinator3 + + +class TrackTagCombinator31(TrackTagCombinator3): + + VARIANT = 'T100' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator31.VARIANT + + def getPayload(self): + return ({'language': 'fra', 'title': 'Französisch'}, # 0 + {}, # 1 + {}) # 2 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[0].getTags()['language'] == 'fra', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'fra'" + assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[0].getTags()['title'] == 'Französisch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Französisch'" + + assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set title tag" + + assert not 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set title tag" + + def shouldFail(self): + return False \ No newline at end of file diff --git a/bin/ffx/test/track_tag_combinator_3_2.py b/bin/ffx/test/track_tag_combinator_3_2.py new file mode 100644 index 0000000..e4d30b3 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_3_2.py @@ -0,0 +1,39 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_3 import TrackTagCombinator3 + + +class TrackTagCombinator32(TrackTagCombinator3): + + VARIANT = 'T010' + + def __init__(self, context): + super().__init__(context) + + + def getVariant(self): + return TrackTagCombinator32.VARIANT + + def getPayload(self): + return ({}, # 0 + {'language': 'bas', 'title': 'Baskisch'}, # 1 + {}) # 2 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[1].getTags()['language'] == 'bas', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'bas'" + assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[1].getTags()['title'] == 'Baskisch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Baskisch'" + + assert not 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set title tag" + + def shouldFail(self): + return False \ No newline at end of file diff --git a/bin/ffx/test/track_tag_combinator_3_3.py b/bin/ffx/test/track_tag_combinator_3_3.py new file mode 100644 index 0000000..d1454e4 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_3_3.py @@ -0,0 +1,38 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_3 import TrackTagCombinator3 + + +class TrackTagCombinator33(TrackTagCombinator3): + + VARIANT = 'T001' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator33.VARIANT + + def getPayload(self): + return ({}, # 0 + {}, # 1 + {'language': 'eng', 'title': 'English'}) # 2 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag" + + assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set language tag" + assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set title tag" + + assert 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[2].getTags()['language'] == 'eng', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'eng'" + assert 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[2].getTags()['title'] == 'English', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'English'" + + def shouldFail(self): + return False \ No newline at end of file diff --git a/bin/ffx/test/track_tag_combinator_3_4.py b/bin/ffx/test/track_tag_combinator_3_4.py new file mode 100644 index 0000000..24cb976 --- /dev/null +++ b/bin/ffx/test/track_tag_combinator_3_4.py @@ -0,0 +1,42 @@ +import os, sys, importlib, glob, inspect + +from ffx.track_disposition import TrackDisposition +from .track_tag_combinator_3 import TrackTagCombinator3 + + +class TrackTagCombinator34(TrackTagCombinator3): + + VARIANT = 'T111' + + def __init__(self, context): + super().__init__(context) + + def getVariant(self): + return TrackTagCombinator34.VARIANT + + def getPayload(self): + return ({'language': 'jpn', 'title': 'Japanisch'}, # 0 + {'language': 'deu', 'title': 'Deutsch'}, # 1 + {'language': 'eng', 'title': 'English'}) # 2 + + def assertFunc(self, trackDescriptors): + + resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex()) + + assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[0].getTags()['language'] == 'jpn', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'jpn'" + assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[0].getTags()['title'] == 'Japanisch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Japanisch'" + + assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[1].getTags()['language'] == 'deu', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'deu'" + assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[1].getTags()['title'] == 'Deutsch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Deutsch'" + + assert 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag" + assert resortedTrackDescriptors[2].getTags()['language'] == 'eng', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'eng'" + assert 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag" + assert resortedTrackDescriptors[2].getTags()['title'] == 'English', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'English'" + + def shouldFail(self): + return True diff --git a/bin/ffx_tests.py b/bin/ffx_tests.py index d58615b..e440814 100755 --- a/bin/ffx_tests.py +++ b/bin/ffx_tests.py @@ -83,7 +83,7 @@ def run(ctx): scenario = Scenario.getClassReference(scenarioIdentifier)(ctx.obj) - ctx.obj['logger'].info(f"Running scenario {scenarioIdentifier}") + ctx.obj['logger'].debug(f"Running scenario {scenarioIdentifier}") scenario.run()