libtest-mockclass-perl/t/00_MockClass.t

462 lines
15 KiB
Perl

#!/usr/bin/perl
#
# Test script for Test::MockClass
# $Id: 00_MockClass.t,v 1.3 2005/02/18 21:16:20 phaedrus Exp $
#
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
#
# Please do not commit any changes you make to the module without a
# successful 'make test'!
#
# always use these:
use strict;
use warnings qw{all};
use Test::SimpleUnit qw{:functions};
Test::SimpleUnit::AutoskipFailedSetup(1);
# this is actually the very first test, the one to see if the package compile-checks:
{
no warnings; # for some reason I get:
# Use of uninitialized value in eval "string"
eval { use Test::MockClass; };
}
my $evalError = $@;
# create all objects and variables that will be set up later:
my $mainObject = undef;
my $result = '';
my @results = ();
my @testSuite = (
# the setup function:
{
name => 'setup',
func => sub {
$mainObject = Test::MockClass->new('FakeClass');
},
},
# the teardown function:
{
name => 'teardown',
func => sub {
# $mainObject->DESTROY;
$mainObject = undef;
},
},
{
name => 'File Loading',
test => sub {
assertNot( $evalError );
},
},
{
name => 'Object Creation',
test => sub {
# do assertions knowing that stuff has been set up
assertInstanceOf( 'Test::MockClass', $mainObject );
assert($INC{'FakeClass.pm'});
assert($FakeClass::VERSION == -1);
my $maker = '';
assertNoException( sub {
$maker = &FakeClass::___getMaker();
});
assertInstanceOf( 'Test::MockClass', $maker );
},
},
{
name => 'noTracking method',
test => sub {
assertNoException( sub {
$mainObject->noTracking;
});
assert($mainObject->{'Test::MockClass::noConstructorCallTracking'});
assert($mainObject->{'Test::MockClass::noMethodCallTracking'});
assert($mainObject->{'Test::MockClass::noAttributeAccessTracking'});
},
},
{
name => 'tracking method',
test => sub {
assertNoException( sub {
$mainObject->tracking;
});
assertNot($mainObject->{'Test::MockClass::noConstructorCallTracking'});
assertNot($mainObject->{'Test::MockClass::noMethodCallTracking'});
assertNot($mainObject->{'Test::MockClass::noAttributeAccessTracking'});
},
},
{
name => 'constructor method',
test => sub {
assertNoException( sub {
$mainObject->constructor('shazam');
});
assert($mainObject->{'Test::MockClass::hasConstructor'} eq 'shazam');
my $mockObject = '';
assertNoException( sub {
$mainObject->defaultConstructor;
$mockObject = FakeClass->shazam();
});
},
},
{
name => 'addMethod method',
test => sub {
$mainObject->noTracking;
assertNoException( sub {
$mainObject->addMethod( 'fooberries', sub {return 1;});
});
assert(&UNIVERSAL::can('FakeClass', 'fooberries'));
assertNoException( sub {
$result = &FakeClass::fooberries;
});
assert($result);
},
},
{
name => 'defaultConstructor method',
test => sub {
$mainObject->noTracking;
my %args = (cat => 'rat', bat => 'hat');
assertNoException( sub {
$mainObject->defaultConstructor(%args);
});
assert(&UNIVERSAL::can('FakeClass', 'new'));
assert($mainObject->{'Test::MockClass::hasConstructor'} eq 'new');
assertNoException( sub {
$result = &FakeClass::new('FakeClass', cat => 'hat');
});
assertInstanceOf( 'FakeClass', $result );
assert($result->{bat} eq 'hat');
assert($result->{cat} eq 'hat');
},
},
{
name => 'setReturnValues method',
test => sub {
$mainObject->noTracking;
assertNoException( sub {
$mainObject->setReturnValues('truth', 'true');
});
assert(&UNIVERSAL::can('FakeClass', 'truth'));
assertNoException( sub {
$result = &FakeClass::truth();
});
assert($result);
assertNoException( sub {
$mainObject->setReturnValues('falseness', 'false');
});
assert(&UNIVERSAL::can('FakeClass', 'falseness'));
assertNoException( sub {
$result = &FakeClass::falseness();
});
assertNot($result);
assertNoException( sub {
$mainObject->setReturnValues('nothing', 'undef');
});
assert(&UNIVERSAL::can('FakeClass', 'nothing'));
assertNoException( sub {
$result = &FakeClass::nothing();
});
assertNot(defined($result));
assertNoException( sub {
$mainObject->setReturnValues('two', 'always', 2);
});
assert(&UNIVERSAL::can('FakeClass', 'two'));
assertNoException( sub {
$result = &FakeClass::two();
});
assert($result == 2);
assertNoException( sub {
$mainObject->setReturnValues('twoNtwo', 'always', 2, 2);
});
assert(&UNIVERSAL::can('FakeClass', 'twoNtwo'));
assertNoException( sub {
@results = &FakeClass::twoNtwo();
});
assert($results[0] == 2);
assert($results[1] == 2);
assertNoException( sub {
$mainObject->setReturnValues('twoNthree', 'always', 2, 3);
});
assert(&UNIVERSAL::can('FakeClass', 'twoNthree'));
assertNoException( sub {
$result = &FakeClass::twoNthree();
});
assert($result->[0] == 2);
assert($result->[1] == 3);
assertNoException( sub {
$mainObject->setReturnValues('fibonacci', 'series', 1, 1, 2, 3, 5);
});
assert(&UNIVERSAL::can('FakeClass', 'fibonacci'));
assertNoException( sub {
$result = &FakeClass::fibonacci();
});
assert($result == 1);
assertNoException( sub {
$result = &FakeClass::fibonacci();
});
assert($result == 1);
assertNoException( sub {
$result = &FakeClass::fibonacci();
});
assert($result == 2);
assertNoException( sub {
$result = &FakeClass::fibonacci();
});
assert($result == 3);
assertNoException( sub {
$result = &FakeClass::fibonacci();
});
assert($result == 5);
assertNoException( sub {
$mainObject->setReturnValues('flipflop', 'cycle', 1, 0);
});
assert(&UNIVERSAL::can('FakeClass', 'flipflop'));
assertNoException( sub {
$result = &FakeClass::flipflop();
});
assert($result == 1);
assertNoException( sub {
$result = &FakeClass::flipflop();
});
assert($result == 0);
assertNoException( sub {
$result = &FakeClass::flipflop();
});
assert($result == 1);
assertNoException( sub {
$result = &FakeClass::flipflop();
});
assert($result == 0);
assertNoException( sub {
$mainObject->setReturnValues('randomUser', 'random', (0..9));
});
assertNoException( sub {
$result = &FakeClass::randomUser();
});
assert($result =~ m{\d});
assert($result >= 0);
assert($result < 10);
# print "result: $result\n";
},
},
{
name => 'create method',
test => sub {
$mainObject->noTracking;
assertNoException(sub {
$mainObject->defaultConstructor('cat' => 'rat', 'bat'=> 'hat');
});
assertNoException(sub {
$result = $mainObject->create('cat' => 'hat');
});
assertInstanceOf('FakeClass', $result);
assert($result->{bat} eq 'hat');
assert($result->{cat} eq 'hat');
},
},
{
name => 'getNextObjectId method',
test => sub {
assertNoException(sub {
$mainObject->defaultConstructor();
$results[0] = $mainObject->create();
$results[1] = $mainObject->create();
$results[2] = $mainObject->create();
});
my $objectId = '';
assertNoException(sub {
$objectId = $mainObject->getNextObjectId();
});
assert($objectId eq "$results[0]");
$objectId = '';
assertNoException(sub {
$objectId = $mainObject->getNextObjectId();
});
assert($objectId eq "$results[1]");
$objectId = '';
assertNoException(sub {
$objectId = $mainObject->getNextObjectId();
});
assert($objectId eq "$results[2]");
assertNoException(sub {
$objectId = $mainObject->getNextObjectId();
});
assert(not(defined($objectId)));
assertNoException(sub {
$objectId = $mainObject->getNextObjectId();
});
assert($objectId eq "$results[0]");
},
},
{
name => 'setCallOrder, getCallOrder, verifyCallOrder methods',
test => sub {
assertNoException( sub {
$mainObject->defaultConstructor();
$mainObject->setReturnValues('thingy', 'always', 'thingy');
$mainObject->setReturnValues('foosh', 'true');
});
assertNoException( sub {
$mainObject->setCallOrder('new', 'thingy', 'foosh');
});
my @objects = ();
assertNoException( sub {
$objects[0] = $mainObject->create();
$objects[1] = $mainObject->create();
$objects[2] = $mainObject->create();
$objects[0]->thingy;
$objects[1]->foosh;
$objects[1]->thingy;
$objects[2]->thingy;
$objects[2]->foosh;
});
assertNoException( sub {
$results[0] = $mainObject->getCallOrder("$objects[0]");
$results[1] = $mainObject->getCallOrder("$objects[1]");
$results[2] = $mainObject->getCallOrder("$objects[2]");
});
assert($results[0][0] eq 'new');
assert($results[0][1] eq 'thingy');
assert($results[1][0] eq 'new');
assert($results[1][1] eq 'foosh');
assert($results[1][2] eq 'thingy');
assert($results[2][0] eq 'new');
assert($results[2][1] eq 'thingy');
assert($results[2][2] eq 'foosh');
assertNoException( sub {
$result = $mainObject->verifyCallOrder("$objects[0]");
});
assertNot($result);
my $breakpoint;
assertNoException( sub {
$result = $mainObject->verifyCallOrder("$objects[1]");
});
assertNot($result);
assertNoException( sub {
$result = $mainObject->verifyCallOrder("$objects[2]");
});
assert($result);
},
},
{
name => 'getArgumentList method',
test => sub {
assertNoException( sub {
$mainObject->defaultConstructor();
$mainObject->setReturnValues('thingy', 'always', 'thingy');
$mainObject->setReturnValues('foosh', 'true');
});
my @objects = ();
assertNoException( sub {
$objects[0] = $mainObject->create();
$objects[1] = $mainObject->create('foo');
$objects[2] = $mainObject->create('foo', 'bar');
$objects[0]->thingy();
$objects[1]->foosh('cat');
$objects[1]->thingy('bat');
$objects[2]->thingy('cat', 'rat');
$objects[2]->foosh('bat', 'hat');
});
assertNoException( sub {
$results[0] = $mainObject->getArgumentList("$objects[0]", 'new', 0);
$results[1] = $mainObject->getArgumentList("$objects[1]", 'new', 0);
$results[2] = $mainObject->getArgumentList("$objects[2]", 'new', 0);
});
assertNot(scalar(@{$results[0]}));
assert(scalar(@{$results[1]}) == 1);
assert(scalar(@{$results[2]}) == 2);
assert($results[1][0] eq 'foo');
assert($results[2][0] eq 'foo');
assert($results[2][1] eq 'bar');
assertNoException( sub {
$results[0] = $mainObject->getArgumentList("$objects[0]", 'thingy', 0);
$results[1] = $mainObject->getArgumentList("$objects[1]", 'thingy', 0);
$results[2] = $mainObject->getArgumentList("$objects[2]", 'thingy', 0);
});
assert(scalar(@{$results[0]}) == 0);
assert(scalar(@{$results[1]}) == 1);
assert(scalar(@{$results[2]}) == 2);
assert($results[1][0] eq 'bat');
assert($results[2][0] eq 'cat');
assert($results[2][1] eq 'rat');
assertNoException( sub {
$objects[0]->thingy();
$objects[1]->foosh('fan');
$objects[1]->thingy('man');
$objects[2]->thingy('plan', 'ran');
$objects[2]->foosh('flan', 'stan');
$results[0] = $mainObject->getArgumentList("$objects[0]", 'thingy', 1);
$results[1] = $mainObject->getArgumentList("$objects[1]", 'thingy', 1);
$results[2] = $mainObject->getArgumentList("$objects[2]", 'thingy', 1);
});
assert(scalar(@{$results[0]}) == 0);
assert(scalar(@{$results[1]}) == 1);
assert(scalar(@{$results[2]}) == 2);
assert($results[1][0] eq 'man');
assert($results[2][0] eq 'plan');
assert($results[2][1] eq 'ran');
},
},
{
name => 'getAttributeAccess method',
test => sub {
my @objects = ();
assertNoException( sub {
$mainObject->defaultConstructor('cat' => 'rat');
$objects[0] = $mainObject->create();
$objects[1] = $mainObject->create();
});
assertNoException( sub {
$objects[0]->{cat} = 'hat';
my $thingy = $objects[1]->{cat};
$objects[1]->{cat} = 'fat';
$objects[1]->{bat} = 'mat';
});
assertNoException( sub {
$results[0] = $mainObject->getAttributeAccess("$objects[0]");
$results[1] = $mainObject->getAttributeAccess("$objects[1]");
});
assert($results[0][0][0] eq 'store');
assert($results[0][0][1] eq 'cat');
assert($results[0][0][2] eq 'hat');
assert($results[1][0][0] eq 'fetch');
assert($results[1][0][1] eq 'cat');
assert($results[1][1][0] eq 'store');
assert($results[1][1][1] eq 'cat');
assert($results[1][1][2] eq 'fat');
assert($results[1][2][0] eq 'store');
assert($results[1][2][1] eq 'bat');
assert($results[1][2][2] eq 'mat');
},
},
);
runTests(@testSuite);