packages feed

tasty-sugar-2.2.0.0: test/TestStrlen2.hs

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module TestStrlen2 ( strlen2SampleTests ) where

import           Data.List
import           System.FilePath ( (</>) )
import qualified Test.Tasty as TT
import           Test.Tasty.HUnit
import           Test.Tasty.Sugar
import           TestUtils
import           Text.RawString.QQ


testInpPath = "test-data/samples"

testParams = [ ("solver", Just ["z3", "yices", "boolector", "cvc4"])
             , ("loop-merging", Just ["loopmerge", "loop"])
             ]

sugarCube = mkCUBE
            { rootName = "*.c"
            , expectedSuffix = "good"
            , inputDirs = [ testInpPath ]
            , associatedNames = [ ("config", "config")
                                , ("stdio", "print")
                                ]
            , validParams = testParams
            }

strlen2SampleTests :: [TT.TestTree]
strlen2SampleTests =
  let chkCandidate = checkCandidate sugarCube strlen2Samples testInpPath [] 0
  in
    [ testCase "valid sample" $ 24 @=? length (strlen2Samples sugarCube)
    , sugarTestEq "correct found count" sugarCube strlen2Samples 1 length

    , TT.testGroup "candidates"
      [
        chkCandidate "strlen_test2.boolector.boolector.out"
        [ ("solver", Explicit "boolector") ]
      , chkCandidate "strlen_test2.boolector.boolector.print.out"
        [ ("solver", Explicit "boolector") ]
      , chkCandidate "strlen_test2.boolector.good"
        [ ("solver", Explicit "boolector") ]
      , chkCandidate "strlen_test2.boolector.loopmerge.good"
        [ ("loop-merging", Explicit "loopmerge")
        , ("solver", Explicit "boolector")
        ]
      , chkCandidate "strlen_test2.c" []
      , chkCandidate "strlen_test2.cvc4.cvc4.out"
        [ ("solver", Explicit "cvc4") ]
      , chkCandidate "strlen_test2.cvc4.loop.good"
        [ ("loop-merging", Explicit "loop")
        , ("solver", Explicit "cvc4")
        ]
      , chkCandidate "strlen_test2.loopmerge.cvc4.good"
        [ ("loop-merging", Explicit "loopmerge")
        , ("solver", Explicit "cvc4")
        ]
      , chkCandidate "strlen_test2.good" []
      , chkCandidate "strlen_test2.loopmerge.config"
        [ ("loop-merging", Explicit "loopmerge") ]
      , chkCandidate "strlen_test2.loopmerge.stp.out"
        [ ("loop-merging", Explicit "loopmerge")
        ]
      , chkCandidate "strlen_test2.loopmerge.yices.out"
        [ ("loop-merging", Explicit "loopmerge")
        , ("solver", Explicit "yices")
        ]
      , chkCandidate "strlen_test2.loopmerge.yices.print.out"
        [ ("loop-merging", Explicit "loopmerge")
        , ("solver", Explicit "yices")
        ]
      , chkCandidate "strlen_test2.print" []
      , chkCandidate "strlen_test2.stp.out" []
      , chkCandidate "strlen_test2.stp.print.out" []
      , chkCandidate "strlen_test2.yices.out"
        [ ("solver", Explicit "yices") ]
      , chkCandidate "strlen_test2.yices.print.out"
        [ ("solver", Explicit "yices") ]
      , chkCandidate "strlen_test2.z3.good"
        [ ("solver", Explicit "z3") ]
      , chkCandidate "strlen_test2.z3.z3.out"
        [ ("solver", Explicit "z3") ]
      , chkCandidate "strlen_test2.z3.z3.print.out"
        [ ("solver", Explicit "z3") ]
      ]

    , testCaseSteps "sweets info" $ \step -> do
        (sugar,sdesc) <- findSugarIn sugarCube (strlen2Samples sugarCube)
        step "rootMatchName"
        (rootMatchName <$> sugar) @?= ["strlen_test2.c"]
        step "rootBaseName"
        (rootBaseName <$> sugar) @?= ["strlen_test2"]
        step "rootFile"
        (rootFile <$> sugar) @?= [ testInpPath </> "strlen_test2.c" ]
        step "cubeParams"
        (cubeParams <$> sugar) @?= [ validParams sugarCube ]

    , testCase "Expectations" $
      let p = (testInpPath </>)
          exp1 e a f =
            Expectation { expectedFile = p e
                        , expParamsMatch = [("solver", a), ("loop-merging", f)]
                        , associated = [("stdio", p "strlen_test2.print")]
                        }
          exp2 e a f c =
            let e1 = exp1 e a f
            in e1 { associated = ("config", p c) : associated e1 }
          e = Explicit
          a = Assumed
          l = "loop"
          m = "loopmerge"
      in do
        (sugar,sdesc) <- findSugarIn sugarCube (strlen2Samples sugarCube)
        compareBags "expected" (expected $ head sugar)
          [
            exp2 "strlen_test2.boolector.loopmerge.good" (e "boolector") (e m)
            "strlen_test2.loopmerge.config"

          , exp1 "strlen_test2.boolector.good"           (e "boolector") (a l)

          , exp2 "strlen_test2.loopmerge.cvc4.good"      (e "cvc4")      (e m)
            "strlen_test2.loopmerge.config"

          , exp1 "strlen_test2.cvc4.loop.good"           (e "cvc4")      (e l)

          , exp2 "strlen_test2.loopmerge.good"           (a "yices")     (e m)
            "strlen_test2.loopmerge.config"

          , exp1 "strlen_test2.good"                     (a "yices")     (a l)

          , exp2 "strlen_test2.loopmerge.good"           (a "z3")        (e m)
            "strlen_test2.loopmerge.config"

          , exp1 "strlen_test2.z3.good"                  (e "z3")        (a l)

            -- Note that there exists strlen_test2.z3.good and
            -- strlen_test2.loopmerge.good, so this will create
            -- Expectations against _each_ file with different sets of
            -- Assumed and Explicit parameters.
            --
            -- The removeNonExplicitMatchingExpectations function will
            -- then try to select which one has the least number of
            -- explicit matches, but one is always Explicit and one is
            -- always Assumed.  The resuilt then comes down to a
            -- comparison of the values, and "loopmerge" < "z3", so "z3"
            -- is selected as the _maximum_ (i.e. best) match.
            --
            -- Thus, the following Expectation is eliminated.
            --
            -- , Expectation
            --   { expectedFile = p "strlen_test2.loopmerge.good"
            --   , expParamsMatch = [ ("loop-merging", Explicit "loopmerge")
            --                      , ("solver", Assumed "z3")
            --                      ]
            --   , associated = [ ("config", p "strlen_test2.loopmerge.config")
            --                  , ("stdio", p "strlen_test2.print")
            --                  ]
            --   }
          ]
    ]


strlen2Samples cube = fmap (makeCandidate cube "test-data/samples" [])
                      $ filter (not . null)
                      $ lines [r|
strlen_test2.boolector.boolector.out
strlen_test2.boolector.boolector.print.out
strlen_test2.boolector.good
strlen_test2.boolector.loopmerge.good
strlen_test2.c
strlen_test2.cvc4.cvc4.out
strlen_test2.cvc4.cvc4.print.out
strlen_test2.cvc4.loop.good
strlen_test2.loopmerge.cvc4.good
strlen_test2.good
strlen_test2.loopmerge.config
strlen_test2.loopmerge.good
strlen_test2.loopmerge.stp.out
strlen_test2.loopmerge.stp.print.out
strlen_test2.loopmerge.yices.out
strlen_test2.loopmerge.yices.print.out
strlen_test2.print
strlen_test2.stp.out
strlen_test2.stp.print.out
strlen_test2.yices.out
strlen_test2.yices.print.out
strlen_test2.z3.good
strlen_test2.z3.z3.out
strlen_test2.z3.z3.print.out
|]