darcs-2.18.5: harness/Darcs/Test/Patch/Arbitrary/RepoPatchV1.hs
-- Copyright (C) 2002-2003,2007 David Roundy
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; see the file COPYING. If not, write to
-- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.
{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE UndecidableInstances #-}
module Darcs.Test.Patch.Arbitrary.RepoPatchV1 (Patch) where
import Prelude ()
import Darcs.Prelude
import Control.Exception ( try, evaluate, SomeException )
import System.IO.Unsafe
import Darcs.Patch
import Darcs.Patch.V1 ()
import Darcs.Patch.V1.Core ( RepoPatchV1(..) )
import qualified Darcs.Patch.V1.Prim as V1 ( Prim )
import Darcs.Patch.Witnesses.Ordered
import Darcs.Patch.Witnesses.Sealed ( Sealed(Sealed) )
import Darcs.Test.Patch.Arbitrary.Generic ( MightHaveDuplicate, ArbitraryPrim, PrimBased(..) )
import Darcs.Test.Patch.Arbitrary.RepoPatch
import Darcs.Test.Patch.Merge.Checked ( CheckedMerge(..) )
import Darcs.Test.Patch.RepoModel ( RepoState, ModelOf )
import Darcs.Test.Patch.Types.Pair ( Pair(..) )
import Darcs.Test.Patch.WithState
( PropagateShrink(..)
, ArbitraryState(..), WithEndState(..)
)
type Patch = RepoPatchV1 V1.Prim
instance
(ArbitraryPrim prim, PrimPatch prim, ApplyState prim ~ RepoState (ModelOf prim))
=> ArbitraryRepoPatch (RepoPatchV1 prim)
where
notRepoPatchV1 = Nothing
instance PrimPatch prim => CheckedMerge (RepoPatchV1 prim) where
validateMerge v =
case unsafePerformIO (try (evaluate v)) of
Left (_ :: SomeException) -> Nothing
Right x -> Just x
instance MightHaveDuplicate (RepoPatchV1 prim)
type instance ModelOf (RepoPatchV1 prim) = ModelOf prim
instance (PrimPatch prim, ArbitraryPrim prim, PropagateShrink prim prim) => PrimBased (RepoPatchV1 prim) where
type OnlyPrim (RepoPatchV1 prim) = prim
primEffect prim = prim :>: NilFL
liftFromPrim = PP
-- TODO: this instance only exists because of the history of the V1 QuickCheck tests
-- (qc_V1P1 in D.T.Patch). The QuickCheck tests for V1, V2, V3 etc should be aligned
-- and this instance removed.
instance ArbitraryState prim => ArbitraryState (RepoPatchV1 prim) where
arbitraryState repo = do
Sealed (WithEndState prim repo') <- arbitraryState repo
return (Sealed (WithEndState (PP prim) repo'))
arbitraryStatePair repo = do
Sealed (WithEndState (Pair (prim1 :> prim2)) repo') <- arbitraryStatePair repo
return (Sealed (WithEndState (Pair (PP prim1 :> PP prim2)) repo'))