mirror of
https://github.com/golang/go
synced 2024-11-25 11:37:57 -07:00
testing: fix rounding error in roundDown10
Fixes #5599. Thanks to minux.ma for the suggested fix. As we now have a harness to test testing internal functions I added some coverage for testing.roundUp, as it is the main consumer of roundDown10. R=minux.ma, kr, r CC=golang-dev https://golang.org/cl/9926043
This commit is contained in:
parent
83d4cd758c
commit
a28609d66f
@ -138,7 +138,7 @@ func max(x, y int) int {
|
|||||||
func roundDown10(n int) int {
|
func roundDown10(n int) int {
|
||||||
var tens = 0
|
var tens = 0
|
||||||
// tens = floor(log_10(n))
|
// tens = floor(log_10(n))
|
||||||
for n > 10 {
|
for n >= 10 {
|
||||||
n = n / 10
|
n = n / 10
|
||||||
tens++
|
tens++
|
||||||
}
|
}
|
||||||
@ -153,14 +153,17 @@ func roundDown10(n int) int {
|
|||||||
// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
|
// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
|
||||||
func roundUp(n int) int {
|
func roundUp(n int) int {
|
||||||
base := roundDown10(n)
|
base := roundDown10(n)
|
||||||
if n < (2 * base) {
|
switch {
|
||||||
|
case n <= base:
|
||||||
|
return base
|
||||||
|
case n <= (2 * base):
|
||||||
return 2 * base
|
return 2 * base
|
||||||
}
|
case n <= (5 * base):
|
||||||
if n < (5 * base) {
|
|
||||||
return 5 * base
|
return 5 * base
|
||||||
}
|
default:
|
||||||
return 10 * base
|
return 10 * base
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// run times the benchmark function in a separate goroutine.
|
// run times the benchmark function in a separate goroutine.
|
||||||
func (b *B) run() BenchmarkResult {
|
func (b *B) run() BenchmarkResult {
|
||||||
|
@ -13,19 +13,46 @@ var roundDownTests = []struct {
|
|||||||
}{
|
}{
|
||||||
{1, 1},
|
{1, 1},
|
||||||
{9, 1},
|
{9, 1},
|
||||||
{10, 1},
|
{10, 10},
|
||||||
{11, 10},
|
{11, 10},
|
||||||
{100, 10},
|
{100, 100},
|
||||||
// {101, 100}, // issue 5599
|
{101, 100},
|
||||||
{1000, 100},
|
{999, 100},
|
||||||
// {1001, 1000}, // issue 5599
|
{1000, 1000},
|
||||||
|
{1001, 1000},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRoundDown10(t *testing.T) {
|
func TestRoundDown10(t *testing.T) {
|
||||||
for _, tt := range roundDownTests {
|
for _, tt := range roundDownTests {
|
||||||
actual := testing.RoundDown10(tt.v)
|
actual := testing.RoundDown10(tt.v)
|
||||||
if tt.expected != actual {
|
if tt.expected != actual {
|
||||||
t.Errorf("roundDown10: expected %v, actual %v", tt.expected, actual)
|
t.Errorf("roundDown10(%d): expected %d, actual %d", tt.v, tt.expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var roundUpTests = []struct {
|
||||||
|
v, expected int
|
||||||
|
}{
|
||||||
|
{0, 1},
|
||||||
|
{1, 1},
|
||||||
|
{2, 2},
|
||||||
|
{5, 5},
|
||||||
|
{9, 10},
|
||||||
|
{999, 1000},
|
||||||
|
{1000, 1000},
|
||||||
|
{1400, 2000},
|
||||||
|
{1700, 2000},
|
||||||
|
{4999, 5000},
|
||||||
|
{5000, 5000},
|
||||||
|
{5001, 10000},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRoundUp(t *testing.T) {
|
||||||
|
for _, tt := range roundUpTests {
|
||||||
|
actual := testing.RoundUp(tt.v)
|
||||||
|
if tt.expected != actual {
|
||||||
|
t.Errorf("roundUp(%d): expected %d, actual %d", tt.v, tt.expected, actual)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,4 +4,7 @@
|
|||||||
|
|
||||||
package testing
|
package testing
|
||||||
|
|
||||||
var RoundDown10 = roundDown10
|
var (
|
||||||
|
RoundDown10 = roundDown10
|
||||||
|
RoundUp = roundUp
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user