summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm
parentInitial commit. (diff)
downloadmanpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz
manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm662
1 files changed, 662 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm b/upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm
new file mode 100644
index 00000000..bd8ffcd3
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/Test2::API::InterceptResult::Event.3pm
@@ -0,0 +1,662 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Test2::API::InterceptResult::Event 3pm"
+.TH Test2::API::InterceptResult::Event 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Test2::API::InterceptResult::Event \- Representation of an event for use in
+testing other test tools.
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+\&\f(CW\*(C`intercept { ... }\*(C'\fR from Test2::API returns an instance of
+Test2::API::InterceptResult which is a blessed arrayref of
+Test2::API::InterceptResult::Event objects.
+.PP
+This POD documents the methods of these events, which are mainly provided for
+you to use when testing your test tools.
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 2
+\& use Test2::V0;
+\& use Test2::API qw/intercept/;
+\&
+\& my $events = intercept {
+\& ok(1, "A passing assertion");
+\& plan(1);
+\& };
+\&
+\& # This will convert all events into instances of
+\& # Test2::API::InterceptResult::Event. Until we do this they are the
+\& # original Test::Event::* instances
+\& $events\->upgrade(in_place => 1);
+\&
+\& # Now we can get individual events in this form
+\& my $assert = $events\->[0];
+\& my $plan = $events\->[1];
+\&
+\& # Or we can operate on all events at once:
+\& my $flattened = $events\->flatten;
+\& is(
+\& $flattened,
+\& [
+\& {
+\& causes_failure => 0,
+\&
+\& name => \*(AqA passing assertion\*(Aq,
+\& pass => 1,
+\&
+\& trace_file => \*(Aqxxx.t\*(Aq,
+\& trace_line => 5,
+\& },
+\& {
+\& causes_failure => 0,
+\&
+\& plan => 1,
+\&
+\& trace_file => \*(Aqxxx.t\*(Aq,
+\& trace_line => 6,
+\& },
+\& ],
+\& "Flattened both events and returned an arrayref of the results
+\& );
+.Ve
+.SH METHODS
+.IX Header "METHODS"
+.SS "!!! IMPORTANT NOTES ON DESIGN !!!"
+.IX Subsection "!!! IMPORTANT NOTES ON DESIGN !!!"
+Please pay attention to what these return, many return a scalar when
+applicable or an empty list when not (as opposed to undef). Many also always
+return a list of 0 or more items. Some always return a scalar. Note that none
+of the methods care about context, their behavior is consistent regardless of
+scalar, list, or void context.
+.PP
+This was done because this class was specifically designed to be used in a list
+and generate more lists in bulk operations. Sometimes in a map you want nothing
+to show up for the event, and you do not want an undef in its place. In general
+single event instances are not going to be used alone, though that is allowed.
+.PP
+As a general rule any method prefixed with \f(CW\*(C`the_\*(C'\fR implies the event should
+have exactly 1 of the specified item, and and exception will be thrown if there
+are 0, or more than 1 of the item.
+.SS ATTRIBUTES
+.IX Subsection "ATTRIBUTES"
+.ie n .IP "$hashref = $event\->facet_data" 4
+.el .IP "\f(CW$hashref\fR = \f(CW$event\fR\->facet_data" 4
+.IX Item "$hashref = $event->facet_data"
+This will return the facet data hashref, which is all Test2 cares about for any
+given event.
+.ie n .IP "$class = $event\->result_class" 4
+.el .IP "\f(CW$class\fR = \f(CW$event\fR\->result_class" 4
+.IX Item "$class = $event->result_class"
+This is normally Test2::API::InterceptResult. This is set at construction so
+that subtest results can be turned into instances of it on demand.
+.SS DUPLICATION
+.IX Subsection "DUPLICATION"
+.ie n .IP "$copy = $event\->clone" 4
+.el .IP "\f(CW$copy\fR = \f(CW$event\fR\->clone" 4
+.IX Item "$copy = $event->clone"
+Create a deep copy of the event. Modifying either event will not effect the
+other.
+.SS "CONDENSED MULTI-FACET DATA"
+.IX Subsection "CONDENSED MULTI-FACET DATA"
+.ie n .IP "$bool = $event\->causes_failure" 4
+.el .IP "\f(CW$bool\fR = \f(CW$event\fR\->causes_failure" 4
+.IX Item "$bool = $event->causes_failure"
+.PD 0
+.ie n .IP "$bool = $event\->causes_fail" 4
+.el .IP "\f(CW$bool\fR = \f(CW$event\fR\->causes_fail" 4
+.IX Item "$bool = $event->causes_fail"
+.PD
+These are both aliases of the same functionality.
+.Sp
+This will always return either a true value, or a false value. This never
+returns a list.
+.Sp
+This method may be relatively slow (still super fast) because it determines
+pass or fail by creating an instance of Test2::Hub and asking it to process
+the event, and then asks the hub for its pass/fail state. This is slower than
+bulding in logic to do the check, but it is more reliable as it will always
+tell you what the hub thinks, so the logic will never be out of date relative
+to the Test2 logic that actually cares.
+.ie n .IP "STRING_OR_EMPTY_LIST = $event\->brief" 4
+.el .IP "STRING_OR_EMPTY_LIST = \f(CW$event\fR\->brief" 4
+.IX Item "STRING_OR_EMPTY_LIST = $event->brief"
+Not all events have a brief, some events are not rendered by the formatter,
+others have no "brief" data worth seeing. When this is the case an empty list
+is returned. This is done intentionally so it can be used in a map operation
+without having \f(CW\*(C`undef\*(C'\fR being included in the result.
+.Sp
+When a brief can be generated it is always a single 1\-line string, and is
+returned as-is, not in a list.
+.Sp
+Possible briefs:
+.Sp
+.Vb 3
+\& # From control facets
+\& "BAILED OUT"
+\& "BAILED OUT: $why"
+\&
+\& # From error facets
+\& "ERROR"
+\& "ERROR: $message"
+\& "ERROR: $partial_message [...]"
+\& "ERRORS: $first_error_message [...]"
+\&
+\& # From assert facets
+\& "PASS"
+\& "FAIL"
+\& "PASS with amnesty"
+\& "FAIL with amnesty"
+\&
+\& # From plan facets
+\& "PLAN $count"
+\& "NO PLAN"
+\& "SKIP ALL"
+\& "SKIP ALL: $why"
+.Ve
+.Sp
+Note that only the first applicable brief is returned. This is essnetially a
+poor-mans TAP that only includes facets that could (but not necessarily do)
+cause a failure.
+.ie n .IP "$hashref = $event\->flatten" 4
+.el .IP "\f(CW$hashref\fR = \f(CW$event\fR\->flatten" 4
+.IX Item "$hashref = $event->flatten"
+.PD 0
+.ie n .IP "$hashref = $event\->flatten(include_subevents => 1)" 4
+.el .IP "\f(CW$hashref\fR = \f(CW$event\fR\->flatten(include_subevents => 1)" 4
+.IX Item "$hashref = $event->flatten(include_subevents => 1)"
+.PD
+This ALWAYS returns a hashref. This puts all the most useful data for the most
+interesting facets into a single hashref for easy validation.
+.Sp
+If there are no meaningful facets this will return an empty hashref.
+.Sp
+If given the 'include_subevents' parameter it will also include subtest data:
+.Sp
+Here is a list of EVERY possible field. If a field is not applicable it will
+not be present.
+.RS 4
+.IP "always present" 4
+.IX Item "always present"
+.Vb 1
+\& causes_failure => 1, # Always present
+.Ve
+.IP "Present if the event has a trace facet" 4
+.IX Item "Present if the event has a trace facet"
+.Vb 3
+\& trace_line => 42,
+\& trace_file => \*(AqFoo/Bar.pm\*(Aq,
+\& trace_details => \*(AqExtra trace details\*(Aq, # usually not present
+.Ve
+.IP "If an assertion is present" 4
+.IX Item "If an assertion is present"
+.Vb 2
+\& pass => 0,
+\& name => "1 + 1 = 2, so math works",
+.Ve
+.IP "If a plan is present:" 4
+.IX Item "If a plan is present:"
+.Vb 1
+\& plan => $count_or_SKIP_ALL_or_NO_PLAN,
+.Ve
+.IP "If amnesty facets are present" 4
+.IX Item "If amnesty facets are present"
+You get an array for each type that is present.
+.Sp
+.Vb 4
+\& todo => [ # Yes you could be under multiple todos, this will list them all.
+\& "I will fix this later",
+\& "I promise to fix these",
+\& ],
+\&
+\& skip => ["This will format the main drive, do not run"],
+\&
+\& ... => ["Other amnesty"]
+.Ve
+.IP "If Info (note/diag) facets are present" 4
+.IX Item "If Info (note/diag) facets are present"
+You get an arrayref for any that are present, the key is not defined if they are not present.
+.Sp
+.Vb 4
+\& diag => [
+\& "Test failed at Foo/Bar.pm line 42",
+\& "You forgot to tie your boots",
+\& ],
+\&
+\& note => ["Your boots are red"],
+\&
+\& ... => ["Other info"],
+.Ve
+.IP "If error facets are present" 4
+.IX Item "If error facets are present"
+Always an arrayref
+.Sp
+.Vb 4
+\& error => [
+\& "non fatal error (does not cause test failure, just an FYI",
+\& "FATAL: This is a fatal error (causes failure)",
+\& ],
+\&
+\& # Errors can have alternative tags, but in practice are always \*(Aqerror\*(Aq,
+\& # listing this for completeness.
+\& ... => [ ... ]
+.Ve
+.IP "Present if the event is a subtest" 4
+.IX Item "Present if the event is a subtest"
+.Vb 5
+\& subtest => {
+\& count => 2, # Number of assertions made
+\& failed => 1, # Number of test failures seen
+\& is_passing => 0, # Boolean, true if the test would be passing
+\& # after the events are processed.
+\&
+\& plan => 2, # Plan, either a number, undef, \*(AqSKIP\*(Aq, or \*(AqNO PLAN\*(Aq
+\& follows_plan => 1, # True if there is a plan and it was followed.
+\& # False if the plan and assertions did not
+\& # match, undef if no plan was present in the
+\& # event list.
+\&
+\& bailed_out => "foo", # if there was a bail\-out in the
+\& # events in this will be a string explaining
+\& # why there was a bailout, if no reason was
+\& # given this will simply be set to true (1).
+\&
+\& skip_reason => "foo", # If there was a skip_all this will give the
+\& # reason.
+\& },
+.Ve
+.Sp
+if \f(CW\*(C`(include_subtest => 1)\*(C'\fR was provided as a parameter then the following
+will be included. This is the result of turning all subtest child events into
+an Test2::API::InterceptResult instance and calling the \f(CW\*(C`flatten\*(C'\fR method on
+it.
+.Sp
+.Vb 1
+\& subevents => Test2::API::InterceptResult\->new(@child_events)\->flatten(...),
+.Ve
+.IP "If a bail-out is being requested" 4
+.IX Item "If a bail-out is being requested"
+If no reason was given this will be set to 1.
+.Sp
+.Vb 1
+\& bailed_out => "reason",
+.Ve
+.RE
+.RS 4
+.RE
+.ie n .IP "$hashref = $event\->\fBsummary()\fR" 4
+.el .IP "\f(CW$hashref\fR = \f(CW$event\fR\->\fBsummary()\fR" 4
+.IX Item "$hashref = $event->summary()"
+This returns a limited summary. See \f(CWflatten()\fR, which is usually a better
+option.
+.Sp
+.Vb 2
+\& {
+\& brief => $event\->brief || \*(Aq\*(Aq,
+\&
+\& causes_failure => $event\->causes_failure,
+\&
+\& trace_line => $event\->trace_line,
+\& trace_file => $event\->trace_file,
+\& trace_tool => $event\->trace_subname,
+\& trace_details => $event\->trace_details,
+\&
+\& facets => [ sort keys(%{$event\->{+FACET_DATA}}) ],
+\& }
+.Ve
+.SS "DIRECT ARBITRARY FACET ACCESS"
+.IX Subsection "DIRECT ARBITRARY FACET ACCESS"
+.ie n .IP "@list_of_facets = $event\->facet($name)" 4
+.el .IP "\f(CW@list_of_facets\fR = \f(CW$event\fR\->facet($name)" 4
+.IX Item "@list_of_facets = $event->facet($name)"
+This always returns a list of 0 or more items. This fetches the facet instances
+from the event. For facets like 'assert' this will always return 0 or 1
+item. For events like 'info' (diags, notes) this will return 0 or more
+instances, once for each instance of the facet.
+.Sp
+These will be blessed into the proper Test2::EventFacet subclass. If no
+subclass can be found it will be blessed as an
+Test2::API::InterceptResult::Facet generic facet class.
+.ie n .IP "$undef_or_facet = $event\->the_facet($name)" 4
+.el .IP "\f(CW$undef_or_facet\fR = \f(CW$event\fR\->the_facet($name)" 4
+.IX Item "$undef_or_facet = $event->the_facet($name)"
+If you know you will have exactly 1 instance of a facet you can call this.
+.Sp
+If you are correct and there is exactly one instance of the facet it will
+always return the hashref.
+.Sp
+If there are 0 instances of the facet this will reutrn undef, not an empty
+list.
+.Sp
+If there are more than 1 instance this will throw an exception because your
+assumption was incorrect.
+.SS "TRACE FACET"
+.IX Subsection "TRACE FACET"
+.ie n .IP "@list_of_facets = $event\->trace" 4
+.el .IP "\f(CW@list_of_facets\fR = \f(CW$event\fR\->trace" 4
+.IX Item "@list_of_facets = $event->trace"
+TODO
+.ie n .IP "$undef_or_hashref = $event\->the_trace" 4
+.el .IP "\f(CW$undef_or_hashref\fR = \f(CW$event\fR\->the_trace" 4
+.IX Item "$undef_or_hashref = $event->the_trace"
+This returns the trace hashref, or undef if it is not present.
+.ie n .IP "$undef_or_arrayref = $event\->frame" 4
+.el .IP "\f(CW$undef_or_arrayref\fR = \f(CW$event\fR\->frame" 4
+.IX Item "$undef_or_arrayref = $event->frame"
+If a trace is present, and has a caller frame, this will be an arrayref:
+.Sp
+.Vb 1
+\& [$package, $file, $line, $subname]
+.Ve
+.Sp
+If the trace is not present, or has no caller frame this will return undef.
+.ie n .IP "$undef_or_string = $event\->trace_details" 4
+.el .IP "\f(CW$undef_or_string\fR = \f(CW$event\fR\->trace_details" 4
+.IX Item "$undef_or_string = $event->trace_details"
+This is usually undef, but occasionally has a string that overrides the
+file/line number debugging a trace usually provides on test failure.
+.ie n .IP "$undef_or_string = $event\->trace_package" 4
+.el .IP "\f(CW$undef_or_string\fR = \f(CW$event\fR\->trace_package" 4
+.IX Item "$undef_or_string = $event->trace_package"
+Same as \f(CW\*(C`(caller())[0]\*(C'\fR, the first element of the trace frame.
+.Sp
+Will be undef if not present.
+.ie n .IP "$undef_or_string = $event\->trace_file" 4
+.el .IP "\f(CW$undef_or_string\fR = \f(CW$event\fR\->trace_file" 4
+.IX Item "$undef_or_string = $event->trace_file"
+Same as \f(CW\*(C`(caller())[1]\*(C'\fR, the second element of the trace frame.
+.Sp
+Will be undef if not present.
+.ie n .IP "$undef_or_integer = $event\->trace_line" 4
+.el .IP "\f(CW$undef_or_integer\fR = \f(CW$event\fR\->trace_line" 4
+.IX Item "$undef_or_integer = $event->trace_line"
+Same as \f(CW\*(C`(caller())[2]\*(C'\fR, the third element of the trace frame.
+.Sp
+Will be undef if not present.
+.ie n .IP "$undef_or_string = $event\->trace_subname" 4
+.el .IP "\f(CW$undef_or_string\fR = \f(CW$event\fR\->trace_subname" 4
+.IX Item "$undef_or_string = $event->trace_subname"
+.PD 0
+.ie n .IP "$undef_or_string = $event\->trace_tool" 4
+.el .IP "\f(CW$undef_or_string\fR = \f(CW$event\fR\->trace_tool" 4
+.IX Item "$undef_or_string = $event->trace_tool"
+.PD
+Aliases for the same thing
+.Sp
+Same as \f(CW\*(C`(caller($level))[4]\*(C'\fR, the fourth element of the trace frame.
+.Sp
+Will be undef if not present.
+.ie n .IP "$undef_or_string = $event\->trace_signature" 4
+.el .IP "\f(CW$undef_or_string\fR = \f(CW$event\fR\->trace_signature" 4
+.IX Item "$undef_or_string = $event->trace_signature"
+A string that is a unique signature for the trace. If a single context
+generates multiple events they will all have the same signature. This can be
+used to tie assertions and diagnostics sent as seperate events together after
+the fact.
+.SS "ASSERT FACET"
+.IX Subsection "ASSERT FACET"
+.ie n .IP "$bool = $event\->has_assert" 4
+.el .IP "\f(CW$bool\fR = \f(CW$event\fR\->has_assert" 4
+.IX Item "$bool = $event->has_assert"
+Returns true if the event has an assert facet, false if it does not.
+.ie n .IP "$undef_or_hashref = $event\->the_assert" 4
+.el .IP "\f(CW$undef_or_hashref\fR = \f(CW$event\fR\->the_assert" 4
+.IX Item "$undef_or_hashref = $event->the_assert"
+Returns the assert facet if present, undef if it is not.
+.ie n .IP "@list_of_facets = $event\->assert" 4
+.el .IP "\f(CW@list_of_facets\fR = \f(CW$event\fR\->assert" 4
+.IX Item "@list_of_facets = $event->assert"
+TODO
+.ie n .IP "EMPTY_LIST_OR_STRING = $event\->assert_brief" 4
+.el .IP "EMPTY_LIST_OR_STRING = \f(CW$event\fR\->assert_brief" 4
+.IX Item "EMPTY_LIST_OR_STRING = $event->assert_brief"
+Returns a string giving a brief of the assertion if an assertion is present.
+Returns an empty list if no assertion is present.
+.SS "SUBTESTS (PARENT FACET)"
+.IX Subsection "SUBTESTS (PARENT FACET)"
+.ie n .IP "$bool = $event\->has_subtest" 4
+.el .IP "\f(CW$bool\fR = \f(CW$event\fR\->has_subtest" 4
+.IX Item "$bool = $event->has_subtest"
+True if a subetest is present in this event.
+.ie n .IP "$undef_or_hashref = $event\->the_subtest" 4
+.el .IP "\f(CW$undef_or_hashref\fR = \f(CW$event\fR\->the_subtest" 4
+.IX Item "$undef_or_hashref = $event->the_subtest"
+Get the one subtest if present, otherwise undef.
+.ie n .IP "@list_of_facets = $event\->subtest" 4
+.el .IP "\f(CW@list_of_facets\fR = \f(CW$event\fR\->subtest" 4
+.IX Item "@list_of_facets = $event->subtest"
+TODO
+.ie n .IP "EMPTY_LIST_OR_OBJECT = $event\->subtest_result" 4
+.el .IP "EMPTY_LIST_OR_OBJECT = \f(CW$event\fR\->subtest_result" 4
+.IX Item "EMPTY_LIST_OR_OBJECT = $event->subtest_result"
+Returns an empty list if there is no subtest.
+.Sp
+Get an instance of Test2::API::InterceptResult representing the subtest.
+.SS "CONTROL FACET (BAILOUT, ENCODING)"
+.IX Subsection "CONTROL FACET (BAILOUT, ENCODING)"
+.ie n .IP "$bool = $event\->has_bailout" 4
+.el .IP "\f(CW$bool\fR = \f(CW$event\fR\->has_bailout" 4
+.IX Item "$bool = $event->has_bailout"
+True if there was a bailout
+.ie n .IP "$undef_hashref = $event\->the_bailout" 4
+.el .IP "\f(CW$undef_hashref\fR = \f(CW$event\fR\->the_bailout" 4
+.IX Item "$undef_hashref = $event->the_bailout"
+Return the control facet if it requested a bailout.
+.ie n .IP "EMPTY_LIST_OR_HASHREF = $event\->bailout" 4
+.el .IP "EMPTY_LIST_OR_HASHREF = \f(CW$event\fR\->bailout" 4
+.IX Item "EMPTY_LIST_OR_HASHREF = $event->bailout"
+Get a list of 0 or 1 hashrefs. The hashref will be the control facet if a
+bail-out was requested.
+.ie n .IP "EMPTY_LIST_OR_STRING = $event\->bailout_brief" 4
+.el .IP "EMPTY_LIST_OR_STRING = \f(CW$event\fR\->bailout_brief" 4
+.IX Item "EMPTY_LIST_OR_STRING = $event->bailout_brief"
+Get the brief of the balout if present.
+.ie n .IP "EMPTY_LIST_OR_STRING = $event\->bailout_reason" 4
+.el .IP "EMPTY_LIST_OR_STRING = \f(CW$event\fR\->bailout_reason" 4
+.IX Item "EMPTY_LIST_OR_STRING = $event->bailout_reason"
+Get the reason for the bailout, an empty string if no reason was provided, or
+an empty list if there was no bailout.
+.SS "PLAN FACET"
+.IX Subsection "PLAN FACET"
+TODO
+.ie n .IP "$bool = $event\->has_plan" 4
+.el .IP "\f(CW$bool\fR = \f(CW$event\fR\->has_plan" 4
+.IX Item "$bool = $event->has_plan"
+.PD 0
+.ie n .IP "$undef_or_hashref = $event\->the_plan" 4
+.el .IP "\f(CW$undef_or_hashref\fR = \f(CW$event\fR\->the_plan" 4
+.IX Item "$undef_or_hashref = $event->the_plan"
+.ie n .IP "@list_if_hashrefs = $event\->plan" 4
+.el .IP "\f(CW@list_if_hashrefs\fR = \f(CW$event\fR\->plan" 4
+.IX Item "@list_if_hashrefs = $event->plan"
+.ie n .IP "EMPTY_LIST_OR_STRING $event\->plan_brief" 4
+.el .IP "EMPTY_LIST_OR_STRING \f(CW$event\fR\->plan_brief" 4
+.IX Item "EMPTY_LIST_OR_STRING $event->plan_brief"
+.PD
+.SS "AMNESTY FACET (TODO AND SKIP)"
+.IX Subsection "AMNESTY FACET (TODO AND SKIP)"
+TODO
+.ie n .IP $event\->has_amnesty 4
+.el .IP \f(CW$event\fR\->has_amnesty 4
+.IX Item "$event->has_amnesty"
+.PD 0
+.ie n .IP $event\->the_amnesty 4
+.el .IP \f(CW$event\fR\->the_amnesty 4
+.IX Item "$event->the_amnesty"
+.ie n .IP $event\->amnesty 4
+.el .IP \f(CW$event\fR\->amnesty 4
+.IX Item "$event->amnesty"
+.ie n .IP $event\->amnesty_reasons 4
+.el .IP \f(CW$event\fR\->amnesty_reasons 4
+.IX Item "$event->amnesty_reasons"
+.ie n .IP $event\->has_todos 4
+.el .IP \f(CW$event\fR\->has_todos 4
+.IX Item "$event->has_todos"
+.ie n .IP $event\->todos 4
+.el .IP \f(CW$event\fR\->todos 4
+.IX Item "$event->todos"
+.ie n .IP $event\->todo_reasons 4
+.el .IP \f(CW$event\fR\->todo_reasons 4
+.IX Item "$event->todo_reasons"
+.ie n .IP $event\->has_skips 4
+.el .IP \f(CW$event\fR\->has_skips 4
+.IX Item "$event->has_skips"
+.ie n .IP $event\->skips 4
+.el .IP \f(CW$event\fR\->skips 4
+.IX Item "$event->skips"
+.ie n .IP $event\->skip_reasons 4
+.el .IP \f(CW$event\fR\->skip_reasons 4
+.IX Item "$event->skip_reasons"
+.ie n .IP $event\->has_other_amnesty 4
+.el .IP \f(CW$event\fR\->has_other_amnesty 4
+.IX Item "$event->has_other_amnesty"
+.ie n .IP $event\->other_amnesty 4
+.el .IP \f(CW$event\fR\->other_amnesty 4
+.IX Item "$event->other_amnesty"
+.ie n .IP $event\->other_amnesty_reasons 4
+.el .IP \f(CW$event\fR\->other_amnesty_reasons 4
+.IX Item "$event->other_amnesty_reasons"
+.PD
+.SS "ERROR FACET (CAPTURED EXCEPTIONS)"
+.IX Subsection "ERROR FACET (CAPTURED EXCEPTIONS)"
+TODO
+.ie n .IP $event\->has_errors 4
+.el .IP \f(CW$event\fR\->has_errors 4
+.IX Item "$event->has_errors"
+.PD 0
+.ie n .IP $event\->the_errors 4
+.el .IP \f(CW$event\fR\->the_errors 4
+.IX Item "$event->the_errors"
+.ie n .IP $event\->errors 4
+.el .IP \f(CW$event\fR\->errors 4
+.IX Item "$event->errors"
+.ie n .IP $event\->error_messages 4
+.el .IP \f(CW$event\fR\->error_messages 4
+.IX Item "$event->error_messages"
+.ie n .IP $event\->error_brief 4
+.el .IP \f(CW$event\fR\->error_brief 4
+.IX Item "$event->error_brief"
+.PD
+.SS "INFO FACET (DIAG, NOTE)"
+.IX Subsection "INFO FACET (DIAG, NOTE)"
+TODO
+.ie n .IP $event\->has_info 4
+.el .IP \f(CW$event\fR\->has_info 4
+.IX Item "$event->has_info"
+.PD 0
+.ie n .IP $event\->the_info 4
+.el .IP \f(CW$event\fR\->the_info 4
+.IX Item "$event->the_info"
+.ie n .IP $event\->info 4
+.el .IP \f(CW$event\fR\->info 4
+.IX Item "$event->info"
+.ie n .IP $event\->info_messages 4
+.el .IP \f(CW$event\fR\->info_messages 4
+.IX Item "$event->info_messages"
+.ie n .IP $event\->has_diags 4
+.el .IP \f(CW$event\fR\->has_diags 4
+.IX Item "$event->has_diags"
+.ie n .IP $event\->diags 4
+.el .IP \f(CW$event\fR\->diags 4
+.IX Item "$event->diags"
+.ie n .IP $event\->diag_messages 4
+.el .IP \f(CW$event\fR\->diag_messages 4
+.IX Item "$event->diag_messages"
+.ie n .IP $event\->has_notes 4
+.el .IP \f(CW$event\fR\->has_notes 4
+.IX Item "$event->has_notes"
+.ie n .IP $event\->notes 4
+.el .IP \f(CW$event\fR\->notes 4
+.IX Item "$event->notes"
+.ie n .IP $event\->note_messages 4
+.el .IP \f(CW$event\fR\->note_messages 4
+.IX Item "$event->note_messages"
+.ie n .IP $event\->has_other_info 4
+.el .IP \f(CW$event\fR\->has_other_info 4
+.IX Item "$event->has_other_info"
+.ie n .IP $event\->other_info 4
+.el .IP \f(CW$event\fR\->other_info 4
+.IX Item "$event->other_info"
+.ie n .IP $event\->other_info_messages 4
+.el .IP \f(CW$event\fR\->other_info_messages 4
+.IX Item "$event->other_info_messages"
+.PD
+.SH SOURCE
+.IX Header "SOURCE"
+The source code repository for Test2 can be found at
+\&\fIhttp://github.com/Test\-More/test\-more/\fR.
+.SH MAINTAINERS
+.IX Header "MAINTAINERS"
+.IP "Chad Granum <exodist@cpan.org>" 4
+.IX Item "Chad Granum <exodist@cpan.org>"
+.SH AUTHORS
+.IX Header "AUTHORS"
+.PD 0
+.IP "Chad Granum <exodist@cpan.org>" 4
+.IX Item "Chad Granum <exodist@cpan.org>"
+.PD
+.SH COPYRIGHT
+.IX Header "COPYRIGHT"
+Copyright 2020 Chad Granum <exodist@cpan.org>.
+.PP
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+.PP
+See \fIhttp://dev.perl.org/licenses/\fR