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  }