Skip to content

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
commit 94afb94
Author: brian d foy <briandfoy@pobox.com>
Date:   Wed Jun 21 07:22:28 2023 -0400

    Run each test independently

commit 9f84e08
Author: Gary Puckering <gary.puckering@outlook.com>
Date:   Fri Jun 16 18:14:19 2023 -0400

    Replace `perl` with "$^X"; remove //xms; add some commments.

commit 3dcc015
Author: Gary Puckering <gary.puckering@outlook.com>
Date:   Fri Jun 16 18:10:45 2023 -0400

    Revert "Replace `perl` with "$^X"; remove //xms; add some commments."

commit bcaaeea
Author: Gary Puckering <gary.puckering@outlook.com>
Date:   Fri Jun 16 18:05:05 2023 -0400

    Replace `perl` with "$^X"; remove //xms; add some commments.

commit 0e756cd
Author: Gary Puckering <gary.puckering@outlook.com>
Date:   Fri Jun 16 15:58:59 2023 -0400

    Initial checkin of 60+ functional tests for script bc covering operators, precedence, special expressions and statements.
  • Loading branch information
briandfoy committed Jun 21, 2023
1 parent eb3a70b commit bb00988
Showing 1 changed file with 181 additions and 0 deletions.
181 changes: 181 additions & 0 deletions t/bc/bc.t
@@ -0,0 +1,181 @@
#!/usr/bin/perl

# bc.t - test for script bc

# Author: Gary Puckering, gary.puckering@outlook.com
# Date written: 2023-06-16

# Test cases based on the GNU bc documentation
# See https://www.gnu.org/software/bc/manual/text/bc.txt

use strict;
use warnings;

use Test::More;
use File::Temp qw/tempfile/;

require './t/lib/common.pl';

# we expect to run this from the PerlPowerTools directory
my $Script = program_name();

run_tests();

sub run_tests {
sanity_test($Script);

my @tables = (
operator_table(),
precedence_table(),
special_expr_table(),
statement_table(),
);

run_table($_) foreach @tables;

return;
}

done_testing();

sub operator_table {
my $table = [
'operators',
[ '-1', '-1', 'negation' ],
[ 'var=12', '12', 'variable assignment' ],
[ 'v=3; ++v', "3\n4", 'prefix increment' ],
[ 'v=3; --v', "3\n2", 'prefix increment' ],
[ 'v=3; v++; v', "3\n3\n4", 'postfix increment' ],
[ 'v=3; v--; v', "3\n3\n2", 'postfix increment' ],
[ 'v=3; v+=5; v', "3\n8\n8", 'postfix increment' ],
[ 'v=5; v-=3; v', "5\n2\n2", 'postfix decrement' ],
[ '1+2', '3', 'addition' ],
[ '5-3', '2', 'subtraction' ],
[ '3*5', '15', 'multiplication' ],
[ '15/3', '5', 'division' ],
[ '15%3', '0', 'remainder zero' ],
[ '29%5', '4', 'remainder four' ],
[ '2^15', '32768', 'exponentiation' ],
[ '3*2+5', '11', 'expr without parens' ],
[ '3*(2+5)', '21', 'expr with parens' ],
[ 'sqrt(16)', '4', 'sqrt' ],
[ '!0', '1', 'boolean not' ],
[ '!1', '0', 'boolean not' ],
[ '1 && 1', '1', 'boolean and' ],
[ '1 && 0', '0', 'boolean and' ],
[ '0 && 1', '0', 'boolean and' ],
[ '0 && 0', '0', 'boolean and' ],
[ '1 || 1', '1', 'boolean or' ],
[ '1 || 0', '1', 'boolean or' ],
[ '0 || 1', '1', 'boolean or' ],
[ '0 || 0', '0', 'boolean or' ],
[ '9 == 9', '1', 'equals (true)' ],
[ '9 == 8', '0', 'equals (false)' ],
[ '9 != 8', '1', 'not equals (true)' ],
[ '9 != 9', '0', 'not equals (false)' ],
[ '5 < 7', '1', 'less than' ],
[ '5 <= 5', '1', 'less than or equal' ],
[ '7 > 5', '1', 'greater than' ],
[ '7 >= 7', '1', 'greater than or equal' ],
];
}

sub precedence_table {
my $table = [
'precedence',
[ 'v = (3 < 5)', '1', 'just like gnu bc' ],

# according to the GNU bc documentation, their implementation
# will assign 3 to v and then do the relational test
[ 'v = 3 < 5', '1', ' not like gnu bc' ],

[ 'v = 4+5*2^3', '44', 'PEDMAS' ],
[ 'v = (4+5)*2', '18', 'PEDMAS' ],
[ 'v = -(4+5)+8', '-1', 'PEDMAS' ],
];
}

sub special_expr_table {
my $sqrt2 = '1.4142135623731';
my $table = [
'special expressions',
[ 'sqrt(2)', $sqrt2, 'sqrt function' ],
[ 'length(sqrt(2))', '14', 'significant digits' ],
[ 'scale(sqrt(2))', '13', 'precision digits' ],
];
}

sub statement_table {
## no critic [ValuesAndExpressions::RequireInterpolationOfMetachars]
my $table = [
'statements',
[
q("a string"),
'a string',
'string literal',
],

[
# need to print the newline here so that the test harness
# recognizes the end of the test output
'print "1+2", " is ", 1+2, "\n"',
'1+2 is 3',
'print statement',
],

[
'{ print "a"; print "b"; print "\n" }',
'ab',
'compound statement',
],

[
'v=5; while (v--) { print v }; print "\n"',
"5\n43210",
'while statement',
],

[
'for (v=0;v<5;v++) { print v }; print "\n"',
"01234",
'for statement',
],

[
'for ( v=0; v<5; v++) { print v; if (v>2) break }; print "\n"',
"01230\n",
'for with break statement',
],

# The following aren't being tested because they are extensions
# that aren't support in the PerlPowerTools implementation of bc
# - read()
# - if ... else
# - continue
# - halt
# - warranty
# - define (because I can't even get it to work interactively)

# Not testing this, for obvious reasons
# - quit
];
}

sub run_table {
my( $table ) = @_;

my $label = shift @$table;

subtest $label => sub {
foreach my $tuple (@$table) {
my( $input, $expected, $description ) = @$tuple;
$expected .= "\n";
my ( $fh, $temp_filename ) = tempfile();
print {$fh} $input, "\n";
my $output = `"$^X" $Script $temp_filename`;
is $output, $expected, $description;
}
};

return;
}

0 comments on commit bb00988

Please sign in to comment.