Assert-Refute

 view release on metacpan or  search on metacpan

lib/Assert/Refute/Build.pm  view on Meta::CPAN

message. (Think C<ok 1>, C<ok 1 'test passed'>).

=head1 FUNCTIONS

All functions are exportable.

=cut

use Carp;
use Data::Dumper;
use Scalar::Util qw(weaken blessed set_prototype looks_like_number refaddr);
use parent qw(Exporter);
our @EXPORT = qw(build_refute current_contract to_scalar);

# NOTE HACK
# If we're being loaded after Test::More, we're *likely* inside a test script
# This has to be re-done properly
# Cannot instantiate *here* because cyclic dependencies
#    so wait until current_contract() is called
our $MORE_DETECTED = Test::Builder->can("new") ? 1 : 0;

lib/Assert/Refute/Report.pm  view on Meta::CPAN

=cut

# Now this module is the CORE of Assert::Refute.
# There are 3 things for which performance matters:
# 1) new()
# 2) refute( 0, ... )
# 3) done_testing()
# The rest can wait.

use Carp;
use Scalar::Util qw( blessed weaken );

use Assert::Refute::Build qw(to_scalar);

# Always add basic testing primitives to the arsenal
require Assert::Refute::T::Basic;

my $ERROR_DONE = "done_testing was called, no more changes may be added";

=head1 METHODS

lib/Assert/Refute/Report.pm  view on Meta::CPAN

    return [ 0, 0, $line ];
};

=head2 set_parent

    $report->set_parent($bigger_report);
    $report->set_parent(undef);

Indicate that a contract is part of a larger one.
The parent object should be an L<Assert::Refute::Report> instance.
The parent object reference will be weakened to avoid memory leak.

Provide C<undef> as argument to erase parent information.

Returns self, so that calls to set_parent can be chained.

This is used internally by L</subcontract>.

B<NOTE> As of 0.16, no C<isa>/C<DOES> check on the argument is enforced.
It must be blessed, however.
This MAY change in the future.

=cut

sub set_parent {
    my ($self, $parent) = @_;

    if (blessed $parent) {
        $self->{parent} = $parent;
        # avoid a circular loop because $self is likely to be stored
        # in parent as subcontract
        weaken $self->{parent};
    } elsif (!defined $parent) {
        delete $self->{parent};
    } else {
        $self->_croak('parent must be a Report object, not a '.(ref $parent || 'scalar'))
    };
    return $self;
};

=head2 get_parent

t/119-get_parent.t  view on Meta::CPAN

#!/usr/bin/env perl

use strict;
use warnings;
use Test::More;
use Scalar::Util qw( weaken refaddr );

use Assert::Refute::Report;

my $parent = Assert::Refute::Report->new;

$parent->subcontract("inner test" => sub {
    my $inner = shift;

    $inner->ok(1);
});

my $details = $parent->get_result_details(1);

my $child = $details->{subcontract};

isa_ok $child, "Assert::Refute::Report";

is refaddr $child->get_parent, refaddr $parent, "subcontract retains parent";

weaken $parent;

is $parent, undef, "report is not leaky";
is $child->get_parent, undef, "parent updated";

done_testing;

t/120-set_parent.t  view on Meta::CPAN

#!/usr/bin/env perl

use strict;
use warnings;
use Test::More;
use Scalar::Util qw( weaken refaddr );

use Assert::Refute::Report;

my $child  = Assert::Refute::Report->new;
my $parent = Assert::Refute::Report->new;

is $child->get_parent, undef, "initial parent is null";

is refaddr( $child->set_parent( $parent ) ), refaddr $child, "set_parent returns self";
is refaddr( $child->get_parent ), refaddr $parent, "get_parent adjusted";



( run in 1.217 second using v1.01-cache-2.11-cpan-39bf76dae61 )