packages feed

graql-0.1.0.0: test/Main.hs

module Main where

import Data.Function ((&))
import Test.Hspec
import Graql
import qualified Example

main :: IO ()
main = hspec $ do

    it "a simple query string representation" $
        match [x `isa` person] ~= "match $x isa person;"

    it "a relation query string representation" $
        match [rel [x, y]] ~= "match ($x, $y);"

    it "a relation query string representation with types" $
        match [rel [husband.: x, wife.: y] -: marriage]
            ~= "match (husband: $x, wife: $y) isa marriage;"

    it "a resource query string representation" $
        match [x `hasText` firstName $ "Bob"]
            ~= "match $x has first-name \"Bob\";"

    it "multiple patterns" $
        match [x-:person, y-:firstName]
            ~= "match $x isa person; $y isa first-name;"

    it "select query with type" $
        match [x -: y] & select [x, y]
            ~= "match $x isa $y; select $x, $y;"

    it "mix role types" $
        match [rel [husband.: x, rp y]] ~= "match (husband: $x, $y);"

    it "limit and distinct" $
        match [x -: person] & distinct & limit 10
            ~= "match $x isa person; distinct; limit 10;"

    it "type of type" $
        match [person -: x] ~= "match person isa $x;"

    it "reify a relation" $
        match [x <: [y, z]] ~= "match $x ($y, $z);"

    it "match just a variable" $
        match [x] ~= "match $x;"

    it "example query output" $
        Example.query
            ~= "match $x isa person; (husband: $x, wife: $y) isa marriage; select $y;"


x :: Var
x = var "x"

y :: Var
y = var "y"

z :: Var
z = var "z"

person :: Name
person = name "person"

firstName :: Name
firstName = name "first-name"

marriage :: Name
marriage = name "marriage"

husband :: Name
husband = name "husband"

wife :: Name
wife = name "wife"

infixr 0 ~=

(~=) :: MatchQuery -> String -> Expectation
(~=) = shouldBe . show