Skip to content
Snippets Groups Projects
TEquivalenceClasses.hs 1.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • module TEquivalenceClasses where
    
    
    import Data.List (elemIndex)
    
    import Data.List.Split (splitOn)
    
    import System.IO.Silently (silence)
    import System.IO.Unsafe (unsafePerformIO)
    import Control.Monad
    
    import Test.HUnit
    
    import SimpleFormulaChecker (compareSpec, parseMethodIds)
    
    
    testEquiv :: Bool -> String -> String -> String -> Assertion
    testEquiv b src s s' =
      unsafePerformIO (id $ compareSpec (src, s) (src, s')) @?= b
    
    (.==) = testEquiv True
    (.!=) = testEquiv False
    
    
    genEquivTests edslSrc =
    
      let methodIds = unsafePerformIO (silence $ parseMethodIds edslSrc)
          getClass = last . splitOn "_"
    
          tailFrom :: Eq a => [a] -> a -> [a]
          tailFrom xs x = case elemIndex x xs of Just i  -> snd $ splitAt i xs
                                                 Nothing -> []
    
      in [ a `op` b | a <- methodIds
    
                    , b <- methodIds `tailFrom` a
    
                    , a /= b
    
                    , let op = unsafePerformIO $ do
                            let eq = getClass a == getClass b
                            putStrLn $ foldl1 (++)
                              ["  (", a, if eq then " == " else " != ", b, ")"]
    
                            return $ (if eq then (.==) else (.!=)) edslSrc