File: method-generate-accessor.t

package info (click to toggle)
libmoo-perl 0.091011-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 476 kB
  • sloc: perl: 1,688; makefile: 4; sh: 1
file content (74 lines) | stat: -rw-r--r-- 1,819 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use strictures 1;
use Test::More;
use Test::Fatal;

use Method::Generate::Accessor;

my $gen = Method::Generate::Accessor->new;

{
  package Foo;
  use Moo;
}

$gen->generate_method('Foo' => 'one' => { is => 'ro' });

$gen->generate_method('Foo' => 'two' => { is => 'rw' });

like(
  exception { $gen->generate_method('Foo' => 'three' => {}) },
  qr/Must have an is/, 'No is rejected'
);

like(
  exception { $gen->generate_method('Foo' => 'three' => { is => 'purple' }) },
  qr/Unknown is purple/, 'is purple rejected'
);

like(
  exception { $gen->generate_method('Foo' => 'four' => { is => 'ro', default => 5 }) },
  qr/Invalid default/, 'default - scalar rejected'
);

like(
  exception { $gen->generate_method('Foo' => 'five' => { is => 'ro', default => [] }) },
  qr/Invalid default/, 'default - arrayref rejected'
);

is(
  exception { $gen->generate_method('Foo' => 'six' => { is => 'ro', default => sub { 5 } }) },
  undef, 'default - coderef accepted'
);

is(
  exception { $gen->generate_method('Foo' => 'seven' => { is => 'ro', default => bless sub { 5 } => 'Blah' }) },
  undef, 'default - blessed sub accepted'
);

{
  package WithOverload;
  use overload '&{}' => sub { sub { 5 } };
  sub new { bless {} }
}

is(
  exception { $gen->generate_method('Foo' => 'eight' => { is => 'ro', default => WithOverload->new }) },
  undef, 'default - object with overloaded ->() accepted'
);

like(
  exception { $gen->generate_method('Foo' => 'nine' => { is => 'ro', default => bless {} => 'Blah' }) },
  qr/Invalid default/, 'default - object rejected'
);

my $foo = Foo->new(one => 1);

is($foo->one, 1, 'ro reads');
ok(exception { $foo->one(-3) }, 'ro dies on write attempt');
is($foo->one, 1, 'ro does not write');

is($foo->two, undef, 'rw reads');
$foo->two(-3);
is($foo->two, -3, 'rw writes');

done_testing;