9 if ( !eval { require MooseX::ConfigFromFile } )
11 plan skip_all => 'Test requires MooseX::ConfigFromFile';
22 with 'MooseX::Getopt';
23 with 'MooseX::ConfigFromFile';
25 has 'config_from_override' => (
31 has 'optional_from_config' => (
37 has 'required_from_config' => (
43 has 'required_from_argv' => (
49 sub get_config_from_file
51 my ( $class, $file ) = @_;
54 required_from_config => 'from_config_1',
55 optional_from_config => 'from_config_2',
58 if ( $file ne '/notused/default' ) {
59 $config{config_from_override} = 1;
67 package App::DefaultConfigFile;
72 has '+configfile' => (
73 default => '/notused/default',
77 foreach my $parser_name (qw(MooseX::Getopt::Parser::Long MooseX::Getopt::Parser::Descriptive MooseX::Getopt::Parser::Default)) {
79 if ($parser_name eq 'MooseX::Getopt::Parser::Descriptive') {
80 eval { require Getopt::Long::Descriptive };
81 skip "Getopt::Long::Descriptive not installed", 41 if $@;
86 local @ARGV = qw( --required_from_argv 1 );
89 my $parser = $parser_name->new;
90 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
92 my $options = App->get_options_from_configfile;
93 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App' } );
94 isa_ok($getopt, 'MooseX::Getopt::Session');
96 App->new_with_options( getopt => $getopt );
97 } qr/required_from_config/;
100 my $parser = $parser_name->new;
101 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
103 my $options = App::DefaultConfigFile->get_options_from_configfile;
104 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App::DefaultConfigFile' } );
105 isa_ok($getopt, 'MooseX::Getopt::Session');
107 my $app = App::DefaultConfigFile->new_with_options( getopt => $getopt );
108 isa_ok( $app, 'App::DefaultConfigFile' );
111 ok( !$app->config_from_override,
112 '... config_from_override false as expected' );
114 is( $app->configfile, '/notused/default',
115 '... configfile is /notused/default as expected' );
121 local @ARGV = qw( --configfile /notused --required_from_argv 1 );
124 my $parser = $parser_name->new;
125 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
127 my $options = App->get_options_from_configfile;
128 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App' } );
129 isa_ok($getopt, 'MooseX::Getopt::Session');
131 my $app = App->new_with_options( getopt => $getopt );
132 isa_ok( $app, 'App' );
137 my $parser = $parser_name->new;
138 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
140 my $options = App::DefaultConfigFile->get_options_from_configfile;
141 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App::DefaultConfigFile' } );
142 isa_ok($getopt, 'MooseX::Getopt::Session');
144 my $app = App::DefaultConfigFile->new_with_options( getopt => $getopt );
145 isa_ok( $app, 'App::DefaultConfigFile' );
148 ok( $app->config_from_override,
149 '... config_from_override true as expected' );
151 is( $app->configfile, '/notused',
152 '... configfile is /notused as expected' );
156 # Required arg not supplied from cmdline
158 local @ARGV = qw( --configfile /notused );
160 my $parser = $parser_name->new;
161 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
163 my $options = App->get_options_from_configfile;
164 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App' } );
165 isa_ok($getopt, 'MooseX::Getopt::Session');
167 App->new_with_options( getopt => $getopt );
168 } qr/required_from_argv/;
171 # Config file value overriden from cmdline
173 local @ARGV = qw( --configfile /notused --required_from_argv 1 --required_from_config override );
175 my $parser = $parser_name->new;
176 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
178 my $options = App->get_options_from_configfile;
179 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App' } );
180 isa_ok($getopt, 'MooseX::Getopt::Session');
182 my $app = App->new_with_options( getopt => $getopt );
183 isa_ok( $app, 'App' );
185 is( $app->required_from_config, 'override',
186 '... required_from_config is override as expected' );
188 is( $app->optional_from_config, 'from_config_2',
189 '... optional_from_config is from_config_2 as expected' );
194 local @ARGV = qw( --required_from_argv 1 --required_from_config noconfig );
196 my $parser = $parser_name->new;
197 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
199 my $options = App->get_options_from_configfile;
200 my $getopt = MooseX::Getopt::Session->new( parser => $parser, options => $options, classes_filter => sub { $_ eq 'App' } );
201 isa_ok($getopt, 'MooseX::Getopt::Session');
203 my $app = App->new_with_options( getopt => $getopt );
204 isa_ok( $app, 'App' );
206 is( $app->required_from_config, 'noconfig',
207 '... required_from_config is noconfig as expected' );
209 ok( !defined $app->optional_from_config,
210 '... optional_from_config is undef as expected' );
214 package BaseApp::WithConfig;
216 with 'MooseX::ConfigFromFile';
218 sub get_config_from_file { return {}; }
222 package DerivedApp::Getopt;
224 extends 'BaseApp::WithConfig';
225 with 'MooseX::Getopt';
228 # With DerivedApp, the Getopt role was applied at a different level
229 # than the ConfigFromFile role
232 my $parser = $parser_name->new;
233 ok(ref($parser) =~ /^MooseX::Getopt::Parser::/, '... parser object is created');
235 my $getopt = MooseX::Getopt::Session->new( parser => $parser, classes_filter => sub { $_ eq 'DerivedApp::Getopt' } );
236 isa_ok($getopt, 'MooseX::Getopt::Session');
238 DerivedApp::Getopt->new_with_options( getopt => $getopt );
239 } 'Can create DerivedApp';
245 is( $app->required_from_config, 'from_config_1',
246 '... required_from_config is from_config_1 as expected' );
248 is( $app->optional_from_config, 'from_config_2',
249 '... optional_from_config is from_config_2 as expected' );
251 is( $app->required_from_argv, '1',
252 '... required_from_argv is 1 as expected' );