github.com/onsi/gomega@v1.32.0/gmeasure/rank_test.go (about) 1 package gmeasure_test 2 3 import ( 4 "strings" 5 "time" 6 7 . "github.com/onsi/ginkgo/v2" 8 . "github.com/onsi/gomega" 9 "github.com/onsi/gomega/gmeasure" 10 ) 11 12 var _ = Describe("Rank", func() { 13 var A, B, C, D gmeasure.Stats 14 15 Describe("Ranking Values", func() { 16 makeStats := func(name string, min float64, max float64, mean float64, median float64) gmeasure.Stats { 17 return gmeasure.Stats{ 18 Type: gmeasure.StatsTypeValue, 19 ExperimentName: "Exp-" + name, 20 MeasurementName: name, 21 N: 100, 22 PrecisionBundle: gmeasure.Precision(2), 23 ValueBundle: map[gmeasure.Stat]float64{ 24 gmeasure.StatMin: min, 25 gmeasure.StatMax: max, 26 gmeasure.StatMean: mean, 27 gmeasure.StatMedian: median, 28 gmeasure.StatStdDev: 2.0, 29 }, 30 } 31 } 32 33 BeforeEach(func() { 34 A = makeStats("A", 1, 2, 3, 4) 35 B = makeStats("B", 2, 3, 4, 1) 36 C = makeStats("C", 3, 4, 1, 2) 37 D = makeStats("D", 4, 1, 2, 3) 38 }) 39 40 DescribeTable("ranking by criteria", 41 func(criteria gmeasure.RankingCriteria, expectedOrder func() []gmeasure.Stats) { 42 ranking := gmeasure.RankStats(criteria, A, B, C, D) 43 expected := expectedOrder() 44 Ω(ranking.Winner()).Should(Equal(expected[0])) 45 Ω(ranking.Stats).Should(Equal(expected)) 46 }, 47 Entry("entry", gmeasure.LowerMeanIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{C, D, A, B} }), 48 Entry("entry", gmeasure.HigherMeanIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{B, A, D, C} }), 49 Entry("entry", gmeasure.LowerMedianIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{B, C, D, A} }), 50 Entry("entry", gmeasure.HigherMedianIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{A, D, C, B} }), 51 Entry("entry", gmeasure.LowerMinIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{A, B, C, D} }), 52 Entry("entry", gmeasure.HigherMinIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{D, C, B, A} }), 53 Entry("entry", gmeasure.LowerMaxIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{D, A, B, C} }), 54 Entry("entry", gmeasure.HigherMaxIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{C, B, A, D} }), 55 ) 56 57 Describe("Generating Reports", func() { 58 It("can generate an unstyled report", func() { 59 ranking := gmeasure.RankStats(gmeasure.LowerMeanIsBetter, A, B, C, D) 60 Ω(ranking.String()).Should(Equal(strings.Join([]string{ 61 "Ranking Criteria: Lower Mean is Better", 62 "Experiment | Name | N | Min | Median | Mean | StdDev | Max ", 63 "==================================================================", 64 "Exp-C | C | 100 | 3.00 | 2.00 | 1.00 | 2.00 | 4.00", 65 "*Winner* | *Winner* | | | | | | ", 66 "------------------------------------------------------------------", 67 "Exp-D | D | 100 | 4.00 | 3.00 | 2.00 | 2.00 | 1.00", 68 "------------------------------------------------------------------", 69 "Exp-A | A | 100 | 1.00 | 4.00 | 3.00 | 2.00 | 2.00", 70 "------------------------------------------------------------------", 71 "Exp-B | B | 100 | 2.00 | 1.00 | 4.00 | 2.00 | 3.00", 72 "", 73 }, "\n"))) 74 }) 75 76 It("can generate a styled report", func() { 77 ranking := gmeasure.RankStats(gmeasure.LowerMeanIsBetter, A, B, C, D) 78 Ω(ranking.ColorableString()).Should(Equal(strings.Join([]string{ 79 "{{bold}}Ranking Criteria: Lower Mean is Better", 80 "{{/}}{{bold}}Experiment{{/}} | {{bold}}Name {{/}} | {{bold}}N {{/}} | {{bold}}Min {{/}} | {{bold}}Median{{/}} | {{bold}}Mean{{/}} | {{bold}}StdDev{{/}} | {{bold}}Max {{/}}", 81 "==================================================================", 82 "{{bold}}Exp-C {{/}} | {{bold}}C {{/}} | {{bold}}100{{/}} | {{bold}}3.00{{/}} | {{bold}}2.00 {{/}} | {{bold}}1.00{{/}} | {{bold}}2.00 {{/}} | {{bold}}4.00{{/}}", 83 "{{bold}}*Winner* {{/}} | {{bold}}*Winner*{{/}} | | | | | | ", 84 "------------------------------------------------------------------", 85 "Exp-D | D | 100 | 4.00 | 3.00 | 2.00 | 2.00 | 1.00", 86 "------------------------------------------------------------------", 87 "Exp-A | A | 100 | 1.00 | 4.00 | 3.00 | 2.00 | 2.00", 88 "------------------------------------------------------------------", 89 "Exp-B | B | 100 | 2.00 | 1.00 | 4.00 | 2.00 | 3.00", 90 "", 91 }, "\n"))) 92 }) 93 }) 94 }) 95 96 Describe("Ranking Durations", func() { 97 makeStats := func(name string, min time.Duration, max time.Duration, mean time.Duration, median time.Duration) gmeasure.Stats { 98 return gmeasure.Stats{ 99 Type: gmeasure.StatsTypeDuration, 100 ExperimentName: "Exp-" + name, 101 MeasurementName: name, 102 N: 100, 103 PrecisionBundle: gmeasure.Precision(time.Millisecond * 100), 104 DurationBundle: map[gmeasure.Stat]time.Duration{ 105 gmeasure.StatMin: min, 106 gmeasure.StatMax: max, 107 gmeasure.StatMean: mean, 108 gmeasure.StatMedian: median, 109 gmeasure.StatStdDev: 2.0, 110 }, 111 } 112 } 113 114 BeforeEach(func() { 115 A = makeStats("A", 1*time.Second, 2*time.Second, 3*time.Second, 4*time.Second) 116 B = makeStats("B", 2*time.Second, 3*time.Second, 4*time.Second, 1*time.Second) 117 C = makeStats("C", 3*time.Second, 4*time.Second, 1*time.Second, 2*time.Second) 118 D = makeStats("D", 4*time.Second, 1*time.Second, 2*time.Second, 3*time.Second) 119 }) 120 121 DescribeTable("ranking by criteria", 122 func(criteria gmeasure.RankingCriteria, expectedOrder func() []gmeasure.Stats) { 123 ranking := gmeasure.RankStats(criteria, A, B, C, D) 124 expected := expectedOrder() 125 Ω(ranking.Winner()).Should(Equal(expected[0])) 126 Ω(ranking.Stats).Should(Equal(expected)) 127 }, 128 Entry("entry", gmeasure.LowerMeanIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{C, D, A, B} }), 129 Entry("entry", gmeasure.HigherMeanIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{B, A, D, C} }), 130 Entry("entry", gmeasure.LowerMedianIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{B, C, D, A} }), 131 Entry("entry", gmeasure.HigherMedianIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{A, D, C, B} }), 132 Entry("entry", gmeasure.LowerMinIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{A, B, C, D} }), 133 Entry("entry", gmeasure.HigherMinIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{D, C, B, A} }), 134 Entry("entry", gmeasure.LowerMaxIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{D, A, B, C} }), 135 Entry("entry", gmeasure.HigherMaxIsBetter, func() []gmeasure.Stats { return []gmeasure.Stats{C, B, A, D} }), 136 ) 137 138 Describe("Generating Reports", func() { 139 It("can generate an unstyled report", func() { 140 ranking := gmeasure.RankStats(gmeasure.LowerMeanIsBetter, A, B, C, D) 141 Ω(ranking.String()).Should(Equal(strings.Join([]string{ 142 "Ranking Criteria: Lower Mean is Better", 143 "Experiment | Name | N | Min | Median | Mean | StdDev | Max", 144 "================================================================", 145 "Exp-C | C | 100 | 3s | 2s | 1s | 0s | 4s ", 146 "*Winner* | *Winner* | | | | | | ", 147 "----------------------------------------------------------------", 148 "Exp-D | D | 100 | 4s | 3s | 2s | 0s | 1s ", 149 "----------------------------------------------------------------", 150 "Exp-A | A | 100 | 1s | 4s | 3s | 0s | 2s ", 151 "----------------------------------------------------------------", 152 "Exp-B | B | 100 | 2s | 1s | 4s | 0s | 3s ", 153 "", 154 }, "\n"))) 155 }) 156 157 It("can generate a styled report", func() { 158 ranking := gmeasure.RankStats(gmeasure.LowerMeanIsBetter, A, B, C, D) 159 Ω(ranking.ColorableString()).Should(Equal(strings.Join([]string{ 160 "{{bold}}Ranking Criteria: Lower Mean is Better", 161 "{{/}}{{bold}}Experiment{{/}} | {{bold}}Name {{/}} | {{bold}}N {{/}} | {{bold}}Min{{/}} | {{bold}}Median{{/}} | {{bold}}Mean{{/}} | {{bold}}StdDev{{/}} | {{bold}}Max{{/}}", 162 "================================================================", 163 "{{bold}}Exp-C {{/}} | {{bold}}C {{/}} | {{bold}}100{{/}} | {{bold}}3s {{/}} | {{bold}}2s {{/}} | {{bold}}1s {{/}} | {{bold}}0s {{/}} | {{bold}}4s {{/}}", 164 "{{bold}}*Winner* {{/}} | {{bold}}*Winner*{{/}} | | | | | | ", 165 "----------------------------------------------------------------", 166 "Exp-D | D | 100 | 4s | 3s | 2s | 0s | 1s ", 167 "----------------------------------------------------------------", 168 "Exp-A | A | 100 | 1s | 4s | 3s | 0s | 2s ", 169 "----------------------------------------------------------------", 170 "Exp-B | B | 100 | 2s | 1s | 4s | 0s | 3s ", 171 "", 172 }, "\n"))) 173 }) 174 }) 175 }) 176 177 })