2018-03-09 20:07:34 +03:00
|
|
|
module Integration.Spec (spec) where
|
2017-02-22 01:02:31 +03:00
|
|
|
|
2018-04-18 23:33:17 +03:00
|
|
|
import Data.Foldable (find, traverse_, for_)
|
2017-04-03 23:34:25 +03:00
|
|
|
import Data.List (union, concat, transpose)
|
2018-03-13 21:04:58 +03:00
|
|
|
import qualified Data.ByteString as B
|
2017-02-22 01:02:31 +03:00
|
|
|
import System.FilePath.Glob
|
2018-04-18 23:33:17 +03:00
|
|
|
import System.FilePath.Posix
|
2018-03-13 21:04:58 +03:00
|
|
|
|
2017-04-19 19:12:19 +03:00
|
|
|
import SpecHelpers
|
2017-02-22 01:02:31 +03:00
|
|
|
|
2018-04-18 23:33:17 +03:00
|
|
|
languages :: [FilePath]
|
2018-06-27 19:55:58 +03:00
|
|
|
languages = ["go", "javascript", "json", "python", "ruby", "typescript"]
|
2018-03-13 21:10:50 +03:00
|
|
|
|
2019-02-02 02:04:23 +03:00
|
|
|
spec :: TaskSession -> Spec
|
2018-07-10 20:49:34 +03:00
|
|
|
spec config = parallel $ do
|
2018-04-18 23:33:17 +03:00
|
|
|
for_ languages $ \language -> do
|
|
|
|
let dir = "test/fixtures" </> language </> "corpus"
|
|
|
|
it (language <> " corpus exists") $ examples dir `shouldNotReturn` []
|
|
|
|
describe (language <> " corpus") $ runTestsIn dir []
|
2017-02-22 01:02:31 +03:00
|
|
|
|
|
|
|
where
|
2017-09-26 19:26:13 +03:00
|
|
|
runTestsIn :: FilePath -> [(FilePath, String)] -> SpecWith ()
|
2017-09-26 19:23:16 +03:00
|
|
|
runTestsIn directory pending = do
|
2017-02-22 03:05:08 +03:00
|
|
|
examples <- runIO $ examples directory
|
2017-09-26 19:23:16 +03:00
|
|
|
traverse_ (runTest pending) examples
|
2018-07-10 20:49:34 +03:00
|
|
|
runTest pending ParseExample{..} = it ("parses " <> file) $ maybe (testParse config file parseOutput) pendingWith (lookup parseOutput pending)
|
2019-01-10 23:53:15 +03:00
|
|
|
runTest pending DiffExample{..} = it ("diffs " <> diffOutput) $ maybe (testDiff config (Both fileA fileB) diffOutput) pendingWith (lookup diffOutput pending)
|
2017-02-22 01:02:31 +03:00
|
|
|
|
2017-02-22 22:31:56 +03:00
|
|
|
data Example = DiffExample { fileA :: FilePath, fileB :: FilePath, diffOutput :: FilePath }
|
|
|
|
| ParseExample { file :: FilePath, parseOutput :: FilePath }
|
2017-02-22 03:30:39 +03:00
|
|
|
deriving (Eq, Show)
|
2017-02-22 01:02:31 +03:00
|
|
|
|
|
|
|
-- | Return all the examples from the given directory. Examples are expected to
|
2017-02-22 19:32:19 +03:00
|
|
|
-- | have the form:
|
2017-02-22 01:02:31 +03:00
|
|
|
-- |
|
2017-02-23 01:07:47 +03:00
|
|
|
-- | example-name.A.rb - The left hand side of the diff.
|
|
|
|
-- | example-name.B.rb - The right hand side of the diff.
|
2017-02-22 03:05:08 +03:00
|
|
|
-- |
|
2017-02-23 01:07:47 +03:00
|
|
|
-- | example-name.diffA-B.txt - The expected sexpression diff output for A -> B.
|
|
|
|
-- | example-name.diffB-A.txt - The expected sexpression diff output for B -> A.
|
2017-02-22 03:05:08 +03:00
|
|
|
-- |
|
2017-02-23 01:07:47 +03:00
|
|
|
-- | example-name.parseA.txt - The expected sexpression parse tree for example-name.A.rb
|
|
|
|
-- | example-name.parseB.txt - The expected sexpression parse tree for example-name.B.rb
|
2017-02-22 03:30:39 +03:00
|
|
|
examples :: FilePath -> IO [Example]
|
2017-02-22 01:02:31 +03:00
|
|
|
examples directory = do
|
|
|
|
as <- globFor "*.A.*"
|
|
|
|
bs <- globFor "*.B.*"
|
2017-02-22 22:31:56 +03:00
|
|
|
sExpAs <- globFor "*.parseA.txt"
|
|
|
|
sExpBs <- globFor "*.parseB.txt"
|
|
|
|
sExpDiffsAB <- globFor "*.diffA-B.txt"
|
|
|
|
sExpDiffsBA <- globFor "*.diffB-A.txt"
|
2017-02-22 01:02:31 +03:00
|
|
|
|
2017-02-27 22:24:52 +03:00
|
|
|
let exampleDiff lefts rights out name = DiffExample (lookupNormalized name lefts) (lookupNormalized name rights) out
|
2017-02-23 01:07:47 +03:00
|
|
|
let exampleParse files out name = ParseExample (lookupNormalized name files) out
|
2017-02-22 01:02:31 +03:00
|
|
|
|
|
|
|
let keys = (normalizeName <$> as) `union` (normalizeName <$> bs)
|
2017-02-27 22:24:52 +03:00
|
|
|
pure $ merge [ getExamples (exampleParse as) sExpAs keys
|
|
|
|
, getExamples (exampleParse bs) sExpBs keys
|
|
|
|
, getExamples (exampleDiff as bs) sExpDiffsAB keys
|
|
|
|
, getExamples (exampleDiff bs as) sExpDiffsBA keys ]
|
2017-02-22 01:02:31 +03:00
|
|
|
where
|
2017-02-27 22:24:52 +03:00
|
|
|
merge = concat . transpose
|
2017-02-23 01:07:47 +03:00
|
|
|
-- Only returns examples if they exist
|
|
|
|
getExamples f list = foldr (go f list) []
|
|
|
|
where go f list name acc = case lookupNormalized' name list of
|
|
|
|
Just out -> f out name : acc
|
|
|
|
Nothing -> acc
|
|
|
|
|
2017-02-22 03:05:08 +03:00
|
|
|
lookupNormalized :: FilePath -> [FilePath] -> FilePath
|
|
|
|
lookupNormalized name xs = fromMaybe
|
2017-07-28 21:37:02 +03:00
|
|
|
(error ("cannot find " <> name <> " make sure .A, .B and exist."))
|
2017-02-23 01:07:47 +03:00
|
|
|
(lookupNormalized' name xs)
|
|
|
|
|
|
|
|
lookupNormalized' :: FilePath -> [FilePath] -> Maybe FilePath
|
|
|
|
lookupNormalized' name = find ((== name) . normalizeName)
|
|
|
|
|
2017-02-22 01:02:31 +03:00
|
|
|
globFor :: FilePath -> IO [FilePath]
|
|
|
|
globFor p = globDir1 (compile p) directory
|
|
|
|
|
2017-02-22 03:05:08 +03:00
|
|
|
-- | Given a test name like "foo.A.js", return "foo".
|
2017-02-22 01:02:31 +03:00
|
|
|
normalizeName :: FilePath -> FilePath
|
|
|
|
normalizeName path = dropExtension $ dropExtension path
|
|
|
|
|
2019-02-02 02:04:23 +03:00
|
|
|
testParse :: TaskSession -> FilePath -> FilePath -> Expectation
|
|
|
|
testParse session path expectedOutput = do
|
|
|
|
actual <- verbatim <$> parseFilePath session path
|
2017-04-19 23:25:46 +03:00
|
|
|
expected <- verbatim <$> B.readFile expectedOutput
|
2017-02-22 19:32:19 +03:00
|
|
|
actual `shouldBe` expected
|
|
|
|
|
2019-02-02 02:04:23 +03:00
|
|
|
testDiff :: TaskSession -> Both FilePath -> FilePath -> Expectation
|
2018-07-10 20:49:34 +03:00
|
|
|
testDiff config paths expectedOutput = do
|
|
|
|
actual <- verbatim <$> diffFilePaths config paths
|
2017-04-19 23:25:46 +03:00
|
|
|
expected <- verbatim <$> B.readFile expectedOutput
|
2017-02-22 03:05:08 +03:00
|
|
|
actual `shouldBe` expected
|