Mutation Coverage Report

Project: poodle version 1.2.0
Project Score: 98.57%
Module Mutants Found Not Found Timeout Error Score
src\poodle\util.py 93 91 2 0 0 97.85%
src\poodle\mutators\unary_op.py 9 9 0 0 0 100.00%
src\poodle\mutate.py 111 109 2 0 0 98.20%
src\poodle\mutators\constant.py 73 73 0 0 0 100.00%
src\poodle\core.py 43 42 1 0 0 97.67%
src\poodle\mutators\calls.py 45 45 0 0 0 100.00%
src\poodle\runners\command_line.py 68 68 0 0 0 100.00%
src\poodle\report.py 10 10 0 0 0 100.00%
src\poodle\data_types\work.py 22 22 0 0 0 100.00%
src\poodle\mutators\operators.py 36 36 0 0 0 100.00%
src\poodle\config.py 324 322 2 0 0 99.38%
src\poodle\reporters\html.py 152 151 1 0 0 99.34%
src\poodle\data_types\data.py 173 166 7 0 0 95.95%
src\poodle\reporters\basic.py 86 82 4 0 0 95.35%
src\poodle\data_types\interfaces.py 50 50 0 0 0 100.00%
src\poodle\mutators\compare.py 30 30 0 0 0 100.00%
Total 1325 1306 19 0 0 98.57%

Mutants

src\poodle\util.py

Status: Mutant Not Found

Mutator Name: Keyword

Unified Diff:

--- src\poodle\util.py
+++ [Mutant] src\poodle\util.py:108
@@ -105,7 +105,7 @@
 def create_unified_diff(mutant: Mutant) -> str | None:
     """Add unified diff to mutant."""
     if mutant.source_file:
