source: trunk/libtransmission/utils-test.c @ 6522

Last change on this file since 6522 was 6522, checked in by charles, 13 years ago

(libT) add unit tests for tr_bitfieldAddRange()

File size: 3.3 KB
Line 
1#include <stdio.h> /* fprintf */
2#include <string.h> /* strcmp */
3#include "transmission.h"
4#include "utils.h"
5
6#define VERBOSE 0
7#define NUM_LOOPS 1
8#define SPEED_TEST 0
9
10#if SPEED_TEST
11#undef VERBOSE
12#define VERBOSE 0
13#undef NUM_LOOPS
14#define NUM_LOOPS 200
15#endif
16
17static int test = 0;
18
19#define check(A) { \
20    ++test; \
21    if (A) { \
22        if( VERBOSE ) \
23            fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
24    } else { \
25        fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
26        return test; \
27    } \
28}
29
30static int
31test_bitfields( void )
32{ 
33    int i;
34    int bitcount = 5000000;
35    tr_bitfield * field = tr_bitfieldNew( bitcount );
36
37    /* test tr_bitfieldAdd */
38    for( i=0; i<bitcount; ++i )
39        if( !( i % 7 ) )
40            tr_bitfieldAdd( field, i );
41    for( i=0; i<bitcount; ++i )
42        check( tr_bitfieldHas( field, i ) == (!(i%7)) );
43
44    /* test tr_bitfieldAddRange */
45    tr_bitfieldAddRange( field, 0, bitcount );
46    for( i=0; i<bitcount; ++i )
47        check( tr_bitfieldHas( field, i ) );
48
49    /* test tr_bitfieldRemRange in the middle of a boundary */
50    tr_bitfieldRemRange( field, 4, 21 );
51    for( i=0; i<64; ++i )
52        check( tr_bitfieldHas( field, i ) == ( ( i < 4 ) || ( i >= 21 ) ) );
53
54    /* test tr_bitfieldRemRange on the boundaries */
55    tr_bitfieldAddRange( field, 0, 64 );
56    tr_bitfieldRemRange( field, 8, 24 );
57    for( i=0; i<64; ++i )
58        check( tr_bitfieldHas( field, i ) == ( ( i < 8 ) || ( i >= 24 ) ) );
59
60    /* test tr_bitfieldRemRange when begin & end is on the same word */
61    tr_bitfieldAddRange( field, 0, 64 );
62    tr_bitfieldRemRange( field, 4, 5 );
63    for( i=0; i<64; ++i )
64        check( tr_bitfieldHas( field, i ) == ( ( i < 4 ) || ( i >= 5 ) ) );
65
66    /* test tr_bitfieldAddRange */
67    tr_bitfieldRemRange( field, 0, 64 );
68    tr_bitfieldAddRange( field, 4, 21 );
69    for( i=0; i<64; ++i )
70        check( tr_bitfieldHas( field, i ) == ( ( 4 <= i ) && ( i < 21 ) ) );
71
72    /* test tr_bitfieldAddRange on the boundaries */
73    tr_bitfieldRemRange( field, 0, 64 );
74    tr_bitfieldAddRange( field, 8, 24 );
75    for( i=0; i<64; ++i )
76        check( tr_bitfieldHas( field, i ) == ( ( 8 <= i ) && ( i < 24 ) ) );
77
78    /* test tr_bitfieldAddRange when begin & end is on the same word */
79    tr_bitfieldRemRange( field, 0, 64 );
80    tr_bitfieldAddRange( field, 4, 5 );
81    for( i=0; i<64; ++i )
82        check( tr_bitfieldHas( field, i ) == ( ( 4 <= i ) && ( i < 5 ) ) );
83
84    tr_bitfieldFree( field );
85    return 0;
86}
87
88int
89main( void )
90{
91    char *in, *out;
92    int len;
93    int i;
94    int l;
95
96    /* base64 */
97    in = "YOYO!";
98    out = tr_base64_encode( in, -1, &len );
99    check( out );
100    check( !strcmp( out, "WU9ZTyE=\n" ) );
101    check( len == 9 );
102    in = tr_base64_decode( out, -1, &len );
103    check( in );
104    check( !strcmp( in, "YOYO!" ) );
105    check( len == 5 );
106    tr_free( in );
107    tr_free( out );
108
109    /* tr_stringEndsWith */
110    check( tr_stringEndsWith( "the", "the" ) );
111    check( tr_stringEndsWith( "dress", "dress" ) );
112    check( tr_stringEndsWith( "address", "dress" ) );
113    check( !tr_stringEndsWith( "foo.bin", "gfoo.bin" ) );
114    check( !tr_stringEndsWith( "xyz", "xyw" ) );
115
116    /* simple bitfield tests */
117    for( l=0; l<NUM_LOOPS; ++l )
118        if(( i = test_bitfields( )))
119            return i;
120
121    return 0;
122}
Note: See TracBrowser for help on using the repository browser.