From d1e2aa6d36bcd5b601f87b1d2674ec9dc37cf78b Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 11 May 2016 17:34:23 +0100 Subject: [PATCH] Use quick.Check instead of many specific tests --- net/address/address_test.go | 41 +++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/net/address/address_test.go b/net/address/address_test.go index 78cdceef..42045ca4 100644 --- a/net/address/address_test.go +++ b/net/address/address_test.go @@ -2,25 +2,40 @@ package address import ( "testing" + "testing/quick" "github.com/stretchr/testify/require" ) +func isPower2(x Count) bool { + if x == 0 { + return false + } + for ; x > 1; x /= 2 { + if x&1 != 0 { + return false + } + } + return true +} + func TestBiggestPow2AlignedRange(t *testing.T) { require.Equal(t, NewRange(0, 1), NewRange(0, 1).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(0, 2), NewRange(0, 2).BiggestPow2AlignedRange()) require.Equal(t, NewRange(0, 2), NewRange(0, 3).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(0, 4), NewRange(0, 7).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(1, 1), NewRange(1, 1).BiggestPow2AlignedRange()) require.Equal(t, NewRange(1, 1), NewRange(1, 2).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(2, 2), NewRange(1, 3).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(2, 2), NewRange(1, 4).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(4, 4), NewRange(1, 8).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(4, 4), NewRange(2, 8).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(4, 4), NewRange(4, 8).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(8, 4), NewRange(8, 7).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(8, 8), NewRange(8, 8).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(0, 0x4000), NewRange(0, 0x7fff).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(0x2000, 2), NewRange(0x2000, 3).BiggestPow2AlignedRange()) - require.Equal(t, NewRange(0xffff, 1), NewRange(0xffff, 1).BiggestPow2AlignedRange()) + require.Equal(t, NewRange(0, 0x40000000), NewRange(0, 0x7fffffff).BiggestPow2AlignedRange()) + require.Equal(t, NewRange(0xfffffffe, 1), NewRange(0xfffffffe, 1).BiggestPow2AlignedRange()) + prop := func(start Address, size Offset) bool { + if size > Offset(0xffffffff)-Offset(start) { // out of range + return true + } + r := NewRange(start, size) + result := r.BiggestPow2AlignedRange() + return r.Contains(result.Start) && + r.Contains(result.End-1) && + isPower2(result.Size()) && + result.Size() > r.Size()/4 && + Count(result.Start)%result.Size() == 0 + } + require.NoError(t, quick.Check(prop, &quick.Config{MaxCount: 1000000})) }