yaml-marked-0.2.0.1: test/Data/Yaml/Marked/ReplaceSpec.hs
module Data.Yaml.Marked.ReplaceSpec
( spec
) where
import Prelude
import Data.Yaml.Marked
import Data.Yaml.Marked.Decode
import Data.Yaml.Marked.Parse
import Data.Yaml.Marked.Replace
import Test.Hspec
spec :: Spec
spec = do
describe "runReplaces" $ do
it "works for a replacement at start" $ do
let r = newReplace 0 4 "that"
runReplaces [r] "this text" `shouldReturn` "that text"
it "works for replacement at start and end" $ do
let rs =
[ newReplace 0 4 "that"
, newReplace 13 3 "cold"
]
runReplaces rs "this text is hot" `shouldReturn` "that text is cold"
it "works for replacement at start, middle, and end" $ do
let rs =
[ newReplace 0 4 "that"
, newReplace 18 3 "cold"
, newReplace 10 4 "won't"
]
runReplaces rs "this text will be hot"
`shouldReturn` "that text won't be cold"
it "works for adjacent replaces" $ do
let rs =
[ newReplace 0 4 ""
, newReplace 4 4 ""
]
runReplaces rs "012\n012\n012\n" `shouldReturn` "012\n"
context "validations" $ do
it "ReplaceOutOfBounds" $ do
let r = newReplace 0 3 ""
runReplaces [r] "x" `shouldThrow` (== ReplaceOutOfBounds r 1)
it "ReplaceOutOfBounds by start" $ do
let r = newReplace 3 3 ""
runReplaces [r] "x" `shouldThrow` (== ReplaceOutOfBounds r 1)
it "ReplaceOutOfBounds with multiple" $ do
let
r = newReplace 7 3 ""
rs =
[ newReplace 0 2 ""
, newReplace 3 3 ""
, r
]
runReplaces rs "123456" `shouldThrow` (== ReplaceOutOfBounds r 0)
it "OverlappingReplace" $ do
let
overlapped = newReplace 2 3 ""
overlapping = newReplace 3 3 ""
rs =
[ newReplace 0 1 ""
, overlapping
, newReplace 9 1 ""
, overlapped
, newReplace 12 1 ""
]
runReplaces rs "123456789abcdefhigjkl"
`shouldThrow` (== OverlappingReplace overlapping)
it "works for a realistic stack.yaml example" $ do
let
exampleYaml =
mconcat
[ "resolver: lts-20.0\n"
, "extra-deps:\n"
, " - ../local-package\n"
, " - hackage-dep-1.0\n"
]
decodeExample = withObject "example" $ \o ->
(,)
<$> (text =<< (o .: "resolver"))
<*> (array text =<< (o .: "extra-deps"))
(resolver, extraDeps) <-
markedItem <$> decodeThrow decodeExample "<input>" exampleYaml
let replaces =
[ replaceMarked resolver "lts-20.11"
, replaceMarked (markedItem extraDeps !! 1) "hackage-dep-2.0.1"
]
runReplaces replaces exampleYaml
`shouldReturn` mconcat
[ "resolver: lts-20.11\n"
, "extra-deps:\n"
, " - ../local-package\n"
, " - hackage-dep-2.0.1\n"
]
describe "runReplacesOnOverlapping" $ do
it "can skip overlapping replaces" $ do
let
exampleYaml =
mconcat
[ "resolver: lts-18.18\n"
, "\n"
, "packages:\n"
, " # Missing in Stackage, newer in Hackage\n"
, " - freckle-app-1.0.1.1\n"
, "\n"
, " # Exists in resolver now, newer in Hackage too\n"
, " - dhall-1.37.1@sha256:447031286e8fe270b0baacd9cc5a8af340d2ae94bb53b85807bee93381ca5287,35080\n"
, " - generic-lens-2.0.0.0@sha256:7409fa0ce540d0bd41acf596edd1c5d0c0ab1cd1294d514cf19c5c24e8ef2550,3866\n"
, "\n"
, " # Newer in Hackage\n"
, " - faktory-1.1.2.0@sha256:b2a1986095aefa645f6ad701504e1671ddfeb36f11b68434837fc9fcd3594ca8,9078\n"
, " - hspec-core-2.8.3@sha256:e4c1e08e16842804c470c2b4722e417ed2a556a47a74107401ad42195522f7a7,4992\n"
, " - hspec-2.8.3@sha256:43a42e23994a6c61a7adead7e8a412016680234f5a14a157f68c020871e59534,1709\n"
, " - hspec-junit-formatter-1.0.1.0@sha256:6429871263be4532a3a6d08e72da5a8e4c00e8bfbfd7fc5b8352a3643f867453,2652\n"
, "\n"
, " # New version available\n"
, " - network-3.1.2.5@sha256:433a5e076aaa8eb3e4158abae78fb409c6bd754e9af99bc2e87583d2bcd8404a,4888\n"
, "\n"
, " # Newer commits, version-like tag exists too\n"
, " - github: freckle/yesod-routes-flow\n"
, " commit: 2a9cd873880956dd9a0999b593022d3c746324e8\n"
, "\n"
, " # No suggestions (yet)\n"
, " - git: https://github.com/freckle/asana\n"
, " commit: 91ce6ade118674bb273966943370684eba71f227\n"
]
replaces =
[ newReplace 77 19 "freckle-app-1.12.0.0"
, newReplace 151 90 "dhall-1.42.1"
, newReplace 246 97 "generic-lens-2.2.2.0"
, newReplace 370 92 "faktory-1.1.2.5"
, newReplace 467 93 "hspec-core-2.11.7"
, newReplace 565 88 "hspec-2.11.7"
, newReplace 658 106 "hspec-junit-formatter-1.1.0.2"
, newReplace 796 92 "network-3.1.4.0"
, newReplace 941 86 "yesod-routes-flow-3.0.0.2"
, newReplace 987 40 "94f9343305ef98d12026ab1f96460dd8b6d29f6f" -- < skipped due to overlap
, newReplace 1108 40 "e9d43d953957efc06a0d20bef786a959d03198e6"
]
runReplacesOnOverlapping (const $ pure ()) replaces exampleYaml
`shouldReturn` mconcat
[ "resolver: lts-18.18\n"
, "\n"
, "packages:\n"
, " # Missing in Stackage, newer in Hackage\n"
, " - freckle-app-1.12.0.0\n"
, "\n"
, " # Exists in resolver now, newer in Hackage too\n"
, " - dhall-1.42.1\n"
, " - generic-lens-2.2.2.0\n"
, "\n"
, " # Newer in Hackage\n"
, " - faktory-1.1.2.5\n"
, " - hspec-core-2.11.7\n"
, " - hspec-2.11.7\n"
, " - hspec-junit-formatter-1.1.0.2\n"
, "\n"
, " # New version available\n"
, " - network-3.1.4.0\n"
, "\n"
, " # Newer commits, version-like tag exists too\n"
, " - yesod-routes-flow-3.0.0.2\n"
, "\n"
, " # No suggestions (yet)\n"
, " - git: https://github.com/freckle/asana\n"
, " commit: e9d43d953957efc06a0d20bef786a959d03198e6\n"
]