More tests for application
[gitmo/MooseX-Role-Parameterized.git] / t / 003-apply.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 14;
5 use Test::Exception;
6
7 do {
8     package MyRole::Storage;
9     use MooseX::Role::Parameterized;
10     use Moose::Util::TypeConstraints;
11
12     parameter format => (
13         is       => 'ro',
14         isa      => (enum ['Dumper', 'Storable']),
15         required => 1,
16     );
17
18     parameter freeze_method => (
19         is      => 'ro',
20         isa     => 'Str',
21         lazy    => 1,
22         default => sub { "freeze_" . shift->format },
23     );
24
25     parameter thaw_method => (
26         is      => 'ro',
27         isa     => 'Str',
28         lazy    => 1,
29         default => sub { "thaw_" . shift->format },
30     );
31
32     role {
33         my $p = shift;
34         my $format = $p->format;
35
36         my ($freezer, $thawer);
37
38         if ($format eq 'Dumper') {
39             require Data::Dumper;
40             $freezer = \&Data::Dumper::Dumper;
41             $thawer  = sub { eval "@_" };
42
43         }
44         elsif ($format eq 'Storable') {
45             require Storable;
46             $freezer = \&Storable::nfreeze;
47             $thawer  = \&Storable::thaw;
48         }
49         else {
50             die "Unknown format ($format)";
51         }
52
53         method $p->freeze_method => $freezer;
54         method $p->thaw_method   => $thawer;
55     };
56 };
57
58 throws_ok {
59     package MyClass::Error;
60     use Moose;
61     with 'MyRole::Storage';
62 } qr/^Attribute \(format\) is required/;
63
64 do {
65     package MyClass::Dumper;
66     use Moose;
67     with 'MyRole::Storage' => {
68         format => 'Dumper',
69     };
70 };
71
72 can_ok('MyClass::Dumper' => qw(freeze_Dumper thaw_Dumper));
73 cant_ok('MyClass::Storable' => qw(freeze_Storable thaw_Storable));
74
75 do {
76     package MyClass::Storable;
77     use Moose;
78     with 'MyRole::Storage' => {
79         format => 'Storable',
80     };
81 };
82
83 can_ok('MyClass::Storable' => qw(freeze_Storable thaw_Storable));
84 cant_ok('MyClass::Storable' => qw(freeze_Dumper thaw_Dumper));
85
86 do {
87     package MyClass::DumperRenamed;
88     use Moose;
89     with 'MyRole::Storage' => {
90         format => 'Dumper',
91         freeze_method => 'save',
92         thaw_method   => 'load',
93     };
94 };
95
96 can_ok('MyClass::DumperRenamed' => qw(save load));
97 cant_ok('MyClass::DumperRenamed' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
98
99 do {
100     package MyClass::Both;
101     use Moose;
102     with 'MyRole::Storage' => { format => 'Dumper'   };
103     with 'MyRole::Storage' => { format => 'Storable' };
104 };
105
106 can_ok('MyClass::Both' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable));
107
108 do {
109     package MyClass::Three;
110     use Moose;
111     with 'MyRole::Storage' => { format => 'Dumper'   };
112     with 'MyRole::Storage' => { format => 'Storable' };
113     with 'MyRole::Storage' => {
114         format        => 'Storable',
115         freeze_method => 'store',
116         thaw_method   => 'dump',
117     };
118 };
119
120 can_ok('MyClass::Three' => qw(freeze_Dumper freeze_Storable thaw_Dumper thaw_Storable store dump));
121
122 sub cant_ok {
123     local $Test::Builder::Level = $Test::Builder::Level + 1;
124     my $instance = shift;
125     for my $method (@_) {
126         ok(!$instance->can($method), "$instance cannot $method");
127     }
128 }
129