packages feed

pec-0.2.0: test_cases/TestStack.pec

module TestStack

// polymorphic stack implementation

imports
  Prelude
  Data.Stack

where

main :: () -> I32
main () = do
  putLn "test Stack"
  p = new (stack #3) // stacks must be given a size
  put putCh p
  mc = new (pop p)
  case mc of
    Nothing -> assert True
    Just _ -> assert False
  assert (push 'a' p)
  put putCh p
  case new (pop p) of
    Nothing -> assert False
    Just c -> do
      putCh @c
      assert (@c == 'a')
  put putCh p
  assert (is_empty p)
  assert (push 'a' p)
  put putCh p
  assert (push 'b' p)
  put putCh p
  assert (push 'c' p)
  put putCh p
  assert (is_full p)
  assert (not (push 'd' p))
  mc <- pop p
  put putCh p
  case mc of
    Nothing -> assert False
    Just c -> do
      putCh @c
      assert (@c == 'c')
  mc <- pop p
  put putCh p
  mc <- pop p
  put putCh p
  assert (is_empty p)
  assert (push 'x' p)
  assert (push 'y' p)
  put putCh p
  mc <- pop p
  case mc of
    Nothing -> assert False
    Just c -> assert (@c == 'y')

  mc <- pop p
  case mc of
    Nothing -> assert False
    Just c -> assert (@c == 'x')

  put putCh p
  w = new (stack #6 :: Stack #6 W32)
  assert (push 0 w)
  assert (push 1 w)
  assert (push 2 w)

  t = new 0
  t <- sum w
  assert (@t == 3)

  foreach inc w

  t <- sum w
  assert (@t == 6)

  assert (push 1 w)
  assert (push 2 w)
  assert (push 1 w)

  t <- sum w
  assert (@t == 10)

  mpw = new (find (eq 1) w)
  case mpw of
    Nothing -> assert False
    Just pw -> @pw <- 2

  put putW w

  t <- sum w
  assert (@t == 11)

  filter (eq 2) w
  t <- sum w
  assert (@t == 6)
  put putW w

  putLn "done"
  0

test_ops :: () -> ()
test_ops () = do
  putLn "test_ops"
  stck = new (stack #3 :: Stack #3 W32)
  assert (push 1 stck)
  assert (push 2 stck)
  assert (push 3 stck)

  t = new (sum stck)
  assert (@t == 6)

  foreach inc stck
  t <- sum stck
  assert (@t == 9)

  mi = new (find_idx (eq 0) stck)
  case mi of
    Nothing -> assert True
    Just _ -> assert False

  mi <- find_idx (eq 4) stck
  case mi of
    Nothing -> assert False
    Just i -> assert (@i == 2)

sum => fold add 0