diff --git a/SofaRegressionProgram/SofaRegressionProgram.py b/SofaRegressionProgram/SofaRegressionProgram.py index 58d960d..a9b470d 100644 --- a/SofaRegressionProgram/SofaRegressionProgram.py +++ b/SofaRegressionProgram/SofaRegressionProgram.py @@ -16,12 +16,12 @@ import SofaRuntime # importing SofaRuntime will add the py3 loader to the scene loaders import tools.RegressionSceneList as RegressionSceneList import tools.RegressionWorker as RegressionWorker -from tools.RegressionHelper import writeMessage +from tools.RegressionHelper import writeMessage, writeWarning regression_file_extension = ".regression-tests" class RegressionProgram: - def __init__(self, input_folders, filter = None, disable_progress_bar = False, verbose = 1, nbr_jobs = 1, logs_output = None): + def __init__(self, input_folders, filter = None, reg_type = 'ALL', disable_progress_bar = False, verbose = 1, nbr_jobs = 1, logs_output = None): """Initialize the RegressionProgram Args: @@ -37,6 +37,7 @@ def __init__(self, input_folders, filter = None, disable_progress_bar = False, v self.legacy_mode = False self.nbr_jobs = RegressionWorker.resolve_nbr_jobs(nbr_jobs) self.logs_output = logs_output + self.reg_type = reg_type err_logs_stream = None if self.logs_output is not None : @@ -46,9 +47,10 @@ def __init__(self, input_folders, filter = None, disable_progress_bar = False, v for directory in input_folders : for root, dirs, files in os.walk(directory): for file in files: - if file.endswith(regression_file_extension): - file_path = os.path.join(root, file) + file_path = os.path.join(root, file) + #Warning lazy or in the end, if not lazy then this breaks + if file.endswith(regression_file_extension) and (reg_type == 'ALL' or RegressionSceneList.RegressionSceneList.RegressionType[reg_type].value[0] in file) : scene_list = RegressionSceneList.RegressionSceneList(file_path, filter, self.disable_progress_bar, verbose, self.nbr_jobs) if err_logs_stream is not None: @@ -60,6 +62,9 @@ def __init__(self, input_folders, filter = None, disable_progress_bar = False, v print("", file=err_logs_stream) self.scene_sets.append(scene_list) + elif file.endswith(regression_file_extension): + writeWarning(f"Regression file {file_path} skipped because of selected regression type {reg_type}", self.verbose) + finally: if self.logs_output is not None : with open(Path(self.logs_output) / "parse_errors_logs.txt", 'w', encoding="utf-8") as summary_file: @@ -120,8 +125,11 @@ def compare_all_sets_references(self): return self.run_all_sets("compare", "Compare All sets") def replay_references(self, id_scene, id_set=0): - scene_list = self.scene_sets[id_set] - scene_list.replay_references(id_scene) + if(self.scene_sets[id_set].regression_type is not None and self.scene_sets[id_set].regression_type.value[1].is_replay_available()): + scene_list = self.scene_sets[id_set] + scene_list.replay_references(id_scene) + else: + raise ValueError(f"Replay is not available for regression type {self.scene_sets[id_set].regression_type}") @@ -140,6 +148,15 @@ def make_parser(): default=[], type=str) + regression_type_choices = ['ALL', *(reg_type.name for reg_type in RegressionSceneList.RegressionSceneList.RegressionType)] + parser.add_argument('--regression-type', + dest='reg_type', + choices=regression_type_choices, + help=f"The regression type from {regression_type_choices}. Default value is ALL.", + type=str, + default='ALL') + + parser.add_argument('--filter', dest='filter', help="A regex filter to select scenes to test (e.g., '^demo.*.scn$')", @@ -222,7 +239,7 @@ def make_parser(): # 2- Process file if args.input: - reg_prog = RegressionProgram(args.input, args.filter, args.progress_bar_is_disabled, verbose, args.jobs, logs_output = args.output) + reg_prog = RegressionProgram(args.input, args.filter, args.reg_type, args.progress_bar_is_disabled, verbose, args.jobs, logs_output = args.output) else: parser.print_help() exit("Error: Argument is required ! Quitting.") diff --git a/SofaRegressionProgram/tools/ReferenceFileIO.py b/SofaRegressionProgram/tools/ReferenceFileIO.py index cd014e8..b5448f1 100644 --- a/SofaRegressionProgram/tools/ReferenceFileIO.py +++ b/SofaRegressionProgram/tools/ReferenceFileIO.py @@ -82,7 +82,7 @@ def read_JSON_reference_file(file_path): keyframes = [] for key in decoded_array: keyframes.append(float(key)) - + return decoded_array, keyframes # -------------------------------------------------- @@ -109,7 +109,7 @@ def read_legacy_reference(filename, mechanical_object): if line.startswith("T="): current_time = float(line.split("=", 1)[1]) times.append(current_time) - + # Positions elif line.startswith("X="): if current_time is None: @@ -137,3 +137,74 @@ def read_legacy_reference(filename, mechanical_object): ) return times, values + +# -------------------------------------------------- +# Helper: read the legacy topology reference format +# -------------------------------------------------- +# Written by the former C++ WriteTopology component, one block per timestep: +# T=