@@ -30,22 +30,48 @@ func assertPercentile(t *testing.T, s Uint64Slice, f float64, want uint64) {
3030}
3131
3232func TestPercentile (t * testing.T ) {
33- N := 100
34- s := make (Uint64Slice , 0 , N )
35- for i := N ; i > 0 ; i -- {
36- s = append (s , uint64 (i ))
37- }
38- assertPercentile (t , s , 0.2 , 20 )
39- assertPercentile (t , s , 0.7 , 70 )
40- assertPercentile (t , s , 0.9 , 90 )
41- N = 105
42- for i := 101 ; i <= N ; i ++ {
43- s = append (s , uint64 (i ))
44- }
45- // 90p should be between 94 and 95. Promoted to 95.
46- assertPercentile (t , s , 0.2 , 21 )
47- assertPercentile (t , s , 0.7 , 74 )
48- assertPercentile (t , s , 0.9 , 95 )
33+ tests := []struct {
34+ name string
35+ data Uint64Slice
36+ p float64
37+ want uint64
38+ }{
39+
40+ {"20p of 100 elements" , generateSlice (100 , true ), 0.2 , 20 },
41+ {"70p of 100 elements" , generateSlice (100 , true ), 0.7 , 70 },
42+ {"90p of 100 elements" , generateSlice (100 , true ), 0.9 , 90 },
43+
44+ // 90p should be between 94 and 95. Promoted to 95.
45+ {"20p of 105 elements" , generateSlice (105 , true ), 0.2 , 21 },
46+ {"70p of 105 elements" , generateSlice (105 , true ), 0.7 , 74 },
47+ {"90p of 105 elements" , generateSlice (105 , true ), 0.9 , 95 },
48+
49+ // boundary value
50+ {"90p of 5 elements" , Uint64Slice {1 , 2 , 3 , 4 , 5 }, 0.9 , 5 },
51+ {"Out of range p > 1" , Uint64Slice {1 , 2 , 3 , 4 , 5 }, 1.1 , 0 },
52+ {"Empty slice" , Uint64Slice {}, 0 , 0 },
53+ {"Zero percentile" , generateSlice (100 , true ), 0 , 1 },
54+ {"100p of 11 elements" , Uint64Slice {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 }, 1.0 , 11 },
55+ {"100p of 105 elements" , generateSlice (105 , true ), 1.0 , 105 },
56+ }
57+
58+ for _ , tt := range tests {
59+ t .Run (tt .name , func (t * testing.T ) {
60+ assertPercentile (t , tt .data , tt .p , tt .want )
61+ })
62+ }
63+ }
64+
65+ func generateSlice (n int , descending bool ) Uint64Slice {
66+ s := make (Uint64Slice , 0 , n )
67+ for i := 1 ; i <= n ; i ++ {
68+ if descending {
69+ s = append (s , uint64 (n - i + 1 ))
70+ } else {
71+ s = append (s , uint64 (i ))
72+ }
73+ }
74+ return s
4975}
5076
5177func TestMean (t * testing.T ) {
0 commit comments