about summary refs log tree commit diff stats
path: root/086scenario_console_test.mu
blob: f5aa14383e65dc3788e83446d3cfd2945bc5e5b8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# To check our support for consoles in scenarios, rewrite tests from
# scenario_console.mu
# Tests for console interface.

scenario read-key-in-mu [
  assume-console [
    type [abc]
  ]
  run [
    1:char, 2:bool <- read-key console
    3:char, 4:bool <- read-key console
    5:char, 6:bool <- read-key console
    7:char, 8:bool <- read-key console
  ]
  memory-should-contain [
    1 <- 97  # 'a'
    2 <- 1
    3 <- 98  # 'b'
    4 <- 1
    5 <- 99  # 'c'
    6 <- 1
    7 <- 0  # eof
    8 <- 1
  ]
]
an class="nv">s what ; channels take (n2:integer <- copy n:integer) (n3:tagged-value-address <- init-tagged-value integer:literal n2:integer) (chan:channel-address/deref <- write chan:channel-address n3:tagged-value-address/deref) (n:integer <- add n:integer 1:literal) (loop) } ]) (function consumer [ ; consume and print integers from a channel (default-space:space-address <- new space:literal 30:literal) (chan:channel-address <- next-input) { begin ; read a tagged value from the channel (x:tagged-value chan:channel-address/deref <- read chan:channel-address) ; unbox the tagged value into an integer (n2:integer <- maybe-coerce x:tagged-value integer:literal) ; other threads might get between these prints ($print (("consume: " literal))) (print-integer nil:literal/terminal n2:integer) ($print (("\n" literal))) (loop) } ]) (function main [ (default-space:space-address <- new space:literal 30:literal) (chan:channel-address <- init-channel 3:literal) ; create two background 'routines' that communicate by a channel (routine1:integer <- fork consumer:fn nil:literal/globals nil:literal/limit chan:channel-address) (routine2:integer <- fork producer:fn nil:literal/globals nil:literal/limit chan:channel-address) (sleep until-routine-done:literal routine1:integer) (sleep until-routine-done:literal routine2:integer) ])