1
1
mirror of https://github.com/github/semantic.git synced 2024-11-29 11:02:26 +03:00
semantic/test/Reprinting/Spec.hs

70 lines
2.5 KiB
Haskell
Raw Normal View History

{-# LANGUAGE GADTs, OverloadedLists, TypeOperators #-}
2018-07-31 03:05:44 +03:00
module Reprinting.Spec (spec) where
2018-07-30 23:00:09 +03:00
2019-06-14 16:46:06 +03:00
import SpecHelpers
2018-07-30 23:00:09 +03:00
import Data.Foldable
import qualified Data.Machine as Machine
2019-06-14 16:46:06 +03:00
import Control.Rewriting
2018-07-30 23:00:09 +03:00
import qualified Data.Language as Language
import Data.Reprinting.Scope
2018-10-15 19:47:18 +03:00
import Data.Reprinting.Token
import Data.Sum
import qualified Data.Syntax.Literal as Literal
import Language.JSON.PrettyPrint
import Reprinting.Pipeline
import Reprinting.Tokenize
2018-07-30 23:00:09 +03:00
increaseNumbers :: (Literal.Float :< fs, Apply Functor fs) => Rule (Term (Sum fs) History)
increaseNumbers = do
(Literal.Float c) <- target >>= guardTerm
create (Literal.Float (c <> "0"))
2018-07-30 23:00:09 +03:00
spec :: Spec
2018-07-31 21:07:16 +03:00
spec = describe "reprinting" $ do
2018-08-22 23:47:30 +03:00
context "JSON" $ do
let path = "test/fixtures/javascript/reprinting/map.json"
(src, tree) <- runIO $ do
src <- blobSource <$> readBlobFromFile' (File path Language.JSON)
tree <- parseFileQuiet jsonParser path
2018-08-22 23:47:30 +03:00
pure (src, tree)
describe "tokenization" $ do
it "should pass over a pristine tree" $ do
let tagged = mark Unmodified tree
2018-09-12 01:54:37 +03:00
let toks = Machine.run $ tokenizing src tagged
toks `shouldSatisfy` not . null
head toks `shouldSatisfy` isControl
last toks `shouldSatisfy` isChunk
2018-08-22 23:47:30 +03:00
it "should emit control tokens but only 1 chunk for a wholly-modified tree" $ do
2018-09-12 01:54:37 +03:00
let toks = Machine.run $ tokenizing src (mark Refactored tree)
for_ @[] [List, Hash] $ \t -> do
toks `shouldSatisfy` elem (Control (Enter t))
toks `shouldSatisfy` elem (Control (Exit t))
2018-08-22 23:47:30 +03:00
describe "pipeline" $ do
it "should roundtrip exactly over a pristine tree" $ do
let tagged = mark Unmodified tree
let printed = runReprinter src defaultJSONPipeline tagged
printed `shouldBe` Right src
it "should roundtrip exactly over a wholly-modified tree" $ do
let tagged = mark Refactored tree
let printed = runReprinter src defaultJSONPipeline tagged
printed `shouldBe` Right src
it "should be able to parse the output of a refactor" $ do
let maybeTagged = rewrite (mark Unmodified tree) (topDownAny increaseNumbers)
tagged <- maybe (fail "rewrite failed") pure maybeTagged
let eitherPrinted = runReprinter src defaultJSONPipeline tagged
printed <- either (fail "reprinter failed") pure eitherPrinted
tree' <- runTaskOrDie (parse jsonParser (makeBlob printed path Language.JSON mempty))
length tree' `shouldSatisfy` (/= 0)