1use strict;
2use warnings;
3use FindBin;
4use lib "$FindBin::Bin/lib";
5use Test::More;
6use Log::Dump::Test::Child;
7
8BEGIN {
9  eval { require IO::Capture::Stderr; 1 }
10    or plan skip_all => 'requires IO::Capture::Stderr';
11}
12
13my $capture = IO::Capture::Stderr->new;
14my $package = 'Log::Dump::Test::Child';
15my $object = $package->new;
16
17subtest 'log' => sub {
18  for my $target ($package, $object) {
19    $capture->start;
20    $target->log( debug => 'message' );
21    $capture->stop;
22    my $captured = join "\n", $capture->read;
23
24    like $captured => qr/\[debug\] message/, 'captured';
25    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
26  }
27};
28
29subtest 'dump' => sub {
30  for my $target ($package, $object) {
31    $capture->start;
32    $target->log( dump => ['message', 'array'] );
33    $capture->stop;
34    my $captured = join "\n", $capture->read;
35
36    like $captured => qr/\[dump\] \["message", "array"\]/, 'captured';
37    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
38  }
39};
40
41subtest 'error' => sub {
42  for my $target ($package, $object) {
43    $capture->start;
44    $target->log( error => 'message' );
45    $capture->stop;
46    my $captured = $capture->read;
47
48    like $captured => qr/\[error\] message at/, 'captured';
49    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
50  }
51};
52
53subtest 'fatal' => sub {
54  for my $target ($package, $object) {
55    eval { $target->log( fatal => 'message' ) };
56
57    like $@ => qr/\[fatal\] message at/, 'captured';
58    unlike $@ => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
59  }
60};
61
62subtest 'array' => sub {
63  for my $target ($package, $object) {
64    $capture->start;
65    $target->log( array => 'message', 'array' );
66    $capture->stop;
67    my $captured = join "\n", $capture->read;
68
69    like $captured => qr/\[array\] messagearray/, 'captured';
70    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
71  }
72};
73
74subtest 'logger' => sub {
75  for my $target ($package, $object) {
76    $capture->start;
77    $target->log( debug => 'message' );
78    $capture->stop;
79    my $captured = join "\n", $capture->read;
80
81    like $captured => qr/\[debug\] message/, 'captured';
82    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
83
84    $target->logger(0);
85    is $target->logger => 0, 'logger value is correct';
86
87    $capture->start;
88    $target->log( debug => 'logger is disabled' );
89    $capture->stop;
90    $captured = join "\n", $capture->read;
91
92    ok !$captured, 'logger is disabled';
93
94    $target->logger(1);
95    is $target->logger => 1, 'logger value is correct';
96
97    $capture->start;
98    $target->log( debug => 'logger is enabled' );
99    $capture->stop;
100    $captured = join "\n", $capture->read;
101
102    like $captured => qr/\[debug\] logger is enabled/, 'captured';
103    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
104  }
105};
106
107subtest 'custom_logger' => sub {
108  for my $target ($package, $object) {
109    $capture->start;
110    $target->log( debug => 'message' );
111    $capture->stop;
112    my $captured = join "\n", $capture->read;
113
114    like $captured => qr/\[debug\] message/, 'captured';
115    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
116
117    $target->logger(0);
118    is $target->logger => 0, 'logger value is correct';
119
120    $capture->start;
121    $target->log( debug => 'logger is disabled' );
122    $capture->stop;
123    $captured = join "\n", $capture->read;
124
125    ok !$captured, 'logger is disabled';
126
127    $target->logger('Log::Dump::Test::CustomLogger');
128    is $target->logger => 'Log::Dump::Test::CustomLogger', 'logger value is correct';
129
130    $capture->start;
131    $target->log( debug => 'custom logger is enabled' );
132    $capture->stop;
133    $captured = join "\n", $capture->read;
134
135    like $captured => qr/debug custom logger is enabled/, 'captured';
136    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
137
138    my $logger_object = Log::Dump::Test::CustomLogger->new;
139    $target->logger($logger_object);
140
141    $capture->start;
142    $target->log( debug => 'custom logger object is enabled' );
143    $capture->stop;
144    $captured = join "\n", $capture->read;
145
146    like $captured => qr/debug custom logger object is enabled/, 'captured';
147    unlike $captured => qr{Log.Dump(?!.Test)}, 'not from Log::Dump';
148
149    $target->logger(1);  # back to the default
150  }
151};
152
153done_testing;
154
155package #
156  Log::Dump::Test::CustomLogger;
157
158sub new { bless {}, shift }
159sub log { shift; print STDERR join ' ', @_ }
160
1611;
162