dodona-edu / universal-judge

Universal judge for educational software testing
https://docs.dodona.be/en/tested
MIT License
9 stars 5 forks source link

Do not ignore leading & trailing whitespace by default #462

Closed niknetniko closed 8 months ago

niknetniko commented 10 months ago

As long as I could go back in git history, leading and trailing white space has been ignored by default. Basically, what happens when evaluating results is expected_stdout.strip() == generated_stdout.strip().

Recently it was said that this should not be the default, as we want to be strict by default.

However, this would make the simple case more difficult. For example,

- tab: "Testen"
  testcases:
  - stdin: "Jan"
    stdout: "Hallo, Jan!"
  - stdin: "Piet"
    stdout: "Hallo, Piet!"
  - stdin: "5236-hallo!"
    stdout: "Hallo, 5236-hallo!!"
  - stdin: "'wereld'"
    stdout: "Hallo, 'wereld'!"
  - stdin: '"wereld"'
    stdout: 'Hallo, "wereld"!'
  - stdin: "    "
    stdout: "Hallo,     !"

would need to become:

- tab: "Testen"
  testcases:
  - stdin: "Jan"
    stdout: "Hallo, Jan!\n"
  - stdin: "Piet"
    stdout: "Hallo, Piet!\n"
  - stdin: "5236-hallo!"
    stdout: "Hallo, 5236-hallo!!\n"
  - stdin: "'wereld'"
    stdout: "Hallo, 'wereld'!\n"
  - stdin: '"wereld"'
    stdout: 'Hallo, "wereld"!\n'
  - stdin: "    "
    stdout: "Hallo,     !\n"

A possible solution would be to add trailing newlines automatically to the test suite for stdout and stderr (and maybe stdin). However, we maybe also need a way to disable this behaviour then.

pdawyndt commented 10 months ago

After giving this some thought, here's what I would like to suggest:

I guess this is the better of worlds where we do exact matching by default, but with silent addition of final newlines in case they are missing from the test specification (or without the need to clutter the specification with newlines after single-line outputs. This might also alleviate the tricky ways in which YAML treats newlines in multiline strings.

pdawyndt commented 10 months ago

Also relates to https://github.com/dodona-edu/dodona/issues/5168: automatic insertion of final newlines if missing (by default) would also resolve this Python Tutor issue (although it would seem more sensible if Dodona also wouldn't ever strip the final character (newline)).

pdawyndt commented 10 months ago

I now see that my suggestion is also what @niknetniko suggested (but didn't read the original post until the very end).

niknetniko commented 10 months ago

The conclusion of talking it over IRL is the following:

niknetniko commented 10 months ago

I think the argument was made to in any case only strip newlines, not all white space, as this would break some exercises (e.g. those where a grid should be made). This seems reasonable to me.

pdawyndt commented 10 months ago

Here's another reason why I would by default append a newline to stdout and stderr the string included in the test specification does not end with a newline: to follow the C/POSIX convention in the expected output displayed in Dodona:

image

niknetniko commented 9 months ago

From #486:

That the expected/generated values are not the same is a big argument in favour of doing strict comparison in my opinion, so I would not be against making the validations strict (as the main argument against it previously was that the status quo caused no problems if I recall correctly).

pdawyndt commented 9 months ago

Here's an example that shows how confusing the newline-difference is for students, as it distracts from the true issue:

image

image