Skip to content

Commit

Permalink
improved Mojo::Base tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 10, 2012
1 parent 1c36f69 commit aa055a5
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 53 deletions.
1 change: 1 addition & 0 deletions Changes
Expand Up @@ -2,6 +2,7 @@ This file documents the revision history for Perl extension Mojolicious.

2.44 2012-01-11 00:00:00
- Improved syntax highlighting in perldoc browser slightly.
- Improved Mojo::Base tests.
- Improved documentation.
- Fixed Mojo::ByteStream, Mojo::Collection and Mojo::DOM to not be
subclasses of Mojo::Base.
Expand Down
49 changes: 14 additions & 35 deletions lib/Mojo/Base.pm
Expand Up @@ -56,59 +56,41 @@ sub new {
# so we optimize them by compiling our own code, don't be scared, we have
# tests for every single case
sub attr {
my ($class, $attrs, $default) = (shift, shift, shift);

# Check arguments
Carp::croak('Attribute generator called with too many arguments') if @_;
return unless $class && $attrs;
$class = ref $class || $class;
my ($class, $attrs, $default) = @_;
return unless ($class = ref $class || $class) && $attrs;

# Check default
Carp::croak('Default has to be a code reference or constant value')
if ref $default && ref $default ne 'CODE';

# Create attributes
$attrs = [$attrs] unless ref $attrs eq 'ARRAY';
my $ws = ' ';
for my $attr (@$attrs) {

Carp::croak(qq/Attribute "$attr" invalid/)
unless $attr =~ /^[a-zA-Z_]\w*$/;

# Header
my $code = "sub {\n";
# Header (check arguments)
my $code = "sub {\n if (\@_ == 1) {\n";

# No value
$code .= "${ws}if (\@_ == 1) {\n";
unless (defined $default) {
# No default value (return value)
unless (defined $default) { $code .= " return \$_[0]->{'$attr'};" }

# Return value
$code .= "$ws${ws}return \$_[0]->{'$attr'};\n";
}
# Default value
else {

# Return value
$code .= "$ws${ws}return \$_[0]->{'$attr'} ";
$code .= "if exists \$_[0]->{'$attr'};\n";
$code .= " return \$_[0]->{'$attr'} if exists \$_[0]->{'$attr'};\n";

# Return default value
$code .= "$ws${ws}return \$_[0]->{'$attr'} = ";
$code .=
ref $default eq 'CODE'
? '$default->($_[0])'
: '$default';
$code .= ";\n";
$code .= " return \$_[0]->{'$attr'} = ";
$code .= ref $default eq 'CODE' ? '$default->($_[0]);' : '$default;';
}
$code .= "$ws}\n";

# Store value
$code .= "$ws\$_[0]->{'$attr'} = \$_[1];\n";

# Return invocant
$code .= "${ws}\$_[0];\n";
$code .= "\n }\n \$_[0]->{'$attr'} = \$_[1];\n";

# Footer
$code .= '};';
# Footer (return invocant)
$code .= " \$_[0];\n};";

# We compile custom attribute code for speed
no strict 'refs';
Expand All @@ -119,10 +101,7 @@ sub attr {
Carp::croak("Mojo::Base compiler error: \n$code\n$@\n") if $@;

# Debug mode
if ($ENV{MOJO_BASE_DEBUG}) {
warn "\nATTRIBUTE: $class->$attr\n";
warn "$code\n\n";
}
warn "\nATTRIBUTE: $class->$attr\n$code\n\n" if $ENV{MOJO_BASE_DEBUG};
}
}

Expand Down
9 changes: 8 additions & 1 deletion t/mojo/base.t
@@ -1,6 +1,6 @@
use Mojo::Base -strict;

use Test::More tests => 411;
use Test::More tests => 413;

use FindBin;
use lib "$FindBin::Bin/lib";
Expand Down Expand Up @@ -78,4 +78,11 @@ is $monkey->bananas, undef, 'monkey has no bananas';
$monkey->bananas(3);
is $monkey->bananas, 3, 'monkey has 3 bananas';

# Exceptions
eval { BaseTest->attr(foo => []) };
like $@, qr/Default has to be a code reference or constant value/,
'right error';
eval { BaseTest->attr(23) };
like $@, qr/Attribute "23" invalid/, 'right error';

1;
2 changes: 1 addition & 1 deletion t/mojo/response.t
Expand Up @@ -277,7 +277,7 @@ ok !$res->at_least_version('1.2'), 'not version 1.2';
ok $res->headers->content_type =~ m#multipart/form-data#,
'right "Content-Type" value';
isa_ok $res->content, 'Mojo::Content::Single', 'right content';
like $res->content->asset->slurp, qr/hallo\ welt/, 'right content';
like $res->content->asset->slurp, qr/hallo welt/, 'right content';

# Build HTTP 1.1 response start line with minimal headers
$res = Mojo::Message::Response->new;
Expand Down
9 changes: 4 additions & 5 deletions t/mojo/template.t
Expand Up @@ -1043,30 +1043,29 @@ $file = File::Spec->catfile(File::Spec->splitdir($FindBin::Bin),
qw/lib exception.mt/);
$output = $mt->render_file($file);
isa_ok $output, 'Mojo::Exception', 'right exception';
like $output->message, qr/exception\.mt\ line\ 2/,
'message contains file name';
like $output->message, qr/exception\.mt line 2/, 'message contains file name';
is $output->lines_before->[0]->[0], 1, 'right number';
is $output->lines_before->[0]->[1], 'test', 'right line';
is $output->line->[0], 2, 'right number';
is $output->line->[1], '% die;', 'right line';
is $output->lines_after->[0]->[0], 3, 'right number';
is $output->lines_after->[0]->[1], '123', 'right line';
like "$output", qr/exception\.mt\ line\ 2/, 'right result';
like "$output", qr/exception\.mt line 2/, 'right result';

# Exception in file (different name)
$mt = Mojo::Template->new;
$file = File::Spec->catfile(File::Spec->splitdir($FindBin::Bin),
qw/lib exception.mt/);
$output = $mt->name('foo.mt')->render_file($file);
isa_ok $output, 'Mojo::Exception', 'right exception';
like $output->message, qr/foo\.mt\ line\ 2/, 'message contains file name';
like $output->message, qr/foo\.mt line 2/, 'message contains file name';
is $output->lines_before->[0]->[0], 1, 'right number';
is $output->lines_before->[0]->[1], 'test', 'right line';
is $output->line->[0], 2, 'right number';
is $output->line->[1], '% die;', 'right line';
is $output->lines_after->[0]->[0], 3, 'right number';
is $output->lines_after->[0]->[1], '123', 'right line';
like "$output", qr/foo\.mt\ line\ 2/, 'right result';
like "$output", qr/foo\.mt line 2/, 'right result';

# File to file with utf8 data
$mt = Mojo::Template->new;
Expand Down
2 changes: 1 addition & 1 deletion t/mojo/user_agent.t
Expand Up @@ -175,7 +175,7 @@ app->log->on(message => $message);
ok !$tx->success, 'not successful';
is $tx->error, 'Premature connection close.', 'right error';
is $timeout, 1, 'finish event has been emitted';
like $log, qr/Connection\ timeout\./, 'right log message';
like $log, qr/Connection timeout\./, 'right log message';

# GET /timeout (client times out)
$ua->once(
Expand Down
18 changes: 9 additions & 9 deletions t/mojolicious/exception_lite_app.t
Expand Up @@ -115,21 +115,21 @@ $t->post_ok('/does_not_exist')->status_is(404)

# GET /dead_template
$t->get_ok('/dead_template')->status_is(500)->content_like(qr/1\./)
->content_like(qr/dead\ template!/);
->content_like(qr/dead template!/);

# GET /dead_included_template
$t->get_ok('/dead_included_template')->status_is(500)->content_like(qr/1\./)
->content_like(qr/dead\ template!/);
->content_like(qr/dead template!/);

# GET /dead_template_with_layout
$t->get_ok('/dead_template_with_layout')->status_is(500)
->content_like(qr/2\./)->content_like(qr/dead\ template\ with\ layout!/);
->content_like(qr/2\./)->content_like(qr/dead template with layout!/);

# GET /dead_action
$t->get_ok('/dead_action')->status_is(500)
->content_type_is('text/html;charset=UTF-8')
->content_like(qr|get\ '/dead_action'|)
->content_like(qr/dead\ action!/);
->content_like(qr|get '/dead_action'|)
->content_like(qr/dead action!/);

# GET /dead_action.xml (different format)
$t->get_ok('/dead_action.xml')->status_is(500)->content_type_is('text/xml')
Expand All @@ -138,13 +138,13 @@ $t->get_ok('/dead_action.xml')->status_is(500)->content_type_is('text/xml')
# GET /dead_action.json (unsupported format)
$t->get_ok('/dead_action.json')->status_is(500)
->content_type_is('text/html;charset=UTF-8')
->content_like(qr|get\ '/dead_action'|)
->content_like(qr/dead\ action!/);
->content_like(qr|get '/dead_action'|)
->content_like(qr/dead action!/);

# GET /double_dead_action_☃
$t->get_ok('/double_dead_action_☃')->status_is(500)
->content_like(qr|get\ '/double_dead_action_☃'.*lite_app\.t\:\d|s)
->content_like(qr/double\ dead\ action!/);
->content_like(qr|get '/double_dead_action_☃'.*lite_app\.t\:\d|s)
->content_like(qr/double dead action!/);

# GET /trapped
$t->get_ok('/trapped')->status_is(200)->content_is('bar');
Expand Down
2 changes: 1 addition & 1 deletion t/mojolicious/pod_renderer_lite_app.t
Expand Up @@ -62,7 +62,7 @@ $t->get_ok('/perldoc/')->status_is(200)->text_is('h1 a[id="NAME"]', 'NAME')
# Perldoc browser (Mojolicious)
$t->get_ok('/perldoc/Mojolicious')->status_is(200)
->text_is('h1 a[id="NAME"]', 'NAME')->text_is('a[id="handler"]', 'handler')
->text_like('p', qr/Mojolicious/)->content_like(qr/Sebastian\ Riedel/);
->text_like('p', qr/Mojolicious/)->content_like(qr/Sebastian Riedel/);

__DATA__
Expand Down

0 comments on commit aa055a5

Please sign in to comment.