1
1
mirror of https://github.com/github/semantic.git synced 2024-11-28 18:23:44 +03:00
semantic/test/CorpusSpec.hs

68 lines
2.5 KiB
Haskell
Raw Normal View History

2016-02-16 20:33:41 +03:00
module CorpusSpec where
2016-02-17 00:38:31 +03:00
import Diffing
2016-02-17 23:54:37 +03:00
import Renderer
2016-02-17 00:38:31 +03:00
import Unified
import Data.Bifunctor.Join
import qualified Data.ByteString.Char8 as B1
import Data.List as List
import Data.Map as Map
import Data.Set as Set
2016-02-17 23:54:37 +03:00
import qualified Data.Text as T
2016-02-17 00:38:31 +03:00
import Rainbow
import System.FilePath
import System.FilePath.Glob
2016-02-16 20:33:41 +03:00
import Test.Hspec
spec :: Spec
spec = do
2016-02-17 00:38:31 +03:00
describe "crashers should not crash" $ runTestsIn "test/crashers/"
describe "should produce the correct diff" $ runTestsIn "test/diffs/"
2016-02-17 20:54:42 +03:00
it "lists example fixtures" $ do
2016-02-17 00:38:31 +03:00
examples "test/crashers/" `shouldNotReturn` []
2016-02-17 20:54:42 +03:00
examples "test/diffs/" `shouldNotReturn` []
2016-02-17 00:38:31 +03:00
where
runTestsIn directory = do
tests <- runIO $ examples directory
2016-02-17 23:54:37 +03:00
mapM_ (\ (a, b, diff) -> it (normalizeName a) $ testDiff testUnified a b diff `shouldReturn` True) tests
testUnified :: Renderer a String
testUnified diff sources = B1.unpack $ mconcat $ chunksToByteStrings toByteStringsColors0 $ unified diff sources
2016-02-17 00:38:31 +03:00
-- | Return all the examples from the given directory. Examples are expected to
-- | have the form "foo.A.js", "foo.B.js", "foo.diff.js". Diffs are not
-- | required as the test may be verifying that the inputs don't crash.
2016-02-17 23:21:37 +03:00
examples :: FilePath -> IO [(FilePath, FilePath, Maybe FilePath)]
2016-02-17 00:38:31 +03:00
examples directory = do
2016-02-17 23:59:16 +03:00
as <- toDict <$> globFor "*.A.*"
bs <- toDict <$> globFor "*.B.*"
diffs <- toDict <$> globFor "*.diff.*"
let keys = Set.unions $ keysSet <$> [as, bs]
return $ (\name -> (as ! name, bs ! name, Map.lookup name diffs)) <$> sort (Set.toList keys)
2016-02-17 00:38:31 +03:00
where
globFor :: String -> IO [FilePath]
globFor p = globDir1 (compile p) directory
toDict list = Map.fromList ((normalizeName <$> list) `zip` list)
-- | Given a test name like "foo.A.js", return "foo.js".
normalizeName :: FilePath -> FilePath
normalizeName path = addExtension (dropExtension $ dropExtension path) (takeExtension path)
-- | Given file paths for A, B, and, optionally, a diff, return whether diffing
-- | the files will produce the diff. If no diff is provided, then the result
-- | is true, but the diff will still be calculated.
2016-02-17 23:54:37 +03:00
testDiff :: Renderer T.Text String -> FilePath -> FilePath -> Maybe FilePath -> IO Bool
testDiff renderer a b diff = do
2016-02-17 23:21:37 +03:00
let parser = parserForFilepath a
2016-02-17 00:38:31 +03:00
sources <- sequence $ readAndTranscodeFile <$> Join (a, b)
2016-02-17 23:54:37 +03:00
actual <- diffFiles parser renderer (runJoin sources)
2016-02-17 00:38:31 +03:00
case diff of
Nothing -> return $ actual /= "<should not be a thing>"
Just file -> do
2016-02-17 23:54:37 +03:00
expected <- readFile file
2016-02-17 00:38:31 +03:00
return $ expected == actual