File: 208_float.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 (82 lines) | stat: -rw-r--r-- 1,852 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
################################################################################
#
# $Project: /Convert-Binary-C $
# $Author: mhx $
# $Date: 2009/03/15 04:11:01 +0100 $
# $Revision: 16 $
# $Source: /tests/208_float.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 => 30 }

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

eval {
$p->parse(<<'EOF');
struct floating {
  struct {
    char   a;
    float  b;
    double c;
  }      a[4];
  float  b[4];
  double c[4];
};
EOF
};
ok($@,'',"parse() failed");

$data = {
  a => [
         { a => 42, b => -5.0    , c =>  4.2e33  },
         { a => 43, b =>  1.5    , c =>  3.14159 },
         { a => 44, b =>  3.14159, c =>  1.5     },
         { a => 45, b =>  4.2e33 , c => -5.0     },
       ],
  b => [-5.0, 1.5, 3.14159, 4.2e33],
  c => [-5.0, 1.5, 3.14159, 4.2e33],
};

$packed   = $p->pack( 'floating', $data );
$unpacked = $p->unpack( 'floating', $packed );

reccmp( $data, $unpacked );

sub reccmp
{
  my($ref, $val) = @_;

  my $id = ref $ref;

  unless( $id ) {
    # special treatment because floats can be inaccurate
    abs( ($ref - $val) / $ref ) < 1e-6 ? ok(1) : ok($val, $ref);
    return;
  }

  if( $id eq 'ARRAY' ) {
    ok( @$ref == @$val );
    for( 0..$#$ref ) {
      reccmp( $ref->[$_], $val->[$_] );
    }
  }
  elsif( $id eq 'HASH' ) {
    ok( @{[keys %$ref]} == @{[keys %$val]} );
    for( keys %$ref ) {
      reccmp( $ref->{$_}, $val->{$_} );
    }
  }
}