Skip to content

Commit 451ef11

Browse files
committed
move and fix template hashcode and equality tests
1 parent 5803eb7 commit 451ef11

6 files changed

Lines changed: 215 additions & 182 deletions

File tree

src/Core/Helper/HashCodes.fs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ let pyHasCustomHash (obj) : bool = nativeOnly
1212
let pyCustomHash (obj) : int = nativeOnly
1313
#endif
1414

15+
let mergeHashes (hash1 : int) (hash2 : int) : int =
16+
0x9e3779b9 + hash2 + (hash1 <<< 6) + (hash1 >>> 2)
17+
18+
let hashDateTime (dt : System.DateTime) : int =
19+
let mutable acc = 0
20+
acc <- mergeHashes acc dt.Year
21+
acc <- mergeHashes acc dt.Month
22+
acc <- mergeHashes acc dt.Day
23+
acc <- mergeHashes acc dt.Hour
24+
acc <- mergeHashes acc dt.Minute
25+
acc <- mergeHashes acc dt.Second
26+
acc
27+
28+
1529
let hash obj =
1630
#if FABLE_COMPILER_PYTHON
1731
if pyHasCustomHash obj then
@@ -29,11 +43,15 @@ let boxHashOption (a: 'a option) : obj =
2943
let boxHashArray (a: 'a []) : obj =
3044
a
3145
// from https://stackoverflow.com/a/53507559
32-
|> Array.fold (fun acc o -> 0x9e3779b9 + (hash o) + (acc <<< 6) + (acc >>> 2) ) 0
46+
|> Array.fold (fun acc o ->
47+
hash o
48+
|> mergeHashes acc) 0
3349
|> box
3450

3551
let boxHashSeq (a: seq<'a>) : obj =
3652
a
3753
// from https://stackoverflow.com/a/53507559
38-
|> Seq.fold (fun acc o -> 0x9e3779b9 + o.GetHashCode() + (acc <<< 6) + (acc >>> 2) ) 0
54+
|> Seq.fold (fun acc o ->
55+
hash o
56+
|> mergeHashes acc) 0
3957
|> box

src/Core/Template.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ type Template(id: System.Guid, table: ArcTable, ?name: string, ?description, ?or
7878

7979
override this.GetHashCode() =
8080
[|
81-
box this.Id
82-
box this.Table
81+
box (this.Id.ToString())
82+
box (this.Table.GetHashCode())
8383
box this.Name
84-
box this.Organisation
84+
box (this.Organisation.GetHashCode())
8585
box this.Version
8686
HashCodes.boxHashSeq this.Authors
8787
HashCodes.boxHashSeq this.EndpointRepositories
8888
HashCodes.boxHashSeq this.Tags
89-
box this.LastUpdated
89+
box (HashCodes.hashDateTime this.LastUpdated)
9090
|]
9191
|> HashCodes.boxHashArray
9292
|> fun x -> x :?> int

tests/ARCtrl/Template.Tests.fs

Lines changed: 0 additions & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -8,189 +8,13 @@ open ARCtrl
88

99
open TestingUtils
1010

11-
let create_TestTemplate() =
12-
let table = ArcTable.init("My Table")
13-
table.AddColumn(CompositeHeader.Input IOType.Source, [|for i in 0 .. 9 do yield CompositeCell.createFreeText($"Source {i}")|])
14-
table.AddColumn(CompositeHeader.Output IOType.RawDataFile, [|for i in 0 .. 9 do yield CompositeCell.createFreeText($"Output {i}")|])
15-
let guid = System.Guid(String.init 32 (fun _ -> "d"))
16-
Template.make
17-
guid
18-
table
19-
"My Template"
20-
"My Template is great"
21-
DataPLANT
22-
"1.0.3"
23-
(ResizeArray [|Person.create(firstName="John", lastName="Doe")|])
24-
(ResizeArray [|OntologyAnnotation "My oa rep"|])
25-
(ResizeArray [|OntologyAnnotation "My oa tag"|])
26-
(System.DateTime(2023,09,19))
27-
28-
29-
let private tests_equality = testList "equality" [
30-
31-
testList "override equality" [
32-
testCase "equal" <| fun _ ->
33-
let template1 = create_TestTemplate()
34-
let template2 = create_TestTemplate()
35-
Expect.equal template1 template2 "equal"
36-
testCase "not equal" <| fun _ ->
37-
let template1 = create_TestTemplate()
38-
let template2 = create_TestTemplate()
39-
template2.Name <- "New Name"
40-
Expect.notEqual template1 template2 "not equal"
41-
]
42-
testList "structural equality" [
43-
testCase "equal" <| fun _ ->
44-
let template1 = create_TestTemplate()
45-
let template2 = create_TestTemplate()
46-
let equals = template1.StructurallyEquals(template2)
47-
Expect.isTrue equals "equal"
48-
testCase "not equal" <| fun _ ->
49-
let template1 = create_TestTemplate()
50-
let template2 = create_TestTemplate()
51-
template2.Name <- "New Name"
52-
let equals = template1.StructurallyEquals(template2)
53-
Expect.isFalse equals "not equal"
54-
]
55-
testList "reference equality" [
56-
testCase "not same object" <| fun _ ->
57-
let template1 = create_TestTemplate()
58-
let template2 = create_TestTemplate()
59-
let equals = template1.ReferenceEquals(template2)
60-
Expect.isFalse equals ""
61-
testCase "same object" <| fun _ ->
62-
let template1 = create_TestTemplate()
63-
let equals = template1.ReferenceEquals(template1)
64-
Expect.isTrue equals ""
65-
]
66-
]
67-
68-
let private tests_HashCode =
69-
testList "hashcode" [
70-
testCase "equal" <| fun _ ->
71-
let template1 = create_TestTemplate()
72-
let template2 = create_TestTemplate()
73-
let hash1 = template1.GetHashCode()
74-
let hash2 = template2.GetHashCode()
75-
Expect.equal hash1 hash2 "equal"
76-
testCase "not equal" <| fun _ ->
77-
let template1 = create_TestTemplate()
78-
let template2 = create_TestTemplate()
79-
template2.Name <- "New Name"
80-
let hash1 = template1.GetHashCode()
81-
let hash2 = template2.GetHashCode()
82-
Expect.notEqual hash1 hash2 "not equal"
83-
]
84-
8511
let private tests_Web = testList "Web" [
8612
testCaseAsync "getTemplates" <| async {
8713
let! templatesMap = ARCtrl.Template.Web.getTemplates(None)
8814
Expect.isTrue (templatesMap.Count > 0) "Count > 0"
8915
}
9016
]
9117

92-
let private tests_filters = testList "filters" [
93-
let create_TestTemplate() =
94-
let guid = System.Guid(String.init 32 (fun _ -> "d"))
95-
Template.make
96-
guid
97-
(ArcTable.init("TestTable"))
98-
"My Template"
99-
"My Template is great"
100-
DataPLANT
101-
"1.0.3"
102-
(ResizeArray [|Person(firstName="John", lastName="Doe")|])
103-
(ResizeArray [|OntologyAnnotation "PRIDE";|])
104-
(ResizeArray [|OntologyAnnotation "Protein"; OntologyAnnotation "DNA";|])
105-
(System.DateTime(2023,09,19))
106-
// this testList is representative to filterByEndpointRepositories
107-
testList "filterByTags" [
108-
testCase "OR, contains all" <| fun _ ->
109-
let templates = ResizeArray [|create_TestTemplate()|]
110-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
111-
let actual = Templates.filterByTags(queryTags) templates
112-
let expected = 1
113-
Expect.equal actual.Count expected ""
114-
testCase "OR, contains different" <| fun _ ->
115-
let templates = ResizeArray [|create_TestTemplate()|]
116-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
117-
let actual = Templates.filterByTags(queryTags) templates
118-
let expected = 1
119-
Expect.equal actual.Count expected ""
120-
testCase "AND, contains some" <| fun _ ->
121-
let templates = ResizeArray [|create_TestTemplate()|]
122-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
123-
let actual = Templates.filterByTags(queryTags, true) templates
124-
let expected = 1
125-
Expect.equal actual.Count expected ""
126-
testCase "AND, contains all" <| fun _ ->
127-
let templates = ResizeArray [|create_TestTemplate()|]
128-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "Protein";|]
129-
let actual = Templates.filterByTags(queryTags, true) templates
130-
let expected = 1
131-
Expect.equal actual.Count expected ""
132-
testCase "AND, contains different" <| fun _ ->
133-
let templates = ResizeArray [|create_TestTemplate()|]
134-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
135-
let actual = Templates.filterByTags(queryTags, true) templates
136-
let expected = 0
137-
Expect.equal actual.Count expected ""
138-
]
139-
testList "filterByOntologyAnnotations" [
140-
testCase "OR, contains tag" <| fun _ ->
141-
let templates = ResizeArray [|create_TestTemplate()|]
142-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
143-
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
144-
let expected = 1
145-
Expect.equal actual.Count expected ""
146-
testCase "OR, contains er" <| fun _ ->
147-
let templates = ResizeArray [|create_TestTemplate()|]
148-
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"|]
149-
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
150-
let expected = 1
151-
Expect.equal actual.Count expected ""
152-
testCase "OR, contains combined" <| fun _ ->
153-
let templates = ResizeArray [|create_TestTemplate()|]
154-
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"; OntologyAnnotation "DNA"|]
155-
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
156-
let expected = 1
157-
Expect.equal actual.Count expected ""
158-
testCase "OR, contains different" <| fun _ ->
159-
let templates = ResizeArray [|create_TestTemplate()|]
160-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
161-
let actual = Templates.filterByOntologyAnnotation(queryTags) templates
162-
let expected = 1
163-
Expect.equal actual.Count expected ""
164-
testCase "AND, contains tag" <| fun _ ->
165-
let templates = ResizeArray [|create_TestTemplate()|]
166-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"|]
167-
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
168-
let expected = 1
169-
Expect.equal actual.Count expected ""
170-
testCase "AND, contains er" <| fun _ ->
171-
let templates = ResizeArray [|create_TestTemplate()|]
172-
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"|]
173-
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
174-
let expected = 1
175-
Expect.equal actual.Count expected ""
176-
testCase "AND, contains combined" <| fun _ ->
177-
let templates = ResizeArray [|create_TestTemplate()|]
178-
let queryTags = ResizeArray [|OntologyAnnotation "PRIDE"; OntologyAnnotation "DNA"|]
179-
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
180-
let expected = 1
181-
Expect.equal actual.Count expected ""
182-
testCase "AND, contains different" <| fun _ ->
183-
let templates = ResizeArray [|create_TestTemplate()|]
184-
let queryTags = ResizeArray [|OntologyAnnotation "DNA"; OntologyAnnotation "RNA"|]
185-
let actual = Templates.filterByOntologyAnnotation(queryTags, true) templates
186-
let expected = 0
187-
Expect.equal actual.Count expected ""
188-
]
189-
]
190-
19118
let main = testList "Templates" [
192-
tests_equality
193-
tests_HashCode
19419
tests_Web
195-
tests_filters
19620
]

tests/Core/ARCtrl.Core.Tests.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<Compile Include="ArcAssay.Tests.fs" />
1717
<Compile Include="ArcStudy.Tests.fs" />
1818
<Compile Include="ArcInvestigation.Tests.fs" />
19+
<Compile Include="Template.Tests.fs" />
1920
<Compile Include="ArcJsonConversion.Tests.fs" />
2021
<Compile Include="Identifier.Tests.fs" />
2122
<Compile Include="DataModel.Tests.fs" />

tests/Core/Main.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ let all = testSequenced <| testList "ISA" [
1515
ArcAssay.Tests.main
1616
ArcStudy.Tests.main
1717
ArcInvestigation.Tests.main
18+
Template.Tests.main
1819
ArcJsonConversion.Tests.main
1920
Identifier.Tests.main
2021
Fable.Tests.main

0 commit comments

Comments
 (0)