use lib ;
use Test;
use Test::Helpers;
plan 26;
subtest '.map does not explode in optimizer' => {
plan 3;
throws-like 「^4 .map: {}」, X::Cannot::Map, 'Hash';
throws-like 「^4 .map: 42」, X::Cannot::Map, 'Int';
sub foo ($x) { $x+2};
is-deeply ^4 .map(&foo), (2, 3, 4, 5).Seq, 'subroutine';
}
throws-like 「(lazy ).nodemap: {;}」, X::Cannot::Lazy, :action,
'nodemap mentions right action when throwing on lazies';
# https://github.com/rakudo/rakudo/issues/1314
throws-like 「'x'.substr: /x/, 'x'」, Exception,
message => /「did you mean 'subst'」/,
'using substr instead of subst';
# https://github.com/Raku/old-issue-tracker/issues/6672
todo 'no location of error, yet', 1 if $*VM.name eq 'jvm';
throws-like 「sprintf "%d", class Foo {}.new」,
X::Str::Sprintf::Directives::BadType, :gist(/«line\s+\d+$$/),
'errors from sprintf include location of error';
# https://github.com/rakudo/rakudo/issues/1560
subtest 'subsets get named in typecheck errors' => {
plan 4;
my subset MeowMix of Int where .so;
throws-like { -> MeowMix {}("x") },
X::TypeCheck::Binding::Parameter, :message{.contains: 'MeowMix'},
'type only, with wrong type given';
throws-like { -> MeowMix $ where .self {}("x") },
X::TypeCheck::Binding::Parameter, :message{.contains: 'MeowMix'},
'type + where, with wrong type given';
throws-like { -> MeowMix {}(0) },
X::TypeCheck::Binding::Parameter, :message{.contains: 'MeowMix'},
'type only, with failing constraint';
throws-like { -> MeowMix $ where .self {}(0) },
X::TypeCheck::Binding::Parameter, :message{.contains: 'MeowMix'},
'type + where, with failing constraint';
}
subtest 'like/unlike failures give useful diagnostics' => {
plan 2;
is-run 「use Test; plan 1; like 42, /43/」,
:1exitcode, :compiler-args[<-I lib>], :out(*), :err{.contains: 'expected a match with'},
'`like` says it wanted a match, not just "expected"';
is-run 「use Test; plan 1; unlike 42, /42/」,
:1exitcode, :compiler-args[<-I lib>], :out(*), :err{.contains: 'expected no match with'},
'`unlike` says it wanted no match, not just "expected"';
}
# https://github.com/rakudo/rakudo/issues/1699
throws-like {
with Proc::Async.new: :out, :!err, $*EXECUTABLE, '-e', '' {
.bind-stdout: IO::Handle.new;
.start;
}
}, Exception, :message{.contains: 'handle not open'},
'trying to bind Proc::Async to unopened handle gives useful error';
# https://github.com/Raku/old-issue-tracker/issues/6580
subtest 'unclosed hash quote index operator <> message' => {
plan 2;
throws-like "\n\nsay \$<\n\n", X::Comp::AdHoc,
'good error message for unclosed <> hash operator',
gist => all(
/:i:s<\'/, /:s< hash operator',
:gist{ not .match: /:i:s<;
-> Supercalifragilisticexpialidocious {}($x)
」, X::TypeCheck, :message{2 == +.comb: 'Supercalifragilisticexpialidocious'},
'X::TypeCheck does not prematurely chop off the .raku';
# https://github.com/Raku/old-issue-tracker/issues/5458
subtest '.polymod with zero divisor does not reference guts in error' => {
plan 4;
throws-like { 1.polymod: 0 }, X::Numeric::DivideByZero,
gist => /^ [ . ]+ $/, 'Int';
throws-like { 1.Rat.polymod: 0 }, X::Numeric::DivideByZero,
gist => /^ [ . ]+ $/, 'Real';
throws-like { 1.polymod: lazy 0, }, X::Numeric::DivideByZero,
gist => /^ [ . ]+ $/, 'Int (lazy)';
throws-like { 1.Rat.polymod: lazy 0, }, X::Numeric::DivideByZero,
gist => /^ [ . ]+ $/, 'Real (lazy)';
}
# https://github.com/Raku/old-issue-tracker/issues/4607
throws-like '++.++', X::Multi::NoMatch,
'++.++ construct does not throw LTA errors';
# https://github.com/Raku/old-issue-tracker/issues/5526
throws-like 'while (0){}', X::Syntax::Missing,
message => /'whitespace' .* 'before curlies' .* 'hash subscript'/,
'lack of whitespace in while (0){} suggests misparse as hash subscript';
# https://github.com/Raku/old-issue-tracker/issues/5510
is-run '*...‘WAT’', :err{not .contains: 'SORRY'}, :out(''), :exitcode{.so},
'runtime time errors do not contain ==SORRY==';
# https://github.com/Raku/old-issue-tracker/issues/3766
is-run 「
grammar Bug { token term { a }; token TOP { % \n } }
Bug.parse( 'a' );
」, :err(/'token TOP { '/), :exitcode{.so},
'`quantifier with %` error includes the token it appears in';
# https://github.com/Raku/old-issue-tracker/issues/4242
is-run 'sub rt125181 returns Str returns Int {}',
:err{ not $^o.contains: 'Unhandled exception' }, :exitcode{.so},
'using two `returns` traits does not cry about unhandled CONTROl exceptions';
{ # coverage; 2016-09-18
throws-like { 42.classify }, Exception, '.classify() on Any throws';
throws-like { 42.categorize }, Exception, '.categorize() on Any throws';
}
# https://github.com/rakudo/rakudo/issues/2110
subtest 'numeric backslash errors do not get accompanied by confusing others' => {
plan 3;
my &err = {.contains: 'backslash sequence' & none 'quantifies nothing' }
is-run 「"a" ~~ /(a)\1+$/」, :&err, :exitcode, 'regex';
is-run 「"\1"」, :&err, :exitcode, 'double quotes';
is-run 「Q:qq:cc/\1/」, :&err, :exitcode, ':qq:cc quoter';
}
# https://github.com/Raku/old-issue-tracker/issues/5739
if $*DISTRO.is-win {
skip 「is-run() routine doesn't quite work right on Windows」;
}
else {
is-run "my \$x = q:to/END/;\ny\n END", :err{ not .contains('Actions.nqp') },
'heredoc trimming warnings do not reference guts';
}
# https://github.com/rakudo/rakudo/issues/1813
cmp-ok X::OutOfRange.new(
:what, :got(0..3000), :range(1..3000)
).message.chars, '<', 150, 'X::OutOfRange does not stringify given Ranges';
# https://github.com/rakudo/rakudo/issues/2320
is-run 'class { method z { $^a } }', :err{ my @lines = $^msg.lines; @lines.grep({ !/'⏏'/ && .contains: '$^a' }) }, :exitcode{.so},
'Use placeholder variables in a method should yield a useful error message';
# https://github.com/rakudo/rakudo/issues/2385
is-run 'role R2385 { multi method r2385(--> Str) { ... } }; class C2385 does R2385 { multi method r2385(--> Int) { 1 } }',
'Role methods implemented by a class are checked for return type as well as for arguments',
:err(/ 'Multi method' .+? 'must be implemented' /), :exitcode(so *);
# https://github.com/rakudo/rakudo/issues/2921
is-run 'bleah:(0)', err => { .contains: 'You can\'t adverb' }, :exitcode{.so},
'Absurd adverbing results in a proper error message';
# https://github.com/rakudo/rakudo/issues/4178
is-run 'close $*OUT; say "hi"', err => { .contains: 'closed handle' }, :exitcode{.so},
'An attempt to use a closed handle results in a proper error message';
# vim: expandtab shiftwidth=4