{- | Module : Test.SDP.Split Copyright : (c) Andrey Mulik 2021 License : BSD-style Maintainer : work.a.mulik@gmail.com Portability : portable @Test.SDP.Split@ is service module that provides 'Split' tests. -} module Test.SDP.Split ( -- * Split test TestSplit, TestSplit1, TestSplit2, splitTest, -- ** Particular tests basicSplitTest, whileSplitTest ) where import Prelude () import SDP.SafePrelude import SDP.Linear default () -------------------------------------------------------------------------------- -- | 'TestSplit' is service type synonym for more comfortable quickCheck using. type TestSplit s = Int -> s -> Bool -- | 'TestSplit1' is service type synonym for more comfortable quickCheck using. type TestSplit1 s e = Int -> s e -> Bool -- | 'TestSplit2' is service type synonym for more comfortable quickCheck using. type TestSplit2 s i e = Int -> s i e -> Bool -------------------------------------------------------------------------------- {- | @'splitTest' f n xs@ is default 'Split' test, where @f@ is arbitrary predicate (e.g. "Test.SDP.Gen.orderA"). -} splitTest :: (Split s e, Eq e, Eq s, Bordered s i) => (e -> Bool) -> TestSplit s splitTest f n xs = and [ basicSplitTest n xs, whileSplitTest f xs ] {- | 'basicSplitTest' checks 'take', 'drop', 'sans', 'keep', 'split' and 'divide' correctness and relations. -} basicSplitTest :: (Split s e, Eq e, Eq s, Bordered s i) => TestSplit s basicSplitTest n xs = and [ split n xs == (tx, dx), divide n xs == (sx, kx), listL tx == ty, listL dx == dy, listL sx == sy, listL kx == ky, -- additional tests lx == sizeOf tx + sizeOf dx, lx == sizeOf sx + sizeOf kx ] where lx = sizeOf xs ys = listL xs tx = take n xs; ty = take n ys dx = drop n xs; dy = drop n ys sx = sans n xs; sy = sans n ys kx = keep n xs; ky = keep n ys {- | 'whileSplitTest' checks 'takeWhile', 'dropWhile', 'takeEnd', 'dropEnd', 'spanl', 'spanr', 'breakl' and 'breakr' correctness and relations. -} whileSplitTest :: (Split s e, Eq e, Eq s, Bordered s i) => (e -> Bool) -> s -> Bool whileSplitTest f xs = and [ spanl f xs == (tx, dx), breakl f xs == (ntx, ndx), spanr f xs == (sx, kx), breakr f xs == (nsx, nkx), listL tx == ty, listL dx == dy, listL sx == sy, listL kx == ky, -- additional tests lx == sizeOf tx + sizeOf dx, lx == sizeOf sx + sizeOf kx, lx == sizeOf ntx + sizeOf ndx, lx == sizeOf nsx + sizeOf nkx ] where lx = sizeOf xs ys = listL xs tx = takeWhile f xs; ty = takeWhile f ys; ntx = takeWhile (not . f) xs dx = dropWhile f xs; dy = dropWhile f ys; ndx = dropWhile (not . f) xs sx = dropEnd f xs; sy = dropEnd f ys; nsx = dropEnd (not . f) xs kx = takeEnd f xs; ky = takeEnd f ys; nkx = takeEnd (not . f) xs