packages feed

arithmoi-0.4.2.0: test-suite/Math/NumberTheory/Primes/HeapTests.hs

-- |
-- Module:      Math.NumberTheory.Primes.HeapTests
-- Copyright:   (c) 2016 Andrew Lelechenko
-- Licence:     MIT
-- Maintainer:  Andrew Lelechenko <andrew.lelechenko@gmail.com>
-- Stability:   Provisional
--
-- Tests for Math.NumberTheory.Primes.Heap
--

{-# LANGUAGE CPP #-}

{-# OPTIONS_GHC -fno-warn-type-defaults #-}

module Math.NumberTheory.Primes.HeapTests
  ( testSuite
  ) where

import Prelude hiding (words)

import Test.Tasty
import Test.Tasty.HUnit

#if MIN_VERSION_base(4,8,0)
#else
import Data.Word
#endif

import Math.NumberTheory.Primes.Heap
import Math.NumberTheory.Primes.Testing
import Math.NumberTheory.TestUtils

-- | Check that 'primes' over different integral types matches with 'isPrime'.
primesProperty1 :: Assertion
primesProperty1 = do
  assertEqual "ints  == integers" (trim ints)  (trim integers)
  assertEqual "words == integers" (trim words) (trim integers)
  assertEqual "naive == integers" (trim naive) (trim integers)
  where
    trim :: Integral a => [a] -> [Integer]
    trim = map toInteger . take 100000

    ints     = primes :: [Int]
    words    = primes :: [Word]
    integers = primes :: [Integer]
    naive    = filter isPrime [1..] :: [Integer]

-- | Check that 'sieveFrom' over different integral types matches with 'isPrime'.
sieveFromProperty1 :: NonNegative Integer -> Bool
sieveFromProperty1 (NonNegative lowBound)
  =  trim ints  == trim integers
  && trim words == trim integers
  && trim naive == trim integers
  where
    trim :: Integral a => [a] -> [Integer]
    trim = map toInteger . take 1000

    ints     = sieveFrom (fromInteger lowBound) :: [Int]
    words    = sieveFrom (fromInteger lowBound) :: [Word]
    integers = sieveFrom lowBound               :: [Integer]
    naive    = filter isPrime [lowBound..]      :: [Integer]

testSuite :: TestTree
testSuite = testGroup "Heap"
  [ testCase          "primes"    primesProperty1
  , testSmallAndQuick "sieveFrom" sieveFromProperty1
  ]