source: trunk/libtransmission/bitfield-test.c

Last change on this file was 14669, checked in by mikedld, 5 years ago

Add bitfield test for has all/none

  • Property svn:keywords set to Date Rev Author Id
File size: 4.9 KB
Line 
1/*
2 * This file Copyright (C) 2010-2014 Mnemosyne LLC
3 *
4 * It may be used under the GNU GPL versions 2 or 3
5 * or any future license endorsed by Mnemosyne LLC.
6 *
7 * $Id: bitfield-test.c 14669 2016-01-08 11:12:22Z mikedld $
8 */
9
10#include <string.h> /* strlen () */
11#include "transmission.h"
12#include "crypto-utils.h"
13#include "bitfield.h"
14#include "utils.h" /* tr_free */
15
16#include "libtransmission-test.h"
17
18static int
19test_bitfield_count_range (void)
20{
21  int i;
22  int n;
23  int begin;
24  int end;
25  int count1;
26  int count2;
27  const int bitCount = 100 + tr_rand_int_weak (1000);
28  tr_bitfield bf;
29
30  /* generate a random bitfield */
31  tr_bitfieldConstruct (&bf, bitCount);
32  for (i=0, n=tr_rand_int_weak (bitCount); i<n; ++i)
33    tr_bitfieldAdd (&bf, tr_rand_int_weak (bitCount));
34  begin = tr_rand_int_weak (bitCount);
35  do
36    end = tr_rand_int_weak (bitCount);
37  while (end == begin);
38
39  /* ensure end <= begin */
40  if (end < begin)
41    {
42      const int tmp = begin;
43      begin = end;
44      end = tmp;
45    }
46
47  /* test the bitfield */
48  count1 = 0;
49  for (i=begin; i<end; ++i)
50    if (tr_bitfieldHas (&bf, i))
51      ++count1;
52  count2 = tr_bitfieldCountRange (&bf, begin, end);
53  check (count1 == count2);
54
55  /* cleanup */
56  tr_bitfieldDestruct (&bf);
57  return 0;
58}
59
60static int
61test_bitfields (void)
62{
63  unsigned int i;
64  unsigned int bitcount = 500;
65  tr_bitfield field;
66
67  tr_bitfieldConstruct (&field, bitcount);
68
69  /* test tr_bitfieldAdd */
70  for (i=0; i<bitcount; i++)
71    if (! (i % 7))
72      tr_bitfieldAdd (&field, i);
73  for (i=0; i<bitcount; i++)
74    check (tr_bitfieldHas (&field, i) == (! (i % 7)));
75
76  /* test tr_bitfieldAddRange */
77  tr_bitfieldAddRange (&field, 0, bitcount);
78  for (i=0; i<bitcount; i++)
79    check (tr_bitfieldHas (&field, i));
80
81  /* test tr_bitfieldRem */
82  for (i=0; i<bitcount; i++)
83    if ((i % 7) != 0)
84      tr_bitfieldRem (&field, i);
85  for (i=0; i<bitcount; i++)
86    check (tr_bitfieldHas (&field, i) == (! (i % 7)));
87
88  /* test tr_bitfieldRemRange in the middle of a boundary */
89  tr_bitfieldAddRange (&field, 0, 64);
90  tr_bitfieldRemRange (&field, 4, 21);
91  for (i=0; i<64; i++)
92    check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 21)));
93
94  /* test tr_bitfieldRemRange on the boundaries */
95  tr_bitfieldAddRange (&field, 0, 64);
96  tr_bitfieldRemRange (&field, 8, 24);
97  for (i=0; i<64; i++)
98    check (tr_bitfieldHas (&field, i) == ((i < 8) || (i >= 24)));
99
100  /* test tr_bitfieldRemRange when begin & end is on the same word */
101  tr_bitfieldAddRange (&field, 0, 64);
102  tr_bitfieldRemRange (&field, 4, 5);
103  for (i=0; i<64; i++)
104    check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 5)));
105
106  /* test tr_bitfieldAddRange */
107  tr_bitfieldRemRange (&field, 0, 64);
108  tr_bitfieldAddRange (&field, 4, 21);
109  for (i=0; i<64; i++)
110    check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 21)));
111
112  /* test tr_bitfieldAddRange on the boundaries */
113  tr_bitfieldRemRange (&field, 0, 64);
114  tr_bitfieldAddRange (&field, 8, 24);
115  for (i=0; i<64; i++)
116    check (tr_bitfieldHas (&field, i) == ((8 <= i) && (i < 24)));
117
118  /* test tr_bitfieldAddRange when begin & end is on the same word */
119  tr_bitfieldRemRange (&field, 0, 64);
120  tr_bitfieldAddRange (&field, 4, 5);
121  for (i=0; i<64; i++)
122    check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 5)));
123
124  tr_bitfieldDestruct (&field);
125  return 0;
126}
127
128static int
129test_bitfield_has_all_none (void)
130{
131  tr_bitfield field;
132
133  tr_bitfieldConstruct (&field, 3);
134
135  check (!tr_bitfieldHasAll (&field));
136  check (tr_bitfieldHasNone (&field));
137
138  tr_bitfieldAdd (&field, 0);
139  check (!tr_bitfieldHasAll (&field));
140  check (!tr_bitfieldHasNone (&field));
141
142  tr_bitfieldRem (&field, 0);
143  tr_bitfieldAdd (&field, 1);
144  check (!tr_bitfieldHasAll (&field));
145  check (!tr_bitfieldHasNone (&field));
146
147  tr_bitfieldRem (&field, 1);
148  tr_bitfieldAdd (&field, 2);
149  check (!tr_bitfieldHasAll (&field));
150  check (!tr_bitfieldHasNone (&field));
151
152  tr_bitfieldAdd (&field, 0);
153  tr_bitfieldAdd (&field, 1);
154  check (tr_bitfieldHasAll (&field));
155  check (!tr_bitfieldHasNone (&field));
156
157  tr_bitfieldSetHasNone (&field);
158  check (!tr_bitfieldHasAll (&field));
159  check (tr_bitfieldHasNone (&field));
160
161  tr_bitfieldSetHasAll (&field);
162  check (tr_bitfieldHasAll (&field));
163  check (!tr_bitfieldHasNone (&field));
164
165  tr_bitfieldDestruct (&field);
166  tr_bitfieldConstruct (&field, 0);
167
168  check (!tr_bitfieldHasAll (&field));
169  check (!tr_bitfieldHasNone (&field));
170
171  tr_bitfieldSetHasNone (&field);
172  check (!tr_bitfieldHasAll (&field));
173  check (tr_bitfieldHasNone (&field));
174
175  tr_bitfieldSetHasAll (&field);
176  check (tr_bitfieldHasAll (&field));
177  check (!tr_bitfieldHasNone (&field));
178
179  tr_bitfieldDestruct (&field);
180  return 0;
181}
182
183int
184main (void)
185{
186  int l;
187  int ret;
188  const testFunc tests[] =
189    {
190      test_bitfields,
191      test_bitfield_has_all_none
192    };
193
194  if ((ret = runTests (tests, NUM_TESTS (tests))))
195    return ret;
196
197  /* bitfield count range */
198  for (l=0; l<10000; ++l)
199    if ((ret = test_bitfield_count_range ()))
200      return ret;
201
202  return 0;
203}
Note: See TracBrowser for help on using the repository browser.