packages feed

pec-0.2.0: test_cases/TestArray.pec

module TestArray

imports
  Prelude
  Data.Array

where

// fixed sized arrays

garr => Array [ 'a', 'b', 'c' ]

main :: () -> I32
main () = do
  putLn "testArray"
  testSingleDim ()
  testMultiDim ()
  testOps ()
  0

testSingleDim () = do
  putLn "testSingleDim"
  arrval = Array [ 'x', 'y', 'z' ]
  arr = new (arrval :: Array #3 Char)
  put putCh arr
  assert (@arr[0] == 'x')
  putCh @arr[0] // index operator.  returns pointer to given index
  putCh @arr[1]
  putCh @arr[2]
  alsoarr = new arrval
  put putCh alsoarr
  assert (@alsoarr[0] == 'x')
  assert (@alsoarr[1] == 'y')
  assert (@alsoarr[2] == 'z')
  // the index operator is type safe, i.e. putCh @arr[3] will fail to compile.
  arr[0] <- 'a' // store an 'a' at element 0
  arr[1] <- 'b'
  arr[2] <- 'c'
  put putCh arr
  putCh @arr[0]
  putCh @arr[1]
  putCh @arr[2]
  assert (@arr[0] == 'a')
  assert (@arr[1] == 'b')
  assert (@arr[2] == 'c')
  assert (@alsoarr[0] == 'x')
  assert (@alsoarr[1] == 'y')
  assert (@alsoarr[2] == 'z')
  arr <- Array [ 'x', 'y', 'z' ]
  put putCh arr
  putCh @arr[0]
  putCh @arr[1]
  putCh @arr[2]
  assert (@arr[2] == 'z')
  assert (@(new garr)[1] == 'b')
  arr2 = new (array #5 'c')
  assert (@arr2[4] == 'c')
  putCh @arr2[0]
  putCh @arr2[4]
  arr3 = new (array #2 True)
  arr3[1] <- False
  arrayf arr3
  arrayf2 arr3
  putLn "done"

arrayf :: Ptr (Array #2 Bool) -> ()
arrayf arr = do
  assert @arr[0]
  assert (not @arr[1])

arrayf2 :: Ptr (Array #2 Bool) -> ()
arrayf2 p = arrayf p

testMultiDim () = do
  putLn "testMultiDim"
  arr = new Array
            [ Array [ 'a', 'b' ]
            , Array [ 'c', 'd' ]
            , Array [ 'e', 'f' ]
            ]
  putCh @arr[0][0]
  putCh @arr[0][1]
  putCh @arr[1][0]
  putCh @arr[1][1]
  putCh @arr[2][0]
  putCh @arr[2][1]
  assert True
  (a :: Ptr Bool) = new True
  assert @a
  b = new Array [ True ]
  assert @b[0]
  x = new Array [ Array [ Array [ True ] ], Array [ Array [ False ] ] ]
  assert @x[0][0][0]
  assert (not @x[1][0][0])
  () = arrayf (new (Array [ True, False ]))
  (p :: Ptr (Array #1 (Array #1 Bool))) = x[0]
  assert @p[0][0]
  (q :: Ptr (Array #1 Bool)) = x[0][0]
  assert @q[0]
  (r :: Ptr (Array #1 Bool)) = p[0]
  assert @r[0]
  (putLn "done" :: ())

sum => fold add 0

testOps :: () -> ()
testOps () = do
  putLn "testOps"
  arr = new (Array [ (1 :: W32), 2, 3])
  t = new (sum arr)
  assert (@t == 6)

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

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

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

/*
// There is no good reason that the following shouldn't work.  It's just a pain to generate the required C code.
retArray :: () -> Array #2 Char
retArray () = Array [ 'p', 'q' ]

argArray :: Array #2 Char -> Bool
argArray arr = do
  p = new arr
  @p[1] == 'q'

ptrArray :: Ptr (Array #2 Bool) -> Ptr (Array #2 Bool)
ptrArray a = a
*/