package t::Test; use strict; use warnings; use File::Assets; use Directory::Scratch; use Test::Memory::Cycle; use Test::More; use HTML::Declare qw/LINK SCRIPT STYLE/; use base qw/Exporter/; use vars qw/@EXPORT/; @EXPORT = qw/compare/; my $scratch; sub scratch { my $self = shift; if (shift) { $scratch->cleanup if $scratch; undef $scratch; } return $scratch ||= do { t::Test::Scratch->new; }; } my $assets; sub assets { shift; memory_cycle_ok($assets) if $assets; return $assets = File::Assets->new(base => [ "http://example.com/", scratch->base, "/static" ], @_); } sub compare ($;@) { my $expect = shift; my @content; while (@_) { my %attributes; if (! ref $_[0]) { my $href = shift; my $kind; $kind = $1 if $href =~ s/^([\w-]+);//; ($kind) = $href =~ m/\.([^.]+)$/ unless $kind; %attributes = (%attributes, %{ shift() }) if ref $_[0] eq "HASH"; if ($kind eq "js") { push @content, SCRIPT({ type => "text/javascript", src => $href, _ => "", %attributes }); } elsif ($kind =~ m/^css\b/) { my ($type, $media) = split m/-/, $kind; $attributes{media} = $media if defined $media; push @content, LINK({ rel => "stylesheet", type => "text/css", href => $href, %attributes }); } } elsif (ref $_[0] eq "ARRAY") { my ($kind, $content, $attributes) = @{ shift() }; $attributes ||= {}; %attributes = (%attributes, %$attributes); if ($kind eq "js") { push @content, SCRIPT({ type => "text/javascript", _ => "\n$content" }); } elsif ($kind =~ m/^css\b/) { my ($type, $media) = split m/-/, $kind; push @content, STYLE({ type => "text/css", _ => "\n$content" }); } } else { die "Don't understand: @_"; } } return is($expect, join "\n", @content); } END { memory_cycle_ok($assets) if Test::Builder->new->{Have_Plan}; } package t::Test::Scratch; use base qw/Directory::Scratch/; sub new { my $class = shift; my $self = $class->SUPER::new(@_, CLEANUP => 0); $self->create_tree({ (map { $_ => "/* Test file: $_ */\n" } qw( static/css/apple.css static/css/banana.css static/js/apple.js js/grape.js js/plum.js css/grape.css other/pear.js static/apple.png static/banana.png static/apple.gif grape.jpg plum.jpeg grape.png apple.gif other/pear.tiff )), 'static/css/cherry.css' => <<_END_, div.cherry { font-weight: bold; /* Some comment */ font-weight: 100; border: 1px solid #aaaaaa; } div.cherry em { color: red; } _END_ 'static/js/cherry.js' => <<_END_, (function(){ alert("Nothing happens."); var cherry = 1 + 2; /* Nothing happens */ return function(alpha, beta, delta) { return alpha + beta + delta; } }()); _END_ 'static/css/grape.css' => <<_END_, /* This is grape.css */ _END_ }); return $self; } sub DESTROY { my $self = shift; $self->cleanup; $self->SUPER::DESTROY; } package File::Assets::Filter::TestCollect; use strict; use warnings; use base qw/File::Assets::Filter::Collect/; sub build_content { my $self = shift; return \"/* Everything is replaced with this! */" } package File::Assets::Filter::Test; use strict; use warnings; use base qw/File::Assets::Filter/; 1;