1
1
mirror of https://github.com/github/semantic.git synced 2024-12-23 06:41:45 +03:00
semantic/test/Semantic/IO/Spec.hs

88 lines
3.4 KiB
Haskell
Raw Normal View History

2017-11-27 21:52:48 +03:00
module Semantic.IO.Spec where
2017-06-24 17:09:50 +03:00
import Data.Blob
import Data.Functor.Both as Both
2017-11-27 22:17:48 +03:00
import Data.Language
2017-04-04 00:39:04 +03:00
import Data.Maybe
import Data.String
2017-07-28 21:37:02 +03:00
import Prelude hiding (readFile)
2017-11-27 21:09:03 +03:00
import Semantic.IO
2017-07-28 21:37:02 +03:00
import System.Exit (ExitCode(..))
import System.IO (IOMode(..), openFile)
import Test.Hspec hiding (shouldBe, shouldNotBe, shouldThrow, errorCall, anyIOException)
import Test.Hspec.Expectations.Pretty
spec :: Spec
spec = parallel $ do
describe "readFile" $ do
it "returns a blob for extant files" $ do
Just blob <- readFile "semantic-diff.cabal" Nothing
2017-06-24 17:21:54 +03:00
blobPath blob `shouldBe` "semantic-diff.cabal"
it "throws for absent files" $ do
readFile "this file should not exist" Nothing `shouldThrow` anyIOException
2017-05-17 22:53:05 +03:00
describe "readBlobPairsFromHandle" $ do
let a = sourceBlob "method.rb" (Just Ruby) "def foo; end"
let b = sourceBlob "method.rb" (Just Ruby) "def bar(x); end"
2017-05-17 22:47:45 +03:00
it "returns blobs for valid JSON encoded diff input" $ do
blobs <- blobsFromFilePath "test/fixtures/input/diff.json"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairDiffing a b]
2017-05-17 22:47:45 +03:00
it "returns blobs when there's no before" $ do
blobs <- blobsFromFilePath "test/fixtures/input/diff-no-before.json"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairInserting b]
it "returns blobs when there's null before" $ do
blobs <- blobsFromFilePath "test/fixtures/input/diff-null-before.json"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairInserting b]
it "returns blobs when there's no after" $ do
blobs <- blobsFromFilePath "test/fixtures/input/diff-no-after.json"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairDeleting a]
it "returns blobs when there's null after" $ do
blobs <- blobsFromFilePath "test/fixtures/input/diff-null-after.json"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairDeleting a]
it "returns blobs for unsupported language" $ do
h <- openFile "test/fixtures/input/diff-unsupported-language.json" ReadMode
2017-06-15 17:17:41 +03:00
blobs <- readBlobPairsFromHandle h
let b' = sourceBlob "test.kt" Nothing "fun main(args: Array<String>) {\nprintln(\"hi\")\n}\n"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairInserting b']
it "detects language based on filepath for empty language" $ do
blobs <- blobsFromFilePath "test/fixtures/input/diff-empty-language.json"
2017-12-11 20:09:07 +03:00
blobs `shouldBe` [blobPairDiffing a b]
it "throws on blank input" $ do
2017-05-17 22:47:45 +03:00
h <- openFile "test/fixtures/input/blank.json" ReadMode
2017-06-15 17:17:41 +03:00
readBlobPairsFromHandle h `shouldThrow` (== ExitFailure 1)
2017-05-17 22:47:45 +03:00
it "throws if language field not given" $ do
h <- openFile "test/fixtures/input/diff-no-language.json" ReadMode
2017-06-15 17:17:41 +03:00
readBlobsFromHandle h `shouldThrow` (== ExitFailure 1)
it "throws if null on before and after" $ do
h <- openFile "test/fixtures/input/diff-null-both-sides.json" ReadMode
readBlobPairsFromHandle h `shouldThrow` (== ExitFailure 1)
2017-05-17 23:34:09 +03:00
describe "readBlobsFromHandle" $ do
it "returns blobs for valid JSON encoded parse input" $ do
h <- openFile "test/fixtures/input/parse.json" ReadMode
2017-06-15 17:17:41 +03:00
blobs <- readBlobsFromHandle h
let a = sourceBlob "method.rb" (Just Ruby) "def foo; end"
2017-05-17 23:34:09 +03:00
blobs `shouldBe` [a]
it "throws on blank input" $ do
2017-05-17 23:34:09 +03:00
h <- openFile "test/fixtures/input/blank.json" ReadMode
2017-06-15 17:17:41 +03:00
readBlobsFromHandle h `shouldThrow` (== ExitFailure 1)
2017-05-17 23:34:09 +03:00
where blobsFromFilePath path = do
h <- openFile path ReadMode
2017-06-15 17:17:41 +03:00
blobs <- readBlobPairsFromHandle h
pure blobs
2017-06-24 17:15:31 +03:00
data Fixture = Fixture { shas :: Both String, expectedBlobs :: [Both Blob] }