It was gettig tedious to add the change tracking logic in all of the
methods. And since there likely will be many more such methods, I have
now extracted that bit into its own function.
This makes editor help, such as autocomplete, much more usefull, while
still allowing me to use absolute paths for imports. The latter is
needed, so that I don't need an extra build step and also don't need to
wory too much about browser imports.
Does this violate the _browser based development_ principle? Yes, a tiny
little bit. However, using an editor is basically required, and making
it that much better seems worthwhile.
Did I waste too much time trying to make this perfect? Also yes. A
strong reminder why that principle is so important.
Specific sessions can now be opened by setting a query param to their
id. This is needed to allow users to reload the page without being
kicked out to the session selection.
The tailor calculation did not go down to one point if the losing team
scored points only after the winning team reached the tailor goal. This
has been fixed.
This made me realize that I forgot to write tests for the `results`
property of the game and session models. Those will follow in a later
commit.
As I noted in commit 85b9c2459c I noticed
that the testing of the invalidity of invalid struct "deserialization"
was not sound. That was because if one error was not actually thrown,
the test would still be satisfied by the following error. However, if
only that specific thing was wrong, no error would be thrown and an
invalid struct would be accepted.
Therefore I now changed those tests to also check the exception type and
its message. This means that if an exception is missing, it is
immediately picked up.
I also found out that one exception was actually wrong. I had mistyped
`TypeError` as `TypError`. Funnily enough that still causes an exception
to be thrown at that location, but a `ReferenceError` instead of the
`TypeError`. Such bugs should now be more easily noticable.
There are two reasons for this:
1. I've reconsidered my original plan to store the past games in
localStorage, because that would make it difficult to display them in
historical order, and would necessitate more complex logic for
updating and removing sessions.
2. I've been unhappy with how I did the testing of the serialization and
deserialization logic. So I redid it, and now I'm satisfied with it.
I've noticed that the testing methodology for the invalid fromStruct
method tests is not fully sound. If a check is accidentally removed that
test would not detect that, as long as it is not the very last. That is
because then the next error triggers. Therefore that will need to be
revisited.