-        file_lines = mutant.source_file.read_text("utf-8").splitlines(keepends=True)
+        file_lines = mutant.source_file.read_text("utf-8").splitlines(keepends=False)
         file_name = str(mutant.source_file)
         return "".join(
             difflib.unified_diff(

Status: Mutant Not Found

Mutator Name: String

Unified Diff:

--- src\poodle\util.py
+++ [Mutant] src\poodle\util.py:108
@@ -105,7 +105,7 @@
 def create_unified_diff(mutant: Mutant) -> str | None:
     """Add unified diff to mutant."""
     if mutant.source_file:
-        file_lines = mutant.source_file.read_text("utf-8").splitlines(keepends=True)
+        file_lines = mutant.source_file.read_text('XXutf-8XX').splitlines(keepends=True)
         file_name = str(mutant.source_file)
         return "".join(
             difflib.unified_diff(

src\poodle\mutate.py

Status: Mutant Not Found

Mutator Name: Number

Unified Diff:

--- src\poodle\mutate.py
+++ [Mutant] src\poodle\mutate.py:186
@@ -183,7 +183,7 @@
             add_line_filter(line_filters, lineno, "all")
         no_mut_filter: list[str] = re.findall(r"#\s*nomut:?\s*([A-Za-z0-9,\s]*)[#$]*", line)
 
-        if no_mut_filter and no_mut_filter[0].strip().lower() in ("start", "on"):
+        if no_mut_filter and no_mut_filter[-1].strip().lower() in ("start", "on"):
             no_mut_on = True
 
         if no_mut_on:

Status: Mutant Not Found

Mutator Name: Number

Unified Diff:

--- src\poodle\mutate.py
+++ [Mutant] src\poodle\mutate.py:196
@@ -193,7 +193,7 @@
                 for mutator in mutators.split(","):
                     add_line_filter(line_filters, lineno, mutator.strip())
 
-        if no_mut_filter and no_mut_filter[0].strip().lower() in ("end", "off"):
+        if no_mut_filter and no_mut_filter[-1].strip().lower() in ("end", "off"):
             no_mut_on = False
 
     return line_filters

src\poodle\core.py

Status: Mutant Not Found

Mutator Name: FuncCall

Unified Diff:

--- src\poodle\core.py
+++ [Mutant] src\poodle\core.py:45
@@ -42,7 +42,7 @@
         results = run_mutant_trails(work, mutants, timeout)
 
         for trial in results.mutant_trials:
-            trial.mutant.unified_diff = create_unified_diff(trial.mutant)
+            trial.mutant.unified_diff = None
 
         for reporter in work.reporters:
             reporter(config=config, echo=work.echo, testing_results=results)

src\poodle\config.py

Status: Mutant Not Found

Mutator Name: FuncCall

Unified Diff:

--- src\poodle\config.py
+++ [Mutant] src\poodle\config.py:196
@@ -193,7 +193,7 @@
     raise PoodleInputError(msg)
 
 
-def get_project_info(config_file: Path | None) -> tuple(str | None, str | None):
+def get_project_info(config_file: Path | None) -> None:
     """Retrieve Poodle configuration from specified Config File."""
     if not config_file:
         return (None, None)

Status: Mutant Not Found

Mutator Name: FuncCall

Unified Diff:

--- src\poodle\config.py
+++ [Mutant] src\poodle\config.py:218
@@ -215,7 +215,7 @@
     return config_data.get("poodle", {})
 
 
-def get_project_info_toml(config_file: Path) -> tuple(str | None, str | None):
+def get_project_info_toml(config_file: Path) -> None:
     """Retrieve Project Name and Version from a 'toml' Config File."""
     config_data = tomllib.load(config_file.open(mode="rb"))
     config_data: dict = config_data.get("project", config_data)

src\poodle\reporters\html.py

Status: Mutant Not Found

Mutator Name: String

Unified Diff:

--- src\poodle\reporters\html.py
+++ [Mutant] src\poodle\reporters\html.py:22
@@ -19,7 +19,7 @@
 
 def template_path() -> Path:
     """Return the path to the HTML Template folder."""
-    return Path(__file__).parent.parent / "templates"
+    return Path(__file__).parent.parent / 'XXtemplatesXX'
 
 
 STATIC_FILES = [

src\poodle\data_types\data.py

Status: Mutant Not Found

Mutator Name: Keyword

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:83
@@ -80,7 +80,7 @@
 
     source_folder: Path
     source_file: Path | None
-    unified_diff: str | None = None
+    unified_diff: str | None = ' '
 
     @staticmethod
     def from_dict(d: dict[str, Any]) -> dict[str, Any]:

Status: Mutant Not Found

Mutator Name: Compare

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:90
@@ -87,7 +87,7 @@
         """Correct fields in Dictionary for JSON deserialization."""
         if "source_folder" in d:
             d["source_folder"] = Path(d["source_folder"])
-        if "source_file" in d and d["source_folder"] is not None:
+        if 'source_file' in d or d['source_folder'] is not None:
             d["source_file"] = Path(d["source_file"])
         return d
 

Status: Mutant Not Found

Mutator Name: Keyword

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:90
@@ -87,7 +87,7 @@
         """Correct fields in Dictionary for JSON deserialization."""
         if "source_folder" in d:
             d["source_folder"] = Path(d["source_folder"])
-        if "source_file" in d and d["source_folder"] is not None:
+        if "source_file" in d and d["source_folder"] is not ' ':
             d["source_file"] = Path(d["source_file"])
         return d
 

Status: Mutant Not Found

Mutator Name: Number

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:157
@@ -154,7 +154,7 @@
     @property
     def success_rate(self) -> float:
         """Return the success rate of the test run."""
-        if self.trials > 0:
+        if self.trials > 1:
             return self.found / self.trials
         if self.tested > 0:
             return self.found / self.tested

Status: Mutant Not Found

Mutator Name: Number

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:159
@@ -156,7 +156,7 @@
         """Return the success rate of the test run."""
         if self.trials > 0:
             return self.found / self.trials
-        if self.tested > 0:
+        if self.tested > 1:
             return self.found / self.tested
         return 0.0
 

Status: Mutant Not Found

Mutator Name: Keyword

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:186
@@ -183,7 +183,7 @@
     @staticmethod
     def from_dict(d: dict[str, Any]) -> dict[str, Any]:
         """Correct fields in Dictionary for JSON deserialization."""
-        d.pop("success_rate", None)
+        d.pop("success_rate", ' ')
         d.pop("coverage_display", None)
         return d
 

Status: Mutant Not Found

Mutator Name: Keyword

Unified Diff:

--- src\poodle\data_types\data.py
+++ [Mutant] src\poodle\data_types\data.py:187
@@ -184,7 +184,7 @@
     def from_dict(d: dict[str, Any]) -> dict[str, Any]:
         """Correct fields in Dictionary for JSON deserialization."""
         d.pop("success_rate", None)
-        d.pop("coverage_display", None)
+        d.pop("coverage_display", ' ')
         return d
 
     def to_dict(self) -> dict[str, Any]:

src\poodle\reporters\basic.py

Status: Mutant Not Found

Mutator Name: Compare

Unified Diff:

--- src\poodle\reporters\basic.py
+++ [Mutant] src\poodle\reporters\basic.py:26
@@ -23,7 +23,7 @@
     """Echo quick summary to console."""
     echo("")
     summary = testing_results.summary
-    if summary.trials < 1:
+    if summary.trials <= 1:
         echo("!!! No mutants found to test !!!", fg="yellow")
         return
 

Status: Mutant Not Found

Mutator Name: Number

Unified Diff:

--- src\poodle\reporters\basic.py
+++ [Mutant] src\poodle\reporters\basic.py:26
@@ -23,7 +23,7 @@
     """Echo quick summary to console."""
     echo("")
     summary = testing_results.summary
-    if summary.trials < 1:
+    if summary.trials < 2:
         echo("!!! No mutants found to test !!!", fg="yellow")
         return
 

Status: Mutant Not Found

Mutator Name: Compare

Unified Diff:

--- src\poodle\reporters\basic.py
+++ [Mutant] src\poodle\reporters\basic.py:49
@@ -46,7 +46,7 @@
     failed_trials.sort(
         key=lambda trial: (
             trial.mutant.source_folder,
-            str(trial.mutant.source_file) or "",
+            str(trial.mutant.source_file) and '',
             trial.mutant.lineno,
             trial.mutant.mutator_name,
         )

Status: Mutant Not Found

Mutator Name: String

Unified Diff:

--- src\poodle\reporters\basic.py
+++ [Mutant] src\poodle\reporters\basic.py:49
@@ -46,7 +46,7 @@
     failed_trials.sort(
         key=lambda trial: (
             trial.mutant.source_folder,
-            str(trial.mutant.source_file) or "",
+            str(trial.mutant.source_file) or 'XXXX',
             trial.mutant.lineno,
             trial.mutant.mutator_name,
         )