## clicking on sandbox results to 'fix' them and turn sandboxes into tests

scenario sandbox-click-on-result-toggles-color-to-green [
  trace-until 100/app  # trace too long
  assume-screen 100/width, 10/height
  # basic recipe
  1:address:array:character <- new [ 
recipe foo [
  reply 4
]]
  # run it
  2:address:array:character <- new [foo]
  assume-console [
    press F4
  ]
  3:address:programming-environment-data <- new-programming-environment screen:address:screen, 1:address:array:character, 2:address:array:character
  event-loop screen:address:screen, console:address:console, 3:address:programming-environment-data
  screen-should-contain [
    .                                                                                 run (F4)           .
    .                                                  ┊                                                 .
    .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
    .  reply 4                                         ┊0   edit          copy            delete         .
    .]                                                 ┊foo                                              .
    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊4                                                .
    .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
    .                                                  ┊                                                 .
  ]
  # click on the '4' in the result
  assume-console [
    left-click 5, 51
  ]
  run [
    event-loop screen:address:screen, console:address:console, 3:address:programming-environment-data
  ]
  # color toggles to green
  screen-should-contain-in-color 2/green, [
    .                                                                                                    .
    .                                                                                                    .
    .                                                                                                    .
    .                                                                                                    .
    .                                                                                                    .
    .                                                   4                                                .
    .                                                                                                    .
    .                                                                                                    .
  ]
  # cursor should remain unmoved
  run [
    4:character/cursor <- copy 9251/␣
    print screen:address:screen, 4:character/cursor
  ]
  screen-should-contain [
    .                                                                                 run (F4)           .
    .␣                                                 ┊                                                 .
    .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
    .  reply 4                                         ┊0   edit          copy            delete         .
    .]                                                 ┊foo                                              .
    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊4                                                .
    .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
    .                                                  ┊                                                 .
    .                                                  ┊                                                 .
    .                                                  ┊                                                 .
  ]
  # now change the result
  # then rerun
  assume-console [
    left-click 3, 11  # cursor to end of line
    press backspace
    type [3]
    press F4
  ]
  run [
    event-loop screen:address:screen, console:address:console, 3:address:programming-environment-data
  ]
  # result turns red
  screen-should-contain-in-color 1/red, [
    .                                                                                                    .
    .                                                                                                    .
    .                                                                                                    .
    .                                                                                                    .
    .                                                                                                    .
    .                                                   3                                                .
    .                                                                                                    .
    .                                                                                                    .
  ]
]

# this requires tracking a couple more things
container sandbox-data [
  response-starting-row-on-screen:number
  expected-response:address:array:character
]

# include expected response when saving or restoring a sandbox
before <end-save-sandbox> [
  {
    expected-response:address:array:character <- get *curr, expected-response:offset
    break-unless expected-response
    filename <- append filename, [.out]
    save filename, expected-response
  }
]

before <end-restore-sandbox> [
  {
    filename <- append filename, [.out]
    contents <- restore filename
    break-unless contents
    *curr <- put *curr, expected-response:offset, contents
  }
]

# clicks on sandbox responses save it as 'expected'
after <global-touch> [
  # check if it's inside the output of any sandbox
  {
    sandbox-left-margin:number <- get *current-sandbox, left:offset
    click-column:number <- get t, column:offset
    on-sandbox-side?:boolean <- greater-or-equal click-column, sandbox-left-margin
    break-unless on-sandbox-side?
    first-sandbox:address:sandbox-data <- get *env, sandbox:offset
    break-unless first-sandbox
    first-sandbox-begins:number <- get *first-sandbox, starting-row-on-screen:offset
    click-row:number <- get t, row:offset
    below-sandbox-editor?:boolean <- greater-or-equal click-row, first-sandbox-begins
    break-unless below-sandbox-editor?
    # identify the sandbox whose output is being clicked on
    sandbox:address:sandbox-data <- find-click-inMa %Zlr)1tMl.@KVs-
	9AeArrܿ~beZs6?Xoof먽美Puf٬j5a];"GjzE'ژ,d&g^	ZVoX0'Poa~wحjw~cXm
