use lib ; use Test; use Test::Helpers; plan 47; # https://github.com/Raku/old-issue-tracker/issues/6613 is-run 「:2(1)」, :err{.contains: 「use 1.base(2) instead」}, :exitcode(* !== 0), ':2(1) suggests using 1.base(2)'; # https://github.com/Raku/old-issue-tracker/issues/6609 throws-like { for [:a] X [:b] -> ($i, $j) { } }, Exception, message => / '' /, "anonymous subs get '' in arity error messages"; throws-like { sub l { IO::Socket::Async.listen: "localhost", 111390 } react whenever l() { whenever l() {} # try to listen on already open sock } }, X::TypeCheck::Binding::Parameter, message => /'type check failed'/; # https://github.com/Raku/old-issue-tracker/issues/6602 is-deeply class { has $.bar }.^methods».name.sort, , 'auto-generated methods present in .^methods'; # https://github.com/Raku/old-issue-tracker/issues/3799 is-run 「Failure.new(Exception.new); Nil」, :1exitcode, :err{ .contains: "Died with Exception" }, 'Failure.new(Exception.new) does not segfault'; throws-like { (1, 2, 3)[42] = 21 }, X::Assignment::RO, :message{ .contains: "List" & none "Str" }, 'Trying to assign to immutable List element gives useful error'; # https://github.com/Raku/old-issue-tracker/issues/4591 if $*DISTRO.is-win { skip 「is-run() routine doesn't quite work right on Windows」; } else { is-run 「 # !! NOTE !! Code's structure is important, to keep correct line number my $supply = supply { die 'pass' # line 4 } react { # line 6 whenever $supply { } } 」, :err{.contains: 'pass' & 'line 4' & 'line 6' }, :1exitcode, 'death in whenevered Supply referenced original location of throw'; } subtest 'using wrong sigil on var suggests correct variable name' => { plan 3; throws-like 「my @foo; $foo[1] = 42」, X::Undeclared, :message(/'Did you mean' .+ '@foo'/), '@array for $array'; throws-like 「my %foo; $foo<2> = 42」, X::Undeclared, :message(/'Did you mean' .+ '%foo'/), '%hash for $hash'; throws-like 「my @foo; my %foo; $foo<2> = 42」, X::Undeclared, :message(/'Did you mean' .+ [ '@foo' .+ '%foo' | '%foo' .+ '@foo' ]/), '@foo and %foo for $foo, when both are declared'; } # https://github.com/Raku/old-issue-tracker/issues/6267 throws-like 「my $x; $x = 50; 42 = $x」, X::Assignment::RO, :message{.contains: '42'}, 'RO assignment indicates value of the thing being assigned into'; # https://github.com/Raku/old-issue-tracker/issues/5943 is-run 「my %h = ; enum Bits (%h)」, :err{ .contains: 'No values supplied to enum' & 'does %h need to be declared constant' }, 'declaring enum with uninitialized hash warns about it'; # https://github.com/Raku/old-issue-tracker/issues/4285 { is-run 「=end MEOWS」, :err{ /«Pod»/ && .contains: '=begin MEOWS' }, :exitcode(*), 'error with `=end FOO` suggests Pod mistake and offers `=begin FOO`'; is-run 「=for」, :err(/«Pod»/), :exitcode(*), 'error for `=for` suggests it might be a Pod mistake'; } # https://github.com/Raku/old-issue-tracker/issues/4392 { is-run 「say 1 if;」, :err{ 1 == .comb: 'Whitespace required' and 1 == .comb: 「keyword 'if'」 }, :1exitcode, '`say 1 if;` does not repeat error'; is-run 「say 1 unless;」, :err{ 1 == .comb: 'Whitespace required' and 1 == .comb: 「keyword 'unless'」 }, :1exitcode, '`say 1 unless;` does not repeat error'; } # https://github.com/Raku/old-issue-tracker/issues/4718 if $*DISTRO.is-win { skip 「is-run() routine doesn't quite work right on Windows」; } else { is-run 「 # We're lookin... # for... # line number class MyInt is Any is Int { } # line 5 」, :err{.contains: ':5' }, :1exitcode, 'C3 linearization mentions line number'; } # https://github.com/Raku/old-issue-tracker/issues/2931 is-run '(:::[])', :err(/"No such symbol ':<>'"/), :1exitcode, 'no guts spillage with `(:::[])`'; # https://github.com/rakudo/rakudo/issues/1333 is-run 'use Test; cmp-ok 1, "!eqv", 2', :compiler-args[<-I lib>], :out{.starts-with: 'not ok 1'}, :err{.contains: '!eqv' & 'pass it as a Callable' }, :1exitcode, 'cmp-ok with Str metaop comparator suggests a working alternative`'; # https://github.com/rakudo/rakudo/pull/1321 throws-like { multi ambigu-arg-tester (Int) { say 'here' } multi ambigu-arg-tester (Str) { say 'there' } ambigu-arg-tester <42> }, X::Multi::Ambiguous, :message{ .contains: 'ambigu-arg-tester' & 'IntStr' }, 'an ambiguous call includes the arguments in the error message'; # https://github.com/Raku/old-issue-tracker/issues/3542 # GH #3682 throws-like { sprintf "%d" }, X::Str::Sprintf::Directives::Count, :args-used(1), :args-have(0), 'sprintf %d directive with one directive and no corresponding argument throws'; { # https://github.com/perl6/roast/commit/20fe657466 for int, "int", num, "num", str, "str" -> \type, $name { my @array := array[type].new; throws-like { @array[0] := my $a }, Exception, :message("Cannot bind to a native $name array"), "error message when binding to native $name array"; throws-like { @array[0]:delete }, Exception, :message("Cannot delete from a native $name array"), "error message when :deleting from native $name array"; my @shaped := array[type].new(:shape(42)); throws-like { @shaped[0] := my $a }, Exception, :message("Cannot bind to a native $name array"), "error message when binding to native $name array"; throws-like { @shaped[0]:delete }, Exception, :message("Cannot delete from a native $name array"), "error message when :deleting from shaped native $name array"; } } # https://github.com/rakudo/rakudo/issues/1346 subtest 'USAGE with subsets/where and variables with quotes' => { plan 3; sub uhas (\sig, Mu \c, \desc) { is-run 「sub MAIN (」 ~ sig ~ 「) {}」, :err{.contains: c}, :out(*), :exitcode(*), desc } group-of 3 => 'named params' => { uhas 「UInt :$x!」, 'UInt', 'mentions subset name'; uhas 「Int :$x! where 42」, 'Int where { ... }', 'Type + where clauses shown sanely'; uhas 「UInt :$x! where 42」, 'UInt where { ... }', 'subset + where clauses shown sanely'; } group-of 3 => 'anon positional params' => { uhas 「UInt $」, '', 'mentions subset name'; uhas 「Int $ where 42」, 'Int where { ... }', 'where clauses shown sanely'; uhas 「UInt $ where 42」, 'UInt where { ... }', 'subset + where clauses shown sanely'; } uhas 「$don't」, 「」, 'variable name does not get special quote treatment'; } if $*DISTRO.is-win { skip 「is-run() routine doesn't quite work right on Windows」; } else { subtest ':bundling and negation/explicit arguments'=> { plan 6; my $allows-bundling = q:to/EOF/; my %*SUB-MAIN-OPTS = :bundling; sub MAIN($pos, :$a, :$b, :$c) {} EOF is-run $allows-bundling, :err{.contains: 'combine bundling'}, :exitcode(1), :args<-abc=foo bar>, 'cannot combine bundling with explicit arguments'; is-run $allows-bundling, :err{.contains: 'combine bundling'}, :exitcode(1), :args<-abc='' bar>, 'cannot combine bundling with explicit arguments, even the empty string'; is-run $allows-bundling, :err{.contains: 'combine bundling'}, :exitcode(1), :args<-abc= bar>, 'cannot combine bundling with explicit arguments, even a nil argument'; is-run $allows-bundling, :exitcode(0), :args<-a=foo bar>, 'can pass explicit argument to a single option, even with bundling enabled'; is-run $allows-bundling, :err{.contains: 'combine bundling'}, :exitcode(1), :args<-/abc bar>, 'cannot combine bundling with negation'; is-run $allows-bundling, :exitcode(0), :args<-/a bar>, 'can negate single option, even with bundling enabled'; }} # https://github.com/Raku/old-issue-tracker/issues/5282 { throws-like { 'foo'.substr(5) }, X::OutOfRange, :message(/'Start argument to substr' .+ 'should be in 0..3' .+ '*-5'/); throws-like { ''.substr(1000) }, X::OutOfRange, :message(/'should be in 0..0' .+ '*-1000'/); } # https://github.com/Raku/old-issue-tracker/issues/4653 for ThreadPoolScheduler.new, CurrentThreadScheduler -> $*SCHEDULER { is-run q[Supply.interval(1).tap(-> { say 'hi' }); sleep 3;], :1exitcode, :err(/ 'Unhandled exception in code scheduled on thread' .+ 'Too many positionals' .+ 'expected 0 arguments but got 1' /), '.tap block with incorrect signature must fail'; } # https://github.com/rakudo/rakudo/issues/1336 throws-like 「 multi z (@a, Int, :$x where 1) {} multi z (@a, Str, :$x where 1) {} my @a = 1..200; z(@a, <1>, :x[1..200]) 」, X::Multi::NoMatch, :message{ .chars < 200 }, 'X::Multi::NoMatch does not dump entire contents of variables'; # https://github.com/Raku/old-issue-tracker/issues/6633 throws-like 「Set.new(1..300)<42> = 42」, X::Assignment::RO, :message{ .chars < 100 }, 'X::Assignment::RO does not dump entire contents of variables'; # https://github.com/Raku/old-issue-tracker/issues/4949 subtest 'cannot use Int type object as an operand' => { plan 14; throws-like 「(1/1)+Int」, X::Numeric::Uninitialized, 'A Rational instance cannot be added by an Int type object'; throws-like 「Int+(1/1)」, X::Numeric::Uninitialized, 'An Int type object cannot be added by a Rational instance'; throws-like 「(1/1)-Int」, X::Numeric::Uninitialized, 'A Rational instance cannot be subtracted by an Int type object'; throws-like 「Int-(1/1)」, X::Numeric::Uninitialized, 'An Int type object cannot be subtracted by a Rational instance'; throws-like 「(1/1)*Int」, X::Numeric::Uninitialized, 'A Rational instance cannot be multiplied by an Int type object'; throws-like 「Int*(1/1)」, X::Numeric::Uninitialized, 'An Int type object cannot be multiplied by a Rational instance'; throws-like 「(1/1)/Int」, X::Numeric::Uninitialized, 'A Rational instance cannot be divided by an Int type object'; throws-like 「Int/(1/1)」, X::Numeric::Uninitialized, 'An Int type object cannot be divided by a Rational instance'; throws-like 「Int/Int」, X::Numeric::Uninitialized, 'An Int type object cannot be divided by an Int type object'; throws-like 「Int/1」, X::Numeric::Uninitialized, 'An Int type object cannot be divided by an Int instance'; throws-like 「1/Int」, X::Numeric::Uninitialized, 'An Int instance cannot be divided by an Int type object'; throws-like 「(1/1)%Int」, X::Numeric::Uninitialized, 'A Rational instance modulo an Int type object is incalculable'; throws-like 「Int%(1/1)」, X::Numeric::Uninitialized, 'An Int type object modulo a Rational instance is incalculable'; throws-like 「(1/1)**Int」, X::Numeric::Uninitialized, 'A Rational instance cannot be powered by an Int type object'; } # https://github.com/rakudo/rakudo/issues/1364 throws-like 「sub meows;」, X::UnitScope::Invalid, :message(/ "placed a semicolon after routine's definition" /), 'unit-scoped sub def mentions potential unwanted semicolon'; # https://github.com/rakudo/rakudo/issues/1305 throws-like { my $r = 1..5; $r[42] = 21 }, X::Assignment::RO, :message{ .contains: 'Range' & none 'Str', '(Nil)' }, 'Trying to assign to immutable Range element gives useful error'; # The warning for `*+*` in void context is handled by the optimizer so # if we turn off the optimizer, we'd get clean STDERR/STDOUT, which is what # the this test checks. is-run 'EVAL "*+*"', :compiler-args[<--optimize=off>], 'optimizer flag gets propagated to EVAL'; # https://github.com/Raku/old-issue-tracker/issues/4760 throws-like 「use 6.0;」, X::Undeclared::Symbols, :message{ .contains: 'use "v" prefix for pragma (e.g., "use v6;", "use v6.c;")' }, 'suggests to use "use v6;" or "use v6.c;" when "use 6.0" is called'; # https://github.com/Raku/old-issue-tracker/issues/6567 throws-like 「need 6.0;」, X::Undeclared::Symbols, :message{ .contains: 'use "v" prefix and "use" for pragma (e.g., "use v6;", ' ~ '"use v6.c;")' }, 'suggests to use "use v6;" or "use v6.c;" when "need 6.0" is called'; throws-like 「need v6.0;」, Exception, :message{ .contains: 'In case of using pragma, use "use" instead (e.g., ' ~ '"use v6;", "use v6.c;").' }, 'suggests to use "use v6;" or "use v6.c;" when "need v6.0" is called'; # https://github.com/Raku/old-issue-tracker/issues/4839 throws-like 「^42 .^methods.say」, X::Syntax::Malformed, :message{ .contains: 'only basic method calls that exclusively use a dot can be detached' }, 'detached non-alpha method says what the problem is'; #### THIS FILE ALREADY LOTS OF TESTS ADD NEW TESTS TO THE NEXT error.t FILE # vim: expandtab shiftwidth=4