| save(Path, ExperimentDocument) |   | 77% |   | 50% | 2 | 3 | 3 | 14 | 0 | 1 |
| normalizeWorkflow(ExperimentDocument, boolean) |   | 79% |   | 62% | 3 | 5 | 4 | 24 | 0 | 1 |
| parseDocument(ObjectNode) |   | 83% |   | 50% | 3 | 4 | 3 | 18 | 0 | 1 |
| decode(byte[]) |   | 77% |   | 50% | 4 | 5 | 3 | 16 | 0 | 1 |
| rejectUnknown(ObjectNode, Set, String) |   | 48% |   | 50% | 1 | 2 | 3 | 8 | 0 | 1 |
| textArray(ArrayNode, String) |   | 72% |   | 66% | 2 | 4 | 2 | 11 | 0 | 1 |
| optionalText(ObjectNode, String, String) |   | 69% |   | 62% | 3 | 5 | 2 | 9 | 0 | 1 |
| requiredText(ObjectNode, String, String) |   | 62% |   | 50% | 2 | 3 | 2 | 7 | 0 | 1 |
| parseDuration(String, String) |  | 0% | | n/a | 1 | 1 | 3 | 3 | 1 | 1 |
| experimentNode(ExperimentDocument.ExperimentInfo) |   | 89% |   | 50% | 1 | 2 | 1 | 12 | 0 | 1 |
| writeTree(JsonNode) |   | 41% | | n/a | 0 | 1 | 2 | 3 | 0 | 1 |
| parseInstant(String, String) |   | 30% | | n/a | 0 | 1 | 2 | 3 | 0 | 1 |
| failure(String, String, String) |  | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| requiredNode(ObjectNode, String, String) |   | 57% |   | 50% | 1 | 2 | 1 | 4 | 0 | 1 |
| requiredNonNegativeLong(ObjectNode, String, String) |   | 76% |   | 50% | 2 | 3 | 1 | 4 | 0 | 1 |
| requiredPositiveInt(ObjectNode, String, String) |   | 75% |   | 50% | 2 | 3 | 1 | 4 | 0 | 1 |
| requiredArray(ObjectNode, String, String) |   | 72% |   | 50% | 1 | 2 | 1 | 4 | 0 | 1 |
| load(Path) |   | 70% |   | 50% | 1 | 2 | 1 | 4 | 0 | 1 |
| parseProfiles(ObjectNode) |   | 68% |   | 50% | 1 | 2 | 1 | 4 | 0 | 1 |
| requireObject(JsonNode, String) |   | 61% |   | 50% | 1 | 2 | 1 | 3 | 0 | 1 |
| requireCollectionLimit(int, String) |   | 44% |   | 50% | 1 | 2 | 1 | 3 | 0 | 1 |
| lambda$rejectUnknown$5(Set, HashSet, String) |   | 55% |   | 50% | 1 | 2 | 1 | 3 | 0 | 1 |
| parseExperiment(ObjectNode) |   | 94% |   | 50% | 1 | 2 | 0 | 11 | 0 | 1 |
| parsePluginData(ObjectNode) |  | 100% |  | 100% | 0 | 3 | 0 | 27 | 0 | 1 |
| static {...} |  | 100% | | n/a | 0 | 1 | 0 | 14 | 0 | 1 |
| toTree(ExperimentDocument, boolean) |  | 100% | | n/a | 0 | 1 | 0 | 13 | 0 | 1 |
| parseAssets(ArrayNode) |  | 100% |  | 100% | 0 | 2 | 0 | 13 | 0 | 1 |
| parseRequirements(ArrayNode) |  | 100% |  | 100% | 0 | 2 | 0 | 12 | 0 | 1 |
| provenanceNode(ExperimentDocument.Provenance, boolean) |  | 100% |  | 100% | 0 | 2 | 0 | 10 | 0 | 1 |
| parseOutputs(ArrayNode) |  | 100% |  | 100% | 0 | 2 | 0 | 11 | 0 | 1 |
| withCanonicalHash(ExperimentDocument, String) |  | 100% | | n/a | 0 | 1 | 0 | 19 | 0 | 1 |
| parseProvenance(ObjectNode) |  | 100% | | n/a | 0 | 1 | 0 | 12 | 0 | 1 |
| lambda$assetsNode$3(ArrayNode, ExperimentDocument.AssetReference) |  | 100% | | n/a | 0 | 1 | 0 | 8 | 0 | 1 |
| workflowNode(ExperimentDocument.WorkflowPayload) |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| lambda$pluginDataNode$1(ObjectNode, String, ExperimentDocument.PluginSection) |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| lambda$requirementsNode$0(ArrayNode, ExperimentDocument.PluginRequirement) |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| lambda$outputsNode$4(ArrayNode, ExperimentDocument.OutputRequest) |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| ExperimentDocumentCodec() |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| parseWorkflow(ObjectNode) |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| encode(ExperimentDocument) |  | 100% | | n/a | 0 | 1 | 0 | 4 | 0 | 1 |
| lambda$pluginDataNode$2(ObjectNode, String, Map) |  | 100% | | n/a | 0 | 1 | 0 | 5 | 0 | 1 |
| requirementsNode(List) |  | 100% | | n/a | 0 | 1 | 0 | 5 | 0 | 1 |
| canonicalHash(ExperimentDocument) |  | 100% | | n/a | 0 | 1 | 0 | 2 | 0 | 1 |
| assetsNode(List) |  | 100% | | n/a | 0 | 1 | 0 | 5 | 0 | 1 |
| outputsNode(List) |  | 100% | | n/a | 0 | 1 | 0 | 5 | 0 | 1 |
| pluginDataNode(Map) |  | 100% | | n/a | 0 | 1 | 0 | 4 | 0 | 1 |
| stringArray(List) |  | 100% | | n/a | 0 | 1 | 0 | 3 | 0 | 1 |
| failure(String, String, String, Throwable) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| requiredObject(ObjectNode, String, String) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |