packages feed

craft-0.0.0.1: test/Craft/Config/ShellSpec.hs

module Craft.Config.ShellSpec (spec) where

import           Test.Hspec
import           Test.Hspec.Megaparsec
import           Text.Megaparsec

import           Craft.Config.Shell


spec :: Spec
spec = do
  describe "set" $ do
    it "sets on empty" $ do
      set "a" "b" empty `shouldBe` ShellFormat [("a", "b")]
    it "replaces existing key" $ do
      set "a" "c" (ShellFormat [("a", "b")]) `shouldBe` ShellFormat [("a", "c")]
    it "appends a new keys" $ do
      set "a" "b" (ShellFormat [("b", "c")])
        `shouldBe` ShellFormat [("b", "c"), ("a", "b")]
    it "replaces multiple keys" $ do
      set "a" "c" (ShellFormat [("a", "foo"), ("a", "bar")])
      `shouldBe` ShellFormat [("a", "c"), ("a", "c")]

  describe "unset" $ do
    it "preserves empty" $ do
      unset "foo" empty `shouldBe` empty
    it "preserves unmatched keys" $ do
      unset "a" (ShellFormat [("foo", "")]) `shouldBe` ShellFormat [("foo", "")]
    it "unsets" $ do
      unset "a" (ShellFormat [("a", "b")]) `shouldBe` empty
    it "unsets multiple keys" $ do
      unset "a" (ShellFormat [("a", "b"), ("a", "c")]) `shouldBe` empty
    it "unsets multiple keys and leaves unmatched" $ do
      unset "a" (ShellFormat [("a", "b"), ("b", "foo"), ("a", "c")])
        `shouldBe` (ShellFormat [("b", "foo")])

  describe "dedup" $ do
    it "supports empty" $ do
      dedup empty `shouldBe` empty
    it "preserves single item lists" $ do
      dedup (ShellFormat [("a", "b")]) `shouldBe` ShellFormat [("a", "b")]
    it "dedup uses the final value" $ do
      dedup (ShellFormat [("a", "b"), ("a", "c")]) `shouldBe` ShellFormat [("a", "c")]
    it "dedups and preserves order" $ do
      dedup (ShellFormat [("a", "b"), ("b", ""), ("a", "c")]) `shouldBe` ShellFormat [("a", "c"), ("b", "")]

  describe "parser" $ do
    it "reads empty files" $ do
      parse parser "" "" `shouldParse` empty
    it "ignores empty lines" $ do
      parse parser "" "\n\n\n" `shouldParse` empty
    it "ignores empty lines with spaces" $ do
      parse parser "" "\n   \n\n" `shouldParse` empty
    it "ignores empty comment" $ do
      parse parser "" "#" `shouldParse` empty
    it "ignores comment" $ do
      parse parser "" "# lkajs #  akjsd\n#lkjaslkdj" `shouldParse` empty
    it "ignores comment with leading space" $ do
      parse parser "" "   # foo bar" `shouldParse` empty
    it "accepts an empty value" $ do
      parse parser "" "foo=" `shouldParse` ShellFormat [("foo", "")]
    it "accepts an value with a space in it" $ do
      parse parser "" "foo=a b " `shouldParse` ShellFormat [("foo", "a")]
    it "accepts space after equals" $ do
      parse parser "" "foo= foo" `shouldParse` ShellFormat [("foo", "")]
    it "ignores comment after a value" $ do
      parse parser "" "FOO_BAR=foobar # a comment" `shouldParse` ShellFormat [("FOO_BAR", "foobar")]
    it "ignores comment after a value with no spaces" $ do
      parse parser "" "FOO_BAR=foobar#comment" `shouldParse` ShellFormat [("FOO_BAR", "foobar")]
    it "ignores comment after empty value with no spaces" $ do
      parse parser "" "FOO_BAR=#comment" `shouldParse` ShellFormat [("FOO_BAR", "")]
    it "parses multiple values" $ do
      parse parser "" "a=a\nb=b\nc=c\n"
      `shouldParse` ShellFormat [ ("a", "a")
                                , ("b", "b")
                                , ("c", "c")
                                ]
    it "parses multiple values with an empty field" $ do
      parse parser "" "a=a\nb=\nc=c\n"
      `shouldParse` ShellFormat [ ("a", "a")
                                , ("b", "")
                                , ("c", "c")
                                ]
    it "works" $ do
      parse parser "" "#foo\na=a\nb=\n#c=c\nd= foo"
      `shouldParse` ShellFormat [ ("a", "a")
                                , ("b", "")
                                , ("d", "")
                                ]