packages feed

sectile-0.1.0.0: test/Data/Sectile/StyleSpec.hs

module Data.Sectile.StyleSpec (spec) where

import qualified Data.ByteString.Builder as B
import qualified Data.ByteString.Lazy as BSL
import Data.Sectile
import Data.Sectile.Tmux (Brightness (..), TerminalColour (..))
import qualified Data.Sectile.Tmux as Colour
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Optics.Core as Optics
import Test.Hspec

spec :: Spec
spec = do
  describe "between" $ do
    it "prepends start and appends end" $ do
      let result = between (string "[") (string "]") [string "a"]
      output <-
        renderSegment Colour.WithoutColours $
          row mapM Isolating "test" result
      builderToText output `shouldBe` "[a]"

  describe "changeStyle" $ do
    it "modifies incoming style" $ do
      output <-
        renderSegment Colour.WithoutColours $
          changeStyle resetStyle (string "hello")
      builderToText output `shouldBe` "hello"

  describe "forceStyle" $ do
    it "applies style to output" $ do
      output <-
        renderSegment Colour.WithoutColours $
          forceStyle resetStyle (string "hello")
      builderToText output `shouldBe` "hello"

  describe "resetStyle" $ do
    it "produces noStyle" $ do
      let result = resetStyle Colour.noStyle
      result `shouldBe` Colour.noStyle

    it "clears any existing style" $ do
      let styled = Colour.noStyle {Colour.chunkStyleItalic = Just True}
      resetStyle styled `shouldBe` Colour.noStyle

  describe "swapForegroundBackgroundStyle" $ do
    it "swaps foreground and background" $ do
      let original =
            Colour.noStyle
              { Colour.chunkStyleForeground = Just (Colour.Colour8 Dull Red),
                Colour.chunkStyleBackground = Just (Colour.Colour8 Bright Blue)
              }
          swapped = swapForegroundBackgroundStyle original
      Colour.chunkStyleForeground swapped `shouldBe` Just (Colour.Colour8 Bright Blue)
      Colour.chunkStyleBackground swapped `shouldBe` Just (Colour.Colour8 Dull Red)

    it "handles noStyle" $ do
      swapForegroundBackgroundStyle Colour.noStyle `shouldBe` Colour.noStyle

  describe "style optics" $ do
    it "styleItalic gets and sets" $ do
      let s = Optics.set styleItalic (Just True) Colour.noStyle
      Optics.view styleItalic s `shouldBe` Just True

    it "styleForeground gets and sets" $ do
      let colour = Colour.Colour8 Dull Green
          s = Optics.set styleForeground (Just colour) Colour.noStyle
      Optics.view styleForeground s `shouldBe` Just colour

    it "styleBackground gets and sets" $ do
      let colour = Colour.Colour8 Bright Yellow
          s = Optics.set styleBackground (Just colour) Colour.noStyle
      Optics.view styleBackground s `shouldBe` Just colour

builderToText :: B.Builder -> T.Text
builderToText = T.decodeUtf8 . BSL.toStrict . B.toLazyByteString