# -*- perl -*-
use Test::More;
use Test::Exception;
#
# can module get use'd ?
BEGIN { use_ok('Catalyst::View::ByCode::Renderer', ':default') };
#
# exported subs
#
can_ok('main', qw(template block block_content
load yield attr class id on
stash c doctype _
div span h1));
ok(!main->can('clear_markup'), 'clear_markup not exported');
ok(!main->can('init_markup'), 'init_markup not exported');
ok(!main->can('get_markup'), 'get_markup not exported');
#
# clear markup
#
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup is empty');
#
# defining a template
#
ok(!main->can('RUN'), 'sub RUN initially undefined');
lives_ok { template { print OUT 'bla' }; } 'defining a template works';
ok(main->can('RUN'), 'sub RUN defined by template directive');
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup still empty');
lives_ok { RUN() } 'RUN can get called';
is(Catalyst::View::ByCode::Renderer::get_markup(), 'bla', 'markup contains template result');
#
# defining a block
#
ok(!main->can('some_block'), 'sub some_block initially undefined');
# must be eval()ed because Devel::Declare defines the block as soon as 'block' is scanned by compiler
lives_ok { eval q{ package main; block some_block { return 'was inside block' } }; die $@ if $@; } 'block definition works';
ok(main->can('some_block'), 'sub some_block now defined');
#
# adding things to a fresh document
#
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 2 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 2 is empty');
lives_ok { div { attr abc => 42 }; } 'adding a div lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*
\s*
\s*}xms, 'markup2 looks OK');
#
# adding things to a fresh document and calling block
#
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 3 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 3 is empty');
lives_ok { div { id 'xyz'; b { some_block(); }; }; } 'adding a div with block lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*was\s+inside\s+block\s*\s*
\s*}xms, 'markup3 looks OK');
#
# testing 'class' operator inside a tag
#
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 4 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 4 is empty');
lives_ok { span { class 'xxx' }; } 'adding a span-tag with class lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*}xms, 'markup4 looks OK');
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 5 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 5 is empty');
lives_ok { span { class 'xxx'; class 'yyy' }; } 'adding a span-tag with 2 classes lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*}xms, 'markup5 looks OK');
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 6 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 6 is empty');
lives_ok { span { class 'xxx'; class '+yyy' }; } 'adding a span-tag with +2 classes lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*}xms, 'markup6 looks OK');
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 7 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 7 is empty');
lives_ok { span { class 'xxx yyy'; class '-yyy' }; } 'adding a span-tag with 2-1 classes lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*}xms, 'markup7 looks OK');
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 8 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 8 is empty');
lives_ok { span { class 'xxx yyy'; class '-yyy +zzz' }; } 'adding a span-tag with 2-1+1 classes lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*}xms, 'markup8 looks OK');
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 9 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 9 is empty');
lives_ok { span { class 'xxx yyy'; class '-yyy', '+zzz' }; } 'adding a span-tag with 2-1+1 classes lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*\s*}xms, 'markup9 looks OK');
#
# attrs with linebreaks
#
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 10 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 10 is empty');
lives_ok { div(id => 'xyz',
bla => 'blubb') { 'test' }; } 'adding a div with line-break lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*\s*test\s*
\s*}xms, 'markup10 looks OK');
#
# attrs with linebreaks (2)
#
{
package X;
sub new {
my $class = shift;
return bless {}, $class;
}
sub uri_for_action {
return 'bla'; # just a dummy return value
}
package Y;
sub new {
my $class = shift;
return bless {}, $class;
}
sub db_id {
return 'blubb'; # just a dummy return value
}
}
{
no warnings 'redefine';
sub c {
return X->new;
}
}
my $concept = Y->new;
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 11 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 11 is empty');
# this version failed before (2010-02-23):
lives_ok { a(href => c->uri_for_action('concept/detail', $concept->db_id),
title => 'Details',
class => 'ajax',
'data-target' => '-new',
dataTitle => 'Detail'
) { 'xxx' } }
'adding a a-tag with more line-breaks and strange attributes lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*
\s*xxx\s*\s*}xms, 'markup11 looks OK');
# content objects that can render() themselves
my $o = RenderMe->new();
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 12 lives';
is(Catalyst::View::ByCode::Renderer::get_markup(), '', 'markup 12 is empty');
lives_ok { div(foo => 'bar') { $o } } 'adding an object markup lives';
like(Catalyst::View::ByCode::Renderer::get_markup(), qr{\s*
"world"
\s*
}xms, 'markup 12 looks good');
#
# boilerplate
#
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 13 lives';
boilerplate;
is(Catalyst::View::ByCode::Renderer::get_markup(),
'
', 'boilerplate w/o content looks good');
lives_ok {Catalyst::View::ByCode::Renderer::init_markup()} 'initing markup 14 lives';
boilerplate { div { 'bla' } };
is(Catalyst::View::ByCode::Renderer::get_markup(),
'
bla
', 'boilerplate w/ content looks good');
done_testing();
# helper class for render test
{
package RenderMe;
sub new { bless {}, $_[0] }
sub render { '"world"' };
}