advancedtelematic / quickcheck-state-machine

Test monadic programs using state machine based models
Other
203 stars 25 forks source link

Event as defined in Labelling is misleading #369

Open edsko opened 4 years ago

edsko commented 4 years ago

Module Test.StateMachine.Labelling defines

data Event model cmd resp (r :: Type -> Type) = Event
  { eventBefore :: model r
  , eventCmd    :: cmd   r
  , eventAfter  :: model r
  , eventResp   :: resp  r
  }
  deriving stock Show

While this is not wrong in that module, it is misleading and rather dangerous. This type is based on,and almost equal to the one I define in my blog post, but not quite. Compare to the Event type defined in Test.StateMachine.Lockstep.NAry:

data Event t r = Event {
      before   :: Model t    r
    , cmd      :: Cmd   t :@ r
    , after    :: Model t    r
    , mockResp :: Resp t (MockHandle t) (RealHandles t)
    }

This records the mock response, not the real one. This is critical: if this records the real response, and then the rest of my blog post is used as is, then the postcondition becomes trivial, comparing the real response to itself.

stevana commented 4 years ago

Hmm, yeah I can see that being problematic.

I don't remember why I did it like I did (perhaps I misunderstood your code?), and I'm not actively using that code anymore today, so I guess maybe the right thing is to simply remove it?