File: 237_parser.t

package info (click to toggle)
libconvert-binary-c-perl 0.74-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 9,100 kB
  • ctags: 21,416
  • sloc: ansic: 63,666; perl: 18,582; yacc: 2,143; makefile: 44
file content (96 lines) | stat: -rw-r--r-- 2,069 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
################################################################################
#
# $Project: /Convert-Binary-C $
# $Author: mhx $
# $Date: 2009/03/15 04:10:55 +0100 $
# $Revision: 9 $
# $Source: /tests/237_parser.t $
#
################################################################################
#
# Copyright (c) 2002-2009 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;
use Convert::Binary::C @ARGV;

$^W = 1;

BEGIN { plan tests => 18 }

my $c = eval { new Convert::Binary::C };
ok($@,'',"failed to create Convert::Binary::C object");

$c->PointerSize(4)->IntSize(2)->CharSize(1);

@test = (
  [ 'const volatile' => $c->IntSize ],
  [ 'volatile [3]'   => 3 * $c->IntSize ],
  [ 'restrict *'     => $c->PointerSize ],
);

for my $t (@test) {
  eval { $c->clean->parse("typedef char array[sizeof($t->[0])];") };
  ok($@, '');
  ok($c->sizeof('array'), $t->[1]);
}

# bitfield size tests

@test = (
  [ 'int :-1'   => qr/negative width for bit-field/ ],
  [ 'int :0'    => '' ],
  [ 'int :1'    => '' ],
  [ 'int bf:-1' => qr/negative width for bit-field 'bf'/ ],
  [ 'int bf:0'  => qr/zero width for bit-field 'bf'/ ],
  [ 'int bf:1'  => '' ],
);

for my $t (@test) {
  eval { $c->clean->parse("struct bitfield { $t->[0]; };") };
  ok($@, $t->[1]);
}

# short-circuiting test
# XXX: this doesn't mean we're really short-circuiting, only
#      that we're cheating good enough ;-)

@test = (
  [ '1 || (1 / 0) ? 2 : 3' => 2 ],
  [ '0 && (1 / 0) ? 2 : 3' => 3 ],
);

for my $t (@test) {
  eval { $c->clean->parse("typedef char array[$t->[0]];") };
  ok($@, '');
  ok($c->sizeof('array'), $t->[1]);
}

# TODO: operator precedence tests

# TODO: array size tests



# test typedef behaviour

eval { $c->clean->parse(<<ENDC) };

typedef int T;

typedef struct T
{
  T T[sizeof(T)];
  T x : 10;
  T   :  1;
  T y :  1;
  T   :  0;
  int z;
} TT;

ENDC

ok($@, '');