----- Original Message ----
> From: Moritz Lenz <[email protected]>
> * the word 'is' is overloaded in Perl 6
> * if we export subs is() and ok(), we clutter the
> namespace with subs with short names
> * is() is rather imprecise; it doesn't say *how*
> things are compared.
<snip>
> So Larry and Patrick developed the idea of creating an
> adverb on the test operator instead:
>
> $x == 1e5 :ok('the :ok makes this is a test');
This may all be irrelevant, but I'm tossing it out here in case anyone thinks
of how it might impact things.
I'm not entire certain how I feel about this yet, but I love the core concept
of making testing a first class feature (well, duh ... of course I would say
that :)
I'd like for this to be thought through really carefully lest we create an
interesting idea which is hampered by its implementation. Specifically, I'm
concerned about diagnostics. What we'd ultimately love to have in TAP is some
way of improving diagnostics (pseudo-TAP).
is 3,3 'constants are constants;
# ok 1 - constants are constants
# have: 3
# want: 3
Now we have a curious situation:
multisub foo(Str $bar);
multisub foo(Int $bar);
If we're testing what we should pass to &foo:
is 3,"3" 'constants are constants;
# ok 1 - constants are constants
# have: 3
# want: "3"
Integration tests will still do OK, but unit tests may have issues and this
could be an expectation violation. What does it mean that the string 3 eq the
integer 3?
Worse:
my $bar = 284;
ok $bar, '$bar should be true';
# ok 1 - $bar should be true
# have: 284
# want: True
That can also look a bit strange, particularly if someone is coming from a
different language background.
How would this new system handle diagnostic information? One thing which might
mitigate this is something we've wanted in newer versions of TAP:
my $bar = 284;
ok $bar, '$bar should be true';
# ok 1 - $bar should be true
# test: ok $bar, '$bar should be true';
# have: 284
# want: True
By letting programmers see the exact line of code for the test, the type
information *might* not be as important. I'm unsure.
One possibility is to look at the &Test::More::cmp_ok function:
$ perl -MTest::Most=no_plan -e 'cmp_ok 3, "==","2"'
not ok 1
# Failed test at -e line 1.
# got: 3
# expected: 2
1..1
If you change "2" to "3", the test still passes, but we could force it to not
pass unless eq is passed in as the second argument. Then we could have the
following diagnostics:
perl6 $ perl -MTest::Most=no_plan -e 'cmp_ok 3, "eq","3"'
not ok 1
# have: 3
# test: eq
# want: "3"
1..1
And then it's crystal clear why it failed.
Cheers,
Ovid