packages feed

hix-0.9.0: test/Hix/Test/Managed/ReleaseMaintenance/Case.hs

module Hix.Test.Managed.ReleaseMaintenance.Case where

import Distribution.Pretty (Pretty (..))
import Distribution.Version (Version)
import Text.PrettyPrint (text, ($$), (<+>))

import Hix.Data.PackageName (LocalPackage (..), PackageName)
import Hix.Managed.Data.BuildOutput (ModifiedId (..))
import Hix.Managed.Data.Mutable (MutableDep, depName)
import Hix.Managed.Data.Packages (Deps, Packages)
import Hix.Pretty (HPretty (..), field, prettyMap, showP)

data TestDep =
  UnmodifiedDep MutableDep
  |
  ModifiedDep ModifiedId
  |
  FailedDep MutableDep
  deriving stock (Eq, Show)

instance Pretty TestDep where
  pretty = \case
    UnmodifiedDep mid -> pretty mid
    ModifiedDep mid -> pretty mid
    FailedDep mid -> pretty mid

bumpedMutableDep :: TestDep -> MutableDep
bumpedMutableDep = \case
  UnmodifiedDep mid -> mid
  ModifiedDep ModifiedId {package} -> package
  FailedDep mid -> mid

testDepName :: TestDep -> PackageName
testDepName = depName . bumpedMutableDep

isModifiedDep :: TestDep -> Bool
isModifiedDep = \case
  ModifiedDep _ -> True
  UnmodifiedDep _ -> False
  FailedDep _ -> False

partitionTestDeps :: [TestDep] -> ([MutableDep], [ModifiedId], [MutableDep])
partitionTestDeps =
  foldr step mempty
  where
    step dep (u, m, f) = case dep of
      UnmodifiedDep mid -> (mid : u, m, f)
      ModifiedDep mid -> (u, mid : m, f)
      FailedDep mid -> (u, m, mid : f)

data PackageConf =
  PackageConf {
    revision :: Word,
    deps :: Deps TestDep
  }
  deriving stock (Eq, Show)

instance Pretty PackageConf where
  pretty PackageConf {..} =
    text (show revision) $$ pretty deps

data PackageMeta =
  PackageMeta {
    package :: LocalPackage,
    version :: Version,
    revision :: Word,
    deps :: Deps TestDep,
    modified :: Bool,
    bumped :: Bool,
    envModified :: Bool,
    released :: Bool,
    shared :: Bool
  }
  deriving stock (Eq, Show)

instance HPretty PackageMeta where
  hpretty PackageMeta {..} =
    prettyMap (showP package) [
      field "deps" deps,
      field "version" version,
      field "revision" (fromIntegral @_ @Int revision),
      field "modified" modified,
      field "bumped" bumped,
      field "envModified" envModified,
      field "released" released,
      field "shared" shared
    ]

data EnvStyle =
  EnvAll
  |
  EnvEach
  deriving stock (Eq, Show)

instance Pretty EnvStyle where
  pretty = \case
    EnvAll -> text "all"
    EnvEach -> text "each"

data ProjectHistoryEvent =
  Release { package :: LocalPackage, major :: Bool, revision :: Word }
  |
  ReleaseShared { major :: Bool, revision :: Word }
  deriving stock (Eq, Show)

instance Pretty ProjectHistoryEvent where
  pretty = \case
    Release {..} -> text "release" <+> pretty package <+> prettyMajor major <+> prettyRevision revision
    ReleaseShared {..} -> text "release" <+> prettyMajor major <+> prettyRevision revision
    where
      prettyMajor major = if major then "major" else "minor"
      prettyRevision revision = text (show revision)

data MaintTestCase =
  MaintTestCase {
    packages :: Packages PackageConf,
    history :: [ProjectHistoryEvent],
    envStyle :: EnvStyle,
    anyDepModified :: Bool
  }
  deriving stock (Eq, Show)

instance HPretty MaintTestCase where
  hpretty MaintTestCase {..} =
    prettyMap "maint test" [
      field "packages" packages,
      field "history" history,
      field "style" envStyle
    ]

instance Default MaintTestCase where
  def =
    MaintTestCase {
      packages = [],
      history = [],
      envStyle = EnvAll,
      anyDepModified = False
    }