#!/usr/bin/pugs use v6; use Test; plan 9*2; # L<S06/"Operator overloading"> # Later, we want to run the same tests with two classes, Foo and Bar. # Foo overloads the operators by using multi methods, Bar by using multi subs. # But as currently both Foo and Bar do not compile, we have to create a # stubclass, which is then given to &run_tests_with. # But if the class does compile, $foo_class and $bar_class will be set to the # correct classes (Foo and Bar), and the tests have a chance to succeed. class StubClass {} my ($foo_class, $bar_class) = (StubClass, StubClass); eval ' class Foo { has $.bar is rw; multi method prefix:<~> ($self) { return $.bar } mutli method infix:<+> ($a, $b) { return "$a $b" } } $foo_class = Foo; '; eval ' class Bar { has $.bar is rw; } multi sub prefix:<~> (Bar $self) { return $self.bar } mutli sub infix:<+> (Bar $a, Bar $b) { return "$a $b" } $bar_class = Bar; '; run_tests_with($foo_class); run_tests_with($bar_class); sub run_tests_with($class) { { my $val; lives_ok { my $foo = $class.new(); $foo.bar = 'software'; $val = "$foo" }, '... class methods work for class', :todo<feature>; is($val, 'software', '... basic prefix operator overloading worked', :todo<feature>); lives_ok { my $foo = $class.new(); $foo.bar = 'software'; $val = $foo + $foo; }, '... class methods work for class', :todo<feature>; is($val, 'software software', '... basic infix operator overloading worked', :todo<feature>); } # Test that the object is correctly stringified when it is in an array. # And test that »...« automagically work, too. { my $obj; lives_ok { $obj = $class.new; $obj.bar = "pugs"; }, "instantiating a class which defines operators worked", :todo<feature>; my @foo = ($obj, $obj, $obj); my $res; lives_ok { $res = ~@foo }, "stringification didn't die", :todo<feature>; is $res, "pugs pugs pugs", "stringification overloading worked in array stringification", :todo<feature>; lives_ok { $res = ~[@foo »~« "!"] }, "stringification with hyperization didn't die", :todo<feature>; is $res, "pugs! pugs! pugs!", "stringification overloading was hyperized correctly", :todo<feature>; } }