The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;
use Test::Builder;
use Test::Builder::Clutch;

plan tests => 14;

ok(1, 'ok() works');

TODO: {
	local $TODO = 'TODO block works';
	fail 'abject failure';
}

subtest 'subtest works' => sub {
	plan tests => 2;
	pass;
	pass;
};

subtest 'failure in subtest disengaged' => sub {
	plan tests => 3;
	ok 1, 'abject pass';
	Test::Builder::Clutch->disengage;
	my $ok = ok undef;
	Test::Builder::Clutch->engage;
	ok !$ok, 'ok() returned false while clutch disengaged';
	ok 1, 'abject pass';
};

TODO: {
	local $TODO = 'subtest inside TODO';
	subtest 'subtest inside TODO works' => sub {
		plan tests => 2;
		pass;
		fail 'abject failure';
	};
}

TODO: {
	local $TODO = 'subtest inside subtest inside TODO';
	subtest 'subtest inside subtest inside TODO works' => sub {
		plan tests => 2;
		pass;
		subtest 'subtest inside TODO works' => sub {
			plan tests => 2;
			pass;
			fail 'abject failure';
		}
	};
}

Test::Builder::Clutch->disengage;
pass 'clutch is disengaged'; # DO NOT COUNT THIS TEST
Test::Builder::Clutch->engage;
pass 'clutch is engaged';
ok(Test::Builder->new->is_passing, 'test is still passing');

Test::Builder::Clutch->disengage;
fail 'clutch is disengaged'; # DO NOT COUNT THIS TEST
Test::Builder::Clutch->engage;
pass 'clutch is engaged';
ok(Test::Builder->new->is_passing,
   'test reports as passing when clutch engaged');
ok(Test::Builder->new->failed_while_disengaged,
	'failure while disengaged was recorded');
Test::Builder::Clutch->disengage;
my $ok = Test::Builder->new->is_passing;
Test::Builder::Clutch->engage;
ok !$ok, 'test reports as not passing when clutch disengaged';


my $Test = Test::Builder->new;

TODO: {
	local $TODO = 'Test::Builder failures inside TODO';

	$Test->ok(0, 'abject failure');

	$Test->subtest('Test::Builder->subtest with failures' => sub {
		$Test->plan(tests => 2);
		$Test->ok(1);
		$Test->ok(0, 'abject failure');
	});
}