#!/usr/bin/perl -w
# /\
# / \ (C) Copyright 2008 Parliament Hill Computers Ltd.
# \ / All rights reserved.
# \/
# . Author: Alain Williams, March 2008
# . addw@phcomp.co.uk
# .
# .
#
# SCCS: @(#)options.t 1.1 03/04/08 09:01:27
#
# Test options for the module Math::Expression.
#
# May want to run as:
# PERL5LIB=blib/lib t/options.t
# PERL5LIB=../blib/lib options.t
# You can also set environment variables:
# TRACE 1 print out expression and result
# 2 also print out the parse tree
# eg:
# TRACE=1 perl -Iblib/lib t/test.t
# Copyright (c) 2008 Parliament Hill Computers Ltd/Alain D D Williams. All rights reserved.
# This module is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself. You must preserve this entire copyright
# notice in any use or distribution.
# The author makes no warranty what so ever that this code works or is fit
# for purpose: you are free to use this code on the understanding that any problems
# are your responsibility.
# Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is
# hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and
# this permission notice appear in supporting documentation.
use strict;
use Math::Expression;
my $NumFails = 0;
my $ExprError;
my $RunError;
my $errtree = 0;
my $verbose = 0;
my $var=0;
my @arr = (1,2,3);
my $OriginalExpression;
my $Operation;
sub MyPrintError {
printf "#Error in $Operation '%s': ", $OriginalExpression;
printf @_;
print "\n";
if($Operation eq 'parsing') {
$ExprError = 1;
} else {
$RunError = 1;
}
}
sub printv {
return unless($verbose > 1);
if($#_ > 0) {
my $fmt = shift @_;
printf $fmt, @_;
} else {
print $_[0];
}
}
# **** Start here ****
# Debug/trace options from the environment:
$verbose = $ENV{TRACE} if(exists($ENV{TRACE}));
$errtree = $ENV{ERR_TREE} if(exists($ENV{ERR_TREE}));
printf "Math::Expression Version '%s'\n", $Math::Expression::VERSION if($verbose);
my $ArithEnv = new Math::Expression;
my $Now = time;
use Test::Simple;
my @round = ('round(0.6) ', 'round(-0.6) ', 'round(0.4) ', 'round(-0.4) ');
# Results of the above, twice, depending on option:
my @round_res = (
[ 1, 0, 0, 0],
[ 1, -1, 0, 0]
);
# Output # tests that we expect to do:
my $NumTests = (scalar @round) * 2;
print "1..$NumTests\n";
my $Tests = 0;
# To show how RoundNegatives affects the rounding of negative numbers:
foreach my $opt (0, 1) {
$ArithEnv->SetOpt(RoundNegatives => $opt);
my $test = 0;
foreach my $e (@round) {
$Tests++;
my $tree = $ArithEnv->Parse($e);
$ArithEnv->PrintTree($tree) if($verbose > 1);
my $res = $ArithEnv->EvalToScalar($tree);
my $ok = $res == $round_res[$opt][$test] ? 'ok' : ($NumFails++, 'not ok');
print qq[$ok $Tests - expr '$e' res '$res' expected '$round_res[$opt][$test]'\n];
$test++;
}
}
print "\n\n";
print "# $Tests tests run\n";
print $NumFails == 0 ? "# All tests OK\n" : "# $NumFails tests failed\n";
# end