Skip to content

Commit 2dec9a7

Browse files
committed
Merge pull request #27 from purescript/lcg
Use Number type to avoid overflows in lcgNext
2 parents b4a3a03 + 61ce30f commit 2dec9a7

File tree

5 files changed

+16
-3
lines changed

5 files changed

+16
-3
lines changed

docs/Test/QuickCheck.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ instance showResult :: Show Result
100100
(<?>) :: Boolean -> String -> Result
101101
```
102102

103+
_left-associative / precedence -1_
104+
103105
This operator attaches an error message to a failed test.
104106

105107
For example:
@@ -114,6 +116,8 @@ test x = myProperty x <?> ("myProperty did not hold for " <> show x)
114116
(===) :: forall a b. (Eq a, Show a) => a -> a -> Result
115117
```
116118

119+
_left-associative / precedence -1_
120+
117121
Self-documenting equality assertion
118122

119123
#### `(/==)`
@@ -122,6 +126,8 @@ Self-documenting equality assertion
122126
(/==) :: forall a b. (Eq a, Show a) => a -> a -> Result
123127
```
124128

129+
_left-associative / precedence -1_
130+
125131
Self-documenting inequality assertion
126132

127133

docs/Test/QuickCheck/Data/ApproxNumber.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ instance numApproxNumber :: Num ApproxNumber
2929
(=~=) :: Number -> Number -> Boolean
3030
```
3131

32+
_left-associative / precedence -1_
33+
3234

docs/Test/QuickCheck/LCG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,6 @@ Step the linear congruential generator
4444
randomSeed :: forall e. Eff (random :: RANDOM | e) Seed
4545
```
4646

47+
Create a random seed
48+
4749

src/Test/QuickCheck.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ quickCheck' n prop = do
4646
seed <- randomSeed
4747
let results = quickCheckPure seed n prop
4848
let successes = countSuccesses results
49-
log $ show (toNumber successes) ++ "/" ++ show (toNumber n) ++ " test(s) passed."
49+
log $ show successes ++ "/" ++ show n ++ " test(s) passed."
5050
throwOnFirstFailure one results
5151

5252
where
5353

5454
throwOnFirstFailure :: Int -> List Result -> QC Unit
5555
throwOnFirstFailure _ Nil = return unit
56-
throwOnFirstFailure n (Cons (Failed msg) _) = throwException $ error $ "Test " ++ show (toNumber n) ++ " failed: \n" ++ msg
56+
throwOnFirstFailure n (Cons (Failed msg) _) = throwException $ error $ "Test " ++ show n ++ " failed: \n" ++ msg
5757
throwOnFirstFailure n (Cons _ rest) = throwOnFirstFailure (n + one) rest
5858

5959
countSuccesses :: List Result -> Int

src/Test/QuickCheck/LCG.purs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ module Test.QuickCheck.LCG
99

1010
import Prelude
1111

12+
import Math ((%))
1213
import Control.Monad.Eff (Eff())
1314
import Control.Monad.Eff.Random (RANDOM(), randomInt)
1415
import Data.Int (fromNumber, toNumber)
1516
import Data.Int.Bits (shl)
17+
import qualified Data.Maybe.Unsafe as U
1618

1719
type Seed = Int
1820

@@ -30,7 +32,8 @@ lcgN = one `shl` 30
3032

3133
-- | Step the linear congruential generator
3234
lcgNext :: Int -> Int
33-
lcgNext n = (lcgM * n + lcgC) `mod` lcgN
35+
lcgNext n = U.fromJust $ fromNumber $ (toNumber lcgM * toNumber n + toNumber lcgC) % toNumber lcgN
3436

37+
-- | Create a random seed
3538
randomSeed :: forall e. Eff (random :: RANDOM | e) Seed
3639
randomSeed = randomInt 0 lcgM

0 commit comments

Comments
 (0)