source: trunk/libtransmission/bitfield-test.c @ 14637

Last change on this file since 14637 was 14637, checked in by mikedld, 6 years ago

Fix bitfield bit removal, add more asserts, extend unit test

  • Property svn:keywords set to Date Rev Author Id
File size: 3.5 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 14637 2015-12-27 16:34:47Z 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
128int
129main (void)
130{
131  int l;
132  int ret;
133  const testFunc tests[] = { test_bitfields };
134
135  if ((ret = runTests (tests, NUM_TESTS (tests))))
136    return ret;
137
138  /* bitfield count range */
139  for (l=0; l<10000; ++l)
140    if ((ret = test_bitfield_count_range ()))
141      return ret;
142
143  return 0;
144}
Note: See TracBrowser for help on using the repository browser.