#!/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__