packages feed

pretty-diff-0.1.0.0: test/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Main
  ( main,
  )
where

import Control.Exception (catch, throw)
import Data.Default (def)
import Data.Function ((&))
import qualified Data.Text as Text
import qualified Data.Text.IO as Text.IO
import qualified Pretty.Diff as Diff
import Test.Tasty
import Test.Tasty.HUnit
import qualified Test.Tasty.Runners.Reporter as Reporter

main = defaultMainWithIngredients [Reporter.ingredient] tests

tests :: TestTree
tests =
  testGroup
    "Pretty.Diff"
    [ testCase "Comparing two equal strings" $
        expectDiffToEqual
          ( Diff.pretty
              def
              "Hello"
              "Hello"
          )
          [ "Hello" & showText,
            "╷",
            "│",
            "╵",
            "Hello" & showText
          ],
      testCase "Removed characters" $
        expectDiffToEqual
          ( Diff.pretty
              def
              "Hello"
              "Hel"
          )
          [ "   ▼▼" & forEscapedString,
            "Hello" & showText,
            "╷",
            "│",
            "╵",
            "Hel" & showText
          ],
      testCase "Added characters" $
        expectDiffToEqual
          ( Diff.pretty
              def
              "Hel"
              "Hello"
          )
          [ "Hel" & showText,
            "╷",
            "│",
            "╵",
            "Hello" & showText,
            "   ▲▲" & forEscapedString
          ],
      testCase "Changed characters" $
        expectDiffToEqual
          ( Diff.pretty
              def
              "Axxx"
              "Bxxx"
          )
          [ "▼" & forEscapedString,
            "Axxx" & showText,
            "╷",
            "│",
            "╵",
            "Bxxx" & showText,
            "▲" & forEscapedString
          ],
      testCase "Mixed changes" $
        expectDiffToEqual
          ( Diff.pretty
              def
              "12345"
              "1004"
          )
          [ " ▼▼ ▼" & forEscapedString,
            "12345" & showText,
            "╷",
            "│",
            "╵",
            "1004" & showText,
            " ▲▲" & forEscapedString
          ],
      testCase "Multiline changes (on first and last line)" $
        expectDiffToEqual
          ( Diff.pretty
              def
                { Diff.wrapping = Diff.Wrap $ 5 + 1 -- + 1 because of "
                }
              "0900000000"
              "9000000000"
          )
          [ "▼" & forEscapedString,
            "09000" & showTextPrefix,
            "00000" & showTextPostfix,
            "╷",
            "│",
            "╵",
            "90000" & showTextPrefix,
            "00000" & showTextPostfix,
            "    ▲"
          ],
      testCase "Multiline changes (inbetween)" $
        expectDiffToEqual
          ( Diff.pretty
              def
                { Diff.wrapping = Diff.Wrap $ 5 + 1 -- + 1 because of "
                }
              "0000090000"
              "0090000000"
          )
          [ "00000" & showTextPrefix,
            "▼",
            "90000" & showTextPostfix,
            "╷",
            "│",
            "╵",
            "00900" & showTextPrefix,
            "  ▲" & forEscapedString,
            "00000" & showTextPostfix
          ],
      testCase "With separator text" $
        expectDiffToEqual
          ( Diff.pretty
              Diff.Config
                { Diff.separatorText = Just "equals",
                  Diff.wrapping = Diff.Wrap $ 5 + 1 -- + 1 because of "
                }
              "0000090000"
              "0090000000"
          )
          [ "00000" & showTextPrefix,
            "▼",
            "90000" & showTextPostfix,
            "╷",
            "│ equals",
            "╵",
            "00900" & showTextPrefix,
            "  ▲" & forEscapedString,
            "00000" & showTextPostfix
          ]
    ]

expectDiffToEqual actual expected_ = do
  let expected = Text.unlines expected_
  (actual @?= expected)
    `catch` ( \(e :: HUnitFailure) -> do
                Text.IO.putStrLn "Actual was:"
                Text.IO.putStrLn actual
                Text.IO.putStrLn "Expected was:"
                Text.IO.putStrLn expected
                throw e
            )

forEscapedString x = " " <> x

showText = Text.pack . show

showTextPrefix x = "\"" <> x

showTextPostfix x = x <> "\""