The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

##################################################################
# TestOptions.pm
# 
# Tests for the Options.pm perl module
# 
# Copyright (C) 2005-2007 by Phil Christensen
##################################################################

use strict;
use warnings;

use Options;
package Options::Test;
use base qw(Test::Unit::TestCase);

sub new {
	my $self = shift()->SUPER::new(@_);
	return $self;
}

sub set_up {
	my $self = shift;
	$self->{'options'} = new Options(params => [
							['port', 'p', undef, 'The port to connect to.'],
							['host', 'h', 'localhost', 'The host to connect to.']
							],
							flags =>  [
							['secure', 's', 'Use SSL for encryption.'],
							['quit', 'q', 'Quit after connecting.']
							]);
	
	$self->{'options'}->{'exit'} = undef;
	
	$self->{'options'}->{'usage_fh_variable'} = '';
	open STRINGIO, '+>', \$self->{'options'}->{'usage_fh_variable'} or die $!;
	$self->{'options'}->{'usage_fh'} = \*STRINGIO;
}

sub tear_down {
	my $self = shift;
	close($self->{'options'}->{'usage_fh'});
	$self->{'options'} = undef;
}

sub test_simple {
	my $self = shift;
	my @args = ('options.t', '--port', '8080');
	my %result = $self->{'options'}->get_options(@args);
	
	$self->assert_equals('localhost', $result{'host'}, "Didn't get back correct 'host' value");
	$self->assert_equals('8080', $result{'port'}, "Didn't get back correct 'port' value");
	$self->assert_null($result{'something'}, 'Secure should not have been found.');
}

sub test_group_flags {
	my $self = shift;
	my @args = ('options.t', '--port', '8080', '-sq');
	my %result = $self->{'options'}->get_options(@args);
	
	$self->assert($result{'secure'}, "'secure' was not selected properly");
	$self->assert($result{'quit'}, "'quit' was not selected properly");
}

sub test_broken_group_flags {
	my $self = shift;
	my @args = ('options.t', '--port', '8080', '-sqh');
	
	my %result = eval{
		my %results = $self->{'options'}->get_options(@args);
	};

	$self->assert_not_null($@, 'Improperly grouped parameter did not kill the script.');
	$self->assert_not_equals('', $self->{'options'}->{'usage_fh_variable'},
					"No usage information found after improperly grouped parameter.");
}

sub test_broken_group_flags2 {
	my $self = shift;
	my @args = ('options.t', '--port', '8080', '-sqx');
	
	my %result = eval{
		return $self->{'options'}->get_options(@args);
	};

	my $usage_fh = $self->{'options'}->{'usage_fh'};
	seek($usage_fh, 0, 0);
	my @usage = <$usage_fh>;
	my $usage = join("\n", @usage);
	
	$self->assert_not_null($@, 'Unknown grouped flag did not kill the script.');
	$self->assert_not_equals('', $usage, "No usage information found after unknown grouped flag.");
}

sub test_required {
	my $self = shift;
	my @args = ('options.t');
	
	my %result = eval{
		return $self->{'options'}->get_options(@args);
	};
	
	my $usage_fh = $self->{'options'}->{'usage_fh'};
	seek($usage_fh, 0, 0);
	my @usage = <$usage_fh>;
	my $usage = join("\n", @usage);
	
	$self->assert_null($result{'host'}, "Shouldn't have gotten a 'host' value.");
	$self->assert_null($result{'secure'}, "Shouldn't have gotten a 'secure' value.");
	$self->assert_not_null($@, 'Missing required options did not kill the script.');
	$self->assert_not_equals('', $usage, "No usage information found after missing required argument.");
}

sub test_handler {
	my $self = shift;
	my @args = ('options.t', '-s', '-h', 'somehost');
	
	$self->{'options'}->{'error_handler'} = sub {
		return 1;
	};
	
	my %result = eval{
		return $self->{'options'}->get_options(@args);
	};
	
	$self->assert_equals('somehost', $result{'host'}, "Didn't get back correct 'host' value");
	$self->assert($result{'secure'}, "'secure' was not selected properly");
	# I don't know why this doesn't come back null here:
	#$self->assert_null($@, "Custom handler failed, missing required options killed the script.");
	$self->assert_equals("$@", '', "Custom handler failed, missing required options killed the script.");
}

1;