81 lines
2.4 KiB
Haskell
Raw Normal View History

2026-02-11 17:11:19 +00:00
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# HLINT ignore "Use const" #-}
{-# HLINT ignore "Unused LANGUAGE pragma" #-}
{-# HLINT ignore "Avoid lambda" #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# LANGUAGE TypeApplications #-}
module Test.Datalog.DigestedQuerySpec where
import Test.Hspec
import Datalog.DatalogParser
2026-02-11 18:02:15 +00:00
import Datalog.DigestedQuery
( DigestedQuery(..),
DigestedQueryCondition(..),
DigestedQueryEntry(..),
digestQuery )
2026-02-11 17:11:19 +00:00
spec :: Spec
spec = do
describe "DigestedQuery" $ do
2026-02-11 17:46:35 +00:00
it "can digest a basic query" $ do
2026-02-11 17:11:19 +00:00
digestQuery "?- parent(alice,X)." `shouldBe` DigestedQuery {
allBoundVariables = ["X"],
numSoughtVariables = 1,
conditions = [
DigestedQueryCondition {
__relation = "parent",
_entries = [
DigestedQueryEntryConstant $ Sym "alice",
DigestedQueryEntryVariable 0
]
}
]
}
2026-02-11 17:46:35 +00:00
it "can digest a query with all variables explicitly sought" $ do
digestQuery "?- knows(a,X), friend(X,Y) → X,Y." `shouldBe` DigestedQuery {
allBoundVariables = ["X", "Y"],
numSoughtVariables = 2,
conditions = [
DigestedQueryCondition {
__relation = "knows",
_entries = [
DigestedQueryEntryConstant $ Sym "a",
DigestedQueryEntryVariable 0
]
},
DigestedQueryCondition {
__relation = "friend",
_entries = [
DigestedQueryEntryVariable 0,
DigestedQueryEntryVariable 1
]
}
]
}
it "can digest a query with unsought variables" $ do
digestQuery "?- edge(A,B), edge(B,C) → A,C ." `shouldBe` DigestedQuery {
allBoundVariables = ["A", "C", "B"],
numSoughtVariables = 2,
conditions = [
DigestedQueryCondition {
__relation = "edge",
_entries = [
DigestedQueryEntryVariable 0,
DigestedQueryEntryVariable 2
]
},
DigestedQueryCondition {
__relation = "edge",
_entries = [
DigestedQueryEntryVariable 2,
DigestedQueryEntryVariable 1
]
}
]
}