about summary refs log blame commit diff stats
path: root/404stream.mu
blob: d0120046f5e26b04317cb5b97c8cf1232b754280 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11


                                   

                                                 
                       
                                            



                                            
                           



                                     



                                             


                                                                


                                     



                                            

                                             




                                          
                                            






                                              
 
# Tests for Mu's stream primitives.

fn test-stream {
  # - write an int to a stream, then read it back
  # step 1: initialize
  var s: (stream int 4)
  var s2/ecx: (addr stream int) <- address s
  var tmp/eax: boolean <- stream-empty? s2
  check-true tmp, "F - test-stream/empty?/0"
  tmp <- stream-full? s2
  check-false tmp, "F - test-stream/full?/0"
  # step 2: write to stream
  var x: int
  copy-to x, 0x34
  var x2/edx: (addr int) <- address x
  write-to-stream s2, x2
  tmp <- stream-empty? s2
  check-false tmp, "F - test-stream/empty?/1"
  tmp <- stream-full? s2
  check-false tmp, "F - test-stream/full?/1"
  # step 3: modify the value written (should make no difference)
  copy-to x, 0
  # step 4: read back
  var y: int
  var y2/ebx: (addr int) <- address y
  read-from-stream s2, y2
  tmp <- stream-empty? s2
  check-true tmp, "F - test-stream/empty?/2"
  tmp <- stream-full? s2
  check-false tmp, "F - test-stream/full?/2"
  # we read back what was written
  check-ints-equal y, 0x34, "F - test-stream"
}

fn test-stream-full {
  # write an int to a stream of capacity 1
  var s: (stream int 1)
  var s2/ecx: (addr stream int) <- address s
  var tmp/eax: boolean <- stream-full? s2
  check-false tmp, "F - test-stream-full?/pre"
  var x: int
  var x2/edx: (addr int) <- address x
  write-to-stream s2, x2
  tmp <- stream-full? s2
  check-true tmp, "F - test-stream-full?"
}
ass="o">="Constant">local-scope</span> assume-filesystem [ <span class="Constant">[a]</span><span class="Special"> &lt;- </span>[ <span class="Constant"> |xyz|</span> ] ] contents:address:source:character<span class="Special"> &lt;- </span>start-reading filesystem:address:filesystem, <span class="Constant">[a]</span> <span class="Constant">1</span>:character/<span class="Special">raw &lt;- </span>read contents <span class="Constant">2</span>:character/<span class="Special">raw &lt;- </span>read contents <span class="Constant">3</span>:character/<span class="Special">raw &lt;- </span>read contents <span class="Constant">4</span>:character/<span class="Special">raw &lt;- </span>read contents _, <span class="Constant">5</span>:boolean/<span class="Special">raw &lt;- </span>read contents memory-should-contain [ <span class="Constant">1</span><span class="Special"> &lt;- </span><span class="Constant">120</span> <span class="Comment"># x</span> <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">121</span> <span class="Comment"># y</span> <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">122</span> <span class="Comment"># z</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">10</span> <span class="Comment"># newline</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># eof</span> ] ] <span class="muScenario">scenario</span> write-to-fake-file [ <span class="Constant">local-scope</span> assume-filesystem [ ] sink:address:sink:character, writer:number/routine<span class="Special"> &lt;- </span>start-writing filesystem:address:filesystem, <span class="Constant">[a]</span> sink<span class="Special"> &lt;- </span>write sink, <span class="Constant">120/x</span> sink<span class="Special"> &lt;- </span>write sink, <span class="Constant">121/y</span> close sink wait-for-routine writer contents-read-back:text<span class="Special"> &lt;- </span>slurp filesystem, <span class="Constant">[a]</span> <span class="Constant">10</span>:boolean/<span class="Special">raw &lt;- </span>equal contents-read-back, <span class="Constant">[xy]</span> memory-should-contain [ <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># file contents read back exactly match what was written</span> ] ] <span class="muScenario">scenario</span> write-to-fake-file-that-exists [ <span class="Constant">local-scope</span> assume-filesystem [ <span class="Constant">[a]</span><span class="Special"> &lt;- </span><span class="Constant">[]</span> ] sink:address:sink:character, writer:number/routine<span class="Special"> &lt;- </span>start-writing filesystem:address:filesystem, <span class="Constant">[a]</span> sink<span class="Special"> &lt;- </span>write sink, <span class="Constant">120/x</span> sink<span class="Special"> &lt;- </span>write sink, <span class="Constant">121/y</span> close sink wait-for-routine writer contents-read-back:text<span class="Special"> &lt;- </span>slurp filesystem, <span class="Constant">[a]</span> <span class="Constant">10</span>:boolean/<span class="Special">raw &lt;- </span>equal contents-read-back, <span class="Constant">[xy]</span> memory-should-contain [ <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># file contents read back exactly match what was written</span> ] ] <span class="muScenario">scenario</span> write-to-existing-file-preserves-other-files [ <span class="Constant">local-scope</span> assume-filesystem [ <span class="Constant">[a]</span><span class="Special"> &lt;- </span><span class="Constant">[]</span> <span class="Constant">[b]</span><span class="Special"> &lt;- </span>[ <span class="Constant"> |bcd|</span> ] ] sink:address:sink:character, writer:number/routine<span class="Special"> &lt;- </span>start-writing filesystem:address:filesystem, <span class="Constant">[a]</span> sink<span class="Special"> &lt;- </span>write sink, <span class="Constant">120/x</span> sink<span class="Special"> &lt;- </span>write sink, <span class="Constant">121/y</span> close sink wait-for-routine writer contents-read-back:text<span class="Special"> &lt;- </span>slurp filesystem, <span class="Constant">[a]</span> <span class="Constant">10</span>:boolean/<span class="Special">raw &lt;- </span>equal contents-read-back, <span class="Constant">[xy]</span> other-file-contents:text<span class="Special"> &lt;- </span>slurp filesystem, <span class="Constant">[b]</span> <span class="Constant">11</span>:boolean/<span class="Special">raw &lt;- </span>equal other-file-contents, <span class="Constant">[bcd</span> <span class="Constant">]</span> memory-should-contain [ <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># file contents read back exactly match what was written</span> <span class="Constant">11</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># other files also continue to persist unchanged</span> ] ] <span class="muRecipe">def</span> slurp fs:address:filesystem, filename:text<span class="muRecipe"> -&gt; </span>contents:text [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> source:address:source:character<span class="Special"> &lt;- </span>start-reading fs, filename buf:address:buffer<span class="Special"> &lt;- </span>new-buffer <span class="Constant">30/capacity</span> <span class="Delimiter">{</span> c:character, done?:boolean, source<span class="Special"> &lt;- </span>read source <span class="muControl">break-if</span> done? buf<span class="Special"> &lt;- </span>append buf, c <span class="muControl">loop</span> <span class="Delimiter">}</span> contents<span class="Special"> &lt;- </span>buffer-to-array buf ] </pre> </body> </html> <!-- vim: set foldmethod=manual : -->