#!/usr/bin/perl -w
###############################################################################
#
# A test for Spreadsheet::WriteExcel.
#
# Tests for the token parsing methods used to parse autofilter expressions.
#
# reverse('©'), August 2007, John McNamara, jmcnamara@cpan.org
#
use strict;
use Spreadsheet::WriteExcel;
use Test::More tests => 24;
###############################################################################
#
# Tests setup
#
my $test_file = "temp_test_file.xls";
my $workbook = Spreadsheet::WriteExcel->new($test_file);
my $worksheet = $workbook->add_worksheet();
###############################################################################
#
# Test cases structured as [$input, [@expected_output]]
#
my @tests = (
[
'x = 2000',
[2, 2000],
],
[
'x == 2000',
[2, 2000],
],
[
'x =~ 2000',
[2, 2000],
],
[
'x eq 2000',
[2, 2000],
],
[
'x <> 2000',
[5, 2000],
],
[
'x != 2000',
[5, 2000],
],
[
'x ne 2000',
[5, 2000],
],
[
'x !~ 2000',
[5, 2000],
],
[
'x > 2000',
[4, 2000],
],
[
'x < 2000',
[1, 2000],
],
[
'x >= 2000',
[6, 2000],
],
[
'x <= 2000',
[3, 2000],
],
[
'x > 2000 and x < 5000',
[4, 2000, 0, 1, 5000],
],
[
'x > 2000 && x < 5000',
[4, 2000, 0, 1, 5000],
],
[
'x > 2000 or x < 5000',
[4, 2000, 1, 1, 5000],
],
[
'x > 2000 || x < 5000',
[4, 2000, 1, 1, 5000],
],
[
'x = Blanks',
[2, 'blanks'],
],
[
'x = NonBlanks',
[2, 'nonblanks'],
],
[
'x <> Blanks',
[2, 'nonblanks'],
],
[
'x <> NonBlanks',
[2, 'blanks'],
],
[
'Top 10 Items',
[30, 10],
],
[
'Top 20 %',
[31, 20],
],
[
'Bottom 5 Items',
[32, 5],
],
[
'Bottom 101 %',
[33, 101],
],
);
###############################################################################
#
# Run the test cases.
#
for my $aref (@tests) {
my $expression = $aref->[0];
my $expected = $aref->[1];
my @tokens = $worksheet->_extract_filter_tokens($expression);
my @results = $worksheet->_parse_filter_expression($expression, @tokens);
my $testname = $expression || 'none';
is_deeply(\@results, $expected, " \t" . $testname);
}
# Cleanup
$workbook->close();
unlink $test_file;