On 30.07.2024 21:51, Tomas Volf wrote:
> Hello,
>
> I think I found a bug in (srfi srfi-64) module shipped with GNU Guile.
>
> The specification says the following regarding the test-runner-test-name:
>
>> Returns the name of the current test or test group, as a string. During
>> execution of test-begin this is the name of the test group [..]
> Thus I believe that following should print `x':
>
>     (use-modules (srfi srfi-64))
>     (let ((r (test-runner-null)))
>       (test-runner-current r)
>       (test-runner-on-group-begin! r
>         (λ (runner suite-name count)
>           (pk (test-runner-test-name r))))
>       (test-begin "x"))
>
> However it does not:
>
>     ;;; ("")
>
> Have a nice day
> Tomas Volf

I think the spec *may* have meant to say "between test-begin and test-end" or 
"during execution of a test group" rather than "during execution of 
test-begin." The reason I think so is that the on-group-begin handler is also 
called before the new name is added to the stack. So, still having the old name 
at that point would be consistent. But this may also have all been 
unintentional, because the implementation of test-runner-test-name is kind of 
hacky (uses the name from the test-result alist).

If we take the spec literally, you are right in that it should set the name 
before calling the on-group-begin handler. And I think that's more intuitive 
anyway. So, I agree that this is best seen a bug, and I believe I've now fixed 
it in my implementation with this commit:

    
https://codeberg.org/taylan/scheme-srfis/commit/16ef0d987c99df7d488e6f4b3fef41d972a7552c

Now my code behaves as follows:

scheme@(guile-user)> ,use (srfi srfi-64)
;;; note: source file 
/home/taylan/src/scheme-srfis/guile-srfi-64/srfi/srfi-64.scm
;;;       newer than compiled 
/usr/lib/x86_64-linux-gnu/guile/3.0/ccache/srfi/srfi-64.go
;;; found fresh local cache at 
/home/taylan/.cache/guile/ccache/3.0-LE-8-4.6/home/taylan/src/scheme-srfis/guile-srfi-64/srfi/srfi-64.scm.go
scheme@(guile-user)> (let ((r (test-runner-null)))
  (test-runner-current r)
  (test-runner-on-group-begin! r
    (λ (runner suite-name count)
      (pk 'group-begin (test-runner-test-name r))))
  (test-runner-on-test-begin! r
    (λ (runner)
      (pk 'test-begin (test-runner-test-name r))))
  (test-runner-on-test-end! r
    (λ (runner)
      (pk 'test-end (test-runner-test-name r))))
  (test-runner-on-group-end! r
    (λ (runner)
      (pk 'group-end (test-runner-test-name r))))
  (test-runner-on-final! r
    (λ (runner)
      (pk 'final (test-runner-test-name r))))
  (pk 'before-begin (test-runner-test-name r))
  (test-begin "x")
  (pk 'within-group (test-runner-test-name r))
  (test-assert "x1" #t)
  (pk 'within-group (test-runner-test-name r))
  (test-end "x")
  (pk 'after-end (test-runner-test-name r)))

;;; (before-begin "")

;;; (group-begin "x")

;;; (within-group "x")

;;; (test-begin "x1")

;;; (test-end "x1")

;;; (within-group "x")

;;; (group-end "x")

;;; (final "")

;;; (after-end "")
$1 = ""
scheme@(guile-user)>

Further, to make the point at which the name is changed consistent with the 
point at which the group stack is changed, I've modified my implementation to 
call the on-group-begin handler *after* the stack is modified:

    
https://codeberg.org/taylan/scheme-srfis/commit/9f247f9b8d3bca2c9f9fe26581cd8f695714a8aa

>From what I can tell, this doesn't contradict anything in the spec, though it 
>is a deviation from what the reference implementation does in practice. I 
>think it's better this way, because otherwise the current name will be 
>inconsistent with the topmost name in the group stack during on-group-begin.

The downside is that there could theoretically be code out there that relies on 
the behavior of the reference implementation, but I see this as being quite 
unlikely and it would be easy to fix such code. Opinions welcome.


- Taylan

Reply via email to