about summary refs log tree commit diff stats
path: root/chessboard.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-06 12:13:04 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-06 12:15:25 -0700
commit768bdb4dbf4e8943fe1c3fcf7f8840372ba79ec6 (patch)
treedbe277341a84707b927c322ba6ba95d9f40cf037 /chessboard.mu
parent4680525f84ab44e6df1b032ee4eeb7ef6ca3e466 (diff)
downloadmu-768bdb4dbf4e8943fe1c3fcf7f8840372ba79ec6.tar.gz
1293 - start porting the chessboard app over
Just to put all our new test primitives through their paces, and iron
out any kinks.

Just the one chessboard scenario is taking 1.5-2.5x all the tests we've
written so far. But we're starting from a faster baseline, that was the
point of the C++ port. I also have -O3 optimizations in my back-pocket.
Diffstat (limited to 'chessboard.mu')
-rw-r--r--chessboard.mu142
1 files changed, 142 insertions, 0 deletions
diff --git a/chessboard.mu b/chessboard.mu
new file mode 100644
index 00000000..d4b00b6f
--- /dev/null
+++ b/chessboard.mu
@@ -0,0 +1,142 @@
+recipe init-board [
+  default-space:address:array:location <- new location:type, 30:literal
+  initial-position:address:array:integer <- next-ingredient
+  # assert(length(initial-position) == 64)
+  len:integer <- length initial-position:address:array:integer/deref
+  correct-length?:boolean <- equal len:integer, 64:literal
+  assert correct-length?:boolean, [chessboard had incorrect size]
+  # board is an array of pointers to files; file is an array of characters
+  board:address:array:address:array:character <- new location:type, 8:literal
+  col:integer <- copy 0:literal
+  {
+    done?:boolean <- equal col:integer, 8:literal
+    break-if done?:boolean
+    file:address:address:array:character <- index-address board:address:array:address:array:character/deref, col:integer
+    file:address:address:array:character/deref <- init-file initial-position:address:array:integer, col:integer
+    col:integer <- add col:integer, 1:literal
+    loop
+  }
+  reply board:address:array:address:array:character
+]
+
+recipe init-file [
+  default-space:address:array:location <- new location:type, 30:literal
+  position:address:array:integer <- next-ingredient
+  index:integer <- next-ingredient
+  index:integer <- multiply index:integer, 8:literal
+  result:address:array:character <- new character:type, 8:literal
+  row:integer <- copy 0:literal
+  {
+    done?:boolean <- equal row:integer, 8:literal
+    break-if done?:boolean
+    dest:address:character <- index-address result:address:array:character/deref, row:integer
+    dest:address:character/deref <- index position:address:array:integer/deref, index:integer
+    row:integer <- add row:integer, 1:literal
+    index:integer <- add index:integer, 1:literal
+    loop
+  }
+  reply result:address:array:character
+]
+
+recipe print-board [
+  default-space:address:array:location <- new location:type, 30:literal
+  screen:address <- next-ingredient
+  board:address:array:address:array:character <- next-ingredient
+  row:integer <- copy 7:literal  # start printing from the top of the board
+  # print each row
+  {
+    done?:boolean <- lesser-than row:integer, 0:literal
+    break-if done?:boolean
+    # print rank number as a legend
+    rank:integer <- add row:integer, 1:literal
+    print-integer screen:address, rank:integer
+    s:address:array:character <- new [ | ]
+    print-string screen:address, s:address:array:character
+    # print each square in the row
+    col:integer <- copy 0:literal
+    {
+      done?:boolean <- equal col:integer, 8:literal
+      break-if done?:boolean
+      f:address:array:character <- index board:address:array:address:array:character/deref, col:integer
+      s:character <- index f:address:array:character/deref, row:integer
+      print-character screen:address, s:character
+      print-character screen:address, 32:literal  # ' '
+      col:integer <- add col:integer, 1:literal
+      loop
+    }
+    row:integer <- subtract row:integer, 1:literal
+    cursor-to-next-line screen:address
+    loop
+  }
+  # print file letters as legend
+  s:address:array:character <- new [  +----------------]
+  print-string screen:address, s:address:array:character
+  screen:address <- cursor-to-next-line screen:address
+#?   screen:address <- print-character screen:address, 97:literal #? 1
+  s:address:array:character <- new [    a b c d e f g h]
+  screen:address <- print-string screen:address, s:address:array:character
+  screen:address <- cursor-to-next-line screen:address
+]
+
+scenario printing-the-board [
+  assume-screen 30:literal/width, 24:literal/height
+  run [
+#?     $print [AAA #? 1
+#? ] #? 1
+    # layout in memory:
+    #   R P _ _ _ _ p r
+    #   N P _ _ _ _ p n
+    #   B P _ _ _ _ p b
+    #   Q P _ _ _ _ p q
+    #   K P _ _ _ _ p k
+    #   B P _ _ _ _ p B
+    #   N P _ _ _ _ p n
+    #   R P _ _ _ _ p r
+    1:address:array:integer/initial-position <- init-array 82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r, 78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n, 66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b, 81:literal/Q, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 113:literal/q, 75:literal/K, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 107:literal/k, 66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b, 78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n, 82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r
+#?       82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r,
+#?       78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n,
+#?       66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b, 
+#?       81:literal/Q, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 113:literal/q,
+#?       75:literal/K, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 107:literal/k,
+#?       66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b,
+#?       78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n,
+#?       82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r
+#?     $print [BBB #? 1
+#? ] #? 1
+#?     $start-tracing #? 1
+    2:address:array:address:array:character/board <- init-board 1:address:array:integer/initial-position
+#?     $print [CCC #? 1
+#? ] #? 1
+    screen:address <- print-board screen:address, 2:address:array:address:array:character/board
+#?     $print [DDD #? 1
+#? ] #? 1
+  ]
+  screen-should-contain [
+  #  012345678901234567890123456789
+    .8 | r n b q k b n r           .
+    .7 | p p p p p p p p           .
+    .6 |                           .
+    .5 |                           .
+    .4 |                           .
+    .3 |                           .
+    .2 | P P P P P P P P           .
+    .1 | R N B Q K B N R           .
+    .  +----------------           .
+    .    a b c d e f g h           .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+    .                              .
+  ]
+]