Pf{d0^wܛύoj=ڽ4_|Njjk~fz`en#
K<|izxڿ	vS:WW@ЛA׮p(jcxmu7na5'm
mZ\k5Z(רֻUx0_uZj/޹ՠu#/HbwbK#(js"c sohn L
,6cv̛#۴jڻZa׫Ơv®9N8;
l+r:k5
`>?-}\"0fgq"5f;y[fcmN vZT[&ŗ߷o=.˷x()cȓK O+Ɂr9"`ZoI#BT7ɚeMcW>y,yŝ	K2d˜fH
zm9C,Ea$YB٧/y_J|y+<1{T.ۿR.+<_w5~n?$%l(/x{7;@*wf*Y&\?V&̐)w}x2rf!C%;Jaw(QvUX;FeWYOwRt'Nw崼\cQ!|g[cH3ao}-Zv;b۹cl'c;A1;cl8mgAmǽ&;cl篙 nY~h=JVXܞooeG٥~WQoZmg]R\i[練RJ]xq
?+hm?Z[c?Zۏ6؏hm?.{긬o|塕3D߉[;ٹ0VE͹Xz\/Q|f'm>Gm)@X˭%oڸwİeRa5x_d']ǮxFũFMo`{&e{sr-$W<˕ϲo/Gg%8/[iIxUbG7P=&+4UY1LNP%2Wq5Qȗn1ޤޤ$O̓`ՃB1Oi
P0Fb(@
Э`.NClue0GF(`)6)Pa{Kd2qw'#%
`_dפL]
@ٳ|,_ZT5%$ܦ;GM"@-I9^#G9yy/_ቱVl?!B~~ǫ<[7p cW\/|:_KVsz4{Z)]|5NuJT\iyX=-,Xț#3wF%;O(|%/AܼQr4n<)ˮʕRn_y?d頭ćnr\﯉kz=fй<Ǔi(ˌJ?iwRi;'%d^G>o'#.ް
҃Ǯ]?^vz_Ħ
ƃ ofOn4 ͉z0W,,LʓG9~̬z(y\Q'S;(fT-Ucuu^Wߺ].Ảla͎mHߙbϭd_R~o-/ٸf	`~µi	te>
{/C[$J)	hDnH5$Tq	M$&urF[kӹz|Oٖ :	r%etcwl%I+M&ohs=B4a@\)[1Ap31M#޴,b>'	w_&rHO.$~T}+MlJ+VZdyvi3fqDe*v7'ŀvgŀEOEk]!E4^<z3:}@`hfWԊ<*Hׂ9l?Xƀ	c_nbNT؆aGaG@^7P1E9z45A-k7T9Xr3o4QA]^ŀԧ!!ŏq M:′)ЂxGDz/(Q$X
%QȾ9>hsU_<se0%F?.]\ >%qQ%WNK㒃G\b<%srKw&ܠ˚h%˚xT#m5zׄIrEd^m
#)bKsmreut(t_ǀⸯぺ!(	{c@'<:'ylvn@W5؎R8ż1^HKi8
dcy^X7|t憏《#v(YAyt$iqz-48ͣ#N8<$if٬j5a];"GjzE'ژ,dOg^	ZVoX0'Poa~wحjw~cXm
Pf{d0^wύoj=ڽ4_|Njj:m7!Je'#7f^ooF0
n%|v4z=X_IZ[+ iMkW[P81:OA۰ܶ͋oo_w|PF{t|nF5^-kT^<zկ:EjPjzV\1;Ajf7tYSdw&cv,#۴jڻZa׫Ơv®9N8;
l+rN:k5
`>?,}\"jct8dnn}m-16'n
;No}Ym׾*c
a2Ȃ,FIC!rFb=V>ř߷o=.˷x&)cȓK O+Ɂr9x#`ZoIC	U7ɚeMcW>y,yŝ	K2d˜fH
z9C,EaYB٧/y'JBn+<1{z[\Wx~{k^,Y^IJ.r1!Ra/_^RM0~=0@qf3AZ<]ᾨ/ɏ87g%s 6/ENJF+eywGz>DǕ\3
Dzhvw(Q
vG)®1*z;v.
1;|CS}kԲcl'΅c;0	17,8c;!Fn;bGn;=5c;q{CsW1ThmEr0Ȧ(<.~djk?Rxz7
}dN>x-xo?}@n?1@w3ٞ:dklkQ3(_ШG#Zqϋ^葊AK?CESux?,0DG-hku.%}/@mclqe_RدzoTjDߤmV0+z+'/GRh'љ@	N2UTAd/	?
MUKvӚU/MT	n1ޤޤ$O̓``,B}0Uh_Bi( L̵ ET>ȇ-mZ3*X!_`3&<{	.4}!rauO.lfݤJ
@UsnPbMAĠms$/y@JH5)	M?++<1?ۆ
sm"FX+ŽW;͸g{+o+ۻv}uFHNƠA>>ZBCBڳ&g9'9C&]A&t*5>?,!?&; \	g܀n:U%KB'3_7`.cdq ipL$J&|i)$_ycxbRXWxlGΆخKr~ry?{pP
tz5qK|njQ}xIp2Q|&yxZ>bhPª+2?4evy
eB7iի?ZɃȒwzh|2$Gôo>_cbͰȍBDcR24r2KpY6'S<^B-T|Tģ};	h3T"*
"Q%9gO.7qV	Rp=B9?>~>`l>	봓Y6B3m\Ān%UE]je
%(Cn(1!