proosal: removing test-result objects Per Bothner (03 Apr 2005 08:11 UTC)
Re: proosal: removing test-result objects Donovan Kolbly (04 Apr 2005 14:18 UTC)
Re: proosal: removing test-result objects Per Bothner (05 Apr 2005 07:24 UTC)
Re: proosal: removing test-result objects Donovan Kolbly (05 Apr 2005 16:11 UTC)

Re: proosal: removing test-result objects Donovan Kolbly 04 Apr 2005 14:18 UTC

On Sun, 3 Apr 2005, Per Bothner wrote:

> As discussed in past messages, I'm leaning towords removing the
> concept of a test-result "value", which in the current specification
> is an association list.  Instead, I think it is better to make the
> "most recent test-result" be part of the test-runner, and allow
> extra properties there.
>
> Specifically, we add:
>
> ;; Get a named property - #f if unknown.
> (test-result [runner] 'property-name)
> These are properties of the current or most recent test.
>
> Exampes:
> (test-result 'kind) -> one of 'pass, 'xpass, 'fail, 'xfail, or 'skip.
> (test-passed?) -> same as (memq (test-result 'kind) '(pass xpass))
> (test-result 'source-line) -> line number if known or #f otherwise
> (test-result 'source-filename) -> file name known or #f otherwise
> (test-result 'source-form) -> test expresion as a list or #f
> (test-result 'test-name) -> test name or #f
>
> (test-result-set! [runner] 'property-name value) ;; set property
>
> (test-result-clear! [runner])
> This is called internally at the start of a test to reset the
> test-result state.  Specifically, all properties set by
> test-result-set! are cleared.
>
> The function on-test in (test-runner-on-test! runner on-test)
> is now a 1-argument function that only takes a test-runner.
> It gets the "test-result" from the test-runner.
>
> Note that both test-cases and test-runner can examine these
> properties.  For example (test-passed?) can be used to decide
> whether to skip subsequent tests.
>
> I also thing it simplies the implementation and api.  We can
> set properties at various statges during the execution of a test.
>
> Comments?  Does this seem like an improvement?

I like the idea of being able to programmatically decide wether to
continue, for example.  Then you could, e.g., define a custom runner that,
say, tolerates at most 10 errors and then skips everything else in the
rest of the group.

In some ways it seems better, although I don't quite get why you want to
*remove* test-result objects.  My mental model of test suites is that it's
a tree whose root is the suite, whose interior nodes are groups, and whose
leaves are test cases (each test case being represented by a test result).
I guess you have the same basic model, but none of those objects are first
class :-)

So I'd probably go the other way and make test results (or, more likely,
test cases) first class, something like so:

  (test-case [runner])  ->  current or most recent test case, or #f if none

  (test-case-kind tcase) -> one of (pass xpass ...) [*]
  (test-case-passed? tcase) ; same as (memq (test-case-kind tcase) '(pass xpass))
  (test-case-property tcase 'property [value])   ; property setter/getter
  (test-case-name tcase) -> test name

[* although 'kind' is looking like a strange name here; maybe
"disposition"?]

--
-- Donovan Kolbly                    (  xxxxxx@rscheme.org
				     (  http://www.rscheme.org/~donovan/