The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl
#
use strict ;
use Test::More;

use File::Copy ;

use App::Framework '::Filter' ;

# VERSION
our $VERSION = '1.00' ;

my $DEBUG=0;
my $VERBOSE=0;

my $read_dir = "t/filter" ;
my $write_dir = "t/filter_wr" ;
my $source = 'source.txt' ;

my %expected = (
	'00-default'	=> {
		'args'		=> [
		],
		'input'		=> "$write_dir/$source",
		'output'	=> "$write_dir/default.txt",
	},
	'01-no_comment'	=> {
		'args'		=> [
			"-trim_comment",
			"-comment", "//",
		],
		'input'		=> "$write_dir/$source",
		'output'	=> "$write_dir/no_comment.txt",
	},
	'02-no_empty'	=> {
		'args'		=> [
			"-skip_empty",
		],
		'input'		=> "$write_dir/$source",
		'output'	=> "$write_dir/no_empty.txt",
	},
	'03-no_space'	=> {
		'args'		=> [
			"-trim_space",
		],
		'input'		=> "$write_dir/$source",
		'output'	=> "$write_dir/no_space.txt",
	},
	'04-terse'	=> {
		'args'		=> [
			"-trim_comment",
			"-comment", "#",
			"-trim_space",
			"-skip_empty",
		],
		'input'		=> "$write_dir/$source",
		'output'	=> "$write_dir/terse.txt",
	},
#	'05-stdout'	=> {
#		'args'		=> [
#			"-trim_comment",
#			"-comment", "//",
#		],
#		'input'		=> "$write_dir/$source",
#	},
	'99-inplace'	=> {
		'args'		=> [
			"-inplace", 
			"-trim_comment",
			"-comment", "//",
			"-trim_space",
			"-skip_empty",
		],
		'input'		=> "$write_dir/$source",
		'output'	=> "$write_dir/$source",
	},

) ;


	my $stdout="" ;
	my $stderr="" ;

	diag( "Testing filter extension" );

	plan tests => scalar(keys %expected) ;

	## clear out write path
	if (-d $write_dir)
	{
		foreach my $f (glob("$write_dir"))
		{
			unlink $f ;
		}
		rmdir $write_dir ;
	}
	mkdir $write_dir ;
	copy("$read_dir/source.txt", "$write_dir/source.txt") ;

	## Create app
	my $app = App::Framework->new('exit_type'=>'die',
		'debug' => $DEBUG,
#		'feature_config' => {
#			'options' => {
#				'debug' => $DEBUG,
#			},
#			'data' => {
#				'debug' => $DEBUG,
#			},
#		},
	) ;


	## run through tests
	my $got_data=0;
	foreach my $test (sort keys %expected)
	{
		my @args = () ;
		push @args, ("-outfile", "$expected{$test}{output}") if $expected{$test}{output} ;
		push @args, (@{$expected{$test}{args}}) ;
		push @args, "$expected{$test}{input}" ;
		$app->prt_data("Test $test : args=", \@args) if $DEBUG ;
		do_go(@args) ;
	}



	## check
	foreach my $test (sort keys %expected)
	{
		my $expected = $expected{$test}{'data'} ;
		my $got ;
		if ($expected{$test}{output})
		{
			$got = getfile($expected{$test}{output}) ;
		}
		else
		{
			$got = $stdout ;
		}
		chomp $got ;
		is($got, $expected, "Checking $test file contents") ;
	}



#=================================================================================
# SUBROUTINES EXECUTED BY APP
#=================================================================================

#----------------------------------------------------------------------
sub app_start
{
	my ($app, $opts_href, $state_href) = @_ ;

	## get data
	if (!$got_data)
	{
		foreach my $dtest (keys %expected)
		{
			print "Get data $dtest\n" ;
			$expected{$dtest}{'data'} = $app->data($dtest) ;
			print "Got data $expected{$dtest}{'data'}\n" ;
		}
		++$got_data ;
	}
	
}
#----------------------------------------------------------------------
# Main execution
#
sub app
{
	my ($app, $opts_href, $state_href, $line) = @_ ;

#print "in app\n" if $DEBUG ;

	$state_href->{output} = uc $line ;

}

#=================================================================================
# SUBROUTINES
#=================================================================================

#----------------------------------------------------------------------
sub do_go
{
	@ARGV = @_ ;

	eval {
		local *STDOUT ;
		local *STDERR ;

		open(STDOUT, '>', \$stdout)  or die "Can't open STDOUT: $!" ;
		open(STDERR, '>', \$stderr) or die "Can't open STDERR: $!";

		$app->go()
	} ;
#	$@ =~ s/Died.*//m if $@ ;
#	$@ =~ s/^\s+//gm if $@ ;
#	$@ =~ s/\s+$//gm if $@ ;

	print "$stdout" if $stdout ;
	print "$stderr" if $stderr ;
	print "$@" if $@ ;

}

