# JSON Reporter Example Report ```json { "mutant_trials": [ { "mutant": { "mutator_name": "FuncCall", "lineno": 45, "col_offset": 40, "end_lineno": 45, "end_col_offset": 73, "text": "None", "source_folder": "src", "source_file": "src/poodle/core.py", "unified_diff": "--- src/poodle/core.py\n+++ [Mutant] src/poodle/core.py:45\n@@ -42,7 +42,7 @@\n results = run_mutant_trails(work, mutants, timeout)\n \n for trial in results.mutant_trials:\n- trial.mutant.unified_diff = create_unified_diff(trial.mutant)\n+ trial.mutant.unified_diff = None\n \n for reporter in work.reporters:\n reporter(config=config, echo=work.echo, testing_results=results)\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.0598676204681396 }, { "mutant": { "mutator_name": "Number", "lineno": 186, "col_offset": 43, "end_lineno": 186, "end_col_offset": 44, "text": "-1", "source_folder": "src", "source_file": "src/poodle/mutate.py", "unified_diff": "--- src/poodle/mutate.py\n+++ [Mutant] src/poodle/mutate.py:186\n@@ -183,7 +183,7 @@\n add_line_filter(line_filters, lineno, \"all\")\n no_mut_filter: list[str] = re.findall(r\"#\\s*nomut:?\\s*([A-Za-z0-9,\\s]*)[#$]*\", line)\n \n- if no_mut_filter and no_mut_filter[0].strip().lower() in (\"start\", \"on\"):\n+ if no_mut_filter and no_mut_filter[-1].strip().lower() in (\"start\", \"on\"):\n no_mut_on = True\n \n if no_mut_on:\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.5591189861297607 }, { "mutant": { "mutator_name": "Number", "lineno": 196, "col_offset": 43, "end_lineno": 196, "end_col_offset": 44, "text": "-1", "source_folder": "src", "source_file": "src/poodle/mutate.py", "unified_diff": "--- src/poodle/mutate.py\n+++ [Mutant] src/poodle/mutate.py:196\n@@ -193,7 +193,7 @@\n for mutator in mutators.split(\",\"):\n add_line_filter(line_filters, lineno, mutator.strip())\n \n- if no_mut_filter and no_mut_filter[0].strip().lower() in (\"end\", \"off\"):\n+ if no_mut_filter and no_mut_filter[-1].strip().lower() in (\"end\", \"off\"):\n no_mut_on = False\n \n return line_filters\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.464325428009033 }, { "mutant": { "mutator_name": "Keyword", "lineno": 108, "col_offset": 79, "end_lineno": 108, "end_col_offset": 83, "text": "False", "source_folder": "src", "source_file": "src/poodle/util.py", "unified_diff": "--- src/poodle/util.py\n+++ [Mutant] src/poodle/util.py:108\n@@ -105,7 +105,7 @@\n def create_unified_diff(mutant: Mutant) -> str | None:\n \"\"\"Add unified diff to mutant.\"\"\"\n if mutant.source_file:\n- file_lines = mutant.source_file.read_text(\"utf-8\").splitlines(keepends=True)\n+ file_lines = mutant.source_file.read_text(\"utf-8\").splitlines(keepends=False)\n file_name = str(mutant.source_file)\n return \"\".join(\n difflib.unified_diff(\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 3.1800050735473633 }, { "mutant": { "mutator_name": "String", "lineno": 108, "col_offset": 50, "end_lineno": 108, "end_col_offset": 57, "text": "'XXutf-8XX'", "source_folder": "src", "source_file": "src/poodle/util.py", "unified_diff": "--- src/poodle/util.py\n+++ [Mutant] src/poodle/util.py:108\n@@ -105,7 +105,7 @@\n def create_unified_diff(mutant: Mutant) -> str | None:\n \"\"\"Add unified diff to mutant.\"\"\"\n if mutant.source_file:\n- file_lines = mutant.source_file.read_text(\"utf-8\").splitlines(keepends=True)\n+ file_lines = mutant.source_file.read_text('XXutf-8XX').splitlines(keepends=True)\n file_name = str(mutant.source_file)\n return \"\".join(\n difflib.unified_diff(\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 1.995598316192627 }, { "mutant": { "mutator_name": "Compare", "lineno": 26, "col_offset": 7, "end_lineno": 26, "end_col_offset": 25, "text": "summary.trials <= 1", "source_folder": "src", "source_file": "src/poodle/reporters/basic.py", "unified_diff": "--- src/poodle/reporters/basic.py\n+++ [Mutant] src/poodle/reporters/basic.py:26\n@@ -23,7 +23,7 @@\n \"\"\"Echo quick summary to console.\"\"\"\n echo(\"\")\n summary = testing_results.summary\n- if summary.trials < 1:\n+ if summary.trials <= 1:\n echo(\"!!! No mutants found to test !!!\", fg=\"yellow\")\n return\n \n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.012969493865967 }, { "mutant": { "mutator_name": "Compare", "lineno": 49, "col_offset": 12, "end_lineno": 49, "end_col_offset": 47, "text": "str(trial.mutant.source_file) and ''", "source_folder": "src", "source_file": "src/poodle/reporters/basic.py", "unified_diff": "--- src/poodle/reporters/basic.py\n+++ [Mutant] src/poodle/reporters/basic.py:49\n@@ -46,7 +46,7 @@\n failed_trials.sort(\n key=lambda trial: (\n trial.mutant.source_folder,\n- str(trial.mutant.source_file) or \"\",\n+ str(trial.mutant.source_file) and '',\n trial.mutant.lineno,\n trial.mutant.mutator_name,\n )\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 3.1697938442230225 }, { "mutant": { "mutator_name": "Number", "lineno": 26, "col_offset": 24, "end_lineno": 26, "end_col_offset": 25, "text": "2", "source_folder": "src", "source_file": "src/poodle/reporters/basic.py", "unified_diff": "--- src/poodle/reporters/basic.py\n+++ [Mutant] src/poodle/reporters/basic.py:26\n@@ -23,7 +23,7 @@\n \"\"\"Echo quick summary to console.\"\"\"\n echo(\"\")\n summary = testing_results.summary\n- if summary.trials < 1:\n+ if summary.trials < 2:\n echo(\"!!! No mutants found to test !!!\", fg=\"yellow\")\n return\n \n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.3608908653259277 }, { "mutant": { "mutator_name": "String", "lineno": 49, "col_offset": 45, "end_lineno": 49, "end_col_offset": 47, "text": "'XXXX'", "source_folder": "src", "source_file": "src/poodle/reporters/basic.py", "unified_diff": "--- src/poodle/reporters/basic.py\n+++ [Mutant] src/poodle/reporters/basic.py:49\n@@ -46,7 +46,7 @@\n failed_trials.sort(\n key=lambda trial: (\n trial.mutant.source_folder,\n- str(trial.mutant.source_file) or \"\",\n+ str(trial.mutant.source_file) or 'XXXX',\n trial.mutant.lineno,\n trial.mutant.mutator_name,\n )\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 3.2349610328674316 }, { "mutant": { "mutator_name": "String", "lineno": 22, "col_offset": 42, "end_lineno": 22, "end_col_offset": 53, "text": "'XXtemplatesXX'", "source_folder": "src", "source_file": "src/poodle/reporters/html.py", "unified_diff": "--- src/poodle/reporters/html.py\n+++ [Mutant] src/poodle/reporters/html.py:22\n@@ -19,7 +19,7 @@\n \n def template_path() -> Path:\n \"\"\"Return the path to the HTML Template folder.\"\"\"\n- return Path(__file__).parent.parent / \"templates\"\n+ return Path(__file__).parent.parent / 'XXtemplatesXX'\n \n \n STATIC_FILES = [\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.860416889190674 }, { "mutant": { "mutator_name": "Compare", "lineno": 90, "col_offset": 11, "end_lineno": 90, "end_col_offset": 64, "text": "'source_file' in d or d['source_folder'] is not None", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:90\n@@ -87,7 +87,7 @@\n \"\"\"Correct fields in Dictionary for JSON deserialization.\"\"\"\n if \"source_folder\" in d:\n d[\"source_folder\"] = Path(d[\"source_folder\"])\n- if \"source_file\" in d and d[\"source_folder\"] is not None:\n+ if 'source_file' in d or d['source_folder'] is not None:\n d[\"source_file\"] = Path(d[\"source_file\"])\n return d\n \n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.748727321624756 }, { "mutant": { "mutator_name": "Keyword", "lineno": 83, "col_offset": 31, "end_lineno": 83, "end_col_offset": 35, "text": "' '", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:83\n@@ -80,7 +80,7 @@\n \n source_folder: Path\n source_file: Path | None\n- unified_diff: str | None = None\n+ unified_diff: str | None = ' '\n \n @staticmethod\n def from_dict(d: dict[str, Any]) -> dict[str, Any]:\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.005250930786133 }, { "mutant": { "mutator_name": "Keyword", "lineno": 90, "col_offset": 60, "end_lineno": 90, "end_col_offset": 64, "text": "' '", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:90\n@@ -87,7 +87,7 @@\n \"\"\"Correct fields in Dictionary for JSON deserialization.\"\"\"\n if \"source_folder\" in d:\n d[\"source_folder\"] = Path(d[\"source_folder\"])\n- if \"source_file\" in d and d[\"source_folder\"] is not None:\n+ if \"source_file\" in d and d[\"source_folder\"] is not ' ':\n d[\"source_file\"] = Path(d[\"source_file\"])\n return d\n \n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 3.1990931034088135 }, { "mutant": { "mutator_name": "Keyword", "lineno": 186, "col_offset": 30, "end_lineno": 186, "end_col_offset": 34, "text": "' '", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:186\n@@ -183,7 +183,7 @@\n @staticmethod\n def from_dict(d: dict[str, Any]) -> dict[str, Any]:\n \"\"\"Correct fields in Dictionary for JSON deserialization.\"\"\"\n- d.pop(\"success_rate\", None)\n+ d.pop(\"success_rate\", ' ')\n d.pop(\"coverage_display\", None)\n return d\n \n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.261491537094116 }, { "mutant": { "mutator_name": "Keyword", "lineno": 187, "col_offset": 34, "end_lineno": 187, "end_col_offset": 38, "text": "' '", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:187\n@@ -184,7 +184,7 @@\n def from_dict(d: dict[str, Any]) -> dict[str, Any]:\n \"\"\"Correct fields in Dictionary for JSON deserialization.\"\"\"\n d.pop(\"success_rate\", None)\n- d.pop(\"coverage_display\", None)\n+ d.pop(\"coverage_display\", ' ')\n return d\n \n def to_dict(self) -> dict[str, Any]:\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.5057268142700195 }, { "mutant": { "mutator_name": "Number", "lineno": 157, "col_offset": 25, "end_lineno": 157, "end_col_offset": 26, "text": "1", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:157\n@@ -154,7 +154,7 @@\n @property\n def success_rate(self) -> float:\n \"\"\"Return the success rate of the test run.\"\"\"\n- if self.trials > 0:\n+ if self.trials > 1:\n return self.found / self.trials\n if self.tested > 0:\n return self.found / self.tested\n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.6431467533111572 }, { "mutant": { "mutator_name": "Number", "lineno": 159, "col_offset": 25, "end_lineno": 159, "end_col_offset": 26, "text": "1", "source_folder": "src", "source_file": "src/poodle/data_types/data.py", "unified_diff": "--- src/poodle/data_types/data.py\n+++ [Mutant] src/poodle/data_types/data.py:159\n@@ -156,7 +156,7 @@\n \"\"\"Return the success rate of the test run.\"\"\"\n if self.trials > 0:\n return self.found / self.trials\n- if self.tested > 0:\n+ if self.tested > 1:\n return self.found / self.tested\n return 0.0\n \n" }, "result": { "found": false, "reason_code": "Mutant Not Found", "reason_desc": null }, "duration": 2.8689138889312744 } ], "summary": { "trials": 1323, "tested": 1323, "found": 1306, "not_found": 17, "timeout": 0, "errors": 0, "success_rate": 0.9871504157218443, "coverage_display": "98.72%" } } ```