From 0c44f591f4370ce7c06ef4b8ccbee513f3552b05 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Wed, 27 Jul 2016 22:46:56 -0700 Subject: 3157 - more testable 'random' interface Shouldn't break any existing programs using 'random'. --- 068random.mu | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 068random.mu (limited to '068random.mu') diff --git a/068random.mu b/068random.mu new file mode 100644 index 00000000..923fc86e --- /dev/null +++ b/068random.mu @@ -0,0 +1,55 @@ +def random generator:address:stream:number -> result:number, fail?:boolean, generator:address:stream:number [ + local-scope + load-ingredients + { + break-if generator + # generator is 0? use real random-number generator + result <- real-random + reply result, 0/false + } + result, fail?, generator <- read generator +] + +# helper for tests +def assume-random-numbers -> result:address:stream:number [ + local-scope + load-ingredients + # compute result-len, space to allocate in result + result-len:number <- copy 0 + { + _, arg-received?:boolean <- next-ingredient + break-unless arg-received? + result-len <- add result-len, 1 + loop + } + rewind-ingredients + result-data:address:array:number <- new number:type, result-len + idx:number <- copy 0 + { + curr:number, arg-received?:boolean <- next-ingredient + break-unless arg-received? + *result-data <- put-index *result-data, idx, curr + idx <- add idx, 1 + loop + } + result <- new-stream result-data +] + +scenario random-numbers-in-scenario [ + local-scope + source:address:stream:number <- assume-random-numbers 34, 35, 37 + 1:number/raw, 2:boolean/raw <- random source + 3:number/raw, 4:boolean/raw <- random source + 5:number/raw, 6:boolean/raw <- random source + 7:number/raw, 8:boolean/raw <- random source + memory-should-contain [ + 1 <- 34 + 2 <- 0 # everything went well + 3 <- 35 + 4 <- 0 # everything went well + 5 <- 37 + 6 <- 0 # everything went well + 7 <- 0 # empty result + 8 <- 1 # end of stream + ] +] -- cgit 1.4.1-2-gfad0