################################################################################
#
# $Project: /Convert-Binary-C $
# $Author: mhx $
# $Date: 2011/04/10 12:32:26 +0200 $
# $Revision: 5 $
# $Source: /tests/240_offsetof.t $
#
################################################################################
#
# Copyright (c) 2002-2011 Marcus Holland-Moritz. All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
################################################################################
use Test::More tests => 377;
use Convert::Binary::C @ARGV;
my $c = new Convert::Binary::C IntSize => 4, CharSize => 1, Alignment => 1;
eval {
$c->parse(<<'ENDC');
struct normal {
int a;
char b[3];
char c[3][3][3];
};
struct flexible {
int a;
char b[];
};
ENDC
};
is($@, '', "parse C code");
my @tests = (
[ 'normal', 'a' => 0 ],
[ 'normal', 'b' => 4 ],
[ 'normal', 'b[0]' => 4 ],
[ 'normal', 'b[1]' => 5 ],
[ 'normal', 'b[2]' => 6 ],
[ 'normal', 'b[3]' => 7 ],
[ 'normal', 'b[4]' => 8 ],
[ 'normal', 'b[+4]' => 8 ],
[ 'normal', 'b[+1000000]' => 1000004 ],
[ 'normal', 'b[-0]' => 4 ],
[ 'normal', 'b[-1]' => 3 ],
[ 'normal', 'b[-2]' => 2 ],
[ 'normal', 'b[-3]' => 1 ],
[ 'normal', 'b[-4]' => 0 ],
[ 'normal', 'b[-5]' => -1 ],
[ 'normal', 'b[-1000000]' => -999996 ],
[ 'normal', 'c' => 7 ],
[ 'normal', 'c[0]' => 7 ],
[ 'normal', 'c[+1]' => 16 ],
[ 'normal', 'c[-1]' => -2 ],
[ 'normal', 'c[+100]' => 907 ],
[ 'normal', 'c[-100]' => -893 ],
[ 'normal', 'c[0][0]' => 7 ],
[ 'normal', 'c[0][+1]' => 10 ],
[ 'normal', 'c[0][-1]' => 4 ],
[ 'normal', 'c[0][+100]' => 307 ],
[ 'normal', 'c[0][-100]' => -293 ],
[ 'normal', 'c[+1][0]' => 16 ],
[ 'normal', 'c[+1][+1]' => 19 ],
[ 'normal', 'c[+1][-1]' => 13 ],
[ 'normal', 'c[+1][+100]' => 316 ],
[ 'normal', 'c[+1][-100]' => -284 ],
[ 'normal', 'c[-1][0]' => -2 ],
[ 'normal', 'c[-1][+1]' => 1 ],
[ 'normal', 'c[-1][-1]' => -5 ],
[ 'normal', 'c[-1][+100]' => 298 ],
[ 'normal', 'c[-1][-100]' => -302 ],
[ 'normal', 'c[+100][0]' => 907 ],
[ 'normal', 'c[+100][+1]' => 910 ],
[ 'normal', 'c[+100][-1]' => 904 ],
[ 'normal', 'c[+100][+100]' => 1207 ],
[ 'normal', 'c[+100][-100]' => 607 ],
[ 'normal', 'c[-100][0]' => -893 ],
[ 'normal', 'c[-100][+1]' => -890 ],
[ 'normal', 'c[-100][-1]' => -896 ],
[ 'normal', 'c[-100][+100]' => -593 ],
[ 'normal', 'c[-100][-100]' => -1193 ],
[ 'normal', 'c[0][0][0]' => 7 ],
[ 'normal', 'c[0][0][+1]' => 8 ],
[ 'normal', 'c[0][0][-1]' => 6 ],
[ 'normal', 'c[0][0][+100]' => 107 ],
[ 'normal', 'c[0][0][-100]' => -93 ],
[ 'normal', 'c[0][+1][0]' => 10 ],
[ 'normal', 'c[0][+1][+1]' => 11 ],
[ 'normal', 'c[0][+1][-1]' => 9 ],
[ 'normal', 'c[0][+1][+100]' => 110 ],
[ 'normal', 'c[0][+1][-100]' => -90 ],
[ 'normal', 'c[0][-1][0]' => 4 ],
[ 'normal', 'c[0][-1][+1]' => 5 ],
[ 'normal', 'c[0][-1][-1]' => 3 ],
[ 'normal', 'c[0][-1][+100]' => 104 ],
[ 'normal', 'c[0][-1][-100]' => -96 ],
[ 'normal', 'c[0][+100][0]' => 307 ],
[ 'normal', 'c[0][+100][+1]' => 308 ],
[ 'normal', 'c[0][+100][-1]' => 306 ],
[ 'normal', 'c[0][+100][+100]' => 407 ],
[ 'normal', 'c[0][+100][-100]' => 207 ],
[ 'normal', 'c[0][-100][0]' => -293 ],
[ 'normal', 'c[0][-100][+1]' => -292 ],
[ 'normal', 'c[0][-100][-1]' => -294 ],
[ 'normal', 'c[0][-100][+100]' => -193 ],
[ 'normal', 'c[0][-100][-100]' => -393 ],
[ 'normal', 'c[+1][0][0]' => 16 ],
[ 'normal', 'c[+1][0][+1]' => 17 ],
[ 'normal', 'c[+1][0][-1]' => 15 ],
[ 'normal', 'c[+1][0][+100]' => 116 ],
[ 'normal', 'c[+1][0][-100]' => -84 ],
[ 'normal', 'c[+1][+1][0]' => 19 ],
[ 'normal', 'c[+1][+1][+1]' => 20 ],
[ 'normal', 'c[+1][+1][-1]' => 18 ],
[ 'normal', 'c[+1][+1][+100]' => 119 ],
[ 'normal', 'c[+1][+1][-100]' => -81 ],
[ 'normal', 'c[+1][-1][0]' => 13 ],
[ 'normal', 'c[+1][-1][+1]' => 14 ],
[ 'normal', 'c[+1][-1][-1]' => 12 ],
[ 'normal', 'c[+1][-1][+100]' => 113 ],
[ 'normal', 'c[+1][-1][-100]' => -87 ],
[ 'normal', 'c[+1][+100][0]' => 316 ],
[ 'normal', 'c[+1][+100][+1]' => 317 ],
[ 'normal', 'c[+1][+100][-1]' => 315 ],
[ 'normal', 'c[+1][+100][+100]' => 416 ],
[ 'normal', 'c[+1][+100][-100]' => 216 ],
[ 'normal', 'c[+1][-100][0]' => -284 ],
[ 'normal', 'c[+1][-100][+1]' => -283 ],
[ 'normal', 'c[+1][-100][-1]' => -285 ],
[ 'normal', 'c[+1][-100][+100]' => -184 ],
[ 'normal', 'c[+1][-100][-100]' => -384 ],
[ 'normal', 'c[-1][0][0]' => -2 ],
[ 'normal', 'c[-1][0][+1]' => -1 ],
[ 'normal', 'c[-1][0][-1]' => -3 ],
[ 'normal', 'c[-1][0][+100]' => 98 ],
[ 'normal', 'c[-1][0][-100]' => -102 ],
[ 'normal', 'c[-1][+1][0]' => 1 ],
[ 'normal', 'c[-1][+1][+1]' => 2 ],
[ 'normal', 'c[-1][+1][-1]' => 0 ],
[ 'normal', 'c[-1][+1][+100]' => 101 ],
[ 'normal', 'c[-1][+1][-100]' => -99 ],
[ 'normal', 'c[-1][-1][0]' => -5 ],
[ 'normal', 'c[-1][-1][+1]' => -4 ],
[ 'normal', 'c[-1][-1][-1]' => -6 ],
[ 'normal', 'c[-1][-1][+100]' => 95 ],
[ 'normal', 'c[-1][-1][-100]' => -105 ],
[ 'normal', 'c[-1][+100][0]' => 298 ],
[ 'normal', 'c[-1][+100][+1]' => 299 ],
[ 'normal', 'c[-1][+100][-1]' => 297 ],
[ 'normal', 'c[-1][+100][+100]' => 398 ],
[ 'normal', 'c[-1][+100][-100]' => 198 ],
[ 'normal', 'c[-1][-100][0]' => -302 ],
[ 'normal', 'c[-1][-100][+1]' => -301 ],
[ 'normal', 'c[-1][-100][-1]' => -303 ],
[ 'normal', 'c[-1][-100][+100]' => -202 ],
[ 'normal', 'c[-1][-100][-100]' => -402 ],
[ 'normal', 'c[+100][0][0]' => 907 ],
[ 'normal', 'c[+100][0][+1]' => 908 ],
[ 'normal', 'c[+100][0][-1]' => 906 ],
[ 'normal', 'c[+100][0][+100]' => 1007 ],
[ 'normal', 'c[+100][0][-100]' => 807 ],
[ 'normal', 'c[+100][+1][0]' => 910 ],
[ 'normal', 'c[+100][+1][+1]' => 911 ],
[ 'normal', 'c[+100][+1][-1]' => 909 ],
[ 'normal', 'c[+100][+1][+100]' => 1010 ],
[ 'normal', 'c[+100][+1][-100]' => 810 ],
[ 'normal', 'c[+100][-1][0]' => 904 ],
[ 'normal', 'c[+100][-1][+1]' => 905 ],
[ 'normal', 'c[+100][-1][-1]' => 903 ],
[ 'normal', 'c[+100][-1][+100]' => 1004 ],
[ 'normal', 'c[+100][-1][-100]' => 804 ],
[ 'normal', 'c[+100][+100][0]' => 1207 ],
[ 'normal', 'c[+100][+100][+1]' => 1208 ],
[ 'normal', 'c[+100][+100][-1]' => 1206 ],
[ 'normal', 'c[+100][+100][+100]' => 1307 ],
[ 'normal', 'c[+100][+100][-100]' => 1107 ],
[ 'normal', 'c[+100][-100][0]' => 607 ],
[ 'normal', 'c[+100][-100][+1]' => 608 ],
[ 'normal', 'c[+100][-100][-1]' => 606 ],
[ 'normal', 'c[+100][-100][+100]' => 707 ],
[ 'normal', 'c[+100][-100][-100]' => 507 ],
[ 'normal', 'c[-100][0][0]' => -893 ],
[ 'normal', 'c[-100][0][+1]' => -892 ],
[ 'normal', 'c[-100][0][-1]' => -894 ],
[ 'normal', 'c[-100][0][+100]' => -793 ],
[ 'normal', 'c[-100][0][-100]' => -993 ],
[ 'normal', 'c[-100][+1][0]' => -890 ],
[ 'normal', 'c[-100][+1][+1]' => -889 ],
[ 'normal', 'c[-100][+1][-1]' => -891 ],
[ 'normal', 'c[-100][+1][+100]' => -790 ],
[ 'normal', 'c[-100][+1][-100]' => -990 ],
[ 'normal', 'c[-100][-1][0]' => -896 ],
[ 'normal', 'c[-100][-1][+1]' => -895 ],
[ 'normal', 'c[-100][-1][-1]' => -897 ],
[ 'normal', 'c[-100][-1][+100]' => -796 ],
[ 'normal', 'c[-100][-1][-100]' => -996 ],
[ 'normal', 'c[-100][+100][0]' => -593 ],
[ 'normal', 'c[-100][+100][+1]' => -592 ],
[ 'normal', 'c[-100][+100][-1]' => -594 ],
[ 'normal', 'c[-100][+100][+100]' => -493 ],
[ 'normal', 'c[-100][+100][-100]' => -693 ],
[ 'normal', 'c[-100][-100][0]' => -1193 ],
[ 'normal', 'c[-100][-100][+1]' => -1192 ],
[ 'normal', 'c[-100][-100][-1]' => -1194 ],
[ 'normal', 'c[-100][-100][+100]' => -1093 ],
[ 'normal', 'c[-100][-100][-100]' => -1293 ],
[ 'flexible', 'a' => 0 ],
[ 'flexible', 'b' => 4 ],
[ 'flexible', 'b[0]' => 4 ],
[ 'flexible', 'b[1]' => 5 ],
[ 'flexible', 'b[2]' => 6 ],
[ 'flexible', 'b[3]' => 7 ],
[ 'flexible', 'b[4]' => 8 ],
[ 'flexible', 'b[+4]' => 8 ],
[ 'flexible', 'b[+1000000]' => 1000004 ],
[ 'flexible', 'b[-0]' => 4 ],
[ 'flexible', 'b[-1]' => 3 ],
[ 'flexible', 'b[-2]' => 2 ],
[ 'flexible', 'b[-3]' => 1 ],
[ 'flexible', 'b[-4]' => 0 ],
[ 'flexible', 'b[-5]' => -1 ],
[ 'flexible', 'b[-1000000]' => -999996 ],
);
for my $t (@tests) {
my $offs = eval { $c->offsetof($t->[0], $t->[1]) };
is($@, '', "eval { offsetof($t->[0], $t->[1]) }");
is($offs, $t->[2], "offsetof($t->[0], $t->[1]) == $t->[2]");
}