github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/args/primes_test.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package args 7 8 import ( 9 "math" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 const firstOddPrimeIndex = 1 16 17 func TestPrime(t *testing.T) { 18 require.Equal(t, 2, Prime(0)) 19 require.Equal(t, 3, Prime(1)) 20 require.Equal(t, MaxPrime, Prime(PrimeCount-1)) 21 22 // at least for math.MaxUint16 23 require.Equal(t, 65521, Primes().Floor(math.MaxUint16)) 24 require.Equal(t, 65537, Primes().Ceiling(math.MaxUint16)) 25 require.Equal(t, 65521, OddPrimes().Floor(math.MaxUint16)) 26 require.Equal(t, 65537, OddPrimes().Ceiling(math.MaxUint16)) 27 require.Equal(t, 65497, IsolatedOddPrimes().Floor(math.MaxUint16)) 28 require.Equal(t, 65543, IsolatedOddPrimes().Ceiling(math.MaxUint16)) 29 } 30 31 func TestPrimeMaxAndCount(t *testing.T) { 32 require.Equal(t, PrimeCount, len(primes)+len(primesOverUint16)) 33 require.Equal(t, MaxPrime, int(primesOverUint16[len(primesOverUint16)-1])) 34 35 prev := int(primes[0]) 36 for i := firstOddPrimeIndex; i < PrimeCount; i++ { 37 p := Prime(i) 38 require.Equal(t, 1, p&1, i) 39 require.Less(t, prev, p, i) 40 prev = p 41 } 42 } 43 44 func TestPrimes(t *testing.T) { 45 for i, p := range primes { 46 for _, pp := range primes[i+1:] { 47 if pp%p == 0 { 48 require.Fail(t, "invalid prime", "%d mod %d=%d", pp, p, pp%p) 49 } 50 } 51 } 52 } 53 54 func TestAllPrimes(t *testing.T) { 55 pl := Primes() 56 for i := pl.Len() - 1; i >= 0; i-- { 57 require.Equal(t, Prime(i), pl.Prime(i), i) 58 } 59 } 60 61 func TestOddPrimes(t *testing.T) { 62 pl := OddPrimes() 63 for i := pl.Len() - 1; i >= 0; i-- { 64 require.Equal(t, Prime(i+firstOddPrimeIndex), pl.Prime(i), i) 65 } 66 } 67 68 func TestIsolatedPrimes(t *testing.T) { 69 op := IsolatedOddPrimes() 70 n := 0 71 72 for i := 1; i < PrimeCount; i++ { 73 p := Prime(i) 74 if Prime(i-1) == p-2 || Prime(i+1) == p+2 { 75 continue 76 } 77 require.Equal(t, p, op.Prime(n)) 78 n++ 79 if n == op.Len() { 80 return 81 } 82 } 83 require.Fail(t, "insufficient number of isolated primes") 84 } 85 86 func TestOddCeilingPrime(t *testing.T) { 87 op := OddPrimes() 88 require.Equal(t, 3, op.Ceiling(-1)) 89 require.Equal(t, 3, op.Ceiling(0)) 90 require.Equal(t, 3, op.Ceiling(1)) 91 require.Equal(t, 3, op.Ceiling(2)) 92 require.Equal(t, 3, op.Ceiling(3)) 93 94 for i := 1; i < op.Len(); i++ { 95 p := Prime(i + firstOddPrimeIndex) 96 for j := Prime(i) + 1; j <= p; j++ { 97 require.Equal(t, p, op.Ceiling(int(j))) 98 } 99 } 100 101 require.Equal(t, op.Max(), op.Ceiling(op.Max())) 102 require.Equal(t, op.Max(), op.Ceiling(op.Max()+1)) 103 require.Equal(t, op.Max(), op.Ceiling(MaxPrime)) 104 require.Equal(t, op.Max(), op.Ceiling(MaxPrime+1)) 105 //require.Panics(t, func() { 106 // op.CeilingPrime(MaxPrime + 1) 107 //}) 108 } 109 110 func TestFloorOddPrime(t *testing.T) { 111 op := OddPrimes() 112 require.Equal(t, op.Min(), op.Floor(-1)) 113 require.Equal(t, op.Min(), op.Floor(0)) 114 require.Equal(t, op.Min(), op.Floor(1)) 115 require.Equal(t, op.Min(), op.Floor(2)) 116 require.Equal(t, op.Min(), op.Floor(3)) 117 118 for i := 0; i < op.Len()-1; i++ { 119 p := Prime(i + firstOddPrimeIndex) 120 for j := Prime(i+firstOddPrimeIndex) - 1; j >= p; j-- { 121 require.Equal(t, p, op.Floor(int(j))) 122 } 123 } 124 125 require.Equal(t, op.Max(), op.Floor(op.Max())) 126 require.Equal(t, op.Max(), op.Floor(op.Max()+1)) 127 require.Equal(t, op.Max(), op.Floor(MaxPrime)) 128 require.Equal(t, op.Max(), op.Floor(MaxPrime+1)) 129 } 130 131 func TestNearestOddPrime(t *testing.T) { 132 op := OddPrimes() 133 require.Equal(t, 3, op.Nearest(-1)) 134 require.Equal(t, 3, op.Nearest(0)) 135 require.Equal(t, 3, op.Nearest(1)) 136 require.Equal(t, 3, op.Nearest(2)) 137 require.Equal(t, 3, op.Nearest(3)) 138 require.Equal(t, 3, op.Nearest(4)) 139 require.Equal(t, 5, op.Nearest(5)) 140 require.Equal(t, 5, op.Nearest(6)) 141 require.Equal(t, 7, op.Nearest(7)) 142 require.Equal(t, 7, op.Nearest(8)) 143 require.Equal(t, 7, op.Nearest(9)) 144 require.Equal(t, 11, op.Nearest(10)) 145 require.Equal(t, 11, op.Nearest(11)) 146 require.Equal(t, 11, op.Nearest(12)) 147 require.Equal(t, 13, op.Nearest(13)) 148 require.Equal(t, 13, op.Nearest(14)) 149 require.Equal(t, 13, op.Nearest(15)) 150 require.Equal(t, 17, op.Nearest(16)) 151 require.Equal(t, 17, op.Nearest(17)) 152 require.Equal(t, 17, op.Nearest(18)) 153 require.Equal(t, 19, op.Nearest(19)) 154 require.Equal(t, 19, op.Nearest(20)) 155 require.Equal(t, 19, op.Nearest(21)) 156 require.Equal(t, 23, op.Nearest(22)) 157 require.Equal(t, 23, op.Nearest(23)) 158 require.Equal(t, 23, op.Nearest(24)) 159 require.Equal(t, 23, op.Nearest(25)) 160 require.Equal(t, 23, op.Nearest(26)) 161 require.Equal(t, 29, op.Nearest(27)) 162 require.Equal(t, 29, op.Nearest(28)) 163 require.Equal(t, 29, op.Nearest(29)) 164 165 require.Equal(t, op.Max(), op.Nearest(op.Max())) 166 require.Equal(t, op.Max(), op.Nearest(op.Max()+1)) 167 require.Equal(t, op.Max(), op.Nearest(MaxPrime)) 168 require.Equal(t, op.Max(), op.Nearest(MaxPrime+1)) 169 }