#----------------------------------------------------------------------
sub getfh
{
	my ($fh) = @_ ;
	local $/ = undef ;
	my $data = <$fh> ;
	return $data ;
}

#----------------------------------------------------------------------
sub getfile
{
	my ($file) = @_ ;
	open my $fh, "<$file" ;
	my $data = getfh($fh) ;
	close $fh ;
	return $data ;
}


#=================================================================================
# SETUP
#=================================================================================
__DATA__

[SUMMARY]

Tests file filter extension

[DESCRIPTION]

B<$name> does some stuff.

__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 00-default
#============================================================================================
# USES
#============================================================================================
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;


#============================================================================================
# OBJECT HIERARCHY
#============================================================================================
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  // C++ TYPE COMMENT 

#============================================================================================
# GLOBALS
#============================================================================================

REVISION HISTORY FOR APP-FRAMEWORK

//0.07    SAT MAR 14 20:33:00 2009
//        BUG FIX: CORRECTED SQL INITIALISATION (WAS CLAIMING DBI NOT INSTALLED)
//        ADDED: -MAN-DEV OPTION TO DISPLAY APP DEVELOPER MAN PAGES
//        ADDED: ALLOW 'DEV:' PREFIX TO MAKE OPTION ONLY SHOW IN DEVELOPER MAN PAGES
//        ADDED: SQL SUPPORT FOR 'GROUP BY'

0.06    THU MAR 05 15:09:00 2009 // C++ TYPE COMMENT
        UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.

0.05    WED MAR 04 13:29:00 2009
        CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.

0.04    WED MAR 04 08:07:00 2009
        VARIOUS BUG FIXES.

0.03    TUE MAR 03 15:55:56 2009  // C++ TYPE COMMENT
        BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.

0.02    FRI FEB 27 08:38:56 2009
        FIXED MANIFEST.SKIP (AND MANIFEST).

0.01    THU FEB 26 15:51:56 2009
        FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 01-no_comment
#============================================================================================
# USES
#============================================================================================
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;


#============================================================================================
# OBJECT HIERARCHY
#============================================================================================
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  

#============================================================================================
# GLOBALS
#============================================================================================

REVISION HISTORY FOR APP-FRAMEWORK







0.06    THU MAR 05 15:09:00 2009 
        UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.

0.05    WED MAR 04 13:29:00 2009
        CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.

0.04    WED MAR 04 08:07:00 2009
        VARIOUS BUG FIXES.

0.03    TUE MAR 03 15:55:56 2009  
        BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.

0.02    FRI FEB 27 08:38:56 2009
        FIXED MANIFEST.SKIP (AND MANIFEST).

0.01    THU FEB 26 15:51:56 2009
        FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 02-no_empty
#============================================================================================
# USES
#============================================================================================
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;
#============================================================================================
# OBJECT HIERARCHY
#============================================================================================
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  // C++ TYPE COMMENT 
#============================================================================================
# GLOBALS
#============================================================================================
REVISION HISTORY FOR APP-FRAMEWORK
//0.07    SAT MAR 14 20:33:00 2009
//        BUG FIX: CORRECTED SQL INITIALISATION (WAS CLAIMING DBI NOT INSTALLED)
//        ADDED: -MAN-DEV OPTION TO DISPLAY APP DEVELOPER MAN PAGES
//        ADDED: ALLOW 'DEV:' PREFIX TO MAKE OPTION ONLY SHOW IN DEVELOPER MAN PAGES
//        ADDED: SQL SUPPORT FOR 'GROUP BY'
0.06    THU MAR 05 15:09:00 2009 // C++ TYPE COMMENT
        UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.
0.05    WED MAR 04 13:29:00 2009
        CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.
0.04    WED MAR 04 08:07:00 2009
        VARIOUS BUG FIXES.
0.03    TUE MAR 03 15:55:56 2009  // C++ TYPE COMMENT
        BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.
0.02    FRI FEB 27 08:38:56 2009
        FIXED MANIFEST.SKIP (AND MANIFEST).
0.01    THU FEB 26 15:51:56 2009
        FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 03-no_space
#============================================================================================
# USES
#============================================================================================
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;


#============================================================================================
# OBJECT HIERARCHY
#============================================================================================
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  // C++ TYPE COMMENT

#============================================================================================
# GLOBALS
#============================================================================================

