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

###############################################################################
#
# A test for Spreadsheet::WriteExcel.
#
# Tests for the Excel DV structure used in data validation.
#
# reverse('©'), September 2008, John McNamara, jmcnamara@cpan.org
#


use strict;

use Spreadsheet::WriteExcel;
use Test::More tests => 43;


###############################################################################
#
# Tests setup
#
my $test_file           = 'temp_test_file.xls';
my $workbook            = Spreadsheet::WriteExcel->new($test_file);
my $worksheet           = $workbook->add_worksheet();
my $target;
my $result;
my $caption;

# Store worksheet data in memory so we can access it for testing.
$worksheet->{_using_tmpfile} = 0;


###############################################################################
#
# Test 1 Integer between 1 and 10.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: integer between";
$target     = join " ",  qw(
    BE 01 2C 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 2 Integer not between 1 and 10.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'not between',
        minimum         => 1,
        maximum         => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: integer not between";
$target     = join " ",  qw(
    BE 01 2C 00 01 01 1C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 3,4,5 Integer == 1.
#
for my $operator ('equal to', '=', '==') {
    $worksheet->{_data}         = '';
    $worksheet->{_validations}  = [];

    $worksheet->data_validation('B5',
        {
            validate        => 'integer',
            criteria        => $operator,
            value         => 1,
        });

    $worksheet->_store_validations();

    $caption    = " \tData validation api: integer equal to";
    $target     = join " ",  qw(
        BE 01 29 00 01 01 2C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 00
        00 00 00 01 00 04 00 04 00 01 00 01 00
    );

    $result     = unpack_record($worksheet->{_data});
    is($result, $target, $caption);
}


###############################################################################
#
# Test 6,7,8 Integer != 1.
#
for my $operator ('not equal to', '<>', '!=') {
    $worksheet->{_data}         = '';
    $worksheet->{_validations}  = [];

    $worksheet->data_validation('B5',
        {
            validate        => 'integer',
            criteria        => $operator,
            value         => 1,
        });

    $worksheet->_store_validations();

    $caption    = " \tData validation api: integer not equal to";
    $target     = join " ",  qw(
        BE 01 29 00 01 01 3C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 00
        00 00 00 01 00 04 00 04 00 01 00 01 00
    );

    $result     = unpack_record($worksheet->{_data});
    is($result, $target, $caption);
}


###############################################################################
#
# Test 9,10 Integer > 1.
#
for my $operator ('greater than', '>') {
    $worksheet->{_data}         = '';
    $worksheet->{_validations}  = [];

    $worksheet->data_validation('B5',
        {
            validate        => 'integer',
            criteria        => $operator,
            value         => 1,
        });

    $worksheet->_store_validations();

    $caption    = " \tData validation api: integer >";
    $target     = join " ",  qw(
        BE 01 29 00 01 01 4C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 00
        00 00 00 01 00 04 00 04 00 01 00 01 00
    );

    $result     = unpack_record($worksheet->{_data});
    is($result, $target, $caption);
}


###############################################################################
#
# Test 11,12 Integer < 1.
#
for my $operator ('less than', '<') {
    $worksheet->{_data}         = '';
    $worksheet->{_validations}  = [];

    $worksheet->data_validation('B5',
        {
            validate        => 'integer',
            criteria        => $operator,
            value         => 1,
        });

    $worksheet->_store_validations();

    $caption    = " \tData validation api: integer <";
    $target     = join " ",  qw(
        BE 01 29 00 01 01 5C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 00
        00 00 00 01 00 04 00 04 00 01 00 01 00
    );

    $result     = unpack_record($worksheet->{_data});
    is($result, $target, $caption);
}


###############################################################################
#
# Test 13,14 Integer >= 1.
#
for my $operator ('greater than or equal to', '>=') {
    $worksheet->{_data}         = '';
    $worksheet->{_validations}  = [];

    $worksheet->data_validation('B5',
        {
            validate        => 'integer',
            criteria        => $operator,
            value         => 1,
        });

    $worksheet->_store_validations();

    $caption    = " \tData validation api: integer >=";
    $target     = join " ",  qw(
        BE 01 29 00 01 01 6C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 00
        00 00 00 01 00 04 00 04 00 01 00 01 00
    );

    $result     = unpack_record($worksheet->{_data});
    is($result, $target, $caption);
}


###############################################################################
#
# Test 15,16 Integer <= 1.
#
for my $operator ('less than or equal to', '<=') {
    $worksheet->{_data}         = '';
    $worksheet->{_validations}  = [];

    $worksheet->data_validation('B5',
        {
            validate        => 'integer',
            criteria        => $operator,
            value         => 1,
        });

    $worksheet->_store_validations();

    $caption    = " \tData validation api: integer <=";
    $target     = join " ",  qw(
        BE 01 29 00 01 01 7C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 00
        00 00 00 01 00 04 00 04 00 01 00 01 00
    );

    $result     = unpack_record($worksheet->{_data});
    is($result, $target, $caption);
}


###############################################################################
#
# Test 17 Integer between 1 and 10 (same as test 1) + Ignore blank off.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        ignore_blank    => 0,
    });

