File Coverage

blib/lib/Markdown/Compiler/Test.pm
Criterion Covered Total %
statement 75 83 90.3
branch 4 10 40.0
condition 1 6 16.6
subroutine 20 22 90.9
pod 0 1 0.0
total 100 122 81.9


line stmt bran cond sub pod time code
1             package Markdown::Compiler::Test;
2 18     18   6718 use warnings;
  18         111  
  18         578  
3 18     18   88 use strict;
  18         30  
  18         294  
4 18     18   10757 use Test::More;
  18         1057462  
  18         138  
5 18     18   14318 use Test::Deep;
  18         165106  
  18         104  
6 18     18   13235 use Test::Differences;
  18         299792  
  18         1122  
7 18     18   7433 use Import::Into;
  18         41653  
  18         492  
8 18     18   117 use Exporter;
  18         35  
  18         639  
9 18     18   7282 use Markdown::Compiler;
  18         90  
  18         615  
10 18     18   134 use Markdown::Compiler::Lexer;
  18         35  
  18         365  
11 18     18   78 use Markdown::Compiler::Parser;
  18         35  
  18         317  
12 18     18   75 use Markdown::Compiler::Target::HTML;
  18         35  
  18         291  
13 18     18   84 use Data::Dumper::Concise;
  18         40  
  18         15643  
14              
15             push our @ISA, qw( Exporter );
16             push our @EXPORT, qw( build_and_test _test_dump_lexer _test_dump_parser _test_dump_html );
17              
18             sub import {
19 18     18   1675 shift->export_to_level(1);
20            
21 18         55 my $target = caller;
22              
23 18         148 warnings->import::into($target);
24 18         3513 strict->import::into($target);
25 18         2620 Test::More->import::into($target);
26 18         6353 Test::Deep->import::into($target);
27             }
28              
29             # build_and_test
30             #
31             # source can be:
32             # 1. string ->
33             # 2. hash ->
34             # 3. code ->
35             #
36             # expect can be:
37             # code_name => arguments ( &_test_run_$code_name($compiler,$arguments) )
38             sub build_and_test {
39 66     66 0 2424 my ( $name, $source, $expects ) = @_;
40 66         276 my ( undef, $file, $line ) = caller;
41              
42 66 0 0     213 if ( ref($source) and ( ref($source) ne 'CODE' or ref($source) ne 'HASH' ) ) {
      33        
43 0         0 die "Error: Invalid type for \$source @ $file:$line. Must be HASH, CODE or plain string.\n";
44             }
45              
46             my $compiler = ref($source) eq 'HASH'
47 66 50       1370 ? Markdown::Compiler->new( %{$source} )
  0 50       0  
48             : ref($source) eq 'CODE'
49             ? $source->()
50             : Markdown::Compiler->new( source => $source );
51              
52 66         32329 foreach my $expect ( @{$expects} ) {
  66         181  
53 74         20118 my $method_name = shift @{$expect};
  74         142  
54              
55 74 50       630 my $test = __PACKAGE__->can( "_test_run_$method_name" )
56             or die "Invalid test function: $method_name @ $file:$line\n";
57              
58 74         181 $test->($compiler, $name, $file, $line, @{$expect});
  74         185  
59             }
60              
61 66         68712 return $compiler;
62             }
63              
64             sub _test_run_dump_lexer {
65 3     3   10 my ( $compiler, $name, $file, $line, @args ) = @_;
66              
67 3         7 foreach my $token ( @{$compiler->lexer->tokens} ) {
  3         53  
68 46         926 ( my $content = $token->content ) =~ s/\n//g;
69 46         109 printf( "%20s | %s\n", $content, $token->type );
70             }
71             }
72              
73             sub _test_run_dump_parser {
74 3     3   20 my ( $compiler, $name, $file, $line, @args ) = @_;
75              
76 3         66 my $tree = $compiler->parser->tree;
77              
78 3         15 print Dumper($tree);
79             }
80              
81             sub _test_run_dump_result {
82 0     0   0 my ( $compiler, $name, $file, $line, @args ) = @_;
83              
84 0         0 print "=== HTML ===\n" . $compiler->result . "\n=== END ===\n\n";
85             }
86              
87             # Paragraph
88             # String
89             # String
90             # String => [ content => 'foo', children => '' ],
91             #
92             #
93             #
94             #
95             #
96             #
97             sub _test_run_assert_parse_tree {
98 0     0   0 my ( $compiler, $name, $file, $line, @args ) = @_;
99              
100 0         0 my $tree = $compiler->parser->tree;
101              
102 0         0 print Dumper($tree);
103             }
104              
105             sub _test_run_assert_parser {
106 1     1   3 my ( $compiler, $name, $file, $line, $match ) = @_;
107              
108 1         20 my $tree = $compiler->parser->tree;
109              
110 1         31 cmp_deeply( $tree, $match, sprintf( "%s:%d: %s", $file, $line, $name ) );
111             }
112              
113             sub _test_run_assert_lexer {
114 1     1   4 my ( $compiler, $name, $file, $line, $match ) = @_;
115              
116 1         1 my @stream = map { ref($_) } @{$compiler->parser->stream};
  3         71  
  1         24  
117              
118 1         9 cmp_deeply( \@stream, $match, sprintf( "%s:%d: %s", $file, $line, $name ) );
119             }
120              
121              
122             # This one I need to think through!
123             sub _test_run_result_is {
124 64     64   183 my ( $compiler, $name, $file, $line, $match ) = @_;
125              
126 64 50       193 if ( ref($match) eq 'REGEXP' ) {
127 0         0 ok( $compiler->result =~ $match, sprintf( "%s:%d: %s", $file, $line, $name ) );
128             } else {
129 64         1117 eq_or_diff ( $compiler->result, $match, sprintf( "%s:%d: %s", $file, $line, $name ) );
130             }
131             }
132              
133             sub _test_run_metadata_is {
134 2     2   7 my ( $compiler, $name, $file, $line, $match ) = @_;
135              
136 2         36 cmp_deeply( $compiler->metadata, $match, sprintf( "%s:%d: %s", $file, $line, $name ) );
137             }
138              
139              
140             1;