REVISION HISTORY FOR APP-FRAMEWORK

//0.07    SAT MAR 14 20:33:00 2009
//        BUG FIX: CORRECTED SQL INITIALISATION (WAS CLAIMING DBI NOT INSTALLED)
//        ADDED: -MAN-DEV OPTION TO DISPLAY APP DEVELOPER MAN PAGES
//        ADDED: ALLOW 'DEV:' PREFIX TO MAKE OPTION ONLY SHOW IN DEVELOPER MAN PAGES
//        ADDED: SQL SUPPORT FOR 'GROUP BY'

0.06    THU MAR 05 15:09:00 2009 // C++ TYPE COMMENT
UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.

0.05    WED MAR 04 13:29:00 2009
CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.

0.04    WED MAR 04 08:07:00 2009
VARIOUS BUG FIXES.

0.03    TUE MAR 03 15:55:56 2009  // C++ TYPE COMMENT
BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.

0.02    FRI FEB 27 08:38:56 2009
FIXED MANIFEST.SKIP (AND MANIFEST).

0.01    THU FEB 26 15:51:56 2009
FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 04-terse
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  // C++ TYPE COMMENT
REVISION HISTORY FOR APP-FRAMEWORK
//0.07    SAT MAR 14 20:33:00 2009
//        BUG FIX: CORRECTED SQL INITIALISATION (WAS CLAIMING DBI NOT INSTALLED)
//        ADDED: -MAN-DEV OPTION TO DISPLAY APP DEVELOPER MAN PAGES
//        ADDED: ALLOW 'DEV:' PREFIX TO MAKE OPTION ONLY SHOW IN DEVELOPER MAN PAGES
//        ADDED: SQL SUPPORT FOR 'GROUP BY'
0.06    THU MAR 05 15:09:00 2009 // C++ TYPE COMMENT
UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.
0.05    WED MAR 04 13:29:00 2009
CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.
0.04    WED MAR 04 08:07:00 2009
VARIOUS BUG FIXES.
0.03    TUE MAR 03 15:55:56 2009  // C++ TYPE COMMENT
BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.
0.02    FRI FEB 27 08:38:56 2009
FIXED MANIFEST.SKIP (AND MANIFEST).
0.01    THU FEB 26 15:51:56 2009
FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 99-inplace
#============================================================================================
# USES
#============================================================================================
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;
#============================================================================================
# OBJECT HIERARCHY
#============================================================================================
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  
#============================================================================================
# GLOBALS
#============================================================================================
REVISION HISTORY FOR APP-FRAMEWORK
0.06    THU MAR 05 15:09:00 2009 
UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.
0.05    WED MAR 04 13:29:00 2009
CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.
0.04    WED MAR 04 08:07:00 2009
VARIOUS BUG FIXES.
0.03    TUE MAR 03 15:55:56 2009  
BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.
0.02    FRI FEB 27 08:38:56 2009
FIXED MANIFEST.SKIP (AND MANIFEST).
0.01    THU FEB 26 15:51:56 2009
FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ 05-stdout
#============================================================================================
# USES
#============================================================================================
USE FILE::PATH ;
USE FILE::BASENAME ;
USE FILE::SPEC ;
USE APP::FRAMEWORK::CORE ;


#============================================================================================
# OBJECT HIERARCHY
#============================================================================================
USE APP::FRAMEWORK::EXTENSION ;
OUR @ISA ;  

#============================================================================================
# GLOBALS
#============================================================================================

REVISION HISTORY FOR APP-FRAMEWORK







0.06    THU MAR 05 15:09:00 2009 
        UPDATED SCRIPT POD. MODIFIED SO THAT SCRIPTS CAN BE USED WITHOUT DBI. CORRECTED BUILD FAIL WHEN DBI NOT INSTALLED.

0.05    WED MAR 04 13:29:00 2009
        CORRECTED MANIFEST PROBLEM THAT CAUSED T/04-ARGS.T TEST TO FAIL.

0.04    WED MAR 04 08:07:00 2009
        VARIOUS BUG FIXES.

0.03    TUE MAR 03 15:55:56 2009  
        BETTER TESTING, BETTER DOCUMENTATION, VARIOUS BUG FIXES.

0.02    FRI FEB 27 08:38:56 2009
        FIXED MANIFEST.SKIP (AND MANIFEST).

0.01    THU FEB 26 15:51:56 2009
        FIRST VERSION, TESTING DISTRIBUTION FILES ARE CORRECT. THIS VERSION HAS VERY LIMITED TESTING.
__#
__#-------------------------------------------------------------------------------------------------------
__DATA__ end