#!/usr/bin/perl use strict; use warnings; use Test::More no_plan => 1; use Perl6::MetaModel; use_ok('Perl6::MetaModel::Parser'); { # basic method my $p = Perl6::MetaModel::Parser->new(); isa_ok($p, 'Perl6::MetaModel::Parser'); my $source = q| class Foo { has $.bar; method bar { shift; $.bar = shift if @_; $.bar; } } |; $p->parse($source); my $Foo = $::{'*'}->FETCH('Foo'); isa_ok($Foo, 'Class'); isa_ok($Foo, 'Foo'); is($Foo->name, 'Foo', '... got the right name for class'); ok($Foo->has_method('bar'), '... Foo has the &bar method'); my $foo = $Foo->new(); isa_ok($foo, 'Foo'); $foo->bar(42); is($foo->bar, 42, '... our &bar method worked correctly'); } { # basic method my $p = Perl6::MetaModel::Parser->new(); isa_ok($p, 'Perl6::MetaModel::Parser'); my $source = q| class Foo2 { has @.bar; method bar { shift; push @.bar => @_; @.bar; } method baz { my ($self, $index) = @_; @.bar[$index]; } } |; $p->parse($source); my $Foo = $::{'*'}->FETCH('Foo2'); isa_ok($Foo, 'Class'); isa_ok($Foo, 'Foo2'); is($Foo->name, 'Foo2', '... got the right name for class'); ok($Foo->has_method('bar'), '... Foo has the &bar method'); ok($Foo->has_method('baz'), '... Foo has the &baz method'); my $foo = $Foo->new(); isa_ok($foo, 'Foo2'); $foo->bar(1, 2, 3, 4, 5); is_deeply( [ $foo->bar ], [ 1, 2, 3, 4, 5 ], '... our &bar method worked correctly'); is($foo->baz(0), 1, '... got the right value with &baz'); is($foo->baz(4), 5, '... got the right value with &baz'); is($foo->baz(1), 2, '... got the right value with &baz'); is($foo->baz(3), 4, '... got the right value with &baz'); } { # basic method my $p = Perl6::MetaModel::Parser->new(); isa_ok($p, 'Perl6::MetaModel::Parser'); my $source = q| class Foo3 { has %.bar; method bar { my ($self, $key, $value) = @_; %.bar{$key} = $value; } method baz { my ($self, $key) = @_; %.bar{$key}; } method foo { %.bar; } } |; $p->parse($source); my $Foo = $::{'*'}->FETCH('Foo3'); isa_ok($Foo, 'Class'); isa_ok($Foo, 'Foo3'); is($Foo->name, 'Foo3', '... got the right name for class'); ok($Foo->has_method('bar'), '... Foo has the &bar method'); ok($Foo->has_method('baz'), '... Foo has the &baz method'); my $foo = $Foo->new(); isa_ok($foo, 'Foo3'); $foo->bar(test => 42); is($foo->baz('test'), 42, '... our &bar and &baz methods worked correctly'); $foo->bar(test2 => 43); is_deeply( { $foo->foo }, { test => 42, test2 => 43 }, '... got the right return value here'); }