packages feed

fitspec-0.4.7: eg/sorting.hs

-- Minimal example: mutation testing a sort specification
--
-- (this program might take a minute to run depending on your system)
--
-- Usage:
--
-- $ ghc -O2 sorting.hs
-- $ ./sorting
-- Apparent incomplete and non-minimal specification based on
-- 4000 test cases for each of properties 1, 2, 3, 4 and 5
-- for each of 4000 mutant variations.
--
-- 3 survivors (99% killed), smallest:
--   \xs -> case xs of
--            [0,0,1] -> [0,1,1]
--            _ -> sort xs
--
-- apparent minimal property subsets:  {1,2,3} {1,2,4}
-- conjectures:  {3}    =  {4}     96% killed (weak)
--               {1,3} ==> {5}     98% killed (weak)

import Test.FitSpec
import Data.List (sort)

properties sort =
  [ property $ \xs   -> ordered (sort xs)
  , property $ \xs   -> length (sort xs) == length xs
  , property $ \x xs -> elem x (sort xs) == elem x xs
  , property $ \x xs -> notElem x (sort xs) == notElem x xs
  , property $ \x xs -> minimum (x:xs) == head (sort (x:xs))
  ]
  where
  ordered (x:y:xs) = x <= y && ordered (y:xs)
  ordered _        = True

main =
  mainWith args { names = ["sort xs"]
                , nMutants = 4000
                , nTests   = 4000
                , timeout  = 0
                }
           (sort::[Word2]->[Word2])
           properties