{-# LANGUAGE OverloadedStrings #-} module Golden.Tests where import qualified Data.Aeson import qualified Data.ByteString.Lazy.Char8 as BS import Data.Text.Encoding import Test.Tasty ( testGroup, TestTree ) import Test.Tasty.Silver (goldenVsAction) import Nix.Diff import Nix.Diff.Transformations import Nix.Diff.Render.HumanReadable import Golden.Utils ( TestableDerivations, makeDiffTree ) goldenTests :: TestableDerivations -> TestableDerivations -> TestTree goldenTests simpleTd complexTd = testGroup "Golden tests" [ goldenVsAction "Human readable, environment" humanReadableExpected simple_env_words humanReadable_words , goldenVsAction "JSON, environment" jsonExpected (mkDTSimple (diffContextEnv Word)) toJson , goldenVsAction "Human readable, complex, skip already compared" skipAlreadyComparedExpected complex_words (humanReadable_words . foldAlreadyComparedSubTrees) , goldenVsAction "JSON, squash text and envs" jsonSquashedExpected simple_words (toJson . squashSourcesAndEnvsDiff) ] where toJson drv = (<> "\n") . decodeUtf8 . BS.toStrict $ (Data.Aeson.encode drv) humanReadable_words = toHumanReadable (renderContext Word Nothing) toHumanReadable ctx drv = runRender' (renderDiffHumanReadable drv) ctx simple_env_words = mkDTSimple (diffContextEnv Word) simple_words = mkDTSimple (diffContext Word) complex_words = mkDTComplex (diffContext Word) mkDTSimple = makeDiffTree simpleTd mkDTComplex = makeDiffTree complexTd indent' = 0 diffContextEnv orient = DiffContext orient True diffContext orient = DiffContext orient False renderContext orient = RenderContext orient NotTTY indent' humanReadableExpected :: FilePath humanReadableExpected = "./golden-tests/expected-outputs/human-readable" jsonExpected :: FilePath jsonExpected = "./golden-tests/expected-outputs/json" skipAlreadyComparedExpected :: FilePath skipAlreadyComparedExpected = "./golden-tests/expected-outputs/skip-already-compared" jsonSquashedExpected :: FilePath jsonSquashedExpected = "./golden-tests/expected-outputs/json-squashed"