$worksheet->_store_validations();

    $caption    = " \tData validation api: ignore blank off";
$target     = join " ",  qw(
    BE 01 2C 00 01 00 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 18 Integer between 1 and 10 (same as test 1) + Error style == warning..
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        error_type      => 'warning',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: error style = warning";
$target     = join " ",  qw(
        BE 01 2C 00 11 01 0C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
        00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 19 Integer between 1 and 10 (same as test 1) + Error style == infor..
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        error_type      => 'information',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: error style = information";
$target     = join " ",  qw(
        BE 01 2C 00 21 01 0C 00 01 00 00 00 01 00 00 00
        01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
        00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);

###############################################################################
#
# Test 20 Integer between 1 and 10 (same as test 1)
#         + input title.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        input_title     => 'Input title January',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: with input title";
$target     = join " ",  qw(
        BE 01 3E 00 01 01 0C 00 13 00 00 49 6E 70 75 74
        20 74 69 74 6C 65 20 4A 61 6E 75 61 72 79 01 00
        00 00 01 00 00 00 01 00 00 00 03 00 00 00 1E 01
        00 03 00 00 00 1E 0A 00 01 00 04 00 04 00 01 00
        01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 21 Integer between 1 and 10 (same as test 1)
#         + input title.
#         + input message.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        input_title     => 'Input title January',
        input_message   => 'Input message February',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api:   + input message";
$target     = join " ",  qw(
        BE 01 53 00 01 01 0C 00 13 00 00 49 6E 70 75 74
        20 74 69 74 6C 65 20 4A 61 6E 75 61 72 79 01 00
        00 00 16 00 00 49 6E 70 75 74 20 6D 65 73 73 61
        67 65 20 46 65 62 72 75 61 72 79 01 00 00 00 03
        00 00 00 1E 01 00 03 00 00 00 1E 0A 00 01 00 04
        00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 22 Integer between 1 and 10 (same as test 1)
#         + input title.
#         + input message.
#         + error title.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        input_title     => 'Input title January',
        input_message   => 'Input message February',
        error_title     => 'Error title March',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api:   + error title";
$target     = join " ",  qw(
        BE 01 63 00 01 01 0C 00 13 00 00 49 6E 70 75 74
        20 74 69 74 6C 65 20 4A 61 6E 75 61 72 79 11 00
        00 45 72 72 6F 72 20 74 69 74 6C 65 20 4D 61 72
        63 68 16 00 00 49 6E 70 75 74 20 6D 65 73 73 61
        67 65 20 46 65 62 72 75 61 72 79 01 00 00 00 03
        00 00 00 1E 01 00 03 00 00 00 1E 0A 00 01 00 04
        00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 23 Integer between 1 and 10 (same as test 1)
#         + input title.
#         + input message.
#         + error title.
#         + error message.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        input_title     => 'Input title January',
        input_message   => 'Input message February',
        error_title     => 'Error title March',
        error_message   => 'Error message April',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api:   + error message";
$target     = join " ",  qw(
    BE 01 75 00 01 01 0C 00 13 00 00 49 6E 70 75 74
    20 74 69 74 6C 65 20 4A 61 6E 75 61 72 79 11 00
    00 45 72 72 6F 72 20 74 69 74 6C 65 20 4D 61 72
    63 68 16 00 00 49 6E 70 75 74 20 6D 65 73 73 61
    67 65 20 46 65 62 72 75 61 72 79 13 00 00 45 72
    72 6F 72 20 6D 65 73 73 61 67 65 20 41 70 72 69
    6C 03 00 00 00 1E 01 00 03 00 00 00 1E 0A 00 01
    00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 24 Integer between 1 and 10 (same as test 1)
#         + input title.
#         + input message.
#         + error title.
#         + error message.
#         - input message box.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate            => 'integer',
        criteria            => 'between',
        minimum             => 1,
        maximum             => 10,
        input_title         => 'Input title January',
        input_message       => 'Input message February',
        error_title         => 'Error title March',
        error_message       => 'Error message April',
        show_input          => 0,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: no input box";
$target     = join " ",  qw(
    BE 01 75 00 01 01 08 00 13 00 00 49 6E 70 75 74
    20 74 69 74 6C 65 20 4A 61 6E 75 61 72 79 11 00
    00 45 72 72 6F 72 20 74 69 74 6C 65 20 4D 61 72
    63 68 16 00 00 49 6E 70 75 74 20 6D 65 73 73 61
    67 65 20 46 65 62 72 75 61 72 79 13 00 00 45 72
    72 6F 72 20 6D 65 73 73 61 67 65 20 41 70 72 69
    6C 03 00 00 00 1E 01 00 03 00 00 00 1E 0A 00 01
    00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);

###############################################################################
#
# Test 25 Integer between 1 and 10 (same as test 1)
#         + input title.
#         + input message.
#         + error title.
#         + error message.
#         - input message box.
#         - error message box.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate            => 'integer',
        criteria            => 'between',
        minimum             => 1,
        maximum             => 10,
        input_title         => 'Input title January',
        input_message       => 'Input message February',
        error_title         => 'Error title March',
        error_message       => 'Error message April',
        show_input          => 0,
        show_error          => 0,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: no error box";
$target     = join " ",  qw(
    BE 01 75 00 01 01 00 00 13 00 00 49 6E 70 75 74
    20 74 69 74 6C 65 20 4A 61 6E 75 61 72 79 11 00
    00 45 72 72 6F 72 20 74 69 74 6C 65 20 4D 61 72
    63 68 16 00 00 49 6E 70 75 74 20 6D 65 73 73 61
    67 65 20 46 65 62 72 75 61 72 79 13 00 00 45 72
    72 6F 72 20 6D 65 73 73 61 67 65 20 41 70 72 69
    6C 03 00 00 00 1E 01 00 03 00 00 00 1E 0A 00 01
    00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 26 'Any' value shouldn't produce a DV record.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'any',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: any validation";
$target     = '';

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);

###############################################################################
#
# Test 27 Decimal = 1.2345
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'decimal',
        criteria        => '==',
        value         => 1.2345,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: decimal validation";
$target     = join " ",  qw(
    BE 01 2F 00 02 01 2C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 09 00 00 00 1F 8D 97 6E
    12 83 C0 F3 3F 00 00 00 00 01 00 04 00 04 00 01
    00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 28 List = a,bb,ccc
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'list',
        source          => ['a', 'bb', 'ccc'],
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: explicit list";
$target     = join " ",  qw(
    BE 01 31 00 83 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 0B 00 00 00 17 08 00 61
    00 62 62 00 63 63 63 00 00 00 00 01 00 04 00 04
    00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 29 List = a,bb,ccc, No dropdown
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'list',
        source          => ['a', 'bb', 'ccc'],
        dropdown        => 0,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: list with no dropdown";
$target     = join " ",  qw(
    BE 01 31 00 83 03 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 0B 00 00 00 17 08 00 61
    00 62 62 00 63 63 63 00 00 00 00 01 00 04 00 04
    00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 30 List = $D$1:$D$5
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('A1:A1',
    {
        validate        => 'list',
        source          => '=$D$1:$D$5',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: list with range";
$target     = join " ",  qw(
    BE 01 2F 00 03 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 09 00 00 00 25 00 00 04
    00 03 00 03 00 00 00 00 00 01 00 00 00 00 00 00
    00 00 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 31 Date = 39653 (2008-07-24)
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'date',
        criteria        => '==',
        value           => 39653,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: date";
$target     = join " ",  qw(
    BE 01 29 00 04 01 2C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E E5 9A 00
    00 00 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 32 Date = 2008-07-24T
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'date',
        criteria        => '==',
        value           => '2008-07-24T',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: date auto";
$target     = join " ",  qw(
    BE 01 29 00 04 01 2C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E E5 9A 00
    00 00 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 33 Date between ranges.
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'date',
        criteria        => 'between',
        minimum         => '2008-01-01T',
        maximum         => '2008-12-12T',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: date auto, between";
$target     = join " ",  qw(
    BE 01 2C 00 04 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 18 9A 03
    00 00 00 1E 72 9B 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 34 Time = 0.5 (12:00:00)
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5:B5',
    {
        validate        => 'time',
        criteria        => '==',
        value           => 0.5,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: time";
$target     = join " ",  qw(
    BE 01 2F 00 05 01 2C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 09 00 00 00 1F 00 00 00
    00 00 00 E0 3F 00 00 00 00 01 00 04 00 04 00 01
    00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 35 Time = T12:00:00
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'time',
        criteria        => '==',
        value           => 'T12:00:00',
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: time auto";
$target     = join " ",  qw(
    BE 01 2F 00 05 01 2C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 09 00 00 00 1F 00 00 00
    00 00 00 E0 3F 00 00 00 00 01 00 04 00 04 00 01
    00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 36 Custom == 10.
#
$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'Custom',
        criteria        => '==',
        value           => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: custom";
$target     = join " ",  qw(
    BE 01 29 00 07 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 0A 00 00
    00 00 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 37 Check the row/col processing: single A1 style cell.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 2C 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 38 Check the row/col processing: single A1 style range.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation('B5:B10',
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 2C 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 09 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 39 Check the row/col processing: single (row, col) style cell.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation(4, 1,
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 2C 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 04 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 40 Check the row/col processing: single (row, col) style range.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation(4, 1, 9, 1,
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 2C 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 01 00 04 00 09 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 41 Check the row/col processing: multiple (row, col) style cells.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation(4, 1,
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        other_cells     => [[4, 3, 4, 3]],
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 34 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 02 00 04 00 04 00 01 00 01 00
    04 00 04 00 03 00 03 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 42 Check the row/col processing: multiple (row, col) style cells.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation(4, 1,
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        other_cells     => [[6, 1, 6, 1], [8, 1, 8, 1]],
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 3C 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 03 00 04 00 04 00 01 00 01 00
    06 00 06 00 01 00 01 00 08 00 08 00 01 00 01 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Test 43 Check the row/col processing: multiple (row, col) style cells.
#

$worksheet->{_data}         = '';
$worksheet->{_validations}  = [];

$worksheet->data_validation(4, 1, 9, 1,
    {
        validate        => 'integer',
        criteria        => 'between',
        minimum         => 1,
        maximum         => 10,
        other_cells     => [[4, 3, 4, 3]],
    });

$worksheet->_store_validations();

$caption    = " \tData validation api: range options";
$target     = join " ",  qw(
    BE 01 34 00 01 01 0C 00 01 00 00 00 01 00 00 00
    01 00 00 00 01 00 00 00 03 00 00 00 1E 01 00 03
    00 00 00 1E 0A 00 02 00 04 00 09 00 01 00 01 00
    04 00 04 00 03 00 03 00
);

$result     = unpack_record($worksheet->{_data});
is($result, $target, $caption);


###############################################################################
#
# Unpack the binary data into a format suitable for printing in tests.
#
sub unpack_record {
    return join ' ', map {sprintf "%02X", $_} unpack "C*", $_[0];
}


# Cleanup
$workbook->close();
unlink $test_file;


__END__




Tool completed successfully