packages feed

salak-0.3.5.2: test/Salak/Internal/KeySpec.hs

module Salak.Internal.KeySpec(spec) where

import           Data.List       (intercalate)
import           Data.Text       (Text, pack, unpack)
import           Salak.Internal
import           Test.Hspec
import           Test.QuickCheck

newtype SKey = SKey { unKey :: Text } deriving Show

instance Arbitrary SKey where
  arbitrary = do
    key <- choose (1,20)
    vs  <- vectorOf key $ do
      k <- choose (1,20)
      v <- vectorOf k $ choose ('a','z')
      b <- choose (0,10) :: Gen Int
      if b > 0 then return v else do
        x <- choose (0,10) :: Gen Int
        return (v ++ "[" ++ show x ++ "]")
    return (SKey $ pack $ intercalate "." vs)


spec :: SpecWith ()
spec = do
  context "selectors" $ do
    it "normal" $ do
      toKeys (""         :: Text) `shouldBe` Right mempty
      toKeys ("."        :: Text) `shouldBe` Right mempty
      toKeys (".."       :: Text) `shouldBe` Right mempty
      toKeys ("xx"       :: Text) `shouldBe` Right (fromKeys $ [KT "xx"])
      toKeys ("xx[0]"    :: Text) `shouldBe` Right (fromKeys $ [KT "xx", KI 0])
      toKeys ("xx.yy"    :: Text) `shouldBe` Right (fromKeys $ [KT "xx", KT "yy"])
      toKeys ("xx[0][1]" :: Text) `shouldBe` Right (fromKeys $ [KT "xx", KI 0, KI 1])
      show (fromKeys $ KT "x" : (KI <$> [0..9])) `shouldBe` "x[0][1][2][3][4][5][6][7][8][9]"
    it "QuickCheck" $ do
      quickCheck $ \s -> let s' = unKey s in (show <$> toKeys s') `shouldBe` Right (unpack s')