File Coverage

blib/lib/App/prove4air.pm
Criterion Covered Total %
statement 22 91 24.1
branch 0 30 0.0
condition 0 14 0.0
subroutine 8 10 80.0
pod 0 2 0.0
total 30 147 20.4


line stmt bran cond sub pod time code
1             package App::prove4air;
2             BEGIN {
3 1     1   75914 $App::prove4air::VERSION = '0.0013';
4             }
5             # ABSTRACT: Test ActionScript (.as) with prove, Adobe Air, and tap4air
6              
7 1     1   8 use strict;
  1         2  
  1         24  
8 1     1   4 use warnings;
  1         2  
  1         20  
9              
10 1     1   644 use Path::Class;
  1         80226  
  1         68  
11 1     1   7 use File::Temp qw/ tempdir /;
  1         2  
  1         63  
12 1     1   5 use File::Copy qw/ copy /;
  1         1  
  1         53  
13 1     1   960 use IPC::System::Simple();
  1         14279  
  1         30  
14 1     1   1173 use Getopt::Long qw/ GetOptions :config pass_through /;
  1         10773  
  1         5  
15              
16             sub run {
17 0     0 0   my $self = shift;
18 0           my @arguments = @_;
19              
20 0           my ( $build_air, $run_air, $exit );
21 0 0         $build_air = $ENV{ BUILD_AIR } or do {
22 0           print STDERR <<_END_;
23             *** Missing \$BUILD_AIR, try:
24             # BUILD_AIR=\$AIR_SDK/bin/mxmlc -incremental +configname=air -compiler.source-path=src/ -debug
25             _END_
26 0           $build_air = '';
27 0           $exit = 1
28             };
29 0 0         $run_air = $ENV{ RUN_AIR } or do {
30 0           print STDERR <<_END_;
31             *** Missing \$RUN_AIR, try:
32             # RUN_AIR=AIR_SDK/bin/adl
33             _END_
34 0           $run_air = '';
35 0           $exit = 1
36             };
37              
38 0 0         if ( $exit ) {
39 0           exit 64;
40             }
41              
42 0           my ( $exec );
43 0 0         $exec = $ENV{TAP_VERSION} ? 1 : 0;
44             {
45 0           local @ARGV = @arguments;
  0            
46 0           GetOptions( exec => \$exec );
47 0           @arguments = @ARGV;
48             }
49              
50 0 0         if ( $exec ) {
51 0           $self->test( $arguments[ 0 ],
52             build_air => $build_air,
53             run_air => $run_air,
54             );
55             }
56             else {
57 0           require App::Prove;
58 0           my $prove = App::Prove->new;
59 0           $prove->process_args( @arguments );
60 0   0       $prove->{exec} ||= "$0 --exec";
61 0   0       $prove->{extension} ||= '.t.as';
62 0           $prove->run;
63             }
64             }
65              
66             sub test {
67 0     0 0   my $self = shift;
68 0           my $script = shift;
69 0           my %context = @_;
70              
71 0 0 0       die "*** Missing test (.t.as) script" unless defined $script && length $script;
72              
73 0           $script = file $script;
74              
75 0           my %test;
76 0           $test{ dir } = dir( '.t', (join '-', $script->parent->dir_list, $script->basename ) );
77 0           $test{ dir }->mkpath;
78 0           $test{ script } = $test{dir}->file( 'test.as' );
79 0           $test{ xml } = $test{dir}->file( 'test.xml' );
80 0           $test{ result } = $test{dir}->file( 'result.tap' );
81              
82 0           my ( @content, @import_content, @test_content );
83 0 0 0       if ( ! -s $test{ script } || $test{ script }->stat->mtime < $script->stat->mtime ) {
84 0           @content = $script->slurp;
85 0 0         if ( $content[ 0 ] =~ m/^\s*\/\/\s*!(?:tap4air|prove4air)\b/ ) {
86 0           my $split = -1;
87 0           my $found = 0;
88 0           for ( @content ) {
89 0           $split += 1;
90 0 0         if ( m/^\s*\/\/\s*\-\-\-\s*$/ ) {
91 0           $found = 1;
92 0           last;
93             }
94             }
95              
96 0 0         if ( $found ) {
97 0           @import_content = @content[ 1 .. $split - 1 ];
98 0           @test_content = @content[ $split + 1 .. @content - 1 ];
99             }
100             else {
101 0           @test_content = @content[ 1 .. @content - 1 ];
102             }
103             }
104              
105 0           my $xmlns;
106 0           $xmlns = "http://ns.adobe.com/air/application/1.5";
107 0           $xmlns = "http://ns.adobe.com/air/application/2.0";
108              
109 0 0         if ( @test_content ) {
110 0           $test{ script }->openw->print( <<_END_ );
111             package {
112              
113             import yzzy.tap4air.Test;
114             import mx.core.UIComponent;
115             import flash.desktop.NativeApplication;
116 0           @{[ join '', @import_content ]}
  0            
117              
118             public class test extends UIComponent {
119            
120             public function test() {
121             var \$:* = Test.singleton();
122             @{[ join '', @test_content ]}
123             \$.exit();
124             }
125             }
126             }
127             _END_
128              
129 0           $test{ xml }->openw->print( <<_END_ );
130            
131            
132             test
133             0.0
134             test
135            
136             test.swf
137            
138            
139             _END_
140             }
141             else {
142 0           my $xml = $script->parent->file( 'test.xml' );
143 0 0         die "*** Missing .xml file" unless -s $xml;
144              
145 0 0         copy "$xml", "$test{ xml }" or die "Failed copy => $xml";
146              
147 0 0 0       if ( ! -s $test{ script } || $test{ script }->stat->mtime < $script->stat->mtime ) {
148 0 0         copy "$script", "$test{ script }" or die "Failed copy $script => $test{ script }";
149             }
150             }
151             }
152              
153 0           IPC::System::Simple::run( "$context{ build_air } $test{ script }" );
154 0           IPC::System::Simple::run( "$context{ run_air } $test{ xml } > $test{ result }" );
155 0           print $test{ result }->slurp;
156             }
157              
158             1;
159              
160              
161              
162             =pod
163              
164             =head1 NAME
165              
166             App::prove4air - Test ActionScript (.as) with prove, Adobe Air, and tap4air
167              
168             =head1 VERSION
169              
170             version 0.0013
171              
172             =head1 SYNOPSIS
173              
174             $ git clone git://github.com/robertkrimen/tap4air.git tap4air
175             $ export BUILD_AIR="$AIR_SDK/bin/mxmlc -incremental +configname=air -compiler.source-path=tap4air/src/ -debug"
176             $ export RUN_AIR="$AIR_SDK/bin/adl"
177              
178             # Run against every .t.as in t/
179             $ prove4air t/
180              
181             =head1 DESCRIPTION
182              
183             App::prove4air integrates with App::Prove and tap4air to provide prove-like TAP-testing in Adobe Air
184              
185             =head1 An example test file
186              
187             // !prove4air
188             // ---
189             $.ok( 1, 'ok' );
190             $.equal( 1, 1, 'equal' );
191             $.unequal( 1, 2, 'unequal' );
192             $.like( 'Xyzzy', /yzzy/, 'like' );
193             $.unlike( 'Xyzzy', /Y/, 'unlike' );
194              
195             =head1 An example test with an import
196              
197             // !prove4air
198             import com.example.Example;
199             // ---
200             $.ok( 1, 'ok' );
201             $.equal( 1, 1, 'equal' );
202              
203             =head1 A test example in another (more traditional) style
204              
205             package {
206             import yzzy.tap4air.Test;
207             import mx.core.UIComponent;
208             import flash.desktop.NativeApplication;
209              
210             public class test extends UIComponent {
211              
212             public function test() {
213             Test.ok( 1, 'ok' );
214             Test.equal( 1, 1, 'equal' );
215             Test.unequal( 1, 2, 'unequal' );
216             Test.like( 'Xyzzy', /yzzy/, 'like' );
217             Test.unlike( 'Xyzzy', /Y/, 'unlike' );
218             Test.exit();
219             }
220             }
221             }
222              
223             =head1 SEE ALSO
224              
225             L
226              
227             L
228              
229             =head1 AUTHOR
230              
231             Robert Krimen
232              
233             =head1 COPYRIGHT AND LICENSE
234              
235             This software is copyright (c) 2011 by Robert Krimen.
236              
237             This is free software; you can redistribute it and/or modify it under
238             the same terms as the Perl 5 programming language system itself.
239              
240             =cut
241              
242              
243             __END__