Test2::Tools::EventDumper - Tool for dumping Test2::Event structures.


This tool allows you to dump Test2::Event instances (including subclasses). The dump format is the Test2::Tools::Compare event DSL. There are many configuration options available to tweak the output to meet your needs.


    use strict;
    use warnings;
    use Test2::Bundle::Extended;
    use Test2::API qw/intercept/;

    use Test2::Tools::EventDumper;

    my $events = intercept {
        ok(1, 'a');
        ok(2, 'b');

    my $dump = dump_events $events;
    print "$dump\n";

The above will print this:

    array {
        event Ok => sub {
            call 'name' => 'a';
            call 'pass' => '1';
            call 'effective_pass' => '1';

            prop file => match qr{\Qbasic.t\E};
            prop line => '12';

        event Ok => sub {
            call 'name' => 'b';
            call 'pass' => '1';
            call 'effective_pass' => '1';

            prop file => match qr{\Qbasic.t\E};
            prop line => '13';

Note: There is no newline at the end of the string, '}' is the last character.


dump_event $event => ( option => 1 )

This can be used to dump a single event. The first argument must always be an Test2::Event instance.

All additional arguments are key/value pairs treated as dump settings. See the "SETTINGS" section for details.

dump_events $arrayref => ( option => 1 )

This can be used to dump an arrayref of events. The first argument must always be an arrayref full of Test2::Event instances.

All additional arguments are key/value pairs treated as dump settings. See the "SETTINGS" section for details.


All settings are listed with their default values when possible.

qualify_functions => 0

This will cause all functions such as array and call to be fully qualified, turning them into Test2::Tools::Compare::array and Test2::Tools::Compare::call. This also turns on the paren_functions => 1 option. which forces the use of parentheses.

paren_functions => 0

This forces the use of parentheses in functions.


    call 'foo' => sub { ... };


    call('foo' => sub { ... });
use_full_event_type => 0

Normally events in the Test2::Event:: namespace are shortened to only include the postfix part of the name:

    event Ok => sub { ... };

When this option is turned on the full event package will be used:

    event '+Test2::Event::Ok' => sub { ... };
show_empty => 0

Normally empty fields are skipped. Empty means any field that does not exist, is undef, or set to ''. 0 does not count as empty. When this option is turned on all fields will be shown.

add_line_numbers => 0

When this option is turned on, all lines will be prefixed with a label containing the line number, for example:

    L01: array {
    L02:     event Ok => sub {
    L03:         call 'name' => 'a';
    L04:         call 'pass' => '1';
    L05:         call 'effective_pass' => '1';

    L07:         prop file => match qr{\Qt/basic.t\E};
    L08:         prop line => '12';
    L09:     };

    L11:     event Ok => sub {
    L12:         call 'name' => 'b';
    L13:         call 'pass' => '1';
    L14:         call 'effective_pass' => '1';

    L16:         prop file => match qr{\Qt/basic.t\E};
    L17:         prop line => '13';
    L18:     };
    L19:     end();
    L20: }

These labels do not change the code in any meaningful way, it will still run in eval and it will still produce the same result. These labels can be useful during debugging. Labels will not be added to otherwise empty lines as such labels break on perls older than 5.14.

call_when_can => 1

This option is turned on by default. When this option is on the call() function will be used in favor of the field() when the field name also exists as a method for the event.

convert_trace => 1

This option is turned on by default. When this option is on the trace field is turned into 2 checks, one for line, and one for filename.


    prop file => match qr{\Qt/basic.t\E};
    prop line => '12';

Without this option trace looks like this:

    call 'trace' => T(); # Unknown value: Test2::Util::Trace

Which is not useful.

shorten_single_field => 1

When true, events with only 1 field to display will be shortened to look like this:

    event Note => {message => 'XXX'};

Instead of this:

    event Note => sub {
        call message => 'XXX';
clean_fail_messages => 1

When true, any value that matches the regex /^Failed test/ will be turned into a match qr/^Failed test/ check. This is useful for diagnostics messages that are automatically created.

field_order => { ... }

This allows you to assign a sort weight to fields (0 is ignored). Lower values are displayed first.

Here are the defaults:

    field_order => {
        name           => 1,
        pass           => 2,
        effective_pass => 3,
        todo           => 4,
        max            => 5,
        directive      => 6,
        reason         => 7,
        trace          => 9999,

Anything not listed gets the value from the 'other_sort_order' parameter.

other_sort_order => 9000

This is the sort weight for fields not listed in field_order.

array_sort_order => 10000

This is the sort weight for any field that contains an array of event objects. For example the subevents field in subtests.

include_fields => [ ... ]

Fields that should always be listed if present (or if 'show_empty' is true). This is not set by default.

exclude_fields => [ ... ]

Fields that should never be listed. To override the defaults set this to a new arrayref, or to undef to clear the defaults.


    exclude_fields => [qw/buffered nested/]
indent_sequence => ' '

How to indent each level. Normally 4 spaces are used. You can set this to "\t" if you would prefer tabs. You can also set this to any valid string with varying results.

adjust_filename => sub { ... }

This is used when the convert_trace option is true. This should be a coderef that modifies the filename to something portable. It should then return a string to be inserted after 'field' =>.

Here is the default:

    sub {
        my $file = shift;
        $file =~ s{^.*[/\\]}{}g;
        return "match qr{\\Q$file\\E}";

This default strips off all of the path from the filename. After stripping the filename it puts it into a match() check with the '\Q' and '\E' quoting construct to make it safer.

The default is probably adequate for most use cases.


The source code repository for Test2-Tools-EventDumper can be found at


Chad Granum <>


Chad Granum <>


Copyright 2016 Chad Granum <>.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.