packages feed

stgi-1.1: test/Testsuite/Test/Orphans/Machine.hs

{-# LANGUAGE OverloadedStrings #-}

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Test.Orphans.Machine () where



import qualified Data.Map    as M
import           Data.Monoid
import qualified Data.Set    as S
import qualified Data.Text   as T

import Stg.Machine.Types

import Test.Orphans.Language ()
import Test.Orphans.Stack    ()
import Test.Tasty.QuickCheck
import Test.Util



instance Arbitrary StgState where
    arbitrary = StgState
            <$> arbitrary
            <*> arbitrary
            <*> arbitrary
            <*> arbitrary
            <*> arbitrary
            <*> arbitrary

instance Arbitrary MemAddr where
    arbitrary = arbitrary1 MemAddr

instance Arbitrary StackFrame where
    arbitrary = oneof [ arbitrary1 ArgumentFrame
                      , arbitrary2 ReturnFrame
                      , arbitrary1 UpdateFrame ]

instance Arbitrary Value where
    arbitrary = oneof [ arbitrary1 Addr
                      , arbitrary1 PrimInt ]

instance Arbitrary Code where
    arbitrary = oneof [ arbitrary2 Eval
                      , arbitrary1 Enter
                      , arbitrary2 ReturnCon
                      , arbitrary1 ReturnInt ]

instance (Arbitrary k, Arbitrary v) => Arbitrary (Mapping k v) where
    arbitrary = arbitrary2 Mapping

instance Arbitrary Globals where
    arbitrary = arbitrary1 (Globals . M.fromList)

instance Arbitrary Locals where
    arbitrary = arbitrary1 (Locals . M.fromList)

instance Arbitrary Closure where
    arbitrary = arbitrary2 Closure

instance Arbitrary Heap where
    arbitrary = arbitrary1 (Heap . M.fromList)

instance Arbitrary HeapObject where
    arbitrary = oneof [ arbitrary1 HClosure
                      , arbitrary1 Blackhole ]

instance Arbitrary Info where
    arbitrary = arbitrary2 Info

instance Arbitrary InfoShort where
    arbitrary = oneof [ pure NoRulesApply
                      , pure MaxStepsExceeded
                      , pure HaltedByPredicate
                      , arbitrary1 StateTransition
                      , arbitrary1 StateError
                      , pure StateInitial ]

instance Arbitrary InfoDetail where
    arbitrary = oneof
        [ arbitrary2 Detail_FunctionApplication
        , arbitrary2 Detail_UnusedLocalVariables
        , arbitrary2 Detail_EnterNonUpdatable
        , arbitrary2 Detail_EvalLet
        , arbitrary0 Detail_EvalCase
        , arbitrary1 Detail_EnterUpdatable
        , arbitrary2 Detail_ConUpdate
        , arbitrary1 Detail_PapUpdate
        , arbitrary0 Detail_ReturnIntCannotUpdate
        , arbitrary0 Detail_StackNotEmpty
        , Detail_GarbageCollected
            <$> ((\x -> "GC algorithm: " <> T.pack x) <$> arbitrary)
            <*> (S.fromList <$> arbitrary)
            <*> (M.fromList <$> arbitrary)
        , arbitrary2 Detail_EnterBlackHole ]

instance Arbitrary StateTransition where
    arbitrary = oneof
        [ arbitrary0 Rule1_Eval_FunctionApplication
        , arbitrary0 Rule2_Enter_NonUpdatableClosure
        , arbitrary1 Rule3_Eval_Let
        , arbitrary0 Rule4_Eval_Case
        , arbitrary0 Rule5_Eval_AppC
        , arbitrary0 Rule6_ReturnCon_Match
        , arbitrary0 Rule7_ReturnCon_DefUnbound
        , arbitrary0 Rule8_ReturnCon_DefBound
        , arbitrary0 Rule9_Lit
        , arbitrary0 Rule10_LitApp
        , arbitrary0 Rule11_ReturnInt_Match
        , arbitrary0 Rule12_ReturnInt_DefBound
        , arbitrary0 Rule13_ReturnInt_DefUnbound
        , arbitrary0 Rule14_Eval_AppP
        , arbitrary0 Rule15_Enter_UpdatableClosure
        , arbitrary0 Rule16_ReturnCon_Update
        , arbitrary0 Rule17a_Enter_PartiallyAppliedUpdate
        , arbitrary0 Rule1819_Eval_Case_Primop_Shortcut ]

instance Arbitrary StateError where
    arbitrary = oneof
        [ arbitrary1 VariablesNotInScope
        , arbitrary0 UpdatableClosureWithArgs
        , arbitrary0 ReturnIntWithEmptyReturnStack
        , arbitrary0 AlgReturnToPrimAlts
        , arbitrary0 PrimReturnToAlgAlts
        , arbitrary0 InitialStateCreationFailed
        , arbitrary0 EnterBlackhole ]

instance Arbitrary NotInScope where
    arbitrary = arbitrary1 NotInScope