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::ParseExcel.
#
# Tests for RK number decoding.
#
# reverse('©'), August 2009, John McNamara, jmcnamara@cpan.org
#

use strict;

use Spreadsheet::ParseExcel;
use Test::More tests => 184;

###############################################################################
#
# The RK numbers and decoded values were extracted from Excel workboooks.
#
my @testcases = (


    # RK Number   Decoded number

    # Test cases from examples in the MS docs.
    [ 0x3FF00000,            1 ],
    [ 0x405EC001,         1.23 ],
    [ 0x02F1853A,     12345678 ],
    [ 0x02F1853B,    123456.78 ],
    [ 0xBFF00000,           -1 ],
    [ 0xC05EC001,        -1.23 ],
    [ 0xFD0E7ACA,    -12345678 ],
    [ 0xFD0E7ACB,   -123456.78 ],

    # Some simple user generated cases.
    [ 0x3FF00000,            1 ],
    [ 0x40000000,            2 ],
    [ 0x40080000,            3 ],
    [ 0x40100000,            4 ],
    [ 0x40140000,            5 ],
    [ 0x40180000,            6 ],
    [ 0x401C0000,            7 ],
    [ 0x40200000,            8 ],
    [ 0x40220000,            9 ],
    [ 0x40240001,          0.1 ],
    [ 0x40340001,          0.2 ],
    [ 0x403E0001,          0.3 ],
    [ 0x40440001,          0.4 ],
    [ 0x3FE00000,          0.5 ],
    [ 0x404E0001,          0.6 ],
    [ 0x40518001,          0.7 ],
    [ 0x40540001,          0.8 ],
    [ 0x40568001,          0.9 ],
    [ 0x3FF00001,         0.01 ],
    [ 0x40000001,         0.02 ],
    [ 0x40080001,         0.03 ],
    [ 0x40100001,         0.04 ],
    [ 0x40140001,         0.05 ],
    [ 0x40180001,         0.06 ],
    [ 0x401C0001,         0.07 ],
    [ 0x40200001,         0.08 ],
    [ 0x40220001,         0.09 ],
    [ 0x3FE00001,        0.005 ],
    [ 0xBFF00000,           -1 ],
    [ 0xC0000000,           -2 ],
    [ 0xC0080000,           -3 ],
    [ 0xC0100000,           -4 ],
    [ 0xC0140000,           -5 ],
    [ 0xC0180000,           -6 ],
    [ 0xC01C0000,           -7 ],
    [ 0xC0200000,           -8 ],
    [ 0xC0220000,           -9 ],
    [ 0xC0240001,         -0.1 ],
    [ 0xC0340001,         -0.2 ],
    [ 0xC03E0001,         -0.3 ],
    [ 0xC0440001,         -0.4 ],
    [ 0xBFE00000,         -0.5 ],
    [ 0xC04E0001,         -0.6 ],
    [ 0xC0518001,         -0.7 ],
    [ 0xC0540001,         -0.8 ],
    [ 0xC0568001,         -0.9 ],
    [ 0xBFF00001,        -0.01 ],
    [ 0xC0000001,        -0.02 ],
    [ 0xC0080001,        -0.03 ],
    [ 0xC0100001,        -0.04 ],
    [ 0xC0140001,        -0.05 ],
    [ 0xC0180001,        -0.06 ],
    [ 0xC01C0001,        -0.07 ],
    [ 0xC0200001,        -0.08 ],
    [ 0xC0220001,        -0.09 ],
    [ 0xBFE00001,       -0.005 ],

    # Testcases generated from single bit RK numbers.
    [ 0x3FF00001,         0.01 ],
    [ 0x40000001,         0.02 ],
    [ 0x40100001,         0.04 ],
    [ 0x40200001,         0.08 ],
    [ 0x40300001,         0.16 ],
    [ 0x40400001,         0.32 ],
    [ 0x40500001,         0.64 ],
    [ 0x3FF00000,            1 ],
    [ 0x40600001,         1.28 ],
    [ 0x40000000,            2 ],
    [ 0x40700001,         2.56 ],
    [ 0x40100000,            4 ],
    [ 0x40800001,         5.12 ],
    [ 0x40200000,            8 ],
    [ 0x40900001,        10.24 ],
    [ 0x40300000,           16 ],
    [ 0x40A00001,        20.48 ],
    [ 0x40400000,           32 ],
    [ 0x40B00001,        40.96 ],
    [ 0x40500000,           64 ],
    [ 0x40C00001,        81.92 ],
    [ 0x40600000,          128 ],
    [ 0x40D00001,       163.84 ],
    [ 0x40700000,          256 ],
    [ 0x40E00001,       327.68 ],
    [ 0x40800000,          512 ],
    [ 0x40F00001,       655.36 ],
    [ 0x40900000,         1024 ],
    [ 0x41000001,      1310.72 ],
    [ 0x40A00000,         2048 ],
    [ 0x41100001,      2621.44 ],
    [ 0x40B00000,         4096 ],
    [ 0x41200001,      5242.88 ],
    [ 0x40C00000,         8192 ],
    [ 0x41300001,     10485.76 ],
    [ 0x40D00000,        16384 ],
    [ 0x41400001,     20971.52 ],
    [ 0x40E00000,        32768 ],
    [ 0x41500001,     41943.04 ],
    [ 0x40F00000,        65536 ],
    [ 0x41600001,     83886.08 ],
    [ 0x41000000,       131072 ],
    [ 0x41700001,    167772.16 ],
    [ 0x41100000,       262144 ],
    [ 0x41800001,    335544.32 ],
    [ 0x41200000,       524288 ],
    [ 0x41900001,    671088.64 ],
    [ 0x41300000,      1048576 ],
    [ 0x41A00001,   1342177.28 ],
    [ 0x41400000,      2097152 ],
    [ 0x41B00001,   2684354.56 ],
    [ 0x41500000,      4194304 ],
    [ 0x41600000,      8388608 ],
    [ 0x41700000,     16777216 ],
    [ 0x41800000,     33554432 ],
    [ 0x41900000,     67108864 ],
    [ 0x41A00000,    134217728 ],
    [ 0x41B00000,    268435456 ],
    [ 0xC0000001,        -0.02 ],
    [ 0xC0000000,           -2 ],
    [ 0xC1B00001,  -2684354.56 ],
    [ 0xC1B80001,  -4026531.84 ],
    [ 0xC1BC0001,  -4697620.48 ],
    [ 0xC1BE0001,   -5033164.8 ],
    [ 0xC1BF0001,  -5200936.96 ],
    [ 0xC1BF8001,  -5284823.04 ],
    [ 0xC1BFC001,  -5326766.08 ],
    [ 0xC1BFE001,   -5347737.6 ],
    [ 0xC1BFF001,  -5358223.36 ],
    [ 0xC1BFF801,  -5363466.24 ],
    [ 0xC1BFFC01,  -5366087.68 ],
    [ 0xC1BFFE01,   -5367398.4 ],
    [ 0xC1BFFF01,  -5368053.76 ],
    [ 0xC1BFFF81,  -5368381.44 ],
    [ 0xC1BFFFC1,  -5368545.28 ],
    [ 0xC1BFFFE1,   -5368627.2 ],
    [ 0xC1BFFFF1,  -5368668.16 ],
    [ 0xC1BFFFF9,  -5368688.64 ],
    [ 0xC1BFFFFD,  -5368698.88 ],
    [ 0xC1547AE0,     -5368704 ],
    [ 0x80000403,  -5368706.56 ],
    [ 0x80000203,  -5368707.84 ],
    [ 0x80000103,  -5368708.48 ],
    [ 0x80000083,   -5368708.8 ],
    [ 0x80000043,  -5368708.96 ],
    [ 0x80000023,  -5368709.04 ],
    [ 0x80000013,  -5368709.08 ],
    [ 0x8000000B,   -5368709.1 ],
    [ 0x80000007,  -5368709.11 ],
    [ 0xC1B00000,   -268435456 ],
    [ 0xC1B80000,   -402653184 ],
    [ 0xC1BC0000,   -469762048 ],
    [ 0xC1BE0000,   -503316480 ],
    [ 0xC1BF0000,   -520093696 ],
    [ 0xC1BF8000,   -528482304 ],
    [ 0xC1BFC000,   -532676608 ],
    [ 0xC1BFE000,   -534773760 ],
    [ 0xC1BFF000,   -535822336 ],
    [ 0xC1BFF800,   -536346624 ],
    [ 0xC1BFFC00,   -536608768 ],
    [ 0xC1BFFE00,   -536739840 ],
    [ 0xC1BFFF00,   -536805376 ],
    [ 0xC1BFFF80,   -536838144 ],
    [ 0xC1BFFFC0,   -536854528 ],
    [ 0xC1BFFFE0,   -536862720 ],
    [ 0xC1BFFFF0,   -536866816 ],
    [ 0xC1BFFFF8,   -536868864 ],
    [ 0xC1BFFFFC,   -536869888 ],
    [ 0x80000802,   -536870400 ],
    [ 0x80000402,   -536870656 ],
    [ 0x80000202,   -536870784 ],
    [ 0x80000102,   -536870848 ],
    [ 0x80000082,   -536870880 ],
    [ 0x80000042,   -536870896 ],
    [ 0x80000022,   -536870904 ],
    [ 0x80000012,   -536870908 ],
    [ 0x8000000A,   -536870910 ],
    [ 0x80000006,   -536870911 ],

    # Some Max RK type 2 ints.
    [ 0x7FFFFFFE,    536870911 ],
    [ 0x80000006,   -536870911 ],

);

###############################################################################
#
# Run tests.
#

my $parser   = Spreadsheet::ParseExcel->new();

for my $test_ref (@testcases) {

    my $rk_number   = $test_ref->[0];
    my $expected    = $test_ref->[1];
    my $got         = Spreadsheet::ParseExcel::_decode_rk_number($rk_number);

    is( $got, $expected);
}



__END__