content: module Camfort.Specification.Stencils.InferenceBackendSpec (spec) where
  
  import Camfort.Specification.Stencils.InferenceBackend
  import Camfort.Specification.Stencils.Syntax
  import Camfort.Specification.Stencils.Model
  import qualified Camfort.Helpers.Vec as V
  
  import Test.Hspec
  
  spec :: Spec
  spec =
    describe "Inference backend" $ do
      describe "spans to approximate regions" $ do
  
        it "handles spans of a(i-2) + a(i) + a(i+2)" $ do
          let spans = [ (V.Cons (-2) V.Nil, V.Cons (-2) V.Nil)
                      , (V.Cons 0 V.Nil, V.Cons 0 V.Nil)
                      , (V.Cons 2 V.Nil, V.Cons 2 V.Nil) ]
          let region = Right $ Bound
                (Just . Spatial $ Sum [ Product [ Centered 0 1 True ]])
                (Just . Spatial $ Sum [ Product [ Centered 2 1 True ]])
          spansToApproxSpatial spans `shouldBe` region
  
        it "handles spans of a(i,0) + a(0,j)" $ do
          let spans = [ ( V.Cons 0 (V.Cons absoluteRep V.Nil)
                        , V.Cons 0 (V.Cons absoluteRep V.Nil) )
                      , ( V.Cons absoluteRep (V.Cons 0 V.Nil)
                        , V.Cons absoluteRep (V.Cons 0 V.Nil) ) ]
          let region = Right . Exact .  Spatial $
                Sum [ Product [ Centered 0 1 True ]
                    , Product [ Centered 0 2 True ] ]
          spansToApproxSpatial spans `shouldBe` region
  