From f7c9d33ad4c0be416e21eab59343a08010bc0a0e Mon Sep 17 00:00:00 2001 From: omaus Date: Tue, 19 Nov 2024 15:26:33 +0100 Subject: [PATCH 1/9] Make validation check for non-emptiness Addresses #5. PRIDE package bumped to v1.0.4. --- validation_packages/pride/pride@1.0.4.fsx | 384 ++++++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 validation_packages/pride/pride@1.0.4.fsx diff --git a/validation_packages/pride/pride@1.0.4.fsx b/validation_packages/pride/pride@1.0.4.fsx new file mode 100644 index 0000000..7e44127 --- /dev/null +++ b/validation_packages/pride/pride@1.0.4.fsx @@ -0,0 +1,384 @@ +let []PACKAGE_METADATA = """(* +--- +Name: pride +Summary: Validates if the ARC contains the necessary metadata to be publishable via PRIDE. +Description: | + Validates if the ARC contains the necessary metadata to be publishable via PRIDE. + The following metadata is required: + - Investigation has title and description + - Investigation has Keywords comment in correct format + - All persons in Investigation Contacts must have a first name, last name, affiliation and valid email + - Study has protocol, tissue & species in correct format + - Assay has protocol, technology type, instrument model, and fixed and/or variable modification in correct format +MajorVersion: 1 +MinorVersion: 0 +PatchVersion: 4 +Publish: true +Authors: + - FullName: Oliver Maus + Affiliation: DataPLANT + - FullName: Christopher Lux + Email: lux@csbiology.de + Affiliation: RPTU Kaiserslautern + AffiliationLink: http://rptu.de/startseite +Tags: + - Name: validation + - Name: pride + - Name: proteomics +ReleaseNotes: | + - Bug fix: Fixed/variable modification values must not be empty +--- +*)""" + + +#r "nuget: ARCExpect, 4.0.1" + + +open ControlledVocabulary +open Expecto +open ARCExpect +open ARCTokenization +open ARCTokenization.StructuralOntology +open System.IO + + +// Input: +//let arcDir = Directory.GetCurrentDirectory() +let arcDir = @"C:\Repos\nfdi4plants\arc-validation-packages\tests\fixtures\testARC_proteomicsCorrect" + + +// Values: +let absoluteDirectoryPaths = FileSystem.parseARCFileSystem arcDir + +let investigationMetadata = + absoluteDirectoryPaths + |> Investigation.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +let studyMetadata = + absoluteDirectoryPaths + |> Study.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +let assayMetadata = + absoluteDirectoryPaths + |> Assay.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +let studyProcessGraphTokens = + try + absoluteDirectoryPaths + |> Study.parseProcessGraphColumnsFromTokens arcDir + |> Seq.collect Map.values + |> List.concat + with + | _ -> List.empty + +let assayProcessGraphTokens = + try + absoluteDirectoryPaths + |> Assay.parseProcessGraphColumnsFromTokens arcDir + |> Seq.collect Map.values + |> List.concat + with + | _ -> List.empty + +let organismTokens = + studyProcessGraphTokens + |> List.tryFind (fun cvpList -> cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("OBI:0100026","organism","OBI"))) + |> Option.defaultValue [] + +let tissueTokens = + studyProcessGraphTokens + |> List.tryFind (fun cvpList -> cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("NCIT:C12801","Tissue","NCIT"))) + |> Option.defaultValue [] + +let instrumentTokens = + assayProcessGraphTokens + |> List.tryFind (fun cvpList -> cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("MS:1000031","instrument model","MS"))) + |> Option.defaultValue [] + +let modTokens = + assayProcessGraphTokens + |> List.filter ( + fun cvpList -> + cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("MS:1003021","Fixed modification","MS")) || + cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("MS:1003022","Variable modification","MS")) + ) + |> List.concat + +let techTypeName = CvTerm.create("ASSMSO:00000011", "Assay Technology Type", "ASSMSO") +let techTypeTAN = CvTerm.create("ASSMSO:00000013", "Assay Technology Type Term Accession Number", "ASSMSO") +let techTypeTSR = CvTerm.create("ASSMSO:00000015", "Assay Technology Type Term Source REF", "ASSMSO") + + +// Helper functions (to deposit in ARCExpect later): + +open System.Text + + +let characterLimit (lowerLimit : int option) (upperLimit : int option) = + match lowerLimit, upperLimit with + | None, None -> RegularExpressions.Regex(@"^.{0,}$") + | Some ll, None -> RegularExpressions.Regex($"^.{{{ll},}}$") + | None, Some ul -> RegularExpressions.Regex($"^.{{0,{ul}}}$") + | Some ll, Some ul -> RegularExpressions.Regex($"^.{{{ll},{ul}}}$") + + +type ErrorMessage with + + static member ofIParamCollection error iParamCollection = + + let iParam = Seq.head iParamCollection + + let str = new StringBuilder() + str.AppendFormat("['{0}', ..] {1}\n", Param.getCvName iParam, error) |> ignore + + match Param.tryGetValueOfCvParamAttr "FilePath" iParam with + | Some path -> + str.AppendFormat(" > filePath '{0}'\n", path) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Worksheet" iParam with + | Some sheet -> + str.AppendFormat(" > sheet '{0}'", sheet) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Row" iParam with + | Some row -> + str.AppendFormat(" > row '{0}'", row) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Column" iParam with + | Some column -> + str.AppendFormat(" > column '{0}'", column) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Line" iParam with + | Some line -> + str.AppendFormat(" > line '{0}'", line) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Position" iParam with + | Some position -> + str.AppendFormat(" > position '{0}'", position) |> ignore + | None -> () + str.ToString() + + +type Validate.ParamCollection with + + static member AllTermsSatisfyPredicate (projection : #IParam -> bool) (paramCollection : #seq<#IParam>) = + match Seq.forall projection paramCollection with + | true -> () + | false -> + ErrorMessage.ofIParamCollection $"does not satisfy the requirements" paramCollection + |> Expecto.Tests.failtestNoStackf "%s" + + +// Validation Cases: +let investigationCases = + testList INVMSO.``Investigation Metadata``.INVESTIGATION.key.Name [ + // Investigation has title + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title`` + } + + // Investigation has description + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description`` + } + + // Investigation has contacts with name, last name, affiliation and email + // Investigation Person First Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + + // Investigation Person Last Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + + // Investigation Person Affiliation + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + + // Investigation Person Email + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email`` + } + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``. ``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name) { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter (Validate.Param.ValueMatchesRegex StringValidationPattern.email) + } + + // Investigation hast Keywords comment + //ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.INVESTIGATION.key}.Keywords exists") { + // investigationMetadata + // //|> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name`` + // |> Validate.ParamCollection.ContainsParamWithTerm (CvTerm.create "Keywords") + //} + ] + +let studyCases = + testList STDMSO.``Study Metadata``.STUDY.key.Name [ + // Study has protocol in correct format + ARCExpect.validationCase (TestID.Name STDMSO.``Study Metadata``.``STUDY PROTOCOLS``.key.Name) { + studyMetadata + |> Validate.ParamCollection.ContainsParamWithTerm STDMSO.``Study Metadata``.``STUDY PROTOCOLS``.key + } + + // Study protocol is in correct format + ARCExpect.validationCase (TestID.Name "STUDY PROTOCOLS description") { + studyMetadata|> Seq.filter (fun iparam -> Param.getTerm iparam = STDMSO.``Study Metadata``.``STUDY PROTOCOLS``.``Study Protocol Description``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter (Validate.Param.ValueMatchesRegex (characterLimit (Some 50) (Some 500))) + } + + // Study has tissue header in process graph + ARCExpect.validationCase (TestID.Name "Tissue") { + tissueTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists (fun iparam -> iparam.Value = ParamValue.CvValue (CvTerm.create("NCIT:C12801","Tissue","NCIT"))) + ) + } + + // Study has tissue values as terms (CvValues) + ARCExpect.validationCase (TestID.Name "Tissue terms") { + tissueTokens + |> Validate.ParamCollection.AllTermsSatisfyPredicate (fun ip -> match ip.Value with CvValue _ -> true | _ -> false) + } + + // Study has species in correct format + ARCExpect.validationCase (TestID.Name "Organism") { + organismTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists (fun iparam -> iparam.Value = ParamValue.CvValue (CvTerm.create("OBI:0100026","organism","OBI"))) + ) + } + + // Study has species values as terms (CvValues) + ARCExpect.validationCase (TestID.Name "Organism terms") { + tissueTokens + |> Validate.ParamCollection.AllTermsSatisfyPredicate (fun ip -> match ip.Value with CvValue _ -> true | _ -> false) + } + ] + +let assayCases = + testList ASSMSO.``Assay Metadata``.ASSAY.key.Name [ + // Assay has protocol + //ARCExpect.validationCase (TestID.Name techTypeTAN.Name) { + // assayMetadata + // |> Validate.ParamCollection.ContainsParamWithTerm techTypeTAN + //} + + // Assay has protocol in correct format + //ARCExpect.validationCase (TestID.Name "ASSAY PROTOCOLS description") { + // assayMetadata + // |> Seq.filter (fun iparam -> Param.getTerm iparam = techTypeTAN) + // |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + // |> Seq.iter (Validate.Param.ValueMatchesRegex (characterLimit (Some 50) (Some 500))) + //} + + // Assay has technology type in correct format + ARCExpect.validationCase (TestID.Name techTypeTAN.Name) { + assayMetadata + |> Validate.ParamCollection.ContainsParamWithTerm techTypeTAN + } + ARCExpect.validationCase (TestID.Name techTypeName.Name) { + assayMetadata + |> Validate.ParamCollection.ContainsParamWithTerm techTypeName + } + ARCExpect.validationCase (TestID.Name techTypeTSR.Name) { + assayMetadata + |> Validate.ParamCollection.ContainsParamWithTerm techTypeTSR + } + + // Assay has instrument model + ARCExpect.validationCase (TestID.Name "instrument model") { + instrumentTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists (fun iparam -> iparam.Value = ParamValue.CvValue (CvTerm.create("MS:1000031","instrument model","MS"))) + ) + } + + // Assay has instrument model in correct format + ARCExpect.validationCase (TestID.Name "instrument model terms") { + instrumentTokens + |> Validate.ParamCollection.AllTermsSatisfyPredicate (fun ip -> match ip.Value with CvValue _ -> true | _ -> false) + } + + // Assay has fixed or variable modification + ARCExpect.validationCase (TestID.Name "modification") { + modTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists ( + fun iparam -> + iparam.Value = ParamValue.CvValue (CvTerm.create("MS:1003021","Fixed modification","MS")) || + iparam.Value = ParamValue.CvValue (CvTerm.create("MS:1003022","Variable modification","MS")) + ) + ) + } + + // Assay has fixed or variable modification and values are not empty + ARCExpect.validationCase (TestID.Name "modification values") { + modTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.forall ( + fun iparam -> + iparam.Value + |> ParamValue.getValueAsString + <> System.String.Empty + ) + ) + } + ] + + +// Execution: + +Setup.ValidationPackage( + metadata = Setup.Metadata(PACKAGE_METADATA), + CriticalValidationCases = [investigationCases; studyCases; assayCases] +) +|> Execute.ValidationPipeline( + basePath = arcDir +) \ No newline at end of file From c569de280259eaeeeb307c8f69aedf51deca197b Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 20 Nov 2024 12:20:10 +0100 Subject: [PATCH 2/9] Add test ARC with modifications missing --- .../assays/.gitkeep | 0 .../assays/testAssayOther/README.md | 0 .../assays/testAssayOther/dataset/.gitkeep | 0 .../assays/testAssayOther/isa.assay.xlsx | Bin 0 -> 6894 bytes .../assays/testAssayOther/protocols/.gitkeep | 0 .../assays/testAssayPRIDE/README.md | 0 .../assays/testAssayPRIDE/dataset/.gitkeep | 0 .../assays/testAssayPRIDE/isa.assay.xlsx | Bin 0 -> 11419 bytes .../assays/testAssayPRIDE/protocols/.gitkeep | 0 .../isa.investigation.xlsx | Bin 0 -> 7169 bytes .../runs/.gitkeep | 0 .../studies/.gitkeep | 0 .../studies/testStudyOther/README.md | 0 .../studies/testStudyOther/isa.study.xlsx | Bin 0 -> 7516 bytes .../studies/testStudyOther/protocols/.gitkeep | 0 .../studies/testStudyOther/resources/.gitkeep | 0 .../studies/testStudyPRIDE/README.md | 0 .../studies/testStudyPRIDE/isa.study.xlsx | Bin 0 -> 9702 bytes .../studies/testStudyPRIDE/protocols/.gitkeep | 0 .../studies/testStudyPRIDE/resources/.gitkeep | 0 .../workflows/.gitkeep | 0 21 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/README.md create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/dataset/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/isa.assay.xlsx create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/README.md create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/dataset/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/isa.assay.xlsx create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/isa.investigation.xlsx create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/runs/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/README.md create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/isa.study.xlsx create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/resources/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/README.md create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/isa.study.xlsx create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/resources/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsModifValueMissing/workflows/.gitkeep diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/README.md b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/README.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/dataset/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/dataset/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/isa.assay.xlsx b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/isa.assay.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2ba813c89d5790848127457d5bce59b370d7fad7 GIT binary patch literal 6894 zcmai3by(D0(_VV%T4Cu%x};P}a#>2cOIT96Q$)H;6lo*`328}@P`Vox>FzH57I{!# zectaqf9$o_?%Ze2b0sWyuc%2sd;uNmcE+0RC88E7g7E`V8~sZjeKhN`MW7M z0;U2M>H;G|)+B)~ue4SYrK(8TQ846ga=0=-2z_#p*@n30IOSb#G;JnOg?& z{H(3ev`2P8GW$YS)PSh0EG!cH{-Tghu^I<2-U&ZjcCaHlX2Ma+%oDcMNDC8EU0mge zJgxVgt@E(1=%agxqy!y%2IFOp2w%wb#pi4FbPs~#D1jtyuA~K(c?g&RLb4XDO9;V@ zZfWxU81W<)wNrR-7wCgHrF}tWHObf2z~4^ zypj!pr z)|XGhHPKcrTzHaO7Z{~SI<7iU=2$1@$9lR)NC6d9@(*P#1Z*yj)X5;^z)ZCC*23|m zkC3&VBf$_Q`C+t@3>GNfvcj8&Es!_w)R{S6>!hwQax?}b{rIrkngBWP5{07=eXN2I zvwioD6qE-?MnNiMc~60C@YU_E;f_~525wB6uoL>BPe`knN~Pr(gS{HmFPLW^)k{nr zq8dKA9kF}@4WLg8>gFU(y<>_Zqi;$TGd8Cw_rd8)o6~8!5YB5|EZlI7ug>CUz09K9 z^`R%nMBQ_7T!u6o9W=Wn^Sq~0Js!G?}0PJq==kt8%4mGOtbQ;X0VG5K+1+zUu6t zPEc;XIAa7iR**~t=d3YhFL|jr5=WdY|J1*UjV5-vroi+aYkObt+3Opj5ip-Nosn?= zdZ2`DC+?u)ln#cx+pB_G0AH^QI9 zy_#F=t23~yve_w5H|{-7+VB@RR&*?iDA>Sqctq%P)}x)$24UHQ&JvSr3J+#+w6hm( zF~z*?{@ioK(P4L|K(gns=%P4H1ii+ZZBrRaTUlMS-bU7#LBluqX~ ztIaQIgjRQqQrsw->ki$WQv`5ldW63m2y$Z21!h&9DR;7O~QM7c+m)*x1m z`*2xYv^a@Vv;3;Sp0)+>>ciV1H@qE! zt}@rj!q^dJs_N`$X>0EEBWvT8tOL04+O{r0G)FHsD51=&v{ISL-v6iQ@KQE+_vTOjiuD>5^s%WT!)M8&aJH9fBh=XX@z^*(kYU2JverBdQ$ZGX zXM?uZKy}b^XW;#i5)F=WYi4+Snfw>=#n~9_z%5$ZtqvkVS0a#w42}=xnDRV8BR0DL z5S-ajth#0N%tCHx0s|6jHdKJ57Rf)Da!R86J%gc`F$YtAA+F9?c*uy6K88Y*Zra;| z&dG06d{ZAO5qDhy1qJ{nVn!fb(lfbk43JvGModFG~Q(-TJ ztY?s)31a4oggGX*lTlrGD0vH=Z278;jdHrC-KGo#eLC6ba}12-dNdTMMewTBmPMia z`^hopbvXWO@piU=*}#6*_^YVJ_43_}fcMN+>Z>6J-UP19etiBYH5=MWc2oSI?=1eC z#iqKu=^3`hU9Lm?mi`|$`swI~h)kfo5SCD75O{Kk0}0i+g#*cT${4I+grc!thD(^y zHtG{1Ec=aaQZ2d4a=_RDkeuziwe#_alFG34^_Y@`6}brqFkHv%B+Q0XaCag`axT%s zuAh@nUIGHb#)skCCf#D|UK=aUVkh~EM@CH%%0A44#GI#_$lwi@p2bL>1*S!Uabp8G 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/protocols/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayOther/protocols/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/README.md b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/README.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/dataset/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/dataset/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/isa.assay.xlsx b/tests/fixtures/testARC_proteomicsModifValueMissing/assays/testAssayPRIDE/isa.assay.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cdfa59a83a08774159faf5c3dcf74d0f85b73228 GIT binary patch literal 11419 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 B?DhZv literal 0 HcmV?d00001 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/runs/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/studies/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/README.md b/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/README.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/isa.study.xlsx b/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyOther/isa.study.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2b122fa8e8f56c82bbc2baabc0b60b5ef773de40 GIT binary patch literal 7516 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 K;;JIP1^+(>3Nr}+ literal 0 HcmV?d00001 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/protocols/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/protocols/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/resources/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/studies/testStudyPRIDE/resources/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsModifValueMissing/workflows/.gitkeep b/tests/fixtures/testARC_proteomicsModifValueMissing/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 From af37cbbafcbfdee47fae1997d8ab51ab966ec981 Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 20 Nov 2024 12:20:52 +0100 Subject: [PATCH 3/9] Update old packages' tests structure --- tests/invenio@3.0.0.fs | 26 +++++++++++++------------- tests/pride@1.0.3.fs | 6 +++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/invenio@3.0.0.fs b/tests/invenio@3.0.0.fs index a01d8da..d0c17e6 100644 --- a/tests/invenio@3.0.0.fs +++ b/tests/invenio@3.0.0.fs @@ -1,4 +1,4 @@ -module invenio +module invenio_3_0_0 open ValidationPackages.Tests @@ -75,8 +75,8 @@ type ArcPrototype() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.invenio.ArcPrototype.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.invenio.ArcPrototype.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.ArcPrototype.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.ArcPrototype.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = @@ -102,8 +102,8 @@ type testARC_empty() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.invenio.testARC_empty.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.invenio.testARC_empty.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_empty.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_empty.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = @@ -129,8 +129,8 @@ type testARC_emptyContactsColumn() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.invenio.testARC_emptyContactsColumn.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.invenio.testARC_emptyContactsColumn.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_emptyContactsColumn.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_emptyContactsColumn.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = @@ -156,8 +156,8 @@ type testARC_shiftedContactsCells() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.invenio.testARC_shiftedContactsCells.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.invenio.testARC_shiftedContactsCells.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_shiftedContactsCells.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_shiftedContactsCells.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = @@ -183,8 +183,8 @@ type testARC_shiftedTitleCell() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.invenio.testARC_shiftedTitleCell.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.invenio.testARC_shiftedTitleCell.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_shiftedTitleCell.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_shiftedTitleCell.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = @@ -210,8 +210,8 @@ type testARC_wrongEmail() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.invenio.testARC_wrongEmail.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.invenio.testARC_wrongEmail.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_wrongEmail.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.``3_0_0``.testARC_wrongEmail.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = diff --git a/tests/pride@1.0.3.fs b/tests/pride@1.0.3.fs index 70f8148..f104120 100644 --- a/tests/pride@1.0.3.fs +++ b/tests/pride@1.0.3.fs @@ -1,4 +1,4 @@ -module pride +module pride_1_0_3 open ValidationPackages.Tests @@ -53,8 +53,8 @@ type testARC_proteomicsCorrect() = [] member this.``validation_summary JSON is equal`` () = - Assert.Equal(ReferenceObjects.pride.testARC_proteomicsCorrect.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) - Assert.Equal(ReferenceObjects.pride.testARC_proteomicsCorrect.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + Assert.Equal(ReferenceObjects.pride.``1_0_3``.testARC_proteomicsCorrect.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.pride.``1_0_3``.testARC_proteomicsCorrect.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) [] member this.``validation_report XML is equal`` () = From 3b9f2ecccbbcc26c34b41ee2e1525979aca6422c Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 20 Nov 2024 12:21:15 +0100 Subject: [PATCH 4/9] Add validation report for correct proteomics ARC --- .../validation_report.xml | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml diff --git a/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml b/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml new file mode 100644 index 0000000..bbe287f --- /dev/null +++ b/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From decd846f89739423f66db682689a3c6a3a659b2c Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 20 Nov 2024 12:21:36 +0100 Subject: [PATCH 5/9] Add unit tests for PRIDE 1.0.4 (WIP) --- tests/ValidationPackages.Tests.fsproj | 1 + tests/pride@1.0.4.fs | 88 +++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 tests/pride@1.0.4.fs diff --git a/tests/ValidationPackages.Tests.fsproj b/tests/ValidationPackages.Tests.fsproj index 783fa50..a7b13b0 100644 --- a/tests/ValidationPackages.Tests.fsproj +++ b/tests/ValidationPackages.Tests.fsproj @@ -17,6 +17,7 @@ + diff --git a/tests/pride@1.0.4.fs b/tests/pride@1.0.4.fs new file mode 100644 index 0000000..0a75b4f --- /dev/null +++ b/tests/pride@1.0.4.fs @@ -0,0 +1,88 @@ +module pride_1_0_4 + + +open ValidationPackages.Tests +open TestUtils + +open Xunit +open ARCExpect + +open System.IO +open System + + +type BaseTool_Fixture(scriptName : string, version : string, arcfolder : string) = + + let result = runTool "dotnet" [|"fsi"; $"../../validation_packages/{scriptName}/{scriptName}@{version}.fsx"|] $"fixtures/{arcfolder}" + + let arcExpectValidationResult = ARCExpect.ValidationSummary.fromJson (File.ReadAllText $"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/validation_summary.json") + + let jUnitResult = JUnitResults.fromJUnitFile $"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/validation_report.xml" + + let jUnitExpected = JUnitResults.fromJUnitFile $"fixtures/validationReport/{scriptName}/{version}/{arcfolder}/validation_report.xml" + + interface IDisposable with + override this.Dispose() = + Directory.Delete($"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/", true) + + member this.Result = result + + member this.ArcExpectValidationResult = arcExpectValidationResult + + member this.JUnitResult = jUnitResult + + member this.JUnitExpected = jUnitExpected + + +type testARC_proteomicsCorrect_Fixture() = + + inherit BaseTool_Fixture("pride", "1.0.4", "testARC_proteomicsCorrect") + + +type testARC_proteomicsCorrect() = + + let tool_fixture = new testARC_proteomicsCorrect_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.pride.``1_0_4``.testARC_proteomicsCorrect.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.pride.``1_0_4``.testARC_proteomicsCorrect.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) + + +type testARC_proteomicsModifValueMissing_Fixture() = + + inherit BaseTool_Fixture("pride", "1.0.4", "testARC_proteomicsCorrect") + + +type testARC_proteomicsModifValueMissing() = + + let tool_fixture = new testARC_proteomicsModifValueMissing_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.pride.``1_0_4``.testARC_proteomicsCorrect.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.pride.``1_0_4``.testARC_proteomicsCorrect.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) \ No newline at end of file From 5ab2f26efc77a4db7cd5e5744e4758bd35317a6b Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 20 Nov 2024 12:21:44 +0100 Subject: [PATCH 6/9] Update ref objects accordingly --- tests/ReferenceObjects.fs | 94 ++++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/tests/ReferenceObjects.fs b/tests/ReferenceObjects.fs index aa09eda..4a08b21 100644 --- a/tests/ReferenceObjects.fs +++ b/tests/ReferenceObjects.fs @@ -12,66 +12,90 @@ module General = module invenio = - module ArcPrototype = + module ``3_0_0`` = - let validationResultCritical = - ValidationResult.create(10,10,0,0) + module ArcPrototype = - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) + let validationResultCritical = + ValidationResult.create(10,10,0,0) + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) - module testARC_empty = - let validationResultCritical = - ValidationResult.create(10,4,6,0) + module testARC_empty = - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) + let validationResultCritical = + ValidationResult.create(10,4,6,0) + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) - module testARC_emptyContactsColumn = - let validationResultCritical = - ValidationResult.create(10,6,4,0) + module testARC_emptyContactsColumn = - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) + let validationResultCritical = + ValidationResult.create(10,6,4,0) + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) - module testARC_shiftedContactsCells = - let validationResultCritical = - ValidationResult.create(10,9,1,0) + module testARC_shiftedContactsCells = - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) + let validationResultCritical = + ValidationResult.create(10,9,1,0) + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) - module testARC_shiftedTitleCell = - let validationResultCritical = - ValidationResult.create(10,10,0,0) + module testARC_shiftedTitleCell = - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) + let validationResultCritical = + ValidationResult.create(10,10,0,0) + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) - module testARC_wrongEmail = - let validationResultCritical = - ValidationResult.create(10,9,1,0) + module testARC_wrongEmail = - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) + let validationResultCritical = + ValidationResult.create(10,9,1,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) module pride = - module testARC_proteomicsCorrect = + module ``1_0_3`` = + + module testARC_proteomicsCorrect = + + let validationResultCritical = + ValidationResult.create(22,22,0,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module ``1_0_4`` = + + module testARC_proteomicsCorrect = + + let validationResultCritical = + ValidationResult.create(22,22,0,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module testARC_proteomicsModifValueMissing = - let validationResultCritical = - ValidationResult.create(22,22,0,0) + let validationResultCritical = + ValidationResult.create(22,21,1,0) - let validationResultNonCritical = - ValidationResult.create(0,0,0,0) \ No newline at end of file + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) \ No newline at end of file From 0ead0660a9bbadb9510d2ccfd1d9ecc627e420bf Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Tue, 26 Nov 2024 20:19:30 +0100 Subject: [PATCH 7/9] Modify validation report for correct proteomics test ARC --- .../pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml b/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml index bbe287f..999e619 100644 --- a/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml +++ b/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsCorrect/validation_report.xml @@ -23,5 +23,6 @@ + \ No newline at end of file From 09b01b75e52568ebc3dd741b841d7ba7df2daac1 Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Tue, 26 Nov 2024 20:19:50 +0100 Subject: [PATCH 8/9] Add validation report for ARC with modification missing --- .../validation_report.xml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsModifValueMissing/validation_report.xml diff --git a/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsModifValueMissing/validation_report.xml b/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsModifValueMissing/validation_report.xml new file mode 100644 index 0000000..999e619 --- /dev/null +++ b/tests/fixtures/validationReport/pride/1.0.4/testARC_proteomicsModifValueMissing/validation_report.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3249ca6723d99dddc52ea75220882a9a042a722a Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Tue, 26 Nov 2024 20:20:12 +0100 Subject: [PATCH 9/9] Update reference objects according to new tests --- tests/ReferenceObjects.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ReferenceObjects.fs b/tests/ReferenceObjects.fs index 4a08b21..2b77fbd 100644 --- a/tests/ReferenceObjects.fs +++ b/tests/ReferenceObjects.fs @@ -86,7 +86,7 @@ module pride = module testARC_proteomicsCorrect = let validationResultCritical = - ValidationResult.create(22,22,0,0) + ValidationResult.create(23,23,0,0) let validationResultNonCritical = ValidationResult.create(0,0,0,0) @@ -95,7 +95,7 @@ module pride = module testARC_proteomicsModifValueMissing = let validationResultCritical = - ValidationResult.create(22,21,1,0) + ValidationResult.create(23,22,1,0) let validationResultNonCritical = ValidationResult.create(0,0,0,0) \ No newline at end of file