@@ -3,86 +3,101 @@ import StatKit
3
3
4
4
@Suite ( " Ranking Tests " , . tags( . ranking) )
5
5
struct RankingTests {
6
- private typealias RankingInput < T> = [ ( [ T ] , ( T , T ) -> Bool , [ Double ] , RankingStrategy ) ]
6
+ private typealias RankingInput < T> = [ ( [ T ] , [ Double ] , RankingStrategy ) ]
7
7
8
8
@Test (
9
- " Valid integer data sets produce valid rankings " ,
9
+ " Valid integer data sets produce valid rankings for less than ordering " ,
10
10
arguments: [
11
- ( [ 1 , 2 , 3 , 4 , 5 ] , > , [ 5 , 4 , 3 , 2 , 1 ] , . dense) ,
12
- ( [ 1 , 3 , 4 , 3 , 5 ] , > , [ 4 , 3 , 2 , 3 , 1 ] , . dense) ,
13
- ( [ 1 , 2 , 3 , 4 , 5 ] , < , [ 1 , 2 , 3 , 4 , 5 ] , . dense) ,
14
- ( [ 1 , 3 , 4 , 3 , 5 ] , < , [ 1 , 2 , 3 , 2 , 4 ] , . dense) ,
15
- ( [ ] , < , [ ] , . dense) ,
16
- ( [ 1 ] , < , [ 1 ] , . dense) ,
17
- ( [ 1 , 3 , 5 , 3 ] , <= , [ 1 , 2 , 3 , 2 ] , . dense) ,
18
-
19
- ( [ 1 , 3 , 4 , 2 , 5 ] , > , [ 5 , 3 , 2 , 4 , 1 ] , . fractional) ,
20
- ( [ 1 , 3 , 4 , 3 , 5 ] , > , [ 5 , 3.5 , 2 , 3.5 , 1 ] , . fractional) ,
21
- ( [ 1 , 3 , 4 , 2 , 5 ] , < , [ 1 , 3 , 4 , 2 , 5 ] , . fractional) ,
22
- ( [ 1 , 3 , 4 , 3 , 5 ] , < , [ 1 , 2.5 , 4 , 2.5 , 5 ] , . fractional) ,
23
- ( [ ] , < , [ ] , . fractional) ,
24
- ( [ 1 ] , < , [ 1 ] , . fractional) ,
25
- ( [ 1 , 3 , 5 , 3 ] , <= , [ 1 , 2.5 , 4 , 2.5 ] , . fractional) ,
26
-
27
- ( [ 1 , 3 , 4 , 2 , 5 ] , > , [ 5 , 3 , 2 , 4 , 1 ] , . modifiedCompetition) ,
28
- ( [ 1 , 3 , 4 , 3 , 5 ] , > , [ 5 , 4 , 2 , 4 , 1 ] , . modifiedCompetition) ,
29
- ( [ 1 , 3 , 4 , 2 , 5 ] , < , [ 1 , 3 , 4 , 2 , 5 ] , . modifiedCompetition) ,
30
- ( [ 1 , 3 , 4 , 3 , 5 , 3 , 3 ] , < , [ 1 , 5 , 6 , 5 , 7 , 5 , 5 ] , . modifiedCompetition) ,
31
- ( [ ] , < , [ ] , . modifiedCompetition) ,
32
- ( [ 1 ] , < , [ 1 ] , . modifiedCompetition) ,
33
- ( [ 1 , 3 , 5 , 3 ] , <= , [ 1 , 3 , 4 , 3 ] , . modifiedCompetition) ,
34
-
35
- ( [ 1 , 3 , 4 , 2 , 5 ] , > , [ 5 , 3 , 2 , 4 , 1 ] , . standardCompetition) ,
36
- ( [ 1 , 3 , 4 , 3 , 5 ] , > , [ 5 , 3 , 2 , 3 , 1 ] , . standardCompetition) ,
37
- ( [ 1 , 3 , 4 , 2 , 5 ] , < , [ 1 , 3 , 4 , 2 , 5 ] , . standardCompetition) ,
38
- ( [ 1 , 3 , 4 , 3 , 5 , 3 , 3 ] , < , [ 1 , 2 , 6 , 2 , 7 , 2 , 2 ] , . standardCompetition) ,
39
- ( [ ] , < , [ ] , . standardCompetition) ,
40
- ( [ 1 ] , < , [ 1 ] , . standardCompetition) ,
41
- ( [ 1 , 3 , 5 , 3 ] , <= , [ 1 , 2 , 4 , 2 ] , . standardCompetition) ,
42
-
43
- ( [ 1 , 3 , 4 , 2 , 5 ] , > , [ 5 , 3 , 2 , 4 , 1 ] , . ordinal) ,
44
- ( [ 1 , 3 , 4 , 3 , 5 ] , > , [ 5 , 3 , 2 , 4 , 1 ] , . ordinal) ,
45
- ( [ 1 , 3 , 4 , 2 , 5 ] , < , [ 1 , 3 , 4 , 2 , 5 ] , . ordinal) ,
46
- ( [ 1 , 3 , 4 , 3 , 5 , 3 , 3 ] , < , [ 1 , 2 , 6 , 3 , 7 , 4 , 5 ] , . ordinal) ,
47
- ( [ ] , < , [ ] , . ordinal) ,
48
- ( [ 1 ] , < , [ 1 ] , . ordinal) ,
49
- ( [ 1 , 3 , 5 , 3 ] , <= , [ 1 , 2 , 4 , 3 ] , . ordinal) ,
11
+ ( [ 1 , 2 , 3 , 4 , 5 ] , [ 1 , 2 , 3 , 4 , 5 ] , . dense) ,
12
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 1 , 2 , 3 , 2 , 4 ] , . dense) ,
13
+ ( [ ] , [ ] , . dense) ,
14
+ ( [ 1 ] , [ 1 ] , . dense) ,
15
+ ( [ 1 , 3 , 5 , 3 ] , [ 1 , 2 , 3 , 2 ] , . dense) ,
16
+
17
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 1 , 3 , 4 , 2 , 5 ] , . fractional) ,
18
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 1 , 2.5 , 4 , 2.5 , 5 ] , . fractional) ,
19
+ ( [ ] , [ ] , . fractional) ,
20
+ ( [ 1 ] , [ 1 ] , . fractional) ,
21
+ ( [ 1 , 3 , 5 , 3 ] , [ 1 , 2.5 , 4 , 2.5 ] , . fractional) ,
22
+
23
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 1 , 3 , 4 , 2 , 5 ] , . modifiedCompetition) ,
24
+ ( [ 1 , 3 , 4 , 3 , 5 , 3 , 3 ] , [ 1 , 5 , 6 , 5 , 7 , 5 , 5 ] , . modifiedCompetition) ,
25
+ ( [ ] , [ ] , . modifiedCompetition) ,
26
+ ( [ 1 ] , [ 1 ] , . modifiedCompetition) ,
27
+ ( [ 1 , 3 , 5 , 3 ] , [ 1 , 3 , 4 , 3 ] , . modifiedCompetition) ,
28
+
29
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 1 , 3 , 4 , 2 , 5 ] , . standardCompetition) ,
30
+ ( [ 1 , 3 , 4 , 3 , 5 , 3 , 3 ] , [ 1 , 2 , 6 , 2 , 7 , 2 , 2 ] , . standardCompetition) ,
31
+ ( [ ] , [ ] , . standardCompetition) ,
32
+ ( [ 1 ] , [ 1 ] , . standardCompetition) ,
33
+ ( [ 1 , 3 , 5 , 3 ] , [ 1 , 2 , 4 , 2 ] , . standardCompetition) ,
34
+
35
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 1 , 3 , 4 , 2 , 5 ] , . ordinal) ,
36
+ ( [ 1 , 3 , 4 , 3 , 5 , 3 , 3 ] , [ 1 , 2 , 6 , 3 , 7 , 4 , 5 ] , . ordinal) ,
37
+ ( [ ] , [ ] , . ordinal) ,
38
+ ( [ 1 ] , [ 1 ] , . ordinal) ,
39
+ ( [ 1 , 3 , 5 , 3 ] , [ 1 , 2 , 4 , 3 ] , . ordinal) ,
40
+ ] as RankingInput < Int >
41
+ )
42
+ func validIntegerDataSetsLessThanOrdering(
43
+ data: [ Int ] ,
44
+ expectedRank: [ Double ] ,
45
+ strategy: RankingStrategy
46
+ ) async {
47
+ #expect( data. rank ( variable: \. self, by: < , strategy: strategy) == expectedRank)
48
+ }
49
+
50
+ @Test (
51
+ " Valid integer data sets produce valid rankings for greater than ordering " ,
52
+ arguments: [
53
+ ( [ 1 , 2 , 3 , 4 , 5 ] , [ 5 , 4 , 3 , 2 , 1 ] , . dense) ,
54
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 4 , 3 , 2 , 3 , 1 ] , . dense) ,
55
+
56
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 5 , 3 , 2 , 4 , 1 ] , . fractional) ,
57
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 5 , 3.5 , 2 , 3.5 , 1 ] , . fractional) ,
58
+
59
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 5 , 3 , 2 , 4 , 1 ] , . modifiedCompetition) ,
60
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 5 , 4 , 2 , 4 , 1 ] , . modifiedCompetition) ,
61
+
62
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 5 , 3 , 2 , 4 , 1 ] , . standardCompetition) ,
63
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 5 , 3 , 2 , 3 , 1 ] , . standardCompetition) ,
64
+
65
+ ( [ 1 , 3 , 4 , 2 , 5 ] , [ 5 , 3 , 2 , 4 , 1 ] , . ordinal) ,
66
+ ( [ 1 , 3 , 4 , 3 , 5 ] , [ 5 , 3 , 2 , 4 , 1 ] , . ordinal) ,
50
67
] as RankingInput < Int >
51
68
)
52
- func validIntegerDataSets (
69
+ func validIntegerDataSetsGreaterThanOrdering (
53
70
data: [ Int ] ,
54
- ordering: @escaping ( Int , Int ) -> Bool ,
55
71
expectedRank: [ Double ] ,
56
72
strategy: RankingStrategy
57
73
) async {
58
- #expect( data. rank ( variable: \. self, by: ordering , strategy: strategy) == expectedRank)
74
+ #expect( data. rank ( variable: \. self, by: > , strategy: strategy) == expectedRank)
59
75
}
60
76
61
77
@Test (
62
78
" Valid floating point data sets produce valid rankings " ,
63
79
arguments: [
64
- ( [ . infinity, . pi, - . infinity, - . pi] , < , [ 4 , 3 , 1 , 2 ] , . dense) ,
65
- ( [ - . infinity, - . infinity, . infinity, . infinity] , < , [ 1 , 1 , 2 , 2 ] , . dense) ,
80
+ ( [ . infinity, . pi, - . infinity, - . pi] , [ 4 , 3 , 1 , 2 ] , . dense) ,
81
+ ( [ - . infinity, - . infinity, . infinity, . infinity] , [ 1 , 1 , 2 , 2 ] , . dense) ,
66
82
67
- ( [ . infinity, . pi, - . infinity, - . pi] , < , [ 4 , 3 , 1 , 2 ] , . fractional) ,
68
- ( [ - . infinity, - . infinity, . infinity, . infinity] , < , [ 1.5 , 1.5 , 3.5 , 3.5 ] , . fractional) ,
83
+ ( [ . infinity, . pi, - . infinity, - . pi] , [ 4 , 3 , 1 , 2 ] , . fractional) ,
84
+ ( [ - . infinity, - . infinity, . infinity, . infinity] , [ 1.5 , 1.5 , 3.5 , 3.5 ] , . fractional) ,
69
85
70
- ( [ . infinity, . pi, - . infinity, - . pi] , < , [ 4 , 3 , 1 , 2 ] , . modifiedCompetition) ,
71
- ( [ - . infinity, - . infinity, . infinity, . infinity] , < , [ 2 , 2 , 4 , 4 ] , . modifiedCompetition) ,
86
+ ( [ . infinity, . pi, - . infinity, - . pi] , [ 4 , 3 , 1 , 2 ] , . modifiedCompetition) ,
87
+ ( [ - . infinity, - . infinity, . infinity, . infinity] , [ 2 , 2 , 4 , 4 ] , . modifiedCompetition) ,
72
88
73
- ( [ . infinity, . pi, - . infinity, - . pi] , < , [ 4 , 3 , 1 , 2 ] , . standardCompetition) ,
74
- ( [ - . infinity, - . infinity, . infinity, . infinity] , < , [ 1 , 1 , 3 , 3 ] , . standardCompetition) ,
89
+ ( [ . infinity, . pi, - . infinity, - . pi] , [ 4 , 3 , 1 , 2 ] , . standardCompetition) ,
90
+ ( [ - . infinity, - . infinity, . infinity, . infinity] , [ 1 , 1 , 3 , 3 ] , . standardCompetition) ,
75
91
76
- ( [ . infinity, . pi, - . infinity, - . pi] , < , [ 4 , 3 , 1 , 2 ] , . ordinal) ,
77
- ( [ - . infinity, - . infinity, . infinity, . infinity] , < , [ 1 , 2 , 3 , 4 ] , . ordinal) ,
92
+ ( [ . infinity, . pi, - . infinity, - . pi] , [ 4 , 3 , 1 , 2 ] , . ordinal) ,
93
+ ( [ - . infinity, - . infinity, . infinity, . infinity] , [ 1 , 2 , 3 , 4 ] , . ordinal) ,
78
94
] as RankingInput < Double >
79
95
)
80
96
func validFloatingPointDataSets(
81
97
data: [ Double ] ,
82
- ordering: @escaping ( Double , Double ) -> Bool ,
83
98
expectedRank: [ Double ] ,
84
99
strategy: RankingStrategy
85
100
) async {
86
- #expect( data. rank ( variable: \. self, by: ordering , strategy: strategy) == expectedRank)
101
+ #expect( data. rank ( variable: \. self, by: < , strategy: strategy) == expectedRank)
87
102
}
88
103
}
0 commit comments