diff --git a/.gitignore b/.gitignore index e6876c8..8adf10f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ bin/ coverage-html .DS_Store flake.lock +tags diff --git a/dataframe.cabal b/dataframe.cabal index 631b367..69f4838 100644 --- a/dataframe.cabal +++ b/dataframe.cabal @@ -201,7 +201,8 @@ test-suite tests Operations.Subset, Operations.Statistics, Operations.Take, - Parquet + Parquet, + Monad build-depends: base >= 4 && < 5, dataframe ^>= 0.4, directory >= 1.3.0.0 && < 2, diff --git a/tests/GenDataFrame.hs b/tests/GenDataFrame.hs index b7d9250..c4d63ac 100644 --- a/tests/GenDataFrame.hs +++ b/tests/GenDataFrame.hs @@ -21,8 +21,8 @@ genColumn len = genDataFrame :: Gen DataFrame genDataFrame = do - numRows <- choose (0, 100) - numCols <- choose (0, 10) + numRows <- choose (100, 1000) + numCols <- choose (1, 10) colNames <- V.fromList <$> vectorOf numCols genUniqueColName cols <- V.fromList <$> vectorOf numCols (genColumn numRows) let indices = M.fromList $ zip (V.toList colNames) [0 ..] diff --git a/tests/Main.hs b/tests/Main.hs index 1455ffd..37820ed 100644 --- a/tests/Main.hs +++ b/tests/Main.hs @@ -18,6 +18,7 @@ import Test.HUnit import Test.QuickCheck import qualified Functions +import qualified Monad import qualified Operations.Aggregations import qualified Operations.Apply import qualified Operations.Core @@ -5138,6 +5139,10 @@ main = do mapM (quickCheckWithResult stdArgs) Operations.Subset.tests - if failures result > 0 || errors result > 0 || not (all isSuccessful propRes) + monadRes <- mapM (quickCheckWithResult stdArgs) Monad.tests + if failures result > 0 + || errors result > 0 + || not (all isSuccessful propRes) + || not (all isSuccessful monadRes) then Exit.exitFailure else Exit.exitSuccess diff --git a/tests/Monad.hs b/tests/Monad.hs new file mode 100644 index 0000000..03e9390 --- /dev/null +++ b/tests/Monad.hs @@ -0,0 +1,27 @@ +module Monad where + +import qualified DataFrame as D +import DataFrame.Internal.DataFrame +import DataFrame.Monad +import GenDataFrame () +import System.Random +import Test.QuickCheck +import Test.QuickCheck.Monadic + +roundToTwoPlaces x = fromIntegral (round (x * 100)) / 100.0 + +prop_sampleM :: DataFrame -> Gen (Gen Property) +prop_sampleM df = monadic' $ do + p <- run $ choose (0.0 :: Double, 1.0 :: Double) + let expectedRate = roundToTwoPlaces p + seed <- run $ choose (0, 1000) + let rowCount = D.nRows df + let colCount = D.nColumns df + pre (colCount > 1 && rowCount > 100) + let finalDf = execFrameM df (sampleM (mkStdGen seed) expectedRate) + let finalRowCount = D.nRows finalDf + let realRate = roundToTwoPlaces $ fromIntegral finalRowCount / fromIntegral rowCount + let diff = abs $ expectedRate - realRate + assert (diff <= 0.11) + +tests = [prop_sampleM]