NAME

TB2::TestState - Object which holds the state of the test

SYNOPSIS

use TB2::TestState;

# Get the state of the default test.
# Usually you'd ask your builder for the TestState object,
# but we'll get it directly.
my $state = TB2::TestState->default;

# Post an event, like an EventCoordinator
$state->post_event($event);

# Get the history of the test
my $history = $state->history;

DESCRIPTION

All test state resides not in the builder objects but in the TestState and its attached TB2::EventHandler objects. TestState holds onto the current event handlers and passes events along to them. It also manages subtest state.

For example, when a builder has generated a Result object, it should post it to the TestState.

$state->post_event($result);

TestState does everything a TB2::EventCoordinator does. It delegates to a stack of EventCoordinators, one for each layer of subtesting.

TestState has a default object to hold the state of the default test. Builders should use TB2::TestState->default to get the TestState if they want to play nice with others. You can also create your own test states with <TB2::TestState-create >>.

METHODS

Constructors

Because TestState is a default, it does not provide a new to avoid confusion. It instead has create and default.

create

my $state = TB2::TestState->create(%event_coordinator_args);

Create a new test state.

%event_coordinator_args are passed to the constructor when it creates new event coordinators. This lets you pass in different formatters and handlers.

# Make a test state with no formatter
my $state = TB2::TestState->create(
    formatters => []
);

default

my $state = TB2::TestState->default;

Retrieve the shared TestState.

You should use this if you want to coordinate with other test libraries.

Misc

object_id

my $id = $thing->object_id;

Returns an identifier for this object unique to the running process. The identifier is fairly simple and easily predictable.

See TB2::HasObjectID for details.

EventCoordinator methods

TestState contains a stack of TB2::EventCoordinator objects and delegates most of the work to the first event coordinator in the stack.

The following TB2::EventCoordinator methods can be called on a TB2::TestState object and work exactly the same.

post_event

history

formatters

early_handlers

late_handlers

all_handlers

add_early_handlers

add_formatters

add_late_handlers

clear_early_handlers

clear_formatters

clear_late_handlers

Stack management

TestState maintains state in a stack of EventCoordinators. Each item in the stack is isolated from another (unless they decide to share EventHandlers).

One can add a coordinator to the stack to set up an isolated test state and remove it to restore the original state. This is useful both for testing tests (see TB2::Tester) and for running subtests in isolation.

push_coordinator

my $event_coordinator = $state->push_coordinator;
my $event_coordinator = $state->push_coordinator($event_coordinator);

Add an $event_coordinator to the stack. This will become the new delegate.

If an $event_coordinator is not passed in, a new one will be made using the arguments originally passed into create.

pop_coordinator

my $event_coordinator = $state->pop_coordinator;

This will remove the current coordinator from the stack. Test state will be delegated to the coordinator below it.

An exception will be thrown if the final coordinator is attempted to be removed.

ec

my $ec = $state->ec;

Returns the TB2::EventCoordinator which is currently in control of the test.

DO NOT store this object! The event coordinator in control of the test can change over the course of the test.

SEE ALSO

TB2::EventCoordinator which TestState delegates to under the hood.

TB2::EventHandler which handle events.

TB2::Formatter which handle output.

TB2::History which stores events for reference.