packages feed

greskell-0.2.3.0: test/Data/Greskell/ExtraSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module Data.Greskell.ExtraSpec (main,spec) where

import Data.Monoid (mempty, (<>))
import Data.Text (Text)
import Test.Hspec

import Data.Aeson (Value(..))
import Data.Greskell.Binder (Binder, Binding, runBinder)
import Data.Greskell.Extra (writePropertyKeyValues)
import Data.Greskell.Graph (AVertex)
import Data.Greskell.Greskell (toGremlin)
import Data.Greskell.GTraversal (Walk, WalkType)
import qualified Data.HashMap.Strict as HM

main :: IO ()
main = hspec spec

runBoundWalk :: WalkType c => Binder (Walk c AVertex AVertex) -> (Text, Binding)
runBoundWalk = doFst . runBinder
  where
    doFst (w, b) = (toGremlin w, b)

spec :: Spec
spec = do
  describe "writePropertyKeyValues" $ do
    specify "empty" $ do
      let input :: [(Text, ())]
          input = []
      (runBoundWalk $ writePropertyKeyValues input) `shouldBe` ("__.identity()", mempty)
    specify "one prop" $ do
      let input :: [(Text, Int)]
          input = [("age", 24)]
      (runBoundWalk $ writePropertyKeyValues input)
        `shouldBe` ( "__.property(\"age\",__v0).identity()",
                     HM.fromList [("__v0", Number 24)]
                   )
    specify "multiple props" $ do
      let input :: [(Text, Value)]
          input = [("age", Number 24), ("name", String "Toshio"), ("foo", String "bar")]
      (runBoundWalk $ writePropertyKeyValues input)
        `shouldBe` ( "__.property(\"age\",__v0).property(\"name\",__v1)"
                     <> ".property(\"foo\",__v2).identity()",
                     HM.fromList [ ("__v0", Number 24),
                                   ("__v1", String "Toshio"),
                                   ("__v2", String "bar")
                                 ]
                   )