prefer trait over metaclass as much as possible
[gitmo/MooseX-Getopt.git] / t / 001_basic.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 70;
5 use Test::Moose;
6 use Test::NoWarnings 1.04 ':early';
7
8 BEGIN {
9     use_ok('MooseX::Getopt');
10 }
11
12 {
13     package App;
14     use Moose;
15
16     with 'MooseX::Getopt';
17
18     has 'data' => (
19         metaclass => 'Getopt',
20         is        => 'ro',
21         isa       => 'Str',
22         default   => 'file.dat',
23         cmd_flag  => 'f',
24     );
25
26     has 'cow' => (
27         metaclass   => 'Getopt',
28         is          => 'ro',
29         isa         => 'Str',
30         default     => 'moo',
31         cmd_aliases => [qw/ moocow m c /],
32     );
33
34     has 'horse' => (
35         traits      => ['Getopt'],
36         is          => 'ro',
37         isa         => 'Str',
38         default     => 'bray',
39         cmd_flag    => 'horsey',
40         cmd_aliases => 'x',
41     );
42
43     has 'length' => (
44         is      => 'ro',
45         isa     => 'Int',
46         default => 24
47     );
48
49     has 'verbose' => (
50         is     => 'ro',
51         isa    => 'Bool',
52     );
53
54     has 'libs' => (
55         is      => 'ro',
56         isa     => 'ArrayRef',
57         default => sub { [] },
58     );
59
60     has 'details' => (
61         is      => 'ro',
62         isa     => 'HashRef',
63         default => sub { {} },
64     );
65
66     has '_private_stuff' => (
67         is      => 'ro',
68         isa     => 'Int',
69         default => 713
70     );
71
72     has '_private_stuff_cmdline' => (
73         traits    => ['Getopt'],
74         is        => 'ro',
75         isa       => 'Int',
76         default   => 832,
77         cmd_flag  => 'p',
78     );
79
80 }
81
82 foreach my $attr_name (qw(data cow horse _private_stuff_cmdline)) {
83     my $attr = App->meta->get_attribute($attr_name);
84     isa_ok($attr, 'Moose::Meta::Attribute');
85     if ($attr_name eq 'data' or $attr_name eq 'cow')
86     {
87         isa_ok($attr, 'MooseX::Getopt::Meta::Attribute');
88     }
89     else
90     {
91         does_ok($attr, 'MooseX::Getopt::Meta::Attribute::Trait');
92     }
93     can_ok($attr, 'cmd_flag');
94     can_ok($attr, 'cmd_aliases');
95 }
96
97 {
98     local @ARGV = ();
99
100     my $app = App->new_with_options;
101     isa_ok($app, 'App');
102
103     ok(!$app->verbose, '... verbosity is off as expected');
104     is($app->length, 24, '... length is 24 as expected');
105     is($app->data, 'file.dat', '... data is file.dat as expected');
106     is_deeply($app->libs, [], '... libs is [] as expected');
107     is_deeply($app->details, {}, '... details is {} as expected');
108 }
109
110 {
111     local @ARGV = ('--verbose', '--length', 50);
112
113     my $app = App->new_with_options;
114     isa_ok($app, 'App');
115
116     ok($app->verbose, '... verbosity is turned on as expected');
117     is($app->length, 50, '... length is 50 as expected');
118     is($app->data, 'file.dat', '... data is file.dat as expected');
119     is_deeply($app->libs, [], '... libs is [] as expected');
120     is_deeply($app->details, {}, '... details is {} as expected');
121 }
122
123 {
124     local @ARGV = ('--verbose', '-f', 'foo.txt');
125
126     my $app = App->new_with_options;
127     isa_ok($app, 'App');
128
129     ok($app->verbose, '... verbosity is turned on as expected');
130     is($app->length, 24, '... length is 24 as expected');
131     is($app->data, 'foo.txt', '... data is foo.txt as expected');
132     is_deeply($app->libs, [], '... libs is [] as expected');
133     is_deeply($app->details, {}, '... details is {} as expected');
134 }
135
136 {
137     local @ARGV = ('--verbose', '--libs', 'libs/', '--libs', 'includes/lib');
138
139     my $app = App->new_with_options;
140     isa_ok($app, 'App');
141
142     ok($app->verbose, '... verbosity is turned on as expected');
143     is($app->length, 24, '... length is 24 as expected');
144     is($app->data, 'file.dat', '... data is foo.txt as expected');
145     is_deeply($app->libs,
146     ['libs/', 'includes/lib'],
147     '... libs is [libs/, includes/lib] as expected');
148     is_deeply($app->details, {}, '... details is {} as expected');
149 }
150
151 {
152     local @ARGV = ('--details', 'os=mac', '--details', 'name=foo');
153
154     my $app = App->new_with_options;
155     isa_ok($app, 'App');
156
157     ok(!$app->verbose, '... verbosity is turned on as expected');
158     is($app->length, 24, '... length is 24 as expected');
159     is($app->data, 'file.dat', '... data is foo.txt as expected');
160     is_deeply($app->libs, [], '... libs is [] as expected');
161     is_deeply($app->details,
162     { os => 'mac', name => 'foo' },
163     '... details is { os => mac, name => foo } as expected');
164 }
165
166 {
167     # Test negation on booleans too ...
168     local @ARGV = ('--noverbose');
169
170     my $app = App->new_with_options;
171     isa_ok($app, 'App');
172
173     ok(!$app->verbose, '... verbosity is turned off as expected');
174     is($app->length, 24, '... length is 24 as expected');
175     is($app->data, 'file.dat', '... file is file.dat as expected');
176     is_deeply($app->libs, [], '... libs is [] as expected');
177     is_deeply($app->details, {}, '... details is {} as expected');
178 }
179
180 # Test cmd_alias without cmd_flag
181 {
182     local @ARGV = ('--cow', '42');
183     my $app = App->new_with_options;
184     isa_ok($app, 'App');
185     is($app->cow, 42, 'cmd_alias, but not using it');
186 }
187 {
188     local @ARGV = ('--moocow', '88');
189     my $app = App->new_with_options;
190     isa_ok($app, 'App');
191     is($app->cow, 88, 'cmd_alias, using long one');
192 }
193 {
194     local @ARGV = ('-c', '99');
195     my $app = App->new_with_options;
196     isa_ok($app, 'App');
197     is($app->cow, 99, 'cmd_alias, using short one');
198 }
199
200 # Test cmd_alias + cmd_flag
201 {
202     local @ARGV = ('--horsey', '123');
203     my $app = App->new_with_options;
204     isa_ok($app, 'App');
205     is($app->horse, 123, 'cmd_alias+cmd_flag, using flag');
206 }
207 {
208     local @ARGV = ('-x', '321');
209     my $app = App->new_with_options;
210     isa_ok($app, 'App');
211     is($app->horse, 321, 'cmd_alias+cmd_flag, using alias');
212 }
213
214 # Test _foo + cmd_flag
215 {
216     local @ARGV = ('-p', '666');
217     my $app = App->new_with_options;
218     isa_ok($app, 'App');
219     is($app->_private_stuff_cmdline, 666, '_foo + cmd_flag');
220 }
221
222 # Test ARGV support
223 {
224     my @args = ('-p', 12345, '-c', 99, '-');
225     local @ARGV = @args;
226     my $app = App->new_with_options;
227     isa_ok($app, 'App');
228     is_deeply($app->ARGV, \@args, 'ARGV accessor');
229     is_deeply(\@ARGV, \@args, '@ARGV unmangled');
230     is_deeply($app->extra_argv, ['-'], 'extra_argv accessor');
231 }