{-# LANGUAGE OverloadedStrings #-}
# LANGUAGE QuasiQuotes #
# LANGUAGE RecordWildCards #

module Development.Guardian.Graph.Adapter.CabalSpec (test_buildPackageGraph) where

import qualified Algebra.Graph as G
import Development.Guardian.Graph.Adapter.Cabal
import qualified Development.Guardian.Graph.Adapter.Cabal as Cabal
import Development.Guardian.Graph.Adapter.TestUtils
import Development.Guardian.Graph.Adapter.Types
import Path
import Test.Tasty

onlyExes :: ComponentsOptions
onlyExes = ComponentsOptions {tests = False, benchmarks = False}

test_buildPackageGraph :: TestTree
test_buildPackageGraph =
  testGroup
    "buildPackageGraph"
    $ map
      testCabalProject
      [ Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A2", "C"), ("B1", "C")]
          , componentOpts = onlyExes
          , customOpts = CabalOptions Nothing Nothing
          }
      , Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A2", "C"), ("A2", "B1"), ("B1", "C")]
          , componentOpts = onlyExes {tests = True}
          , customOpts = CabalOptions Nothing Nothing
          }
      , Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A1", "A2"), ("A2", "C"), ("B1", "C")]
          , componentOpts = onlyExes {benchmarks = True}
          , customOpts = CabalOptions Nothing Nothing
          }
      , Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A1", "A2"), ("A2", "C"), ("A2", "B1"), ("B1", "C")]
          , componentOpts = onlyExes {tests = True, benchmarks = True}
          , customOpts = CabalOptions Nothing Nothing
          }
      ]
      ++ [ testCabalProjectWithLabel
            "test-only-dependency (with cabal-no-A1.yaml)"
            Case
              { caseDir = [reldir|test-only-dependency|]
              , expectedGraph = G.edges [("A2", "C"), ("B1", "C")]
              , componentOpts = onlyExes
              , customOpts = CabalOptions (Just [relfile|cabal-no-A1.project|]) Nothing
              }
         ]

testCabalProjectWithLabel :: String -> Case Cabal -> TestTree
testCabalProjectWithLabel = testProjectWithLabel Cabal.buildPackageGraph

testCabalProject :: Case Cabal -> TestTree
testCabalProject = testProjectWith Cabal.buildPackageGraph

# LANGUAGE OverloadedStrings #
# LANGUAGE QuasiQuotes #
# LANGUAGE RecordWildCards #

module Development.Guardian.Graph.Adapter.CabalSpec (test_buildPackageGraph) where

import qualified Algebra.Graph as G
import Development.Guardian.Graph.Adapter.Cabal
import qualified Development.Guardian.Graph.Adapter.Cabal as Cabal
import Development.Guardian.Graph.Adapter.TestUtils
import Development.Guardian.Graph.Adapter.Types
import Path
import Test.Tasty

onlyExes :: ComponentsOptions
onlyExes = ComponentsOptions {tests = False, benchmarks = False}

test_buildPackageGraph :: TestTree
test_buildPackageGraph =
  testGroup
    "buildPackageGraph"
    $ map
      testCabalProject
      [ Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A2", "C"), ("B1", "C")]
          , componentOpts = onlyExes
          , customOpts = CabalOptions Nothing Nothing
          }
      , Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A2", "C"), ("A2", "B1"), ("B1", "C")]
          , componentOpts = onlyExes {tests = True}
          , customOpts = CabalOptions Nothing Nothing
          }
      , Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A1", "A2"), ("A2", "C"), ("B1", "C")]
          , componentOpts = onlyExes {benchmarks = True}
          , customOpts = CabalOptions Nothing Nothing
          }
      , Case
          { caseDir = [reldir|test-only-dependency|]
          , expectedGraph = G.edges [("A1", "C"), ("A1", "A2"), ("A2", "C"), ("A2", "B1"), ("B1", "C")]
          , componentOpts = onlyExes {tests = True, benchmarks = True}
          , customOpts = CabalOptions Nothing Nothing
          }
      ]
      ++ [ testCabalProjectWithLabel
            "test-only-dependency (with cabal-no-A1.yaml)"
            Case
              { caseDir = [reldir|test-only-dependency|]
              , expectedGraph = G.edges [("A2", "C"), ("B1", "C")]
              , componentOpts = onlyExes
              , customOpts = CabalOptions (Just [relfile|cabal-no-A1.project|]) Nothing
              }
         ]

testCabalProjectWithLabel :: String -> Case Cabal -> TestTree
testCabalProjectWithLabel = testProjectWithLabel Cabal.buildPackageGraph

testCabalProject :: Case Cabal -> TestTree
testCabalProject = testProjectWith Cabal.buildPackageGraph
