about summary refs log tree commit diff stats
path: root/html/edit/009-sandbox-test.mu.html
blob: 8c2324e4052dac1320024335f97b22fd41acc5a6 (plain) (blame) pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# Compatible with ranger 1.5.3 through 1.7.*
#
# Change the prompt when you open a shell from inside ranger
#
# Add this line to your .bashrc for it to work.

[ -n "$RANGER_LEVEL" ] && PS1="$PS1"'(in ranger) '
id='n199' href='#n199'>199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - edit/009-sandbox-test.mu</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="none">
<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
* { font-size: 12pt; font-size: 1em; }
.muData { color: #ffff00; }
.muControl { color: #c0a020; }
.Special { color: #c00000; }
.Delimiter { color: #800080; }
.Comment { color: #9090ff; }
.Constant { color: #00a0a0; }
.SalientComment { color: #00ffff; }
.muRecipe { color: #ff8700; }
.muScenario { color: #00af00; }
-->
</style>

<script type='text/javascript'>
<!--

-->
</script>
</head>
<body>
<pre id='vimCodeElement'>
<span class="SalientComment">## clicking on sandbox results to 'fix' them and turn sandboxes into tests</span>

<span class="muScenario">scenario</span> sandbox-click-on-result-toggles-color-to-green [
  <span class="Constant">local-scope</span>
  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
  <span class="Comment"># basic recipe</span>
  recipes:text<span class="Special"> &lt;- </span>new <span class="Constant">[ </span>
<span class="Constant">recipe foo [</span>
<span class="Constant">  reply 4</span>
<span class="Constant">]</span>]
  env:&amp;:environment<span class="Special"> &lt;- </span>new-programming-environment screen, recipes:text, <span class="Constant">[foo]</span>
  <span class="Comment"># run it</span>
  assume-console [
    press F4
  ]
  event-loop screen, console, env
  screen-should-contain [
   <span class="Constant"> .                                                                                 run (F4)           .</span>
   <span class="Constant"> .                                                  ╎                                                 .</span>
   <span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
   <span class="Constant"> .  reply 4                                         ╎0   edit          copy            delete         .</span>
   <span class="Constant"> .]                                                 ╎foo                                              .</span>
   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎4                                                .</span>
   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
   <span class="Constant"> .                                                  ╎                                                 .</span>
  ]
  <span class="Comment"># click on the '4' in the result</span>
  assume-console [
    left-click <span class="Constant">5</span>, <span class="Constant">51</span>
  ]
  run [
    event-loop screen, console, env
  ]
  <span class="Comment"># color toggles to green</span>
  screen-should-contain-in-color <span class="Constant">2/green</span>, [
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                   4                                                .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
  ]
  <span class="Comment"># cursor should remain unmoved</span>
  run [
    cursor:char<span class="Special"> &lt;- </span>copy <span class="Constant">9251/␣</span>
    print screen, cursor
  ]
  screen-should-contain [
   <span class="Constant"> .                                                                                 run (F4)           .</span>
   <span class="Constant"> .␣                                                 ╎                                                 .</span>
   <span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
   <span class="Constant"> .  reply 4                                         ╎0   edit          copy            delete         .</span>
   <span class="Constant"> .]                                                 ╎foo                                              .</span>
   <span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎4                                                .</span>
   <span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
   <span class="Constant"> .                                                  ╎                                                 .</span>
   <span class="Constant"> .                                                  ╎                                                 .</span>
   <span class="Constant"> .                                                  ╎                                                 .</span>
  ]
  <span class="Comment"># now change the result</span>
  <span class="Comment"># then rerun</span>
  assume-console [
    left-click <span class="Constant">3</span>, <span class="Constant">11</span>  <span class="Comment"># cursor to end of line</span>
    press backspace
    type <span class="Constant">[3]</span>
    press F4
  ]
  run [
    event-loop screen, console, env
  ]
  <span class="Comment"># result turns red</span>
  screen-should-contain-in-color <span class="Constant">1/red</span>, [
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                   3                                                .</span>
   <span class="Constant"> .                                                                                                    .</span>
   <span class="Constant"> .                                                                                                    .</span>
  ]
]

<span class="Comment"># this requires tracking a couple more things</span>
<span class="muData">container</span> sandbox [
  response-starting-row-on-screen:num
  expected-response:text
]

<span class="Comment"># include expected response when saving or restoring a sandbox</span>
<span class="muRecipe">before</span> <span class="Constant">&lt;end-save-sandbox&gt;</span> [
  <span class="Delimiter">{</span>
    expected-response:text<span class="Special"> &lt;- </span>get *curr, <span class="Constant">expected-response:offset</span>
    <span class="muControl">break-unless</span> expected-response
    filename<span class="Special"> &lt;- </span>append filename, <span class="Constant">[.out]</span>
    save filename, expected-response
  <span class="Delimiter">}</span>
]

<span class="muRecipe">before</span> <span class="Constant">&lt;end-restore-sandbox&gt;</span> [
  <span class="Delimiter">{</span>
    filename<span class="Special"> &lt;- </span>append filename, <span class="Constant">[.out]</span>
    contents<span class="Special"> &lt;- </span>restore filename
    <span class="muControl">break-unless</span> contents
    *curr<span class="Special"> &lt;- </span>put *curr, <span class="Constant">expected-response:offset</span>, contents
  <span class="Delimiter">}</span>
]

<span class="Comment"># clicks on sandbox responses save it as 'expected'</span>
<span class="muRecipe">after</span> <span class="Constant">&lt;global-touch&gt;</span> [
  <span class="Comment"># check if it's inside the output of any sandbox</span>
  <span class="Delimiter">{</span>
    sandbox-left-margin:num<span class="Special"> &lt;- </span>get *current-sandbox, <span class="Constant">left:offset</span>
    click-column:num<span class="Special"> &lt;- </span>get t, <span class="Constant">column:offset</span>
    on-sandbox-side?:bool<span class="Special"> &lt;- </span>greater-or-equal click-column, sandbox-left-margin
    <span class="muControl">break-unless</span> on-sandbox-side?
    first-sandbox:&amp;:sandbox<span class="Special"> &lt;- </span>get *env, <span class="Constant">sandbox:offset</span>
    <span class="muControl">break-unless</span> first-sandbox
    first-sandbox-begins:num<span class="Special"> &lt;- </span>get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
    click-row:num<span class="Special"> &lt;- </span>get t, <span class="Constant">row:offset</span>
    below-sandbox-editor?:bool<span class="Special"> &lt;- </span>greater-or-equal click-row, first-sandbox-begins
    <span class="muControl">break-unless</span> below-sandbox-editor?
    <span class="Comment"># identify the sandbox whose output is being clicked on</span>
    sandbox:&amp;:sandbox<span class="Special"> &lt;- </span>find-click-in-sandbox-output env, click-row
    <span class="muControl">break-unless</span> sandbox
    <span class="Comment"># toggle its expected-response, and save session</span>
    sandbox<span class="Special"> &lt;- </span>toggle-expected-response sandbox
    save-sandboxes env
    hide-screen screen
    screen<span class="Special"> &lt;- </span>render-sandbox-side screen, env, render
    screen<span class="Special"> &lt;- </span>update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
    <span class="Comment"># no change in cursor</span>
    show-screen screen
    <span class="muControl">loop</span> <span class="Constant">+next-event:label</span>
  <span class="Delimiter">}</span>
]

<span class="muRecipe">def</span> find-click-in-sandbox-output env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
  <span class="Constant">local-scope</span>
  <span class="Constant">load-ingredients</span>
  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
  sandbox:&amp;:sandbox<span class="Special"> &lt;- </span>get *env, <span class="Constant">sandbox:offset</span>
  start:num<span class="Special"> &lt;- </span>get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
  clicked-on-sandboxes?:bool<span class="Special"> &lt;- </span>greater-or-equal click-row, start
  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
  <span class="Delimiter">{</span>
    next-sandbox:&amp;:sandbox<span class="Special"> &lt;- </span>get *sandbox, <span class="Constant">next-sandbox:offset</span>
    <span class="muControl">break-unless</span> next-sandbox
    next-start:num<span class="Special"> &lt;- </span>get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
    found?:bool<span class="Special"> &lt;- </span>lesser-than click-row, next-start
    <span class="muControl">break-if</span> found?
    sandbox<span class="Special"> &lt;- </span>copy next-sandbox
    <span class="muControl">loop</span>
  <span class="Delimiter">}</span>
  <span class="Comment"># return sandbox if click is in its output region</span>
  response-starting-row:num<span class="Special"> &lt;- </span>get *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>
  <span class="muControl">return-unless</span> response-starting-row, <span class="Constant">0/no-click-in-sandbox-output</span>
  click-in-response?:bool<span class="Special"> &lt;- </span>greater-or-equal click-row, response-starting-row
  <span class="muControl">return-unless</span> click-in-response?, <span class="Constant">0/no-click-in-sandbox-output</span>
  <span class="muControl">return</span> sandbox
]

<span class="muRecipe">def</span> toggle-expected-response sandbox:&amp;:sandbox<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
  <span class="Constant">local-scope</span>
  <span class="Constant">load-ingredients</span>
  expected-response:text<span class="Special"> &lt;- </span>get *sandbox, <span class="Constant">expected-response:offset</span>
  <span class="Delimiter">{</span>
    <span class="Comment"># if expected-response is set, reset</span>
    <span class="muControl">break-unless</span> expected-response
    *sandbox<span class="Special"> &lt;- </span>put *sandbox, <span class="Constant">expected-response:offset</span>, <span class="Constant">0</span>
  <span class="Delimiter">}</span>
  <span class="Delimiter">{</span>
    <span class="Comment"># if not, set expected response to the current response</span>
    <span class="muControl">break-if</span> expected-response
    response:text<span class="Special"> &lt;- </span>get *sandbox, <span class="Constant">response:offset</span>
    *sandbox<span class="Special"> &lt;- </span>put *sandbox, <span class="Constant">expected-response:offset</span>, response
  <span class="Delimiter">}</span>
]

<span class="Comment"># when rendering a sandbox, color it in red/green if expected response exists</span>
<span class="muRecipe">after</span> <span class="Constant">&lt;render-sandbox-response&gt;</span> [
  <span class="Delimiter">{</span>
    <span class="muControl">break-unless</span> sandbox-response
    *sandbox<span class="Special"> &lt;- </span>put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>, row
    expected-response:text<span class="Special"> &lt;- </span>get *sandbox, <span class="Constant">expected-response:offset</span>
    <span class="muControl">break-unless</span> expected-response  <span class="Comment"># fall-through to print in grey</span>
    response-is-expected?:bool<span class="Special"> &lt;- </span>equal expected-response, sandbox-response
    <span class="Delimiter">{</span>
      <span class="muControl">break-if</span> response-is-expected?:bool
      row, screen<span class="Special"> &lt;- </span>render-text screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row
    <span class="Delimiter">}</span>
    <span class="Delimiter">{</span>
      <span class="muControl">break-unless</span> response-is-expected?:bool
      row, screen<span class="Special"> &lt;- </span>render-text screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row
    <span class="Delimiter">}</span>
    <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end:label</span>
  <span class="Delimiter">}</span>
]

<span class="muRecipe">before</span> <span class="Constant">&lt;end-render-sandbox-reset-hidden&gt;</span> [
  *sandbox<span class="Special"> &lt;- </span>put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>, <span class="Constant">0</span>
]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->