Programming environment for editing various of my live apps without restarting them.
I care a lot about being able to automatically check _any_ property about my
program before it ever runs. However, some things don't have tests yet, either
because I don't know how to test them or because I've been lazy. I'll at least
record those here.

Initializing settings:
  - from previous session
  - from defaults
    - `default_map` absent/present
    - when connecting to a new app

  - run with an untested version of LÖVE. Error message pops up and waits for a key. The app attempts to continue, and doesn't receive the key.
  - run with a LÖVE v12 release candidate. No errors; it is a supported version. All tests pass.
  - create a failing test. Start app. See test failure. Fix using driver.love
  - include an error in on.initialize. Start app. See error message. Fix on.initialize using driver.love.

Code loading:
* run love with directory; text editor runs
* run love with zip file; text editor runs

* How the screen looks. Our tests use a level of indirection to check text and
  graphics printed to screen, but not the precise pixels they translate to.
    - where exactly the cursor is drawn to highlight a given character
    - analogously, how a shape precisely looks as you draw it

Panning around on an infinite surface:
* The upstream luaML needs to pass all its manual tests.

Editing:
* The upstream template-live-editor needs to pass all its manual tests.

### Protocol with a client app; error-handling

* run driver without first running a client app. Driver window remains
  responsive. It can be closed without error.

* run driver and then client app from a separate terminal. Driver window
  populates with client app code.

* run client app and then driver from a separate terminal. Driver window
  populates with client app code.

* run 2 client apps and then driver. Driver window populates with code from
  one of the client apps at random. (NOT something to do in ernest; just
  documenting expected behavior.)

* press C-n, add an empty definition:

    ```
    foo = function()
    end
    ```
  Press C-d, select `foo` to delete its definition.
  Driver doesn't hang, no errors in logs.

* press C-d, select `on` to try to delete its definition.
  Driver shows an error that it's not allowed.

### Other compromises

Lua is dynamically typed. Tests can't patch over lack of type-checking.

* All strings are UTF-8. Bytes within them are not characters. I try to label
  byte offsets with the suffix `_offset`, and character positions as `_pos`.
  For example, `string.sub` should never use a `_pos`, only an `_offset`.

* Some ADT/interface support would be helpful in keeping per-line state in
  sync. Any change to line data should clear the derived line property
  `screen_line_starting_pos`.

* Some inputs get processed in love.textinput and some in love.keypressed.
  Several bugs have arisen due to destructive interference between the two for
  some key chord. I wish I could guarantee that the two sets are disjoint. But
  perhaps I'm not thinking about this right.

* Like any high-level language, it's easy to accidentally alias two non-scalar
  variables. I wish there was a way to require copy when assigning.

* I wish I could require pixel coordinates to be integers. The editor
  defensively converts input margins to integers.

* My test harness automatically runs `test_*` methods -- but only at the
  top-level. I wish there was a way to raise warnings if someone defines such
  a function inside a dict somewhere.