Skip to content

Commit

Permalink
move and fix template hashcode and equality tests
Browse files Browse the repository at this point in the history
  • Loading branch information
HLWeil committed Mar 28, 2024
1 parent 5803eb7 commit 451ef11
Show file tree
Hide file tree
Showing 6 changed files with 215 additions and 182 deletions.
22 changes: 20 additions & 2 deletions src/Core/Helper/HashCodes.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,20 @@ let pyHasCustomHash (obj) : bool = nativeOnly
let pyCustomHash (obj) : int = nativeOnly
#endif

let mergeHashes (hash1 : int) (hash2 : int) : int =
0x9e3779b9 + hash2 + (hash1 <<< 6) + (hash1 >>> 2)

let hashDateTime (dt : System.DateTime) : int =
let mutable acc = 0
acc <- mergeHashes acc dt.Year
acc <- mergeHashes acc dt.Month
acc <- mergeHashes acc dt.Day
acc <- mergeHashes acc dt.Hour
acc <- mergeHashes acc dt.Minute
acc <- mergeHashes acc dt.Second
acc


let hash obj =
#if FABLE_COMPILER_PYTHON
if pyHasCustomHash obj then
Expand All @@ -29,11 +43,15 @@ let boxHashOption (a: 'a option) : obj =
let boxHashArray (a: 'a []) : obj =
a
// from https://stackoverflow.com/a/53507559
|> Array.fold (fun acc o -> 0x9e3779b9 + (hash o) + (acc <<< 6) + (acc >>> 2) ) 0
|> Array.fold (fun acc o ->
hash o
|> mergeHashes acc) 0
|> box

let boxHashSeq (a: seq<'a>) : obj =
a
// from https://stackoverflow.com/a/53507559
|> Seq.fold (fun acc o -> 0x9e3779b9 + o.GetHashCode() + (acc <<< 6) + (acc >>> 2) ) 0
|> Seq.fold (fun acc o ->
hash o
|> mergeHashes acc) 0
|> box
8 changes: 4 additions & 4 deletions src/Core/Template.fs
Original file line number Diff line number Diff line change
Expand Up @@ -78,15 +78,15 @@ type Template(id: System.Guid, table: ArcTable, ?name: string, ?description, ?or

override this.GetHashCode() =
[|
box this.Id
box this.Table
box (this.Id.ToString())
box (this.Table.GetHashCode())
box this.Name
box this.Organisation
box (this.Organisation.GetHashCode())
box this.Version
HashCodes.boxHashSeq this.Authors
HashCodes.boxHashSeq this.EndpointRepositories
HashCodes.boxHashSeq this.Tags
box this.LastUpdated
box (HashCodes.hashDateTime this.LastUpdated)
|]
|> HashCodes.boxHashArray
|> fun x -> x :?> int
176 changes: 0 additions & 176 deletions tests/ARCtrl/Template.Tests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,189 +8,13 @@ open ARCtrl

open TestingUtils

let create_TestTemplate() =
let table = ArcTable.init("My Table")
table.AddColumn(CompositeHeader.Input IOType.Source, [|for i in 0 .. 9 do yield CompositeCell.createFreeText($"Source {i}")|])
table.AddColumn(CompositeHeader.Output IOType.RawDataFile, [|for i in 0 .. 9 do yield CompositeCell.createFreeText($"Output {i}")|])
let guid = System.Guid(String.init 32 (fun _ -> "d"))
Template.make
guid
table
"My Template"
"My Template is great"
DataPLANT
"1.0.3"
(ResizeArray [|Person.create(firstName="John", lastName="Doe")|])
(ResizeArray [|OntologyAnnotation "My oa rep"|])
(ResizeArray [|OntologyAnnotation "My oa tag"|])
(System.DateTime(2023,09,19))


let private tests_equality = testList "equality" [

testList "override equality" [
testCase "equal" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
Expect.equal template1 template2 "equal"
testCase "not equal" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
template2.Name <- "New Name"
Expect.notEqual template1 template2 "not equal"
]
testList "structural equality" [
testCase "equal" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
let equals = template1.StructurallyEquals(template2)
Expect.isTrue equals "equal"
testCase "not equal" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
template2.Name <- "New Name"
let equals = template1.StructurallyEquals(template2)
Expect.isFalse equals "not equal"
]
testList "reference equality" [
testCase "not same object" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
let equals = template1.ReferenceEquals(template2)
Expect.isFalse equals ""
testCase "same object" <| fun _ ->
let template1 = create_TestTemplate()
let equals = template1.ReferenceEquals(template1)
Expect.isTrue equals ""
]
]

let private tests_HashCode =
testList "hashcode" [
testCase "equal" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
let hash1 = template1.GetHashCode()
let hash2 = template2.GetHashCode()
Expect.equal hash1 hash2 "equal"
testCase "not equal" <| fun _ ->
let template1 = create_TestTemplate()
let template2 = create_TestTemplate()
template2.Name <- "New Name"
let hash1 = template1.GetHashCode()
let hash2 = template2.GetHashCode()
Expect.notEqual hash1 hash2 "not equal"
]

let private tests_Web = testList "Web" [
testCaseAsync "getTemplates" <| async {
let! templatesMap = ARCtrl.Template.Web.getTemplates(None)
Expect.isTrue (templatesMap.Count > 0) "Count > 0"
}
]

let private tests_filters = testList "filters" [
let create_TestTemplate() =
let guid = System.Guid(String.init 32 (fun _ -> "d"))
Template.make
guid
(ArcTable.init("TestTable"))
"My Template"
"My Template is great"
DataPLANT
"1.0.3"
(ResizeArray [|Person(firstName="John", lastName="Doe")|])
(ResizeArray [|OntologyAnnotation "PRIDE";|])
(ResizeArray [|OntologyAnnotation "Protein"; OntologyAnnotation "DNA";|])
(System.DateTime(2023,09,19))
// this testList is representative to filterByEndpointRepositories
testList "filterByTags" [
testCase "OR, contains all" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
let actual = Templates.filterByTags(queryTags) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "OR, contains different" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
let actual = Templates.filterByTags(queryTags) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains some" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
let actual = Templates.filterByTags(queryTags, true) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains all" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "Protein";|]
let actual = Templates.filterByTags(queryTags, true) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains different" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
let actual = Templates.filterByTags(queryTags, true) templates
let expected = 0
Expect.equal actual.Count expected ""
]
testList "filterByOntologyAnnotations" [
testCase "OR, contains tag" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "OR, contains er" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"|]
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "OR, contains combined" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"; OntologyAnnotation "DNA"|]
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "OR, contains different" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains tag" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains er" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"|]
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains combined" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"; OntologyAnnotation "DNA"|]
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
let expected = 1
Expect.equal actual.Count expected ""
testCase "AND, contains different" <| fun _ ->
let templates = ResizeArray [|create_TestTemplate()|]
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
let expected = 0
Expect.equal actual.Count expected ""
]
]

let main = testList "Templates" [
tests_equality
tests_HashCode
tests_Web
tests_filters
]
1 change: 1 addition & 0 deletions tests/Core/ARCtrl.Core.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<Compile Include="ArcAssay.Tests.fs" />
<Compile Include="ArcStudy.Tests.fs" />
<Compile Include="ArcInvestigation.Tests.fs" />
<Compile Include="Template.Tests.fs" />
<Compile Include="ArcJsonConversion.Tests.fs" />
<Compile Include="Identifier.Tests.fs" />
<Compile Include="DataModel.Tests.fs" />
Expand Down
1 change: 1 addition & 0 deletions tests/Core/Main.fs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ let all = testSequenced <| testList "ISA" [
ArcAssay.Tests.main
ArcStudy.Tests.main
ArcInvestigation.Tests.main
Template.Tests.main
ArcJsonConversion.Tests.main
Identifier.Tests.main
Fable.Tests.main
Expand Down
Loading

0 comments on commit 451ef11

Please sign in to comment.