use lib ; use Test; use Test::Helpers; plan 10; subtest 'IO::Handle.raku.EVAL roundtrips' => { plan 7; my $orig = IO::Handle.new: :path("foo".IO), :!chomp, :nl-in[], :nl-out, :encoding; is-deeply IO::Handle.raku.EVAL, IO::Handle, 'type object'; given $orig.raku.EVAL -> $evaled { is-deeply $evaled, $orig, 'instance'; is-deeply $evaled."$_"(), $orig."$_"(), $_ for ; } } # https://github.com/MoarVM/MoarVM/issues/971 if $*DISTRO.is-win { # https://github.com/Raku/old-issue-tracker/issues/6591 skip 'code too complex for Win32'; } else { todo 'Attach a profiler (e.g. JVisualVM) and press enter', 1 if $*VM.name eq 'jvm'; is-run :compiler-args[ '--profile', '--profile-filename=' ~ make-temp-path.absolute ], 「 my %functions = ( 1 => sub (@args) { [-] @args }, 4 => sub (@args) { [+] @args } ); sub foo(@ast) { %functions{@ast[0]}(@ast.map: {$_ ~~ Array ?? foo $_ !! $_} ); }([4, [1, 1, 2]]) for ^250; print "success"; 」, :out{.contains: 'success'}, :err{.contains: 'Writing profiler output'}, 'profiler does not crash'; } # https://github.com/Raku/old-issue-tracker/issues/6661 # XXX TODO 6.d REVIEW. Setting traits from multiple multies is undefined # and this test may need to be moved to rakudo's test suite. eval-lives-ok 「 multi infix:<↑> is assoc is tighter(&infix:<**>) { $^n ** $^m } multi infix:<↑↑> ($, 0) is assoc is tighter(&infix:<↑>) { 1 } multi infix:<↑↑> is assoc is tighter(&infix:<↑>) { [↑] $^n xx $^m } 」, 'no crash when defining multiple routines with tightnes'; # https://github.com/rakudo/rakudo/issues/1411 -> Positional:D[Int] \z { is-deeply z.List, (1, 2, 3), 'parametarization of a DefiniteHOW does not complain about complex coercers' }(Array[Int].new: 1, 2, 3); # https://github.com/rakudo/rakudo/issues/1315 # https://github.com/rakudo/rakudo/issues/1477 # The non-optimizing custom stuff might not be spec material: # https://colabti.org/irclogger/irclogger_log/perl6-dev?date=2018-02-07#l44 # and with extra comments on https://github.com/rakudo/rakudo/issues/1477#issuecomment-363644261 subtest 'postfix-to-prefix-inc-dec opt does not rewrite custom ops' => { plan 5; subtest 'custom classes' => { plan 2; my class A {} sub prefix:<++>(A) { flunk 'postfix increment' } sub postfix:<++>(A) { pass 'postfix increment' } sub prefix:<-->(A) { flunk 'postfix decrement' } sub postfix:<-->(A) { pass 'postfix decrement' } my $var = A.new; $var++; $var--; } subtest 'core types (Int)' => { plan 2; sub prefix:<++>(Int) { flunk 'postfix increment' } sub postfix:<++>(Int) { pass 'postfix increment' } sub prefix:<-->(Int) { flunk 'postfix decrement' } sub postfix:<-->(Int) { pass 'postfix decrement' } my $var = 42; $var++; $var--; } subtest 'core types (Num)' => { plan 2; sub prefix:<++>(Num) { flunk 'postfix increment' } sub postfix:<++>(Num) { pass 'postfix increment' } sub prefix:<-->(Num) { flunk 'postfix decrement' } sub postfix:<-->(Num) { pass 'postfix decrement' } my $var = 42e0; $var++; $var--; } subtest 'core types (native int)' => { plan 2; sub prefix:<++>(int) { flunk 'postfix increment' } sub postfix:<++>(int) { pass 'postfix increment' } sub prefix:<-->(int) { flunk 'postfix decrement' } sub postfix:<-->(int) { pass 'postfix decrement' } my int $var = 42; $var++; $var--; } subtest 'core types (native num)' => { plan 2; sub prefix:<++>(num) { flunk 'postfix increment' } sub postfix:<++>(num) { pass 'postfix increment' } sub prefix:<-->(num) { flunk 'postfix decrement' } sub postfix:<-->(num) { pass 'postfix decrement' } my num $var = 42e0; $var++; $var--; } } { # https://github.com/rakudo/rakudo/issues/1481 my @res; multi sub foo($x where /{@res.push: $x}./) {} multi sub foo($y where /{@res.push: $y}./) {} foo 'a'; foo 'b'; todo 'JVM backend still does trial bind, giving []', 1 if $*VM.name eq 'jvm'; is-deeply @res, [], 'regex blocks update their lexical variables right'; } group-of 2 => 'collation experiment' => { todo 'Dynamic variable $*COLLATION not found', 2 if $*VM.name eq 'jvm'; is-run 「$*COLLATION.set: :primary; print 'pass'」, :out, '$*COLLATION.set no longer requires experimental pragma'; is-run 「 $*COLLATION.set: :primary; print 'pass' 」, :out, :compiler-args[<-I lib>], 'we can still use the pragma (to support old code)'; } subtest 'Distribution::Resource can be stringified', { lives-ok { Distribution::Resource.raku }, 'Can use .raku'; lives-ok { Distribution::Resource.Str }, 'Can use .Str'; lives-ok { Distribution::Resource.gist }, 'Can use .gist'; } class ParameterChild is Parameter { has $.foobar } is ParameterChild.new(foobar => 'Baz').foobar, 'Baz', 'Subclassing of Parameter works'; is Parameter.new(:name('$a'), :type(Int), :optional).perl, 'Int $a?', 'Parameter takes by-name parameters itself'; # vim: expandtab shiftwidth=4