about summary refs log tree commit diff stats
path: root/068random.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-07-27 22:46:56 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-07-27 22:47:04 -0700
commit0c44f591f4370ce7c06ef4b8ccbee513f3552b05 (patch)
treef8eb649c5338a814c1e496fe17b1eeb7a05162d5 /068random.mu
parent4f3510d05a144addc9612a046a1f2fa31a8a8c41 (diff)
downloadmu-0c44f591f4370ce7c06ef4b8ccbee513f3552b05.tar.gz
3157 - more testable 'random' interface
Shouldn't break any existing programs using 'random'.
Diffstat (limited to '068random.mu')
-rw-r--r--068random.mu55
1 files changed, 55 insertions, 0 deletions
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
+  ]
+]