#!/usr/bin/env perl
# NEED FIX: various bugs, including...
# Subroutine RPerl::Algorithm::inherited_Algorithm redefined at /usr/lib/perl/5.18/DynaLoader.pm line 207.
# Constant subroutine RPerl::Algorithm::TIME_BEST redefined at /usr/lib/x86_64-linux-gnu/perl/5.22/DynaLoader.pm line 210.
# [[[ PRE-HEADER ]]]
# suppress 'WEXRP00: Found multiple rperl executables' due to blib/ & pre-existing installation(s),
# also 'WARNING WCOCODE00, COMPILER, FIND DEPENDENCIES: Failed to eval-use package' due to RPerl/Test/*/*Bad*.pm & RPerl/Test/*/*bad*.pl
BEGIN { $ENV{RPERL_WARNINGS} = 0; }
# [[[ HEADER ]]]
use strict;
use warnings;
use RPerl::AfterSubclass;
our $VERSION = 0.009_000;
# [[[ CRITICS ]]]
## no critic qw(ProhibitUselessNoCritic ProhibitMagicNumbers RequireCheckedSyscalls) # USER DEFAULT 1: allow numeric values & print operator
## no critic qw(RequireInterpolationOfMetachars) # USER DEFAULT 2: allow single-quoted control characters & sigils
## no critic qw(RequireCheckingReturnValueOfEval) ## SYSTEM DEFAULT 4: allow eval() test code blocks
# [[[ INCLUDES ]]]
use Test::More tests => 521;
use Test::Exception;
use RPerl::Test;
use File::Copy;
use Module::Refresh;
use Sub::Delete;
# [[[ OPERATIONS ]]]
BEGIN {
if ( $ENV{RPERL_VERBOSE} ) {
Test::More::diag('[[[ Beginning Class Inheritance Pre-Test Loading, RPerl Object System ]]]');
}
lives_and( sub { use_ok('RPerl::AfterSubclass'); }, q{use_ok('RPerl::AfterSubclass') lives} );
lives_and( sub { use_ok('RPerl::Compiler'); }, q{use_ok('RPerl::Compiler') lives} );
# NEED ANSWER: why does all this code have to be inside a BEGIN block???
# NEED FIX: duplicate code, is it redundant to do this here and also at the top of the main for() loop?
my string $bubble_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort/Bubble.cpp' );
my string $bubble_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort/Bubble.h' );
my string $bubble_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort/Bubble.pmc' );
my string $sort_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort.cpp' );
my string $sort_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort.h' );
my string $sort_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort.pmc' );
my string $inefficient_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Inefficient.cpp' );
my string $inefficient_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Inefficient.h' );
my string $inefficient_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Inefficient.pmc' );
my string $algorithm_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm.cpp' );
my string $algorithm_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm.h' );
my string $algorithm_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm.pmc' );
# RPerl::diag('in 10_precompiled_oo_inherit.t, have $bubble_pmc_filename = ' . $bubble_pmc_filename . "\n");
# NEED FIX: triplicate code, is it redundant to do this here and also at the top of the main for() loop?
# delete CPP, H, and PMC files if they exist;
# for PERLOPS_PERLTYPES we need none of these files; for CPPOPS_xTYPES we need the proper manually-compiled files, not some other files
foreach my string $filename (
@{ [ $bubble_cpp_filename, $bubble_h_filename, $bubble_pmc_filename, $sort_cpp_filename,
$sort_h_filename, $sort_pmc_filename, $inefficient_cpp_filename, $inefficient_h_filename,
$inefficient_pmc_filename, $algorithm_cpp_filename, $algorithm_h_filename, $algorithm_pmc_filename
]
}
)
{
if ( -e $filename ) {
my integer $unlink_success = unlink $filename;
if ($unlink_success) {
ok( 1, 'Unlink (delete) existing file ' . $filename );
}
else {
ok( 0, 'Unlink (delete) existing file ' . $filename . q{ ... } . $OS_ERROR );
# skip all tests in this mode if we cannot remove the PMC file (and presumably the other 2 modes, as well)
next;
}
}
else {
ok( 1, 'No need to unlink (delete) existing file ' . $filename );
}
}
# DEV NOTE, CORRELATION #rp015: suppress 'Too late to run INIT block' at run-time loading via require or eval
lives_and( sub { require_ok('RPerl::Algorithm::Sort::Bubble'); }, q{require_ok('RPerl::Algorithm::Sort::Bubble') lives} );
lives_and( sub { require_ok('RPerl::Algorithm::Inefficient'); }, q{require_ok('RPerl::Algorithm::Inefficient') lives} );
}
my string $bubble_pm_filename = 'RPerl/Algorithm/Sort/Bubble.pm';
my string $sort_pm_filename = 'RPerl/Algorithm/Sort.pm';
my string $inefficient_pm_filename = 'RPerl/Algorithm/Inefficient.pm';
my string $algorithm_pm_filename = 'RPerl/Algorithm.pm';
my object $refresher = Module::Refresh->new();
# NEED FIX: duplicate code
my string $bubble_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort/Bubble.cpp' );
my string $bubble_cpp_filename_manual = $bubble_cpp_filename . '.CPPOPS_DUALTYPES';
#my string $bubble_cpp_filename_manual = $bubble_cpp_filename . '.CPPOPS_CPPTYPES';
my string $bubble_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort/Bubble.h' );
my string $bubble_h_filename_manual = $bubble_h_filename . '.CPPOPS_DUALTYPES';
#my string $bubble_h_filename_manual = $bubble_h_filename . '.CPPOPS_CPPTYPES';
my string $bubble_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort/Bubble.pmc' );
my string $bubble_pmc_filename_manual = $bubble_pmc_filename . '.CPPOPS_DUALTYPES';
my string $sort_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort.cpp' );
my string $sort_cpp_filename_manual = $sort_cpp_filename . '.CPPOPS_DUALTYPES';
#my string $sort_cpp_filename_manual = $sort_cpp_filename . '.CPPOPS_CPPTYPES';
my string $sort_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort.h' );
my string $sort_h_filename_manual = $sort_h_filename . '.CPPOPS_DUALTYPES';
#my string $sort_h_filename_manual = $sort_h_filename . '.CPPOPS_CPPTYPES';
my string $sort_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Sort.pmc' );
my string $sort_pmc_filename_manual = $sort_pmc_filename . '.CPPOPS_DUALTYPES';
my string $inefficient_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Inefficient.cpp' );
my string $inefficient_cpp_filename_manual = $inefficient_cpp_filename . '.CPPOPS_DUALTYPES';
#my string $inefficient_cpp_filename_manual = $inefficient_cpp_filename . '.CPPOPS_CPPTYPES';
my string $inefficient_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Inefficient.h' );
my string $inefficient_h_filename_manual = $inefficient_h_filename . '.CPPOPS_DUALTYPES';
#my string $inefficient_h_filename_manual = $inefficient_h_filename . '.CPPOPS_CPPTYPES';
my string $inefficient_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm/Inefficient.pmc' );
my string $inefficient_pmc_filename_manual = $inefficient_pmc_filename . '.CPPOPS_DUALTYPES';
my string $algorithm_cpp_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm.cpp' );
my string $algorithm_cpp_filename_manual = $algorithm_cpp_filename . '.CPPOPS_DUALTYPES';
#my string $algorithm_cpp_filename_manual = $algorithm_cpp_filename . '.CPPOPS_CPPTYPES';
my string $algorithm_h_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm.h' );
my string $algorithm_h_filename_manual = $algorithm_h_filename . '.CPPOPS_DUALTYPES';
#my string $algorithm_h_filename_manual = $algorithm_h_filename . '.CPPOPS_CPPTYPES';
my string $algorithm_pmc_filename = RPerl::Compiler::post_processor__absolute_path_delete( $RPerl::INCLUDE_PATH . '/RPerl/Algorithm.pmc' );
my string $algorithm_pmc_filename_manual = $algorithm_pmc_filename . '.CPPOPS_DUALTYPES';
#RPerl::diag('in 10_precompiled_oo_inherit.t, have $bubble_pmc_filename = ' . $bubble_pmc_filename . "\n");
#RPerl::diag('in 10_precompiled_oo_inherit.t, have $bubble_pmc_filename_manual = ' . $bubble_pmc_filename_manual . "\n");
# [[[ PRIMARY RUNLOOP ]]]
# [[[ PRIMARY RUNLOOP ]]]
# [[[ PRIMARY RUNLOOP ]]]
# loop 3 times, once for each mode: PERLOPS_PERLTYPES, PERLOPS_CPPTYPES, CPPOPS_CPPTYPES
foreach my integer $mode_id ( sort keys %{$RPerl::MODES} ) {
#for my integer $mode_id ( 0, 1, 2 ) { # TEMPORARY DEBUGGING xOPS_xTYPES ONLY
# [[[ MODE SETUP ]]]
# RPerl::diag("in 10_precompiled_oo_inherit.t, top of for() loop, have \$mode_id = $mode_id\n");
my scalartype_hashref $mode = $RPerl::MODES->{$mode_id};
my $ops = $mode->{ops};
my $types = $mode->{types};
my string $mode_tagline = $ops . 'OPS_' . $types . 'TYPES';
if ( $ENV{RPERL_VERBOSE} ) {
Test::More::diag( '[[[ Beginning Class Inheritance Tests, RPerl Object System, ' . $ops . ' Operations & ' . $types . ' Data Types' . ' ]]]' );
}
lives_ok( sub { rperltypes::types_enable($types) }, q{Mode '} . $ops . ' Operations & ' . $types . ' Data Types' . q{' enabled in CPP header file(s)} );
# NEED FIX: triplicate code
# delete CPP, H, and PMC files if they exist;
# for PERLOPS_PERLTYPES we need none of these files; for CPPOPS_xTYPES we need the proper manually-compiled files, not some other files
foreach my string $filename (
@{ [ $bubble_cpp_filename, $bubble_h_filename, $bubble_pmc_filename, $sort_cpp_filename,
$sort_h_filename, $sort_pmc_filename, $inefficient_cpp_filename, $inefficient_h_filename,
$inefficient_pmc_filename, $algorithm_cpp_filename, $algorithm_h_filename, $algorithm_pmc_filename
]
}
)
{
if ( -e $filename ) {
my integer $unlink_success = unlink $filename;
if ($unlink_success) {
ok( 1, 'Unlink (delete) existing file ' . $filename );
}
else {
ok( 0, 'Unlink (delete) existing file ' . $filename . q{ ... } . $OS_ERROR );
# skip all tests in this mode if we cannot remove the PMC file (and presumably the other 2 modes, as well)
next;
}
}
else {
ok( 1, 'No need to unlink (delete) existing file ' . $filename );
}
}
if ( $ops eq 'PERL' ) {
# RPerl::diag('in 10_precompiled_oo_inherit.t, have Bubble symtab entries:' . "\n" . RPerl::analyze_class_symtab_entries('RPerl::Algorithm::Sort::Bubble') . "\n\n");
}
else { # $ops eq 'CPP'
foreach my string_arrayref $filenames (
@{ [ [ $bubble_cpp_filename, $bubble_cpp_filename_manual ],
[ $bubble_h_filename, $bubble_h_filename_manual ],
[ $bubble_pmc_filename, $bubble_pmc_filename_manual ],
[ $sort_cpp_filename, $sort_cpp_filename_manual ],
[ $sort_h_filename, $sort_h_filename_manual ],
[ $sort_pmc_filename, $sort_pmc_filename_manual ],
[ $inefficient_cpp_filename, $inefficient_cpp_filename_manual ],
[ $inefficient_h_filename, $inefficient_h_filename_manual ],
[ $inefficient_pmc_filename, $inefficient_pmc_filename_manual ],
[ $algorithm_cpp_filename, $algorithm_cpp_filename_manual ],
[ $algorithm_h_filename, $algorithm_h_filename_manual ],
[ $algorithm_pmc_filename, $algorithm_pmc_filename_manual ]
]
}
)
{
my string $filename = $filenames->[0];
my string $filename_manual = $filenames->[1];
my string $filename_short = $filename;
my string $filename_manual_short = $filename_manual;
if ( ( length $filename_short ) > 55 ) { $filename_short = '...' . substr $filename_short, -55; }
if ( ( length $filename_manual_short ) > 55 ) { $filename_manual_short = '...' . substr $filename_manual_short, -55; }
if ( -e ($filename_manual) ) {
my integer $copy_success = copy( $filename_manual, $filename );
if ($copy_success) {
ok( 1, 'Copy manually-compiled file ' . $filename_manual_short . ' to ' . $filename_short );
}
else {
ok( 0, 'Copy manually-compiled file ' . $filename_manual_short . ' to ' . $filename_short . q{ ... } . $OS_ERROR );
}
}
else {
ok( 0, 'Copy manually-compiled file ' . $filename_manual_short . ' to ' . $filename_short . q{ ... } . 'File does not exist' );
}
}
# C++ use, load, link
# ALL 4 MODULES
lives_ok( sub { $refresher->refresh_module($bubble_pm_filename) }, 'Refresh previously-loaded module: ' . $bubble_pm_filename );
lives_ok( sub { $refresher->refresh_module($sort_pm_filename) }, 'Refresh previously-loaded module: ' . $sort_pm_filename );
lives_ok( sub { $refresher->refresh_module($inefficient_pm_filename) }, 'Refresh previously-loaded module: ' . $inefficient_pm_filename );
lives_ok( sub { $refresher->refresh_module($algorithm_pm_filename) }, 'Refresh previously-loaded module: ' . $algorithm_pm_filename );
# DEV NOTE, CORRELATION #rp015: suppress 'Too late to run INIT block' at run-time loading via require or eval
# ONLY 2 MODULES
lives_and( sub { require_ok('RPerl::Algorithm::Sort::Bubble'); }, q{require_ok('RPerl::Algorithm::Sort::Bubble') lives} );
lives_and( sub { require_ok('RPerl::Algorithm::Inefficient'); }, q{require_ok('RPerl::Algorithm::Inefficient') lives} );
# force reload
# ONLY 2 MODULES
delete $main::{'RPerl__Algorithm__Sort__Bubble__MODE_ID'};
delete $main::{'RPerl__Algorithm__Inefficient__MODE_ID'};
# DEV NOTE: must call long form of cpp_load() to bypass mysterious 'undefined subroutine' symtab weirdness
# ONLY 2 MODULES
#lives_ok( sub { RPerl::Algorithm::Sort::Bubble::cpp_load(); }, q{RPerl::Algorithm::Sort::Bubble::cpp_load() lives} );
lives_ok( sub { &{ $RPerl::Algorithm::Sort::Bubble::{'cpp_load'} }(); }, q{RPerl::Algorithm::Sort::Bubble::cpp_load() lives} ); # long form
lives_ok( sub { &{ $RPerl::Algorithm::Inefficient::{'cpp_load'} }(); }, q{RPerl::Algorithm::Inefficient::cpp_load() lives} ); # long form
#RPerl::diag('in 10_precompiled_oo_inherit.t, have post-re-use, post-re-cpp_load Bubble symtab entries:' . "\n" . RPerl::analyze_class_symtab_entries('RPerl::Algorithm::Sort::Bubble') . "\n\n");
}
foreach my string $type (
qw(DataType__Integer DataType__Number DataType__String DataStructure__Array DataStructure__Hash Algorithm Algorithm__Sort Algorithm__Inefficient Algorithm__Sort__Bubble)
)
{
lives_and(
sub {
is( $RPerl::MODES->{ main->can( 'RPerl__' . $type . '__MODE_ID' )->() }->{ops},
$ops, 'main::RPerl__' . $type . '__MODE_ID() ops returns ' . $ops );
},
'main::RPerl__' . $type . '__MODE_ID() lives'
);
lives_and(
sub {
is( $RPerl::MODES->{ main->can( 'RPerl__' . $type . '__MODE_ID' )->() }->{types},
$types, 'main::RPerl__' . $type . '__MODE_ID() types returns ' . $types );
},
'main::RPerl__' . $type . '__MODE_ID() lives'
);
}
# [[[ OO INHERITANCE TESTS ]]]
# [[[ OO INHERITANCE TESTS ]]]
# [[[ OO INHERITANCE TESTS ]]]
# [ BUBBLE ]
# TOOIN00
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'new' );
my $bubbler = new_ok('RPerl::Algorithm::Sort::Bubble');
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Bubble' );
lives_ok( # TOOIN01
sub { $bubbler->inherited_Bubble('Frozen') },
q{TOOIN01 inherited_Bubble('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Sort' );
lives_ok( # TOOIN02
sub { $bubbler->inherited_Sort('Frozen') },
q{TOOIN02 inherited_Sort('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Algorithm' );
lives_ok( # TOOIN03
sub { $bubbler->inherited_Algorithm('Frozen') },
q{TOOIN03 inherited_Algorithm('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited' );
lives_ok( # TOOIN04
sub { $bubbler->inherited('Logan') },
q{TOOIN04 inherited('Logan') lives}
);
# $refresher->refresh_module($bubble_pm_filename);
# print '[[[ in t/10 before eval()... ]]]', "\n";
# print eval 'use RPerl::Algorithm::Sort::Bubble;';
# print eval 'require q{RPerl/Algorithm/Sort/Bubble.pmc};';
# if ($EVAL_ERROR) { die 'in t/10' . "\n" . $EVAL_ERROR . ', dying'; }
# print '[[[ in t/10 after eval()... ]]]', "\n";
#undef &RPerl::Algorithm::Sort::Bubble::uninherited_Bubble;
#delete_sub 'RPerl::Algorithm::Sort::Bubble::uninherited_Bubble';
=DISABLED_NEED_DELETE
#undef &RPerl::Algorithm::Sort::Bubble::integer_bubblesort;
#*RPerl::Algorithm::Sort::Bubble::integer_bubblesort = sub { return main::RPerl__Algorithm__Sort__Bubble__integer_bubblesort(@ARG); };
*RPerl::Algorithm::Sort::Bubble::integer_bubblesort = sub { print '[[[ in t/10 SUBROUTINE SHIM RPerl::Algorithm::Sort::Bubble::integer_bubblesort() ]]]', "\n"; return main::RPerl__Algorithm__Sort__Bubble__integer_bubblesort(@ARG); };
#undef &RPerl::Algorithm::Sort::Bubble::number_bubblesort;
#*RPerl::Algorithm::Sort::Bubble::number_bubblesort = sub { return main::RPerl__Algorithm__Sort__Bubble__number_bubblesort(@ARG); };
*RPerl::Algorithm::Sort::Bubble::number_bubblesort = sub { print '[[[ in t/10 SUBROUTINE SHIM RPerl::Algorithm::Sort::Bubble::number_bubblesort() ]]]', "\n"; return main::RPerl__Algorithm__Sort__Bubble__number_bubblesort(@ARG); };
#undef &RPerl::Algorithm::Sort::Bubble::uninherited_Bubble;
#*RPerl::Algorithm::Sort::Bubble::uninherited_Bubble = sub { return main::RPerl__Algorithm__Sort__Bubble__uninherited_Bubble(@ARG); };
*RPerl::Algorithm::Sort::Bubble::uninherited_Bubble = sub { print '[[[ in t/10 SUBROUTINE SHIM RPerl::Algorithm::Sort::Bubble::uninherited_Bubble() ]]]', "\n"; return main::RPerl__Algorithm__Sort__Bubble__uninherited_Bubble(@ARG); };
#undef &RPerl::Algorithm::Sort::Bubble::uninherited;
#*RPerl::Algorithm::Sort::Bubble::uninherited = sub { return main::RPerl__Algorithm__Sort__Bubble__uninherited(@ARG); };
*RPerl::Algorithm::Sort::Bubble::uninherited = sub { print '[[[ in t/10 SUBROUTINE SHIM RPerl::Algorithm::Sort::Bubble::uninherited() ]]]', "\n"; return main::RPerl__Algorithm__Sort__Bubble__uninherited(@ARG); };
#undef &RPerl::Algorithm::Sort::Bubble::integer_bubblesort_typetest0;
#*RPerl::Algorithm::Sort::Bubble::integer_bubblesort_typetest0 = sub { return main::RPerl__Algorithm__Sort__Bubble__integer_bubblesort_typetest0(@ARG); };
*RPerl::Algorithm::Sort::Bubble::integer_bubblesort_typetest0 = sub { print '[[[ in t/10 SUBROUTINE SHIM RPerl::Algorithm::Sort::Bubble::integer_bubblesort_typetest0() ]]]', "\n"; return main::RPerl__Algorithm__Sort__Bubble__integer_bubblesort_typetest0(@ARG); };
#undef &RPerl::Algorithm::Sort::Bubble::number_bubblesort_typetest0;
#*RPerl::Algorithm::Sort::Bubble::number_bubblesort_typetest0 = sub { return main::RPerl__Algorithm__Sort__Bubble__number_bubblesort_typetest0(@ARG); };
*RPerl::Algorithm::Sort::Bubble::number_bubblesort_typetest0 = sub { print '[[[ in t/10 SUBROUTINE SHIM RPerl::Algorithm::Sort::Bubble::number_bubblesort_typetest0() ]]]', "\n"; return main::RPerl__Algorithm__Sort__Bubble__number_bubblesort_typetest0(@ARG); };
=cut
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'uninherited_Bubble' );
# can_ok( 'RPerl::Algorithm::Sort::Bubble', 'uninherited_Bubbbbbbble' );
lives_and( # TOOIN05
sub {
# START HERE: why are all the uninherited_*() subs registering via can_ok() but the fail to be located when actually running in is() below via CPPOPS_*TYPES???
# START HERE: why are all the uninherited_*() subs registering via can_ok() but the fail to be located when actually running in is() below via CPPOPS_*TYPES???
# START HERE: why are all the uninherited_*() subs registering via can_ok() but the fail to be located when actually running in is() below via CPPOPS_*TYPES???
is( RPerl::Algorithm::Sort::Bubble::uninherited_Bubble('Claws'),
# is( main::RPerl__Algorithm__Sort__Bubble__uninherited_Bubble('Claws'),
'Bubble::uninherited_Bubble() RULES! ' . $mode_tagline,
q{TOOIN05 uninherited_Bubble('Claws') returns correct value}
);
},
q{TOOIN05 uninherited_Bubble('Claws') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'uninherited' );
lives_and( # TOOIN06
sub {
is( RPerl::Algorithm::Sort::Bubble::uninherited('Wolverine'),
'Bubble::uninherited() ROCKS! ' . $mode_tagline,
q{TOOIN06 uninherited('Wolverine') returns correct value}
);
},
q{TOOIN06 uninherited('Wolverine') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'get_foo' );
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'set_foo' );
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Bubble_foo_get' );
lives_and( # TOOIN07 - TOOIN11
sub {
is( $bubbler->get_foo(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN07 get_foo() returns correct value}
);
is( $bubbler->inherited_Bubble_foo_get(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN08 inherited_Bubble_foo_get() returns correct value}
);
$bubbler->set_foo('Alpha Flight');
is( $bubbler->get_foo(),
'Alpha Flight',
q{TOOIN09 set_foo('Alpha Flight') sets correct value}
);
is( $bubbler->inherited_Bubble_foo_get(),
'Alpha Flight',
q{TOOIN10 inherited_Bubble_foo_get() returns correct value}
);
},
q{TOOIN11 set_foo('Alpha Flight') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Bubble_foo_set' );
lives_and( # TOOIN12 - TOOIN16
sub {
is( $bubbler->get_foo(),
'Alpha Flight',
q{TOOIN12 get_foo() returns correct value}
);
is( $bubbler->inherited_Bubble_foo_get(),
'Alpha Flight',
q{TOOIN13 inherited_Bubble_foo_get() returns correct value}
);
$bubbler->inherited_Bubble_foo_set('Avengers');
is( $bubbler->get_foo(),
'Avengers',
q{TOOIN14 inherited_Bubble_foo_set('Avengers') sets correct value}
);
is( $bubbler->inherited_Bubble_foo_get(),
'Avengers',
q{TOOIN15 inherited_Bubble_foo_get() returns correct value}
);
},
q{TOOIN16 inherited_Bubble_foo_set('Avengers') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Sort_foo_get' );
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Sort_foo_set' );
lives_and( # TOOIN17 - TOOIN21
sub {
is( $bubbler->get_foo(),
'Avengers',
q{TOOIN17 get_foo() returns correct value}
);
is( $bubbler->inherited_Sort_foo_get(),
'Avengers',
q{TOOIN18 inherited_Sort_foo_get() returns correct value}
);
$bubbler->inherited_Sort_foo_set('X-Men');
is( $bubbler->get_foo(),
'X-Men',
q{TOOIN19 inherited_Sort_foo_set('X-Men') sets correct value}
);
is( $bubbler->inherited_Sort_foo_get(),
'X-Men',
q{TOOIN20 inherited_Sort_foo_get() returns correct value}
);
},
q{TOOIN21 inherited_Sort_foo_set('X-Men') lives}
);
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Algorithm_foo_get' );
can_ok( 'RPerl::Algorithm::Sort::Bubble', 'inherited_Algorithm_foo_set' );
lives_and( # TOOIN22 - TOOIN
sub {
is( $bubbler->get_foo(),
'X-Men',
q{TOOIN22 get_foo() returns correct value}
);
is( $bubbler->inherited_Algorithm_foo_get(),
'X-Men',
q{TOOIN23 inherited_Algorithm_foo_get() returns correct value}
);
$bubbler->inherited_Algorithm_foo_set('Weapon X');
is( $bubbler->get_foo(),
'Weapon X',
q{TOOIN24 inherited_Algorithm_foo_set('Weapon X') sets correct value}
);
is( $bubbler->inherited_Algorithm_foo_get(),
'Weapon X',
q{TOOIN25 inherited_Algorithm_foo_get() returns correct value}
);
},
q{TOOIN26 inherited_Algorithm_foo_set('Weapon X') lives}
);
# [ SORT ]
# TOOIN27
can_ok( 'RPerl::Algorithm::Sort', 'new' );
my $sorter = new_ok('RPerl::Algorithm::Sort');
can_ok( 'RPerl::Algorithm::Sort', 'uninherited_Sort' );
lives_and( # TOOIN28
sub {
is( RPerl::Algorithm::Sort::uninherited_Sort('Claws'),
'Sort::uninherited_Sort() RULES! ' . $mode_tagline,
q{TOOIN28 uninherited_Sort('Claws') returns correct value}
);
},
q{TOOIN28 uninherited_Sort('Claws') lives}
);
can_ok( 'RPerl::Algorithm::Sort', 'inherited_Sort' );
lives_ok( # TOOIN29
sub { $sorter->inherited_Sort('Frozen') },
q{TOOIN29 inherited_Sort('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Sort', 'inherited_Algorithm' );
lives_ok( # TOOIN30
sub { $sorter->inherited_Algorithm('Frozen') },
q{TOOIN30 inherited_Algorithm('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Sort', 'get_foo' );
can_ok( 'RPerl::Algorithm::Sort', 'set_foo' );
can_ok( 'RPerl::Algorithm::Sort', 'inherited_Sort_foo_get' );
lives_and( # TOOIN31 - TOOIN35
sub {
is( $sorter->get_foo(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN31 get_foo() returns correct value}
);
is( $sorter->inherited_Sort_foo_get(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN32 inherited_Sort_foo_get() returns correct value}
);
$sorter->set_foo('Alpha Flight');
is( $sorter->get_foo(),
'Alpha Flight',
q{TOOIN33 set_foo('Alpha Flight') sets correct value}
);
is( $sorter->inherited_Sort_foo_get(),
'Alpha Flight',
q{TOOIN34 inherited_Sort_foo_get() returns correct value}
);
},
q{TOOIN35 set_foo('Alpha Flight') lives}
);
can_ok( 'RPerl::Algorithm::Sort', 'inherited_Sort_foo_set' );
lives_and( # TOOIN36 - TOOIN40
sub {
is( $sorter->get_foo(),
'Alpha Flight',
q{TOOIN36 get_foo() returns correct value}
);
is( $sorter->inherited_Sort_foo_get(),
'Alpha Flight',
q{TOOIN37 inherited_Sort_foo_get() returns correct value}
);
$sorter->inherited_Sort_foo_set('Avengers');
is( $sorter->get_foo(),
'Avengers',
q{TOOIN38 inherited_Sort_foo_set('Avengers') sets correct value}
);
is( $sorter->inherited_Sort_foo_get(),
'Avengers',
q{TOOIN39 inherited_Sort_foo_get() returns correct value}
);
},
q{TOOIN40 inherited_Sort_foo_set('Avengers') lives}
);
can_ok( 'RPerl::Algorithm::Sort', 'inherited_Algorithm_foo_get' );
can_ok( 'RPerl::Algorithm::Sort', 'inherited_Algorithm_foo_set' );
lives_and( # TOOIN41 - TOOIN45
sub {
is( $sorter->get_foo(),
'Avengers',
q{TOOIN41 get_foo() returns correct value}
);
is( $sorter->inherited_Algorithm_foo_get(),
'Avengers',
q{TOOIN42 inherited_Algorithm_foo_get() returns correct value}
);
$sorter->inherited_Algorithm_foo_set('X-Men');
is( $sorter->get_foo(),
'X-Men',
q{TOOIN43 inherited_Algorithm_foo_set('X-Men') sets correct value}
);
is( $sorter->inherited_Algorithm_foo_get(),
'X-Men',
q{TOOIN44 inherited_Algorithm_foo_get() returns correct value}
);
},
q{TOOIN45 inherited_Algorithm_foo_set('X-Men') lives}
);
# [ INEFFICIENT ]
# TOOIN46
can_ok( 'RPerl::Algorithm::Inefficient', 'new' );
my $inefficient = new_ok('RPerl::Algorithm::Inefficient');
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Inefficient' );
lives_ok( # TOOIN47
sub { $inefficient->inherited_Inefficient('Frozen') },
q{TOOIN47 inherited_Inefficient('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Algorithm' );
lives_ok( # TOOIN48
sub { $inefficient->inherited_Algorithm('Frozen') },
q{TOOIN48 inherited_Algorithm('Frozen') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited' );
lives_ok( # TOOIN49
sub { $inefficient->inherited('Logan') },
q{TOOIN49 inherited('Logan') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'uninherited_Inefficient' );
lives_and( # TOOIN50
sub {
is( RPerl::Algorithm::Inefficient::uninherited_Inefficient('Claws'),
'Inefficient::uninherited_Inefficient() RULES! ' . $mode_tagline,
q{TOOIN50 uninherited_Inefficient('Claws') returns correct value}
);
},
q{TOOIN50 uninherited_Inefficient('Claws') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'get_foo' );
can_ok( 'RPerl::Algorithm::Inefficient', 'set_foo' );
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Inefficient_foo_get' );
lives_and( # TOOIN51 - TOOIN55
sub {
is( $inefficient->get_foo(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN51 get_foo() returns correct value}
);
is( $inefficient->inherited_Inefficient_foo_get(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN52 inherited_Inefficient_foo_get() returns correct value}
);
$inefficient->set_foo('Alpha Flight');
is( $inefficient->get_foo(),
'Alpha Flight',
q{TOOIN53 set_foo('Alpha Flight') sets correct value}
);
is( $inefficient->inherited_Inefficient_foo_get(),
'Alpha Flight',
q{TOOIN54 inherited_Inefficient_foo_get() returns correct value}
);
},
q{TOOIN55 set_foo('Alpha Flight') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Inefficient_foo_set' );
lives_and( # TOOIN56 - TOOIN60
sub {
is( $inefficient->get_foo(),
'Alpha Flight',
q{TOOIN56 get_foo() returns correct value}
);
is( $inefficient->inherited_Inefficient_foo_get(),
'Alpha Flight',
q{TOOIN57 inherited_Inefficient_foo_get() returns correct value}
);
$inefficient->inherited_Inefficient_foo_set('Avengers');
is( $inefficient->get_foo(),
'Avengers',
q{TOOIN58 inherited_Inefficient_foo_set('Avengers') sets correct value}
);
is( $inefficient->inherited_Inefficient_foo_get(),
'Avengers',
q{TOOIN59 inherited_Inefficient_foo_get() returns correct value}
);
},
q{TOOIN60 inherited_Inefficient_foo_set('Avengers') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'get_bar' );
can_ok( 'RPerl::Algorithm::Inefficient', 'set_bar' );
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Inefficient_bar_get' );
lives_and( # TOOIN61 - TOOIN65
sub {
is( $inefficient->get_bar(),
'<<< DEFAULT, INEFFICIENT >>>',
q{TOOIN61 get_bar() returns correct value}
);
is( $inefficient->inherited_Inefficient_bar_get(),
'<<< DEFAULT, INEFFICIENT >>>',
q{TOOIN62 inherited_Inefficient_bar_get() returns correct value}
);
$inefficient->set_bar('Alpha Flight');
is( $inefficient->get_bar(),
'Alpha Flight',
q{TOOIN63 set_bar('Alpha Flight') sets correct value}
);
is( $inefficient->inherited_Inefficient_bar_get(),
'Alpha Flight',
q{TOOIN64 inherited_Inefficient_bar_get() returns correct value}
);
},
q{TOOIN65 inherited_Inefficient_bar_set('Alpha Flight') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Inefficient_bar_set' );
lives_and( # TOOIN66 - TOOIN70
sub {
is( $inefficient->get_bar(),
'Alpha Flight',
q{TOOIN66 get_bar() returns correct value}
);
is( $inefficient->inherited_Inefficient_bar_get(),
'Alpha Flight',
q{TOOIN67 inherited_Inefficient_bar_get() returns correct value}
);
$inefficient->inherited_Inefficient_bar_set('Avengers');
is( $inefficient->get_bar(),
'Avengers',
q{TOOIN68 inherited_Inefficient_bar_set('Avengers') sets correct value}
);
is( $inefficient->inherited_Inefficient_bar_get(),
'Avengers',
q{TOOIN69 inherited_Inefficient_bar_get() returns correct value}
);
},
q{TOOIN70 inherited_Inefficient_bar_set('Avengers') lives}
);
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Algorithm_foo_get' );
can_ok( 'RPerl::Algorithm::Inefficient', 'inherited_Algorithm_foo_set' );
lives_and( # TOOIN71 - TOOIN75
sub {
is( $inefficient->get_foo(),
'Avengers',
q{TOOIN71 get_foo() returns correct value}
);
is( $inefficient->inherited_Algorithm_foo_get(),
'Avengers',
q{TOOIN72 inherited_Algorithm_foo_get() returns correct value}
);
$inefficient->inherited_Algorithm_foo_set('X-Men');
is( $inefficient->get_foo(),
'X-Men',
q{TOOIN73 inherited_Algorithm_foo_set('X-Men') sets correct value}
);
is( $inefficient->inherited_Algorithm_foo_get(),
'X-Men',
q{TOOIN74 inherited_Algorithm_foo_get() returns correct value}
);
},
q{TOOIN75 inherited_Algorithm_foo_set('X-Men') lives}
);
# [ ALGORITHM ]
# TOOIN76
can_ok( 'RPerl::Algorithm', 'new' );
my $algorithm = new_ok('RPerl::Algorithm');
can_ok( 'RPerl::Algorithm', 'uninherited_Algorithm' );
lives_and( # TOOIN77
sub {
is( RPerl::Algorithm::uninherited_Algorithm('Claws'),
'Algorithm::uninherited_Algorithm() RULES! ' . $mode_tagline,
q{TOOIN77 uninherited_Algorithm('Claws') returns correct value}
);
},
q{TOOIN77 uninherited_Algorithm('Claws') lives}
);
can_ok( 'RPerl::Algorithm', 'get_foo' );
can_ok( 'RPerl::Algorithm', 'set_foo' );
can_ok( 'RPerl::Algorithm', 'inherited_Algorithm_foo_get' );
lives_and( # TOOIN78 - TOOIN82
sub {
is( $algorithm->get_foo(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN78 get_foo() returns correct value}
);
is( $algorithm->inherited_Algorithm_foo_get(),
'<<< DEFAULT, ALGORITHM >>>',
q{TOOIN79 inherited_Algorithm_foo_get() returns correct value}
);
$algorithm->set_foo('Alpha Flight');
is( $algorithm->get_foo(),
'Alpha Flight',
q{TOOIN80 set_foo('Alpha Flight') sets correct value}
);
is( $algorithm->inherited_Algorithm_foo_get(),
'Alpha Flight',
q{TOOIN81 inherited_Algorithm_foo_get() returns correct value}
);
},
q{TOOIN82 set_foo('Alpha Flight') lives}
);
can_ok( 'RPerl::Algorithm', 'inherited_Algorithm_foo_set' );
lives_and( # TOOIN83 - TOOIN87
sub {
is( $algorithm->get_foo(),
'Alpha Flight',
q{TOOIN83 get_foo() returns correct value}
);
is( $algorithm->inherited_Algorithm_foo_get(),
'Alpha Flight',
q{TOOIN84 inherited_Algorithm_foo_get() returns correct value}
);
$algorithm->inherited_Algorithm_foo_set('Avengers');
is( $algorithm->get_foo(),
'Avengers',
q{TOOIN85 inherited_Algorithm_foo_set('Avengers') sets correct value}
);
is( $algorithm->inherited_Algorithm_foo_get(),
'Avengers',
q{TOOIN86 inherited_Algorithm_foo_get() returns correct value}
);
},
q{TOOIN87 inherited_Algorithm_foo_set('Avengers') lives}
);
# DEV NOTE, CORRELATION #rp004: inheritance testing, manually enable uninherited() in exactly one of Algorithm.*, Inefficient.*, Sort.*, or Bubble.*
# can_ok( 'RPerl::Algorithm::Inefficient', 'uninherited' );
# lives_and( # TOOINxx
# sub {
# is( uninherited('Wolverine'), 'Inefficient::uninherited() ROCKS! ' . $mode_tagline, q{TOOINxx uninherited('Wolverine') returns correct value} );
# },
# q{TOOINxx uninherited('Wolverine') lives}
# );
}
# NEED FIX: triplicate code
# delete CPP, H, and PMC files if they exist;
# for PERLOPS_PERLTYPES we need none of these files; for CPPOPS_xTYPES we need the proper manually-compiled files, not some other files
foreach my string $filename (
@{ [ $bubble_cpp_filename, $bubble_h_filename, $bubble_pmc_filename, $sort_cpp_filename,
$sort_h_filename, $sort_pmc_filename, $inefficient_cpp_filename, $inefficient_h_filename,
$inefficient_pmc_filename, $algorithm_cpp_filename, $algorithm_h_filename, $algorithm_pmc_filename
]
}
)
{
{
if ( -e $filename ) {
my integer $unlink_success = unlink $filename;
if ($unlink_success) {
ok( 1, 'Unlink (delete) existing file ' . $filename );
}
else {
ok( 0, 'Unlink (delete) existing file ' . $filename . q{ ... } . $OS_ERROR );
# skip all tests in this mode if we cannot remove the PMC file (and presumably the other 2 modes, as well)
next;
}
}
else {
ok( 1, 'No need to unlink (delete) existing file ' . $filename );
}
}
}
done_testing();