#! /usr/bin/perl -T

use strict;
use warnings;

package Foo; use base qw(Test::Class);
use Test::More;
use Test::Exception;

sub passN {
	my ($self, $n) = @_;
	my $m = $self->current_method;
	pass("$m just passing $_") foreach (1..$n);
}

sub new {
	my $class = shift;
	my $self = $class->SUPER::new(@_);
	is($self->num_method_tests('two_tests'), 2, 'fixed num tests');
	is($self->num_method_tests('no_plan_test'), 'no_plan', 'no_plan tests');
	throws_ok {$self->num_method_tests('fribble')} qr/not a test method/, 'cannot use non-method';
	throws_ok {$self->num_method_tests('no_plan_test', 'goobah')} qr/not valid number/, 'cannot update illegal value';
	lives_ok {$self->num_method_tests('no_plan_test', 2)} 'updated legal value';
	is($self->num_method_tests('no_plan_test'), 2, 'update worked');
	lives_ok {$self->num_method_tests('no_plan_test2', '+2')} 'updated extended';
	is($self->num_method_tests('no_plan_test2'), '+2', 'update worked');
	return($self);
}

sub two_tests : Test(2) {$_[0]->passN(2)}
sub no_plan_test : Test(no_plan) {$_[0]->passN(2)}
sub no_plan_test2 : Test(no_plan) {$_[0]->passN(2)}

package Bar; use base qw(Foo);
use Test::More;

sub no_plan_test : Test(+1) {pass("just passing"); $_[0]->SUPER::no_plan_test}

sub new {
	my $class = shift;
	my $self = $class->SUPER::new(@_);
	is($self->num_method_tests('no_plan_test'), '+1', 'extended method okay');
	return($self);
}


package main;
use Test::More tests => 19;
use Test::Exception;

my $tc = Bar->new;
is(Bar->expected_tests, 'no_plan', 'class expected_tests');
is($tc->expected_tests, 7, 'object expected_tests');
throws_ok {$tc->num_method_tests('two_tests')} qr/not called in a Test::Class/, 'num_method_tests dies outside test class';
$tc->runtests;
