tricu

A lazy functional language based on Tree Calculus
Log | Files | Refs | README | LICENSE

testing.tri (1535B)


      1 !import base as B
      2 !import handlers as H
      3 !export expect
      4 !export run
      5 
      6 -- Scripts match exact named requests and payloads, supplying ordinary replies.
      7 -- Return [execution-Result chronological-trace unused-script]. A success with
      8 -- leftover expectations is an error. A failure retains its trace and remainder.
      9 expect service operation argument reply = [[service operation argument] reply]
     10 run script action = let rec
     11   walk current remaining reversed = let
     12     finish outcome = [outcome (B.reverse reversed) remaining]
     13     rejected event problem = [(B.err problem t) (B.reverse (B.pair event reversed)) remaining]
     14     consume event{[service operation argument]} labels next [[wanted reply] | rest] = B.lazyBool
     15       (_ : walk (next reply) rest (B.pair event reversed))
     16       (_ : rejected event (H.diagnostic "script-mismatch" service operation [wanted event] labels))
     17       (B.equal? wanted event)
     18     consume event{[service operation argument]} labels _ [] = rejected event
     19       (H.diagnostic "script-exhausted" service operation argument labels)
     20     consume event labels _ _ = rejected event (H.diagnostic "invalid-script" t t t labels)
     21     in case current of
     22       (100, value) = case remaining of
     23         [] = finish (B.ok value t)
     24         _ = finish (B.err (H.diagnostic "script-unused" t t remaining []) t)
     25       (103, problem) = finish (B.err problem t)
     26       (106, [event labels next]) = consume event labels next remaining
     27       _ = finish (B.err (H.diagnostic "invalid-view" t t t []) t)
     28   in walk (H.view action) script []