File: exception.t

package info (click to toggle)
libmojolicious-perl 8.12%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,720 kB
  • sloc: perl: 12,099; makefile: 14
file content (122 lines) | stat: -rw-r--r-- 4,296 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use Mojo::Base -strict;

use Test::More;
use Mojo::Exception;
use Mojo::File 'path';

# Basics
my $e = Mojo::Exception->new;
is $e->message, 'Exception!', 'right message';
is "$e", 'Exception!', 'right message';
$e = Mojo::Exception->new('Test!');
is $e->message, 'Test!', 'right message';
is "$e", 'Test!', 'right message';

# Context information
my $line = __LINE__;
eval {

  # test

  my $wrapper = sub { Mojo::Exception->throw('Works!') };
  $wrapper->();

  # test

};
$e = $@;
isa_ok $e, 'Mojo::Exception', 'right class';
is $e,     'Works!',          'right result';
like $e->frames->[0][1], qr/exception\.t/, 'right file';
is $e->lines_before->[0][0], $line + 1, 'right number';
is $e->lines_before->[0][1], 'eval {', 'right line';
is $e->lines_before->[1][0], $line + 2, 'right number';
ok !$e->lines_before->[1][1], 'empty line';
is $e->lines_before->[2][0], $line + 3, 'right number';
is $e->lines_before->[2][1], '  # test', 'right line';
is $e->lines_before->[3][0], $line + 4, 'right number';
ok !$e->lines_before->[3][1], 'empty line';
is $e->lines_before->[4][0], $line + 5, 'right number';
is $e->lines_before->[4][1],
  "  my \$wrapper = sub { Mojo::Exception->throw('Works!') };", 'right line';
is $e->line->[0], $line + 6, 'right number';
is $e->line->[1], "  \$wrapper->();", 'right line';
is $e->lines_after->[0][0], $line + 7, 'right number';
ok !$e->lines_after->[0][1], 'empty line';
is $e->lines_after->[1][0], $line + 8, 'right number';
is $e->lines_after->[1][1], '  # test', 'right line';
is $e->lines_after->[2][0], $line + 9, 'right number';
ok !$e->lines_after->[2][1], 'empty line';
is $e->lines_after->[3][0], $line + 10, 'right number';
is $e->lines_after->[3][1], '};', 'right line';
is $e->lines_after->[4][0], $line + 11, 'right number';
is $e->lines_after->[4][1], '$e = $@;', 'right line';

# Trace
sub wrapper2 { Mojo::Exception->new->trace(@_) }
sub wrapper1 { wrapper2(@_) }
like wrapper1()->frames->[0][3], qr/wrapper2/, 'right subroutine';
like wrapper1(0)->frames->[0][3], qr/trace/,    'right subroutine';
like wrapper1(1)->frames->[0][3], qr/wrapper2/, 'right subroutine';
like wrapper1(2)->frames->[0][3], qr/wrapper1/, 'right subroutine';

# Inspect (UTF-8)
my $file = path(__FILE__)->sibling('exception', 'utf8.txt');
$e = Mojo::Exception->new("Whatever at $file line 3.");
is_deeply $e->lines_before, [], 'no lines';
is_deeply $e->line,         [], 'no line';
is_deeply $e->lines_after,  [], 'no lines';
$e->inspect;
is_deeply $e->lines_before->[-1], [2, 'use warnings;'], 'right line';
is_deeply $e->line,               [3, 'use utf8;'],     'right line';
is_deeply $e->lines_after->[0],   [4, ''],              'right line';
$e->message("Died at $file line 4.")->inspect;
is_deeply $e->lines_before->[-1], [3, 'use utf8;'], 'right line';
is_deeply $e->line,               [4, ''],          'right line';
is_deeply $e->lines_after->[0], [5, "my \$s = 'Über•résumé';"],
  'right line';

# Inspect (non UTF-8)
$file = $file->sibling('non_utf8.txt');
$e    = Mojo::Exception->new("Whatever at $file line 3.");
is_deeply $e->lines_before, [], 'no lines';
is_deeply $e->line,         [], 'no line';
is_deeply $e->lines_after,  [], 'no lines';
$e->inspect;
is_deeply $e->lines_before->[-1], [2, 'use warnings;'], 'right line';
is_deeply $e->line,               [3, 'no utf8;'],      'right line';
is_deeply $e->lines_after->[0],   [4, ''],              'right line';
$e->message("Died at $file line 4.")->inspect;
is_deeply $e->lines_before->[-1], [3, 'no utf8;'], 'right line';
is_deeply $e->line,               [4, ''],         'right line';
is_deeply $e->lines_after->[0], [5, "my \$s = '\xDCber\x95r\xE9sum\xE9';"],
  'right line';

# Verbose
$e = Mojo::Exception->new('Test!')->verbose(1);
$e->frames([
  ['Sandbox',     'template',      4],
  ['MyApp::Test', 'MyApp/Test.pm', 3],
  ['main',        'foo.pl',        4]
]);
$e->lines_before([[3, 'foo();']])->line([4, 'die;'])
  ->lines_after([[5, 'bar();']]);
is $e, <<EOF, 'right result';
Test!
3: foo();
4: die;
5: bar();
template:4 (Sandbox)
MyApp/Test.pm:3 (MyApp::Test)
foo.pl:4 (main)
EOF
$e->message("Works!\n")->lines_before([])->lines_after([]);
is $e, <<EOF, 'right result';
Works!
4: die;
template:4 (Sandbox)
MyApp/Test.pm:3 (MyApp::Test)
foo.pl:4 (main)
EOF

done_testing();