mirror of
https://github.com/golang/go
synced 2024-11-25 06:57:58 -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 {
|
||||
var tens = 0
|
||||
// tens = floor(log_10(n))
|
||||
for n > 10 {
|
||||
for n >= 10 {
|
||||
n = n / 10
|
||||
tens++
|
||||
}
|
||||
@ -153,13 +153,16 @@ func roundDown10(n int) int {
|
||||
// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
|
||||
func roundUp(n int) int {
|
||||
base := roundDown10(n)
|
||||
if n < (2 * base) {
|
||||
switch {
|
||||
case n <= base:
|
||||
return base
|
||||
case n <= (2 * base):
|
||||
return 2 * base
|
||||
}
|
||||
if n < (5 * base) {
|
||||
case n <= (5 * base):
|
||||
return 5 * base
|
||||
default:
|
||||
return 10 * base
|
||||
}
|
||||
return 10 * base
|
||||
}
|
||||
|
||||
// run times the benchmark function in a separate goroutine.
|
||||
|
@ -13,19 +13,46 @@ var roundDownTests = []struct {
|
||||
}{
|
||||
{1, 1},
|
||||
{9, 1},
|
||||
{10, 1},
|
||||
{10, 10},
|
||||
{11, 10},
|
||||
{100, 10},
|
||||
// {101, 100}, // issue 5599
|
||||
{1000, 100},
|
||||
// {1001, 1000}, // issue 5599
|
||||
{100, 100},
|
||||
{101, 100},
|
||||
{999, 100},
|
||||
{1000, 1000},
|
||||
{1001, 1000},
|
||||
}
|
||||
|
||||
func TestRoundDown10(t *testing.T) {
|
||||
for _, tt := range roundDownTests {
|
||||
actual := testing.RoundDown10(tt.v)
|
||||
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
|
||||
|
||||
var RoundDown10 = roundDown10
|
||||
var (
|
||||
RoundDown10 = roundDown10
|
||||
RoundUp = roundUp
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user