diff --git a/app/cli/documentation/cli-reference.mdx b/app/cli/documentation/cli-reference.mdx
index b7bf68c85..20773a9c5 100755
--- a/app/cli/documentation/cli-reference.mdx
+++ b/app/cli/documentation/cli-reference.mdx
@@ -268,7 +268,7 @@ Options
--append reserved for a future release: will control whether --policy-input and --policy-input-from-file append to (rather than replace) the contract-declared value; has no effect yet
--attestation-id string Unique identifier of the in-progress attestation
-h, --help help for add
---kind string kind of the material to be recorded: ["ARTIFACT" "ASYNCAPI_SPEC" "ATTESTATION" "BLACKDUCK_SCA_JSON" "CERTCC_DRANZER" "CHAINLOOP_AI_AGENT_CONFIG" "CHAINLOOP_AI_CODING_SESSION" "CHAINLOOP_PR_INFO" "CHAINLOOP_RUNNER_CONTEXT" "CHECKMARX_JSON" "COBERTURA_XML" "CONTAINER_IMAGE" "CSAF_INFORMATIONAL_ADVISORY" "CSAF_SECURITY_ADVISORY" "CSAF_SECURITY_INCIDENT_RESPONSE" "CSAF_VEX" "EVIDENCE" "GHAS_CODE_SCAN" "GHAS_DEPENDENCY_SCAN" "GHAS_SECRET_SCAN" "GITLAB_SECURITY_REPORT" "GITLEAKS_JSON" "GRAPHQL_SPEC" "HELM_CHART" "JACOCO_XML" "JUNIT_XML" "OPENAPI_SPEC" "OPENVEX" "OSSF_SCORECARD_JSON" "OVERSECURED_JSON" "RADAMSA_CRASHES" "RADAMSA_REPORT" "SARIF" "SBOM_CYCLONEDX_JSON" "SBOM_SPDX_JSON" "SLSA_PROVENANCE" "STRING" "SYSINTERNALS_ACCESSCHK" "SYSINTERNALS_SIGCHECK" "TRUFFLEHOG_JSON" "TWISTCLI_SCAN_JSON" "YELP_DETECT_SECRETS_BASELINE" "ZAP_DAST_ZIP"]
+--kind string kind of the material to be recorded: ["ARTIFACT" "ASYNCAPI_SPEC" "ATTESTATION" "BLACKDUCK_SCA_JSON" "CERTCC_DRANZER" "CHAINLOOP_AI_AGENT_CONFIG" "CHAINLOOP_AI_CODING_SESSION" "CHAINLOOP_PR_INFO" "CHAINLOOP_RUNNER_CONTEXT" "CHECKMARX_JSON" "COBERTURA_XML" "CONTAINER_IMAGE" "CSAF_INFORMATIONAL_ADVISORY" "CSAF_SECURITY_ADVISORY" "CSAF_SECURITY_INCIDENT_RESPONSE" "CSAF_VEX" "EVIDENCE" "GHAS_CODE_SCAN" "GHAS_DEPENDENCY_SCAN" "GHAS_SECRET_SCAN" "GITLAB_SECURITY_REPORT" "GITLEAKS_JSON" "GRAPHQL_SPEC" "HELM_CHART" "JACOCO_XML" "JUNIT_XML" "OPENAPI_SPEC" "OPENVEX" "OSSF_SCORECARD_JSON" "OVERSECURED_JSON" "PITEST_XML" "RADAMSA_CRASHES" "RADAMSA_REPORT" "SARIF" "SBOM_CYCLONEDX_JSON" "SBOM_SPDX_JSON" "SLSA_PROVENANCE" "STRING" "SYSINTERNALS_ACCESSCHK" "SYSINTERNALS_SIGCHECK" "TRUFFLEHOG_JSON" "TWISTCLI_SCAN_JSON" "YELP_DETECT_SECRETS_BASELINE" "ZAP_DAST_ZIP"]
--max-extract-entries int max number of files to extract when --value is an archive (default 10000)
--max-extract-size string max total uncompressed size to extract when --value is an archive (default "1GiB")
--name string name of the material as shown in the contract
@@ -3046,7 +3046,7 @@ Options
--annotation strings Key-value pairs of material annotations (key=value)
-h, --help help for eval
--input stringArray Key-value pairs of policy inputs (key=value)
---kind string Kind of the material: ["ARTIFACT" "ASYNCAPI_SPEC" "ATTESTATION" "BLACKDUCK_SCA_JSON" "CERTCC_DRANZER" "CHAINLOOP_AI_AGENT_CONFIG" "CHAINLOOP_AI_CODING_SESSION" "CHAINLOOP_PR_INFO" "CHAINLOOP_RUNNER_CONTEXT" "CHECKMARX_JSON" "COBERTURA_XML" "CONTAINER_IMAGE" "CSAF_INFORMATIONAL_ADVISORY" "CSAF_SECURITY_ADVISORY" "CSAF_SECURITY_INCIDENT_RESPONSE" "CSAF_VEX" "EVIDENCE" "GHAS_CODE_SCAN" "GHAS_DEPENDENCY_SCAN" "GHAS_SECRET_SCAN" "GITLAB_SECURITY_REPORT" "GITLEAKS_JSON" "GRAPHQL_SPEC" "HELM_CHART" "JACOCO_XML" "JUNIT_XML" "OPENAPI_SPEC" "OPENVEX" "OSSF_SCORECARD_JSON" "OVERSECURED_JSON" "RADAMSA_CRASHES" "RADAMSA_REPORT" "SARIF" "SBOM_CYCLONEDX_JSON" "SBOM_SPDX_JSON" "SLSA_PROVENANCE" "STRING" "SYSINTERNALS_ACCESSCHK" "SYSINTERNALS_SIGCHECK" "TRUFFLEHOG_JSON" "TWISTCLI_SCAN_JSON" "YELP_DETECT_SECRETS_BASELINE" "ZAP_DAST_ZIP"]
+--kind string Kind of the material: ["ARTIFACT" "ASYNCAPI_SPEC" "ATTESTATION" "BLACKDUCK_SCA_JSON" "CERTCC_DRANZER" "CHAINLOOP_AI_AGENT_CONFIG" "CHAINLOOP_AI_CODING_SESSION" "CHAINLOOP_PR_INFO" "CHAINLOOP_RUNNER_CONTEXT" "CHECKMARX_JSON" "COBERTURA_XML" "CONTAINER_IMAGE" "CSAF_INFORMATIONAL_ADVISORY" "CSAF_SECURITY_ADVISORY" "CSAF_SECURITY_INCIDENT_RESPONSE" "CSAF_VEX" "EVIDENCE" "GHAS_CODE_SCAN" "GHAS_DEPENDENCY_SCAN" "GHAS_SECRET_SCAN" "GITLAB_SECURITY_REPORT" "GITLEAKS_JSON" "GRAPHQL_SPEC" "HELM_CHART" "JACOCO_XML" "JUNIT_XML" "OPENAPI_SPEC" "OPENVEX" "OSSF_SCORECARD_JSON" "OVERSECURED_JSON" "PITEST_XML" "RADAMSA_CRASHES" "RADAMSA_REPORT" "SARIF" "SBOM_CYCLONEDX_JSON" "SBOM_SPDX_JSON" "SLSA_PROVENANCE" "STRING" "SYSINTERNALS_ACCESSCHK" "SYSINTERNALS_SIGCHECK" "TRUFFLEHOG_JSON" "TWISTCLI_SCAN_JSON" "YELP_DETECT_SECRETS_BASELINE" "ZAP_DAST_ZIP"]
--material string Path to material or attestation file
-p, --policy string Policy reference (./my-policy.yaml, https://my-domain.com/my-policy.yaml, chainloop://my-stored-policy) (default "policy.yaml")
--project string Project name to use as engine context for chainloop.* built-ins
diff --git a/app/controlplane/api/gen/frontend/workflowcontract/v1/crafting_schema.ts b/app/controlplane/api/gen/frontend/workflowcontract/v1/crafting_schema.ts
index 0db137e9c..5e039bc29 100644
--- a/app/controlplane/api/gen/frontend/workflowcontract/v1/crafting_schema.ts
+++ b/app/controlplane/api/gen/frontend/workflowcontract/v1/crafting_schema.ts
@@ -331,6 +331,11 @@ export enum CraftingSchema_Material_MaterialType {
* https://docs.oversecured.com/docs/guide-exporting-reports
*/
OVERSECURED_JSON = 43,
+ /**
+ * PITEST_XML - PIT mutation testing report in its native XML format (mutations.xml)
+ * https://pitest.org/
+ */
+ PITEST_XML = 44,
UNRECOGNIZED = -1,
}
@@ -468,6 +473,9 @@ export function craftingSchema_Material_MaterialTypeFromJSON(object: any): Craft
case 43:
case "OVERSECURED_JSON":
return CraftingSchema_Material_MaterialType.OVERSECURED_JSON;
+ case 44:
+ case "PITEST_XML":
+ return CraftingSchema_Material_MaterialType.PITEST_XML;
case -1:
case "UNRECOGNIZED":
default:
@@ -565,6 +573,8 @@ export function craftingSchema_Material_MaterialTypeToJSON(object: CraftingSchem
return "CHECKMARX_JSON";
case CraftingSchema_Material_MaterialType.OVERSECURED_JSON:
return "OVERSECURED_JSON";
+ case CraftingSchema_Material_MaterialType.PITEST_XML:
+ return "PITEST_XML";
case CraftingSchema_Material_MaterialType.UNRECOGNIZED:
default:
return "UNRECOGNIZED";
diff --git a/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.jsonschema.json b/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.jsonschema.json
index de5b8934d..7d342996d 100644
--- a/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.jsonschema.json
+++ b/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.jsonschema.json
@@ -60,7 +60,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
@@ -156,7 +157,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.schema.json b/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.schema.json
index 57fc9dab0..354dba9fc 100644
--- a/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.schema.json
+++ b/app/controlplane/api/gen/jsonschema/attestation.v1.Attestation.Material.schema.json
@@ -60,7 +60,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
@@ -156,7 +157,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.jsonschema.json b/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.jsonschema.json
index 90ae287bd..743aa050e 100644
--- a/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.jsonschema.json
+++ b/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.jsonschema.json
@@ -171,7 +171,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.schema.json b/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.schema.json
index caf1ed28e..b188852c0 100644
--- a/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.schema.json
+++ b/app/controlplane/api/gen/jsonschema/attestation.v1.PolicyEvaluation.schema.json
@@ -171,7 +171,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.jsonschema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.jsonschema.json
index 9d8c4b900..b203b9530 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.jsonschema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.jsonschema.json
@@ -81,7 +81,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.schema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.schema.json
index 7a4f7cd56..246b7302f 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.schema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.CraftingSchema.Material.schema.json
@@ -81,7 +81,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.jsonschema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.jsonschema.json
index cfc3c4bf8..0f5d1e79c 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.jsonschema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.jsonschema.json
@@ -105,7 +105,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.schema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.schema.json
index f0c60fb38..781a410fd 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.schema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicyGroup.Material.schema.json
@@ -105,7 +105,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.jsonschema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.jsonschema.json
index 303314a9d..5b97df6db 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.jsonschema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.jsonschema.json
@@ -79,7 +79,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.schema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.schema.json
index 1e3bfad5f..f3f357631 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.schema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpec.schema.json
@@ -79,7 +79,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.jsonschema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.jsonschema.json
index da6bd022f..f729155ed 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.jsonschema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.jsonschema.json
@@ -100,7 +100,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.schema.json b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.schema.json
index 38d9edc1d..cbfbbdb9b 100644
--- a/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.schema.json
+++ b/app/controlplane/api/gen/jsonschema/workflowcontract.v1.PolicySpecV2.schema.json
@@ -100,7 +100,8 @@
"TRUFFLEHOG_JSON",
"COBERTURA_XML",
"CHECKMARX_JSON",
- "OVERSECURED_JSON"
+ "OVERSECURED_JSON",
+ "PITEST_XML"
],
"title": "Material Type",
"type": "string"
diff --git a/app/controlplane/api/workflowcontract/v1/crafting_schema.pb.go b/app/controlplane/api/workflowcontract/v1/crafting_schema.pb.go
index 809fa9032..e097271e7 100644
--- a/app/controlplane/api/workflowcontract/v1/crafting_schema.pb.go
+++ b/app/controlplane/api/workflowcontract/v1/crafting_schema.pb.go
@@ -253,6 +253,9 @@ const (
// Oversecured mobile (Android/iOS) scan report, whole-scan JSON export
// https://docs.oversecured.com/docs/guide-exporting-reports
CraftingSchema_Material_OVERSECURED_JSON CraftingSchema_Material_MaterialType = 43
+ // PIT mutation testing report in its native XML format (mutations.xml)
+ // https://pitest.org/
+ CraftingSchema_Material_PITEST_XML CraftingSchema_Material_MaterialType = 44
)
// Enum value maps for CraftingSchema_Material_MaterialType.
@@ -302,6 +305,7 @@ var (
41: "COBERTURA_XML",
42: "CHECKMARX_JSON",
43: "OVERSECURED_JSON",
+ 44: "PITEST_XML",
}
CraftingSchema_Material_MaterialType_value = map[string]int32{
"MATERIAL_TYPE_UNSPECIFIED": 0,
@@ -348,6 +352,7 @@ var (
"COBERTURA_XML": 41,
"CHECKMARX_JSON": 42,
"OVERSECURED_JSON": 43,
+ "PITEST_XML": 44,
}
)
@@ -2096,7 +2101,7 @@ var File_workflowcontract_v1_crafting_schema_proto protoreflect.FileDescriptor
const file_workflowcontract_v1_crafting_schema_proto_rawDesc = "" +
"\n" +
- ")workflowcontract/v1/crafting_schema.proto\x12\x13workflowcontract.v1\x1a\x1bbuf/validate/validate.proto\"\xe6\x12\n" +
+ ")workflowcontract/v1/crafting_schema.proto\x12\x13workflowcontract.v1\x1a\x1bbuf/validate/validate.proto\"\xf6\x12\n" +
"\x0eCraftingSchema\x122\n" +
"\x0eschema_version\x18\x01 \x01(\tB\v\xbaH\x06r\x04\n" +
"\x02v1\x18\x01R\rschemaVersion\x12N\n" +
@@ -2119,7 +2124,7 @@ const file_workflowcontract_v1_crafting_schema_proto_rawDesc = "" +
"\x0fDAGGER_PIPELINE\x10\x06\x12\x15\n" +
"\x11TEAMCITY_PIPELINE\x10\a\x12\x13\n" +
"\x0fTEKTON_PIPELINE\x10\b\x12\x15\n" +
- "\x11CHAINLOOP_SANDBOX\x10\t:\x02\x18\x01\x1a\xb1\f\n" +
+ "\x11CHAINLOOP_SANDBOX\x10\t:\x02\x18\x01\x1a\xc1\f\n" +
"\bMaterial\x12[\n" +
"\x04type\x18\x01 \x01(\x0e29.workflowcontract.v1.CraftingSchema.Material.MaterialTypeB\f\xbaH\a\x82\x01\x04\x10\x01 \x00\x18\x01R\x04type\x12\x99\x01\n" +
"\x04name\x18\x02 \x01(\tB\x84\x01\xbaH\x7f\xba\x01|\n" +
@@ -2130,7 +2135,7 @@ const file_workflowcontract_v1_crafting_schema_proto_rawDesc = "" +
"\vskip_upload\x18\x06 \x01(\bR\n" +
"skipUpload\x12\xaa\x01\n" +
"\x05group\x18\a \x01(\tB\x93\x01\xbaH\x8f\x01\xba\x01\x8b\x01\n" +
- "\x0egroup.dns-1123\x12:must contain only lowercase letters, numbers, and hyphens.\x1a=this == '' || this.matches('^[a-z0-9]([-a-z0-9]*[a-z0-9])?$')R\x05group\"\xd6\a\n" +
+ "\x0egroup.dns-1123\x12:must contain only lowercase letters, numbers, and hyphens.\x1a=this == '' || this.matches('^[a-z0-9]([-a-z0-9]*[a-z0-9])?$')R\x05group\"\xe6\a\n" +
"\fMaterialType\x12\x1d\n" +
"\x19MATERIAL_TYPE_UNSPECIFIED\x10\x00\x12\n" +
"\n" +
@@ -2179,7 +2184,9 @@ const file_workflowcontract_v1_crafting_schema_proto_rawDesc = "" +
"\x0fTRUFFLEHOG_JSON\x10(\x12\x11\n" +
"\rCOBERTURA_XML\x10)\x12\x12\n" +
"\x0eCHECKMARX_JSON\x10*\x12\x14\n" +
- "\x10OVERSECURED_JSON\x10+:\x02\x18\x01:\x02\x18\x01\"\xfb\x01\n" +
+ "\x10OVERSECURED_JSON\x10+\x12\x0e\n" +
+ "\n" +
+ "PITEST_XML\x10,:\x02\x18\x01:\x02\x18\x01\"\xfb\x01\n" +
"\x10CraftingSchemaV2\x128\n" +
"\vapi_version\x18\x01 \x01(\tB\x17\xbaH\x14r\x12\n" +
"\x10chainloop.dev/v1R\n" +
diff --git a/app/controlplane/api/workflowcontract/v1/crafting_schema.proto b/app/controlplane/api/workflowcontract/v1/crafting_schema.proto
index 96f9994a1..38fd7434e 100644
--- a/app/controlplane/api/workflowcontract/v1/crafting_schema.proto
+++ b/app/controlplane/api/workflowcontract/v1/crafting_schema.proto
@@ -202,6 +202,9 @@ message CraftingSchema {
// Oversecured mobile (Android/iOS) scan report, whole-scan JSON export
// https://docs.oversecured.com/docs/guide-exporting-reports
OVERSECURED_JSON = 43;
+ // PIT mutation testing report in its native XML format (mutations.xml)
+ // https://pitest.org/
+ PITEST_XML = 44;
}
}
}
diff --git a/app/controlplane/api/workflowcontract/v1/crafting_schema_validations.go b/app/controlplane/api/workflowcontract/v1/crafting_schema_validations.go
index 6c5dfab31..22043c66a 100644
--- a/app/controlplane/api/workflowcontract/v1/crafting_schema_validations.go
+++ b/app/controlplane/api/workflowcontract/v1/crafting_schema_validations.go
@@ -63,6 +63,7 @@ var CraftingMaterialInValidationOrder = []CraftingSchema_Material_MaterialType{
CraftingSchema_Material_JUNIT_XML,
CraftingSchema_Material_JACOCO_XML,
CraftingSchema_Material_COBERTURA_XML,
+ CraftingSchema_Material_PITEST_XML,
CraftingSchema_Material_HELM_CHART,
CraftingSchema_Material_SARIF,
CraftingSchema_Material_BLACKDUCK_SCA_JSON,
diff --git a/pkg/attestation/crafter/api/attestation/v1/crafting_state.go b/pkg/attestation/crafter/api/attestation/v1/crafting_state.go
index e5ae4259e..cbcded7f4 100644
--- a/pkg/attestation/crafter/api/attestation/v1/crafting_state.go
+++ b/pkg/attestation/crafter/api/attestation/v1/crafting_state.go
@@ -31,6 +31,7 @@ import (
"github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/dranzer"
"github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/jacoco"
materialsjunit "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/junit"
+ "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/pitest"
materialsradamsa "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/radamsa"
"github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/trufflehog"
"github.com/chainloop-dev/chainloop/pkg/tabular"
@@ -261,6 +262,12 @@ func (m *Attestation_Material) ingestMaterialToJSON(rawMaterial []byte, value st
return nil, fmt.Errorf("invalid Cobertura report file: %w", err)
}
return json.Marshal(&report)
+ case v1.CraftingSchema_Material_PITEST_XML:
+ var report pitest.Report
+ if err := xml.Unmarshal(rawMaterial, &report); err != nil {
+ return nil, fmt.Errorf("invalid PIT report file: %w", err)
+ }
+ return json.Marshal(&report)
case v1.CraftingSchema_Material_SYSINTERNALS_SIGCHECK:
report, err := tabular.Parse(rawMaterial)
if err != nil {
diff --git a/pkg/attestation/crafter/api/attestation/v1/crafting_state_test.go b/pkg/attestation/crafter/api/attestation/v1/crafting_state_test.go
index 3df00d172..b95f9e9dd 100644
--- a/pkg/attestation/crafter/api/attestation/v1/crafting_state_test.go
+++ b/pkg/attestation/crafter/api/attestation/v1/crafting_state_test.go
@@ -619,3 +619,115 @@ func TestTruffleHogCleanScanIsEvaluableInline(t *testing.T) {
require.True(t, ok, "clean scan must project to an elements array")
assert.Empty(t, elements)
}
+
+// pitestMaterial builds an artifact material of kind PITEST_XML for
+// projection tests.
+func pitestMaterial() *Attestation_Material {
+ return &Attestation_Material{
+ MaterialType: schemaapi.CraftingSchema_Material_PITEST_XML,
+ M: &Attestation_Material_Artifact_{
+ Artifact: &Attestation_Material_Artifact{Name: "mutations", Digest: "sha256:deadbeef"},
+ },
+ }
+}
+
+// pitestMutations decodes the evaluable content of a PIT report and returns
+// its mutation records.
+func pitestMutations(t *testing.T, path string) (map[string]any, []any) {
+ t.Helper()
+
+ content, err := pitestMaterial().GetEvaluableContent(path)
+ require.NoError(t, err)
+
+ var decoded map[string]any
+ require.NoError(t, json.NewDecoder(bytes.NewReader(content)).Decode(&decoded))
+ mutations, ok := decoded["mutations"].([]any)
+ require.True(t, ok, "PIT report must project to a mutations array")
+ return decoded, mutations
+}
+
+// TestPitestReportIsEvaluable guards the XML-to-JSON projection of a standard
+// PIT report: the root partial flag is preserved and every mutation record is
+// projected with its own fields.
+func TestPitestReportIsEvaluable(t *testing.T) {
+ decoded, mutations := pitestMutations(t, "testdata/pitest.xml")
+ assert.Equal(t, true, decoded["partial"], "root partial attribute must be preserved")
+ assert.Len(t, mutations, 3, "every mutation record must be projected")
+}
+
+// TestPitestSurvivedMutationKeepsStatus guards that a SURVIVED mutant keeps
+// detected=false and status=SURVIVED along with its source location, mutator,
+// indexes, blocks and description, so a policy can single out surviving
+// covered mutants.
+func TestPitestSurvivedMutationKeepsStatus(t *testing.T) {
+ _, mutations := pitestMutations(t, "testdata/pitest.xml")
+
+ var survived map[string]any
+ for _, m := range mutations {
+ mutation := m.(map[string]any)
+ if mutation["status"] == "SURVIVED" {
+ survived = mutation
+ break
+ }
+ }
+ require.NotNil(t, survived, "fixture must contain a SURVIVED mutation")
+ assert.Equal(t, false, survived["detected"])
+ assert.Equal(t, "SURVIVED", survived["status"])
+ assert.Equal(t, "PetController.java", survived["sourceFile"])
+ assert.Equal(t, "org.springframework.samples.petclinic.owner.PetController", survived["mutatedClass"])
+ assert.NotEmpty(t, survived["mutatedMethod"])
+ assert.NotEmpty(t, survived["methodDescription"])
+ assert.NotZero(t, survived["lineNumber"])
+ assert.NotEmpty(t, survived["mutator"])
+ assert.NotEmpty(t, survived["indexes"])
+ assert.NotEmpty(t, survived["blocks"])
+ assert.NotEmpty(t, survived["description"])
+}
+
+// TestPitestNoCoverageKeepsStatusDistinct guards that a NO_COVERAGE mutant is
+// not collapsed into the same signal as a surviving covered mutant: it keeps
+// status=NO_COVERAGE and numberOfTestsRun=0.
+func TestPitestNoCoverageKeepsStatusDistinct(t *testing.T) {
+ _, mutations := pitestMutations(t, "testdata/pitest.xml")
+
+ var noCoverage map[string]any
+ for _, m := range mutations {
+ mutation := m.(map[string]any)
+ if mutation["status"] == "NO_COVERAGE" {
+ noCoverage = mutation
+ break
+ }
+ }
+ require.NotNil(t, noCoverage, "fixture must contain a NO_COVERAGE mutation")
+ assert.Equal(t, "NO_COVERAGE", noCoverage["status"])
+ assert.Equal(t, false, noCoverage["detected"])
+ assert.EqualValues(t, 0, noCoverage["numberOfTestsRun"])
+}
+
+// TestPitestFullMutationMatrixIsEvaluable guards that a report generated with
+// PIT's fullMutationMatrix option preserves its killingTests, succeedingTests
+// and coveringTests lists (pipe-delimited, kept unsplit) instead of the
+// standard killingTest field.
+func TestPitestFullMutationMatrixIsEvaluable(t *testing.T) {
+ _, mutations := pitestMutations(t, "testdata/pitest-full-matrix.xml")
+ require.Len(t, mutations, 1)
+
+ mutation := mutations[0].(map[string]any)
+ assert.Equal(t,
+ "org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormSuccess()|org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormError()",
+ mutation["killingTests"])
+ assert.Equal(t,
+ "org.springframework.samples.petclinic.owner.PetControllerTests.processUpdateForm()",
+ mutation["succeedingTests"])
+ assert.Equal(t,
+ "org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormSuccess()|org.springframework.samples.petclinic.owner.PetControllerTests.processUpdateForm()",
+ mutation["coveringTests"])
+ assert.NotContains(t, mutation, "killingTest", "full-matrix reports must not manufacture the standard killingTest field")
+}
+
+// TestPitestInvalidReportIsNotEvaluable guards that a non-PIT XML report
+// fails the projection instead of producing an empty policy input.
+func TestPitestInvalidReportIsNotEvaluable(t *testing.T) {
+ _, err := pitestMaterial().GetEvaluableContent("testdata/cobertura.xml")
+ require.ErrorContains(t, err, "invalid PIT report file")
+}
diff --git a/pkg/attestation/crafter/api/attestation/v1/testdata/pitest-full-matrix.xml b/pkg/attestation/crafter/api/attestation/v1/testdata/pitest-full-matrix.xml
new file mode 100644
index 000000000..417db62a4
--- /dev/null
+++ b/pkg/attestation/crafter/api/attestation/v1/testdata/pitest-full-matrix.xml
@@ -0,0 +1,4 @@
+
+
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindOwner(I)Lorg/springframework/samples/petclinic/owner/Owner;72org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator203org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormSuccess()|org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormError()org.springframework.samples.petclinic.owner.PetControllerTests.processUpdateForm()org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormSuccess()|org.springframework.samples.petclinic.owner.PetControllerTests.processUpdateForm()replaced return value with null for org/springframework/samples/petclinic/owner/PetController::findOwner
+
diff --git a/pkg/attestation/crafter/api/attestation/v1/testdata/pitest.xml b/pkg/attestation/crafter/api/attestation/v1/testdata/pitest.xml
new file mode 100644
index 000000000..47a580b35
--- /dev/null
+++ b/pkg/attestation/crafter/api/attestation/v1/testdata/pitest.xml
@@ -0,0 +1,6 @@
+
+
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindOwner(I)Lorg/springframework/samples/petclinic/owner/Owner;72org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator203org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]replaced return value with null for org/springframework/samples/petclinic/owner/PetController::findOwner
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/ui/ModelMap;)Ljava/lang/String;103org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator111removed call to org/springframework/samples/petclinic/owner/Owner::addPet
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerlambda$findOwner$0(I)Ljava/lang/IllegalArgumentException;70org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator81replaced return value with null for org/springframework/samples/petclinic/owner/PetController::lambda$findOwner$0
+
diff --git a/pkg/attestation/crafter/crafter_test.go b/pkg/attestation/crafter/crafter_test.go
index 2b9627391..46e8decde 100644
--- a/pkg/attestation/crafter/crafter_test.go
+++ b/pkg/attestation/crafter/crafter_test.go
@@ -653,6 +653,11 @@ func (s *crafterSuite) TestAddMaterialsAutomatic() {
materialPath: "./materials/testdata/junit.xml",
expectedType: schemaapi.CraftingSchema_Material_JUNIT_XML,
},
+ {
+ name: "pitest",
+ materialPath: "./materials/testdata/pitest.xml",
+ expectedType: schemaapi.CraftingSchema_Material_PITEST_XML,
+ },
{
name: "junit with custom material name",
materialName: "custom-junit-material",
diff --git a/pkg/attestation/crafter/materials/cobertura_test.go b/pkg/attestation/crafter/materials/cobertura_test.go
index 04b3fdbb1..4431a4884 100644
--- a/pkg/attestation/crafter/materials/cobertura_test.go
+++ b/pkg/attestation/crafter/materials/cobertura_test.go
@@ -57,6 +57,11 @@ func TestCoberturaCraft(t *testing.T) {
filePath: "./testdata/junit.xml",
wantErr: "unexpected material type",
},
+ {
+ name: "wrong xml root (PIT mutations report)",
+ filePath: "./testdata/pitest.xml",
+ wantErr: "unexpected material type",
+ },
{
name: "valid artifact type",
filePath: "./testdata/cobertura.xml",
diff --git a/pkg/attestation/crafter/materials/jacoco_test.go b/pkg/attestation/crafter/materials/jacoco_test.go
index d0856fc34..7688b8108 100644
--- a/pkg/attestation/crafter/materials/jacoco_test.go
+++ b/pkg/attestation/crafter/materials/jacoco_test.go
@@ -52,6 +52,11 @@ func TestJacocoCraft(t *testing.T) {
filePath: "./testdata/junit.xml",
wantErr: "unexpected material type",
},
+ {
+ name: "invalid Jacoco file (PIT mutations report)",
+ filePath: "./testdata/pitest.xml",
+ wantErr: "unexpected material type",
+ },
{
name: "valid artifact type",
filePath: "./testdata/jacoco.xml",
diff --git a/pkg/attestation/crafter/materials/materials.go b/pkg/attestation/crafter/materials/materials.go
index e55931c7d..ad29a312d 100644
--- a/pkg/attestation/crafter/materials/materials.go
+++ b/pkg/attestation/crafter/materials/materials.go
@@ -388,6 +388,8 @@ func Craft(ctx context.Context, materialSchema *schemaapi.CraftingSchema_Materia
crafter = NewJacocoCrafter(materialSchema, casBackend, logger)
case schemaapi.CraftingSchema_Material_COBERTURA_XML:
crafter = NewCoberturaCrafter(materialSchema, casBackend, logger)
+ case schemaapi.CraftingSchema_Material_PITEST_XML:
+ crafter = NewPitestCrafter(materialSchema, casBackend, logger)
case schemaapi.CraftingSchema_Material_OPENVEX:
crafter, err = NewOpenVEXCrafter(materialSchema, casBackend, logger)
case schemaapi.CraftingSchema_Material_CSAF_VEX:
diff --git a/pkg/attestation/crafter/materials/pitest.go b/pkg/attestation/crafter/materials/pitest.go
new file mode 100644
index 000000000..5c54f88c3
--- /dev/null
+++ b/pkg/attestation/crafter/materials/pitest.go
@@ -0,0 +1,72 @@
+//
+// Copyright 2026 The Chainloop Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package materials
+
+import (
+ "context"
+ "encoding/xml"
+ "fmt"
+ "io"
+ "os"
+
+ schemaapi "github.com/chainloop-dev/chainloop/app/controlplane/api/workflowcontract/v1"
+ api "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/api/attestation/v1"
+ "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials/pitest"
+ "github.com/chainloop-dev/chainloop/pkg/casclient"
+ "github.com/rs/zerolog"
+)
+
+type PitestCrafter struct {
+ *crafterCommon
+ backend *casclient.CASBackend
+}
+
+func NewPitestCrafter(schema *schemaapi.CraftingSchema_Material, backend *casclient.CASBackend, l *zerolog.Logger) *PitestCrafter {
+ return &PitestCrafter{
+ crafterCommon: &crafterCommon{logger: l, input: schema},
+ backend: backend,
+ }
+}
+
+func (c *PitestCrafter) Craft(ctx context.Context, filePath string) (*api.Attestation_Material, error) {
+ f, err := os.Open(filePath)
+ if err != nil {
+ return nil, fmt.Errorf("can't open the file: %w", err)
+ }
+ defer f.Close()
+
+ data, err := io.ReadAll(f)
+ if err != nil {
+ return nil, fmt.Errorf("can't read the file: %w", err)
+ }
+
+ var report pitest.Report
+ // Report pins its XMLName to "mutations", so xml.Unmarshal rejects a
+ // mismatched root element (e.g. JaCoCo's , Cobertura's
+ // or JUnit's ).
+ if err := xml.Unmarshal(data, &report); err != nil {
+ return nil, fmt.Errorf("invalid PIT report file: %w", ErrInvalidMaterialType)
+ }
+
+ // An empty report means no mutants were analyzed, not a 0% or
+ // 100% result; downstream score calculations would otherwise divide by
+ // zero. Reject it instead of uploading contentless evidence.
+ if len(report.Mutations) == 0 {
+ return nil, fmt.Errorf("invalid PIT report file, no mutations found: %w", ErrInvalidMaterialType)
+ }
+
+ return uploadAndCraft(ctx, c.input, c.backend, filePath, c.logger)
+}
diff --git a/pkg/attestation/crafter/materials/pitest/pitest.go b/pkg/attestation/crafter/materials/pitest/pitest.go
new file mode 100644
index 000000000..926359fbc
--- /dev/null
+++ b/pkg/attestation/crafter/materials/pitest/pitest.go
@@ -0,0 +1,58 @@
+//
+// Copyright 2026 The Chainloop Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package pitest provides the XML structs to parse PIT mutation testing
+// reports (mutations.xml). See https://pitest.org/ and PIT's
+// XMLReportListener for the format definition.
+package pitest
+
+import "encoding/xml"
+
+// Report is the root element of a PIT report.
+type Report struct {
+ XMLName xml.Name `xml:"mutations" json:"-"`
+ // Partial mirrors PIT's partial root attribute: a partial report covers
+ // only the mutations PIT analyzed before the run was cut short.
+ Partial bool `xml:"partial,attr" json:"partial"`
+ Mutations []Mutation `xml:"mutation" json:"mutations"`
+}
+
+// Mutation is a single record. Status is preserved verbatim
+// (KILLED, SURVIVED, NO_COVERAGE, ...) rather than validated against a closed
+// enum or derived from Detected, so NO_COVERAGE stays distinguishable from
+// SURVIVED and the projection stays forward-compatible with new PIT statuses.
+type Mutation struct {
+ Detected bool `xml:"detected,attr" json:"detected"`
+ Status string `xml:"status,attr" json:"status"`
+ NumberOfTestsRun int `xml:"numberOfTestsRun,attr" json:"numberOfTestsRun"`
+ SourceFile string `xml:"sourceFile" json:"sourceFile"`
+ MutatedClass string `xml:"mutatedClass" json:"mutatedClass"`
+ MutatedMethod string `xml:"mutatedMethod" json:"mutatedMethod"`
+ MethodDescription string `xml:"methodDescription" json:"methodDescription"`
+ LineNumber int `xml:"lineNumber" json:"lineNumber"`
+ Mutator string `xml:"mutator" json:"mutator"`
+ Indexes []int `xml:"indexes>index" json:"indexes"`
+ Blocks []int `xml:"blocks>block" json:"blocks"`
+ // Standard reports emit KillingTest; reports generated with
+ // fullMutationMatrix emit KillingTests, SucceedingTests and CoveringTests
+ // instead, each a '|'-delimited list of test names kept unsplit. Only
+ // these four fields are omitempty so both report shapes keep their native
+ // representation without manufacturing absent fields.
+ KillingTest string `xml:"killingTest" json:"killingTest,omitempty"`
+ KillingTests string `xml:"killingTests" json:"killingTests,omitempty"`
+ SucceedingTests string `xml:"succeedingTests" json:"succeedingTests,omitempty"`
+ CoveringTests string `xml:"coveringTests" json:"coveringTests,omitempty"`
+ Description string `xml:"description" json:"description"`
+}
diff --git a/pkg/attestation/crafter/materials/pitest_test.go b/pkg/attestation/crafter/materials/pitest_test.go
new file mode 100644
index 000000000..f5cb77fab
--- /dev/null
+++ b/pkg/attestation/crafter/materials/pitest_test.go
@@ -0,0 +1,136 @@
+//
+// Copyright 2026 The Chainloop Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//nolint:dupl
+package materials_test
+
+import (
+ "context"
+ "path/filepath"
+ "testing"
+
+ contractAPI "github.com/chainloop-dev/chainloop/app/controlplane/api/workflowcontract/v1"
+ attestationApi "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/api/attestation/v1"
+ "github.com/chainloop-dev/chainloop/pkg/attestation/crafter/materials"
+ "github.com/chainloop-dev/chainloop/pkg/casclient"
+ mUploader "github.com/chainloop-dev/chainloop/pkg/casclient/mocks"
+ "github.com/rs/zerolog"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
+ "github.com/stretchr/testify/require"
+)
+
+func TestPitestCraft(t *testing.T) {
+ testCases := []struct {
+ name string
+ filePath string
+ wantErr string
+ wantDigest string
+ }{
+ {
+ name: "invalid path",
+ filePath: "./testdata/non-existing.xml",
+ wantErr: "no such file or directory",
+ },
+ {
+ name: "invalid artifact type",
+ filePath: "./testdata/simple.txt",
+ wantErr: "unexpected material type",
+ },
+ {
+ name: "wrong xml root (jacoco report)",
+ filePath: "./testdata/jacoco.xml",
+ wantErr: "unexpected material type",
+ },
+ {
+ name: "wrong xml root (cobertura coverage)",
+ filePath: "./testdata/cobertura.xml",
+ wantErr: "unexpected material type",
+ },
+ {
+ name: "wrong xml root (junit testsuite)",
+ filePath: "./testdata/junit.xml",
+ wantErr: "unexpected material type",
+ },
+ {
+ name: "valid artifact type",
+ filePath: "./testdata/pitest.xml",
+ wantDigest: "sha256:32bce80d562307c69f3e60eadc2aaa56be2f9d47d4aff354aa35e7c4d6bb909f",
+ },
+ {
+ name: "valid full mutation matrix report",
+ filePath: "./testdata/pitest-full-matrix.xml",
+ wantDigest: "sha256:ed5677f32b319ee35064e92b2fcc0d03db266cb1484e209f293fc007f8aed494",
+ },
+ }
+
+ assert := assert.New(t)
+ schema := &contractAPI.CraftingSchema_Material{
+ Name: "test",
+ Type: contractAPI.CraftingSchema_Material_PITEST_XML,
+ }
+ l := zerolog.Nop()
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ // Mock uploader
+ uploader := mUploader.NewUploader(t)
+ if tc.wantErr == "" {
+ uploader.On("Upload", context.TODO(), mock.Anything, mock.Anything, mock.Anything).
+ Return(&casclient.UpDownStatus{
+ Digest: "deadbeef",
+ Filename: "pitest.xml",
+ }, nil)
+ }
+ backend := &casclient.CASBackend{Uploader: uploader}
+ crafter := materials.NewPitestCrafter(schema, backend, &l)
+
+ got, err := crafter.Craft(context.TODO(), tc.filePath)
+ if tc.wantErr != "" {
+ assert.ErrorContains(err, tc.wantErr)
+ return
+ }
+
+ require.NoError(t, err)
+ assert.Equal(contractAPI.CraftingSchema_Material_PITEST_XML.String(), got.MaterialType.String())
+ assert.True(got.UploadedToCas)
+
+ // The result includes the digest reference
+ assert.Equal(&attestationApi.Attestation_Material_Artifact{
+ Id: "test", Digest: tc.wantDigest, Name: filepath.Base(tc.filePath),
+ }, got.GetArtifact())
+ })
+ }
+}
+
+// TestPitestCraftEmptyReport asserts that a report with a valid
+// root but no records is rejected: it means no mutants were
+// analyzed, not a 0% or 100% result, and downstream score calculations would
+// otherwise divide by zero. The file must not be uploaded to the CAS.
+func TestPitestCraftEmptyReport(t *testing.T) {
+ schema := &contractAPI.CraftingSchema_Material{
+ Name: "test",
+ Type: contractAPI.CraftingSchema_Material_PITEST_XML,
+ }
+ l := zerolog.Nop()
+ // No Upload expectation: the mock fails the test if an upload happens.
+ uploader := mUploader.NewUploader(t)
+ backend := &casclient.CASBackend{Uploader: uploader}
+ crafter := materials.NewPitestCrafter(schema, backend, &l)
+
+ _, err := crafter.Craft(context.TODO(), "./testdata/pitest-empty.xml")
+ require.Error(t, err)
+ assert.ErrorContains(t, err, "invalid PIT report file, no mutations found")
+ assert.ErrorIs(t, err, materials.ErrInvalidMaterialType)
+}
diff --git a/pkg/attestation/crafter/materials/testdata/pitest-empty.xml b/pkg/attestation/crafter/materials/testdata/pitest-empty.xml
new file mode 100644
index 000000000..a4a148359
--- /dev/null
+++ b/pkg/attestation/crafter/materials/testdata/pitest-empty.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/pkg/attestation/crafter/materials/testdata/pitest-full-matrix.xml b/pkg/attestation/crafter/materials/testdata/pitest-full-matrix.xml
new file mode 100644
index 000000000..417db62a4
--- /dev/null
+++ b/pkg/attestation/crafter/materials/testdata/pitest-full-matrix.xml
@@ -0,0 +1,4 @@
+
+
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindOwner(I)Lorg/springframework/samples/petclinic/owner/Owner;72org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator203org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormSuccess()|org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormError()org.springframework.samples.petclinic.owner.PetControllerTests.processUpdateForm()org.springframework.samples.petclinic.owner.PetControllerTests.processCreationFormSuccess()|org.springframework.samples.petclinic.owner.PetControllerTests.processUpdateForm()replaced return value with null for org/springframework/samples/petclinic/owner/PetController::findOwner
+
diff --git a/pkg/attestation/crafter/materials/testdata/pitest.xml b/pkg/attestation/crafter/materials/testdata/pitest.xml
new file mode 100644
index 000000000..19e6dc53b
--- /dev/null
+++ b/pkg/attestation/crafter/materials/testdata/pitest.xml
@@ -0,0 +1,167 @@
+
+
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindOwner(I)Lorg/springframework/samples/petclinic/owner/Owner;72org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator203org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]replaced return value with null for org/springframework/samples/petclinic/owner/PetController::findOwner
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindPet(ILjava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Pet;79org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator40org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindPet(ILjava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Pet;80org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator102org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]replaced return value with null for org/springframework/samples/petclinic/owner/PetController::findPet
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerfindPet(ILjava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Pet;86org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator337org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processUpdateFormWithSameName()]replaced return value with null for org/springframework/samples/petclinic/owner/PetController::findPet
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/ui/ModelMap;)Ljava/lang/String;103org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator111removed call to org/springframework/samples/petclinic/owner/Owner::addPet
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/ui/ModelMap;)Ljava/lang/String;104org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator152org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:initCreationForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::initCreationForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitOwnerBinder(Lorg/springframework/web/bind/WebDataBinder;)V91org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator140removed call to org/springframework/web/bind/WebDataBinder::setDisallowedFields
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitPetBinder(Lorg/springframework/web/bind/WebDataBinder;)V96org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator71org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithBlankName()]removed call to org/springframework/web/bind/WebDataBinder::setValidator
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitPetBinder(Lorg/springframework/web/bind/WebDataBinder;)V97org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator212removed call to org/springframework/web/bind/WebDataBinder::setDisallowedFields
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerinitUpdateForm()Ljava/lang/String;141org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator40org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:initUpdateForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::initUpdateForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerisDuplicatePetNameViolation(Lorg/springframework/dao/DataIntegrityViolationException;)Z204org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator91org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDataIntegrityViolation()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerisDuplicatePetNameViolation(Lorg/springframework/dao/DataIntegrityViolationException;)Z204org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator144org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDataIntegrityViolation()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerisDuplicatePetNameViolation(Lorg/springframework/dao/DataIntegrityViolationException;)Z204org.pitest.mutationtest.engine.gregor.mutators.returns.BooleanTrueReturnValsMutator227replaced boolean return with true for org/springframework/samples/petclinic/owner/PetController::isDuplicatePetNameViolation
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerlambda$findOwner$0(I)Ljava/lang/IllegalArgumentException;70org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator81replaced return value with null for org/springframework/samples/petclinic/owner/PetController::lambda$findOwner$0
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerlambda$findPet$1(I)Ljava/lang/IllegalArgumentException;84org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator81replaced return value with null for org/springframework/samples/petclinic/owner/PetController::lambda$findPet$1
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerpopulatePetTypes()Ljava/util/Collection;64org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator61replaced return value with Collections.emptyList for org/springframework/samples/petclinic/owner/PetController::populatePetTypes
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;111org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator62org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDuplicateName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;111org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator94org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDuplicateName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;111org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator157org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;116org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator3211org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithInvalidBirthDate()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;116org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator3714org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;120org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator4917org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;129org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator7923org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDataIntegrityViolation()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;112org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator228org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDuplicateName()]removed call to org/springframework/validation/BindingResult::rejectValue
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;117org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator4315org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithInvalidBirthDate()]removed call to org/springframework/validation/BindingResult::rejectValue
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;125org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator5919removed call to org/springframework/samples/petclinic/owner/Owner::addPet
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;132org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator9125org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDataIntegrityViolation()]removed call to org/springframework/validation/BindingResult::rejectValue
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;121org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator5318org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithBlankName()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::processCreationForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;133org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator9526org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDataIntegrityViolation()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::processCreationForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;136org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator10728org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processCreationFormSuccess()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::processCreationForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;151org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator102org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDuplicateName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;153org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator214org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDuplicateName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;153org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator278org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processUpdateFormWithSameName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;159org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator4412org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithInvalidBirthDate()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;159org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator4915org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processUpdateFormWithSameName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;163org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator6118org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processUpdateFormWithSameName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;171org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator8523org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDataIntegrityViolation()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;154org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator349org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDuplicateName()]removed call to org/springframework/validation/BindingResult::rejectValue
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;160org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator5516removed call to org/springframework/validation/BindingResult::rejectValue
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;168org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator7220org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDataIntegrityViolation()]removed call to org/springframework/samples/petclinic/owner/PetController::updatePetDetails
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;174org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator9725org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDataIntegrityViolation()]removed call to org/springframework/validation/BindingResult::rejectValue
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;164org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator6519org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithBlankName()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::processUpdateForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;175org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator10126org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessUpdateFormHasErrors]/[method:processUpdateFormWithDataIntegrityViolation()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::processUpdateForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerprocessUpdateForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;178org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator11328org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processUpdateFormWithSameName()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetController::processUpdateForm
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V188org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator91org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[method:processUpdateFormWithSameName()]negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V190org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator286negated conditional
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V188org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator184removed call to org/springframework/util/Assert::state
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V192org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator348removed call to org/springframework/samples/petclinic/owner/Pet::setName
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V193org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator4010removed call to org/springframework/samples/petclinic/owner/Pet::setBirthDate
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V194org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator4612removed call to org/springframework/samples/petclinic/owner/Pet::setType
+PetController.javaorg.springframework.samples.petclinic.owner.PetControllerupdatePetDetails(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/samples/petclinic/owner/Pet;)V197org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator5314removed call to org/springframework/samples/petclinic/owner/Owner::addPet
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControlleraddPaginationModel(ILorg/springframework/ui/Model;Lorg/springframework/data/domain/Page;)Ljava/lang/String;130org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator4210org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormSuccess()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::addPaginationModel
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerfindOwner(Ljava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Owner;66org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator40org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerfindOwner(Ljava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Owner;66org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator276org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]replaced return value with null for org/springframework/samples/petclinic/owner/OwnerController::findOwner
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerfindPaginatedForOwnersLastName(ILjava/lang/String;)Lorg/springframework/data/domain/Page;135org.pitest.mutationtest.engine.gregor.mutators.MathMutator90Replaced integer subtraction with addition
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerfindPaginatedForOwnersLastName(ILjava/lang/String;)Lorg/springframework/data/domain/Page;136org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator202org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]replaced return value with null for org/springframework/samples/petclinic/owner/OwnerController::findPaginatedForOwnersLastName
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerinitCreationForm()Ljava/lang/String;74org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator40org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initCreationForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::initCreationForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerinitFindForm()Ljava/lang/String;91org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator40org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initFindForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::initFindForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerinitUpdateOwnerForm()Ljava/lang/String;141org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator40org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initUpdateOwnerForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::initUpdateOwnerForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerlambda$findOwner$0(Ljava/lang/Integer;)Ljava/lang/IllegalArgumentException;68org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator81replaced return value with null for org/springframework/samples/petclinic/owner/OwnerController::lambda$findOwner$0
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerlambda$showOwner$1(I)Ljava/lang/IllegalArgumentException;173org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator81replaced return value with null for org/springframework/samples/petclinic/owner/OwnerController::lambda$showOwner$1
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;79org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator51org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processCreationFormSuccess()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;81org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator163org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processCreationFormHasErrors()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processCreationForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessCreationForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;86org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator377org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processCreationFormSuccess()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processCreationForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;99org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator91org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;108org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator337org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;114org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator5211org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;110org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator408org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormNoOwnersFound()]removed call to org/springframework/validation/BindingResult::rejectValue
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;111org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator449org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormNoOwnersFound()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processFindForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;117org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator6515org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processFindForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessFindForm(ILorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;Lorg/springframework/ui/Model;)Ljava/lang/String;121org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator7417org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormSuccess()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processFindForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;147org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator51org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processUpdateOwnerFormSuccess()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;152org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator257org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processUpdateOwnerFormSuccess()]negated conditional
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;153org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator328removed call to org/springframework/validation/BindingResult::rejectValue
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;158org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator5012removed call to org/springframework/samples/petclinic/owner/Owner::setId
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;149org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator163org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processUpdateOwnerFormHasErrors()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processUpdateOwnerForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;155org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator4310org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processUpdateOwnerFormWithIdMismatch()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processUpdateOwnerForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllerprocessUpdateOwnerForm(Lorg/springframework/samples/petclinic/owner/Owner;Lorg/springframework/validation/BindingResult;ILorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;161org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator6815org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processUpdateOwnerFormSuccess()]replaced return value with "" for org/springframework/samples/petclinic/owner/OwnerController::processUpdateOwnerForm
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllersetAllowedFields(Lorg/springframework/web/bind/WebDataBinder;)V61org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator140removed call to org/springframework/web/bind/WebDataBinder::setDisallowedFields
+OwnerController.javaorg.springframework.samples.petclinic.owner.OwnerControllershowOwner(I)Lorg/springframework/web/servlet/ModelAndView;176org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator335org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:showOwner()]replaced return value with null for org/springframework/samples/petclinic/owner/OwnerController::showOwner
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddPet(Lorg/springframework/samples/petclinic/owner/Pet;)V98org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator40org.springframework.samples.petclinic.owner.OwnerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerTests]/[method:addPetDoesNotAddDuplicatePet()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddPet(Lorg/springframework/samples/petclinic/owner/Pet;)V101org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator154org.springframework.samples.petclinic.owner.OwnerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerTests]/[method:addPetDoesNotAddDuplicatePet()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddPet(Lorg/springframework/samples/petclinic/owner/Pet;)V105org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator3913negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddPet(Lorg/springframework/samples/petclinic/owner/Pet;)V105org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator4215negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddPet(Lorg/springframework/samples/petclinic/owner/Pet;)V105org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator4819negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddVisit(Ljava/lang/Integer;Lorg/springframework/samples/petclinic/owner/Visit;)V175org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator50removed call to org/springframework/util/Assert::notNull
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddVisit(Ljava/lang/Integer;Lorg/springframework/samples/petclinic/owner/Visit;)V176org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator101removed call to org/springframework/util/Assert::notNull
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddVisit(Ljava/lang/Integer;Lorg/springframework/samples/petclinic/owner/Visit;)V180org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator213removed call to org/springframework/util/Assert::notNull
+Owner.javaorg.springframework.samples.petclinic.owner.OwneraddVisit(Ljava/lang/Integer;Lorg/springframework/samples/petclinic/owner/Visit;)V182org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator264org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldAddNewVisitForPet()]removed call to org/springframework/samples/petclinic/owner/Pet::addVisit
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetAddress()Ljava/lang/String;70org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initUpdateOwnerForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/Owner::getAddress
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetCity()Ljava/lang/String;78org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initUpdateOwnerForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/Owner::getCity
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Pet;128org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator207org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldUpdatePetName()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Pet;130org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator3110org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldAddNewVisitForPet()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/Integer;)Lorg/springframework/samples/petclinic/owner/Pet;131org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator3511org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldUpdatePetName()]replaced return value with null for org/springframework/samples/petclinic/owner/Owner::getPet
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/String;)Lorg/springframework/samples/petclinic/owner/Pet;118org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator71org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]replaced return value with null for org/springframework/samples/petclinic/owner/Owner::getPet
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/String;Z)Lorg/springframework/samples/petclinic/owner/Pet;147org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator247org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/String;Z)Lorg/springframework/samples/petclinic/owner/Pet;147org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator289org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/String;Z)Lorg/springframework/samples/petclinic/owner/Pet;148org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator3210negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/String;Z)Lorg/springframework/samples/petclinic/owner/Pet;148org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator3512org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:processCreationFormWithDuplicateName()]negated conditional
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPet(Ljava/lang/String;Z)Lorg/springframework/samples/petclinic/owner/Pet;149org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator4013org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:processFindFormByLastName()]replaced return value with null for org/springframework/samples/petclinic/owner/Owner::getPet
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetPets()Ljava/util/List;94org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.owner.OwnerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerTests]/[method:addPetDoesNotAddDuplicatePet()]replaced return value with Collections.emptyList for org/springframework/samples/petclinic/owner/Owner::getPets
+Owner.javaorg.springframework.samples.petclinic.owner.OwnergetTelephone()Ljava/lang/String;86org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initUpdateOwnerForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/Owner::getTelephone
+Owner.javaorg.springframework.samples.petclinic.owner.OwnertoString()Ljava/lang/String;158org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator5213replaced return value with "" for org/springframework/samples/petclinic/owner/Owner::toString
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerinitNewVisitForm()Ljava/lang/String;92org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator40org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:initNewVisitForm()]replaced return value with "" for org/springframework/samples/petclinic/owner/VisitController::initNewVisitForm
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerlambda$loadPetWithVisit$0(I)Ljava/lang/IllegalArgumentException;67org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator81replaced return value with null for org/springframework/samples/petclinic/owner/VisitController::lambda$loadPetWithVisit$0
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerloadPetWithVisit(IILjava/util/Map;)Lorg/springframework/samples/petclinic/owner/Visit;71org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator275org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormSuccess()]negated conditional
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerloadPetWithVisit(IILjava/util/Map;)Lorg/springframework/samples/petclinic/owner/Visit;79org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator6211removed call to org/springframework/samples/petclinic/owner/Pet::addVisit
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerloadPetWithVisit(IILjava/util/Map;)Lorg/springframework/samples/petclinic/owner/Visit;80org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator6612org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormSuccess()]replaced return value with null for org/springframework/samples/petclinic/owner/VisitController::loadPetWithVisit
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerminVisitDate()Ljava/time/LocalDate;85org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator62replaced return value with null for org/springframework/samples/petclinic/owner/VisitController::minVisitDate
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;100org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator51org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormHasErrorsWhenVisitDateIsNotInFuture()]negated conditional
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;100org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator105org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormSuccess()]negated conditional
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;104org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator228org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormSuccess()]negated conditional
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;101org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator166org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormHasErrorsWhenVisitDateIsNotInFuture()]removed call to org/springframework/validation/BindingResult::rejectValue
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;108org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator3411removed call to org/springframework/samples/petclinic/owner/Owner::addVisit
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;105org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator269org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormHasErrorsWhenVisitDateIsNotInFuture()]replaced return value with "" for org/springframework/samples/petclinic/owner/VisitController::processNewVisitForm
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllerprocessNewVisitForm(Lorg/springframework/samples/petclinic/owner/Owner;ILorg/springframework/samples/petclinic/owner/Visit;Lorg/springframework/validation/BindingResult;Lorg/springframework/web/servlet/mvc/support/RedirectAttributes;)Ljava/lang/String;111org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator5214org.springframework.samples.petclinic.owner.VisitControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.VisitControllerTests]/[method:processNewVisitFormSuccess()]replaced return value with "" for org/springframework/samples/petclinic/owner/VisitController::processNewVisitForm
+VisitController.javaorg.springframework.samples.petclinic.owner.VisitControllersetAllowedFields(Lorg/springframework/web/bind/WebDataBinder;)V53org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator140removed call to org/springframework/web/bind/WebDataBinder::setDisallowedFields
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorsupports(Ljava/lang/Class;)Z66org.pitest.mutationtest.engine.gregor.mutators.returns.BooleanFalseReturnValsMutator61org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:supportsPetClass()]replaced boolean return with false for org/springframework/samples/petclinic/owner/PetValidator::supports
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorsupports(Ljava/lang/Class;)Z66org.pitest.mutationtest.engine.gregor.mutators.returns.BooleanTrueReturnValsMutator61org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:doesNotSupportNonPetClass()]replaced boolean return with true for org/springframework/samples/petclinic/owner/PetValidator::supports
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V46org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator306changed conditional boundary
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V43org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator152org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:validate()]negated conditional
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V46org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator306org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:validate()]negated conditional
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V51org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator439org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[nested-class:ValidateHasErrors]/[method:validateWithInvalidPetType()]negated conditional
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V51org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator4611org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:validate()]negated conditional
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V56org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator5914org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:validate()]negated conditional
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V44org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator223org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[nested-class:ValidateHasErrors]/[method:validateWithInvalidPetName()]removed call to org/springframework/validation/Errors::rejectValue
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V47org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator377org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[nested-class:ValidateHasErrors]/[method:validateWithLongPetName()]removed call to org/springframework/validation/Errors::rejectValue
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V52org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator5312org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[nested-class:ValidateHasErrors]/[method:validateWithInvalidPetType()]removed call to org/springframework/validation/Errors::rejectValue
+PetValidator.javaorg.springframework.samples.petclinic.owner.PetValidatorvalidate(Ljava/lang/Object;Lorg/springframework/validation/Errors;)V57org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator6615org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[nested-class:ValidateHasErrors]/[method:validateWithInvalidBirthDate()]removed call to org/springframework/validation/Errors::rejectValue
+VetController.javaorg.springframework.samples.petclinic.vet.VetControlleraddPaginationModel(ILorg/springframework/data/domain/Page;Lorg/springframework/ui/Model;)Ljava/lang/String;56org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator4210org.springframework.samples.petclinic.vet.VetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.vet.VetControllerTests]/[method:showVetListHtml()]replaced return value with "" for org/springframework/samples/petclinic/vet/VetController::addPaginationModel
+VetController.javaorg.springframework.samples.petclinic.vet.VetControllerfindPaginated(I)Lorg/springframework/data/domain/Page;61org.pitest.mutationtest.engine.gregor.mutators.MathMutator90Replaced integer subtraction with addition
+VetController.javaorg.springframework.samples.petclinic.vet.VetControllerfindPaginated(I)Lorg/springframework/data/domain/Page;62org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator192org.springframework.samples.petclinic.vet.VetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.vet.VetControllerTests]/[method:showVetListHtml()]replaced return value with null for org/springframework/samples/petclinic/vet/VetController::findPaginated
+VetController.javaorg.springframework.samples.petclinic.vet.VetControllershowResourcesVetList()Lorg/springframework/samples/petclinic/vet/Vets;71org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator194org.springframework.samples.petclinic.vet.VetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.vet.VetControllerTests]/[method:showResourcesVetList()]replaced return value with null for org/springframework/samples/petclinic/vet/VetController::showResourcesVetList
+VetController.javaorg.springframework.samples.petclinic.vet.VetControllershowVetList(ILorg/springframework/ui/Model;)Ljava/lang/String;47org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator142org.springframework.samples.petclinic.vet.VetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.vet.VetControllerTests]/[method:showVetListHtml()]replaced return value with "" for org/springframework/samples/petclinic/vet/VetController::showVetList
+WebConfiguration.javaorg.springframework.samples.petclinic.system.WebConfigurationlocaleChangeInterceptor()Lorg/springframework/web/servlet/i18n/LocaleChangeInterceptor;47org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator111removed call to org/springframework/web/servlet/i18n/LocaleChangeInterceptor::setParamName
+WebConfiguration.javaorg.springframework.samples.petclinic.system.WebConfigurationlocaleChangeInterceptor()Lorg/springframework/web/servlet/i18n/LocaleChangeInterceptor;48org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator152replaced return value with null for org/springframework/samples/petclinic/system/WebConfiguration::localeChangeInterceptor
+WebConfiguration.javaorg.springframework.samples.petclinic.system.WebConfigurationlocaleResolver()Lorg/springframework/web/servlet/LocaleResolver;35org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator111removed call to org/springframework/web/servlet/i18n/SessionLocaleResolver::setDefaultLocale
+WebConfiguration.javaorg.springframework.samples.petclinic.system.WebConfigurationlocaleResolver()Lorg/springframework/web/servlet/LocaleResolver;36org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator152replaced return value with null for org/springframework/samples/petclinic/system/WebConfiguration::localeResolver
+Vet.javaorg.springframework.samples.petclinic.vet.VetgetNrOfSpecialties()I67org.pitest.mutationtest.engine.gregor.mutators.returns.PrimitiveReturnsMutator62org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindVets()]replaced int return with 0 for org/springframework/samples/petclinic/vet/Vet::getNrOfSpecialties
+Vet.javaorg.springframework.samples.petclinic.vet.VetgetSpecialties()Ljava/util/List;61org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator186org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindVets()]replaced return value with Collections.emptyList for org/springframework/samples/petclinic/vet/Vet::getSpecialties
+Vet.javaorg.springframework.samples.petclinic.vet.VetgetSpecialtiesInternal()Ljava/util/Set;53org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator50org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindVets()]negated conditional
+Vet.javaorg.springframework.samples.petclinic.vet.VetgetSpecialtiesInternal()Ljava/util/Set;56org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator183org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindVets()]replaced return value with Collections.emptySet for org/springframework/samples/petclinic/vet/Vet::getSpecialtiesInternal
+PetTypeFormatter.javaorg.springframework.samples.petclinic.owner.PetTypeFormatterparse(Ljava/lang/String;Ljava/util/Locale;)Lorg/springframework/samples/petclinic/owner/PetType;55org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator278org.springframework.samples.petclinic.owner.PetTypeFormatterTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetTypeFormatterTests]/[method:shouldParse()]negated conditional
+PetTypeFormatter.javaorg.springframework.samples.petclinic.owner.PetTypeFormatterparse(Ljava/lang/String;Ljava/util/Locale;)Lorg/springframework/samples/petclinic/owner/PetType;56org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator319org.springframework.samples.petclinic.owner.PetTypeFormatterTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetTypeFormatterTests]/[method:shouldParse()]replaced return value with null for org/springframework/samples/petclinic/owner/PetTypeFormatter::parse
+PetTypeFormatter.javaorg.springframework.samples.petclinic.owner.PetTypeFormatterprint(Lorg/springframework/samples/petclinic/owner/PetType;Ljava/util/Locale;)Ljava/lang/String;48org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator91org.springframework.samples.petclinic.owner.PetTypeFormatterTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetTypeFormatterTests]/[method:testPrint()]negated conditional
+PetTypeFormatter.javaorg.springframework.samples.petclinic.owner.PetTypeFormatterprint(Lorg/springframework/samples/petclinic/owner/PetType;Ljava/util/Locale;)Ljava/lang/String;48org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator174org.springframework.samples.petclinic.owner.PetTypeFormatterTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetTypeFormatterTests]/[method:testPrint()]replaced return value with "" for org/springframework/samples/petclinic/owner/PetTypeFormatter::print
+BaseEntity.javaorg.springframework.samples.petclinic.model.BaseEntitygetId()Ljava/lang/Integer;40org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindAllPetTypes()]replaced Integer return value with 0 for org/springframework/samples/petclinic/model/BaseEntity::getId
+BaseEntity.javaorg.springframework.samples.petclinic.model.BaseEntityisNew()Z48org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator50org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[nested-class:ValidateHasErrors]/[method:validateWithInvalidPetType()]negated conditional
+BaseEntity.javaorg.springframework.samples.petclinic.model.BaseEntityisNew()Z48org.pitest.mutationtest.engine.gregor.mutators.returns.BooleanTrueReturnValsMutator133org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldUpdatePetName()]replaced boolean return with true for org/springframework/samples/petclinic/model/BaseEntity::isNew
+NamedEntity.javaorg.springframework.samples.petclinic.model.NamedEntitygetName()Ljava/lang/String;38org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.owner.PetTypeFormatterTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetTypeFormatterTests]/[method:testPrint()]replaced return value with "" for org/springframework/samples/petclinic/model/NamedEntity::getName
+NamedEntity.javaorg.springframework.samples.petclinic.model.NamedEntitytoString()Ljava/lang/String;48org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator91org.springframework.samples.petclinic.owner.PetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetControllerTests]/[nested-class:ProcessCreationFormHasErrors]/[method:initUpdateForm()]negated conditional
+NamedEntity.javaorg.springframework.samples.petclinic.model.NamedEntitytoString()Ljava/lang/String;48org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator174replaced return value with "" for org/springframework/samples/petclinic/model/NamedEntity::toString
+Pet.javaorg.springframework.samples.petclinic.owner.PetgetBirthDate()Ljava/time/LocalDate;66org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator50org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:validate()]replaced return value with null for org/springframework/samples/petclinic/owner/Pet::getBirthDate
+Pet.javaorg.springframework.samples.petclinic.owner.PetgetType()Lorg/springframework/samples/petclinic/owner/PetType;70org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator50org.springframework.samples.petclinic.owner.PetValidatorTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.PetValidatorTests]/[method:validate()]replaced return value with null for org/springframework/samples/petclinic/owner/Pet::getType
+Pet.javaorg.springframework.samples.petclinic.owner.PetgetVisits()Ljava/util/Collection;78org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindVisitsByPetId()]replaced return value with Collections.emptyList for org/springframework/samples/petclinic/owner/Pet::getVisits
+Person.javaorg.springframework.samples.petclinic.model.PersongetFirstName()Ljava/lang/String;42org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.owner.OwnerControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.owner.OwnerControllerTests]/[method:initUpdateOwnerForm()]replaced return value with "" for org/springframework/samples/petclinic/model/Person::getFirstName
+Person.javaorg.springframework.samples.petclinic.model.PersongetLastName()Ljava/lang/String;50org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindSingleOwnerWithPet()]replaced return value with "" for org/springframework/samples/petclinic/model/Person::getLastName
+CacheConfiguration.javaorg.springframework.samples.petclinic.system.CacheConfigurationcacheConfiguration()Ljavax/cache/configuration/Configuration;50org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator82replaced return value with null for org/springframework/samples/petclinic/system/CacheConfiguration::cacheConfiguration
+CacheConfiguration.javaorg.springframework.samples.petclinic.system.CacheConfigurationpetclinicCacheConfigurationCustomizer()Lorg/springframework/boot/cache/autoconfigure/JCacheManagerCustomizer;37org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator50replaced return value with null for org/springframework/samples/petclinic/system/CacheConfiguration::petclinicCacheConfigurationCustomizer
+Visit.javaorg.springframework.samples.petclinic.owner.VisitgetDate()Ljava/time/LocalDate;53org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator50org.springframework.samples.petclinic.service.ClinicServiceTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.service.ClinicServiceTests]/[method:shouldFindVisitsByPetId()]replaced return value with null for org/springframework/samples/petclinic/owner/Visit::getDate
+Visit.javaorg.springframework.samples.petclinic.owner.VisitgetDescription()Ljava/lang/String;61org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator50replaced return value with "" for org/springframework/samples/petclinic/owner/Visit::getDescription
+Vets.javaorg.springframework.samples.petclinic.vet.VetsgetVetList()Ljava/util/List;37org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator50org.springframework.samples.petclinic.vet.VetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.vet.VetControllerTests]/[method:showResourcesVetList()]negated conditional
+Vets.javaorg.springframework.samples.petclinic.vet.VetsgetVetList()Ljava/util/List;40org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator183org.springframework.samples.petclinic.vet.VetControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.vet.VetControllerTests]/[method:showResourcesVetList()]replaced return value with Collections.emptyList for org/springframework/samples/petclinic/vet/Vets::getVetList
+WelcomeController.javaorg.springframework.samples.petclinic.system.WelcomeControllerwelcome()Ljava/lang/String;27org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator40org.springframework.samples.petclinic.system.WelcomeControllerTests.[engine:junit-jupiter]/[class:org.springframework.samples.petclinic.system.WelcomeControllerTests]/[method:welcome()]replaced return value with "" for org/springframework/samples/petclinic/system/WelcomeController::welcome
+