packages feed

reflex-vty-1.3.0.0: test/Reflex/Vty/Test/GoldenSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Reflex.Vty.Test.GoldenSpec (spec) where

import System.FilePath ((</>))
import Test.Hspec

import Reflex.Vty.Style
import Reflex.Vty.Test.Snapshot

goldenDir :: FilePath
goldenDir = "test" </> "goldens"

spec :: GoldenMode -> Spec
spec = describe "Golden snapshots" . withMode
  where
    withMode mode = do
      -- Borders
      golden mode "border_single" $ render (withBorder singleBorder def) "Box"
      golden mode "border_rounded" $ render (withBorder roundedBorder def) "Box"
      golden mode "border_thick" $ render (withBorder thickBorder def) "Box"
      golden mode "border_double" $ render (withBorder doubleBorder def) "Box"
      golden mode "border_ascii" $ render (withBorder asciiBorder def) "Box"

      -- Padding & Margin
      golden mode "padding_1" $ render (withPadding 1 1 1 1 def) "pad"
      golden mode "padding_2" $ render (withPadding 2 2 2 2 def) "pad"
      golden mode "margin_1" $ render (withMargin 1 1 1 1 def) "m"

      -- Colors
      golden mode "color_red_fg" $ render (withForeground red def) "Red"
      golden mode "color_blue_bg" $ render (withBackground blue def) "Blue"
      golden mode "color_rgb" $ render (withForeground (rgbColor 200 100 50) def) "RGB"

      -- Transforms
      golden mode "transform_bold" $ render (withBold def) "Bold"
      golden mode "transform_italic" $ render (withItalic def) "Italic"
      golden mode "transform_underline" $ render (withUnderline UnderlineSingle def) "UL"
      golden mode "transform_reverse" $ render (withReverse def) "Rev"

      -- Alignment
      golden mode "align_left" $ render (withAlignH HAlignLeft . withWidth 20 $ def) "Left"
      golden mode "align_center" $ render (withAlignH HAlignCenter . withWidth 20 $ def) "Center"
      golden mode "align_right" $ render (withAlignH HAlignRight . withWidth 20 $ def) "Right"

      -- Combined
      golden mode "combined" $
        render
          ( withBorder roundedBorder
              . withPadding 1 2 1 2
              . withForeground brightGreen
              . withBorderForeground brightMagenta
              $ def
          )
          "Combined"

      -- Multi-line
      golden mode "multiline" $ render def "Hello\nWorld"

      -- Wide chars
      golden mode "wide_chars" $ render def "a文b"

      -- Plain text (baseline)
      golden mode "plain" $ render def "hello"
    golden mode name img =
      it name $
        assertGolden mode goldenDir name $
          renderGrid $
            imageToGrid img