Panning:
* Zoom = 1
short node entirely within viewer, cursor in middle of screen
✓ arrow keys
✓ page-up positions cursor on top line
✓ page-down positions cursor on bottom line
✓ mouse panning
tall node extending below viewport
✓ repeated down arrow near bottom pans down
✓ repeated up arrow
✓ repeated down arrow
✓ repeated pagedown
✓ pageup
✓ mouse panning
tall node extending above viewport
✓ repeated up arrow near top pans up
✓ repeated down arrow
✓ repeated up arrow
✓ pagedown
✓ repeated pageup
✓ mouse panning
tall node extending both below and above viewport
✓ repeated up arrow near top pans up
✓ repeated down arrow
✓ repeated down arrow near bottom pans down
✓ repeated up arrow
✓ repeated pagedown
✓ repeated pageup
✓ mouse panning
* Zoom > 1 (e.g. ctrl+0 ctrl+= ctrl+=)
short node entirely within viewer, cursor in middle of screen
✓ arrow keys
✓ page-up positions cursor on top line
✓ page-down positions cursor on bottom line
✓ mouse panning
tall node extending below viewport
✓ repeated down arrow near bottom pans down
✓ repeated up arrow
✓ repeated down arrow
✓ repeated pagedown
✓ pageup
✓ mouse panning
tall node extending above viewport
✓ repeated up arrow near top pans up
✓ repeated down arrow
✓ repeated up arrow
✓ pagedown
✓ repeated pageup
✓ mouse panning
tall node extending both below and above viewport
✓ repeated up arrow near top pans up
✓ repeated down arrow
✓ repeated down arrow near bottom pans down
✓ repeated up arrow
✓ repeated pagedown
✓ repeated pageup
✓ mouse panning
* Zoom < 1 (e.g. ctrl+0 ctrl+- ctrl+-)
short node entirely within viewer, cursor in middle of screen
✓ arrow keys
✓ page-up positions cursor on top line
✓ page-down positions cursor on bottom line
✓ mouse panning
tall node extending below viewport
✓ repeated down arrow near bottom pans down
✓ repeated up arrow
✓ repeated down arrow
✓ repeated pagedown
✓ repeated pageup
✓ mouse panning
tall node extending above viewport
✓ repeated up arrow near top pans up
✓ repeated down arrow
✓ repeated up arrow
✓ repeated pagedown
✓ repeated pageup
✓ mouse panning
tall node extending both below and above viewport
✓ repeated up arrow near top pans up
✓ repeated down arrow
✓ repeated down arrow near bottom pans down
✓ repeated up arrow
✓ repeated pagedown
✓ repeated pageup
✓ mouse panning
### Protocol with driver; error-handling
* clone this repo to a new client app, clear its save dir[1], run it, run the
driver, add a definition:
```
on.draw = function()
end
```
Hit F4. No error.
Quit driver, quit client app. Restart client app. No error.
* clone this repo to a new client app, clear its save dir, run it, run the
driver, add a definition that draws to screen:
```
on.draw = function()
love.graphics.print('hello!', 50,50)
end
```
Hit F4. Client app shows 'hello!'
Quit driver, quit client app. Restart client app. No error. Client app shows 'hello!'
* clone this repo to a new client app, clear its save dir, run it, run the
driver, add a definition containing invalid Lua:
```
on.draw = function(
```
Hit F4. Driver shows an error under the definition.
Fix the definition:
```
on.draw = function()
end
```
Hit F4. The error disappears.
* clone this repo to a new client app, clear its save dir, run it, run the
driver, add a definition containing invalid Lua:
```
on.draw = function(
```
Hit F4. Driver shows an error under the definition as before.
Quit the client app.
Restart the client app. It loads up without error.
Switch back to the driver. Fix the definition.
```
on.draw = function()
end
```
Hit F4. The error disappears.
Driver can connect to app on errors in on.initialize (and `on.load_settings`).
* clone this repo to a new client app, clear its save dir, run it, run the
driver, define `on.initialize` with a run-time error:
```
on.initialize = function()
foo = bar+1
end
```
Hit F4.
Quit the client app and restart. App shows an error.
Edit `on.initialize` in the driver and remove the error:
```
on.initialize = function()
end
```
Hit F4. The error disappears from the app and driver.
* clone this repo to a new client app, clear its save dir, run it, run the
driver, define `on.initialize` with a run-time error:
```
on.initialize = function()
foo = bar+1
end
```
Hit F4.
Quit the client app and restart. App shows an error.
Hit F4 again in the driver (without fixing the error).
The client app continues to show the error.
Driver can connect to app on errors in `on.quit` (and `on.save_settings`).
* clone this repo to a new client app, clear its save dir, run it, run the
driver, define `on.quit` with a run-time error:
```
on.quit = function()
foo = bar+1
end
```
Hit F4.
Try to quit the client app. It shows an error and refuses to quit.
Edit `on.quit` in the driver and remove the error:
```
on.quit = function()
end
```
Hit F4. The error disappears from the app and driver.
Try to quit the client app. Now the quit succeeds.
* clone this repo to a new client app, clear its save dir, run it, run the
driver, define `on.quit` with a run-time error:
```
on.quit = function()
foo = bar+1
end
```
Hit F4.
Try to quit the client app. It shows an error and refuses to quit.
Hit F4 again in the driver (without fixing the error).
Try to quit the client app again. It continues to show the error.
Driver can connect to app that contains test failures on startup.
* clone this repo to a new client app, clear its save dir, run it, run the
driver, define a new test with an invalid assertion:
```
test_foo = function()
check(nil, 'foo')
end
```
Hit F4. The test fails.
Quit the client app and restart. App shows an error.
Edit `test_foo` in the driver and remove the error:
```
test_foo = function()
end
```
Hit F4. The error disappears from the app and driver.
* clone this repo to a new client app, clear its save dir, run it, run the
driver, define a new test with an invalid assertion:
```
test_foo = function()
check(nil, 'foo')
end
```
Hit F4.
Quit the client app and restart. App shows an error.
Hit F4 again in the driver (without fixing the error).
The client app continues to show the error.