1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkBitSet.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
13*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BitSet,reporter)14*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BitSet, reporter) {
15*c8dee2aaSAndroid Build Coastguard Worker SkBitSet set0(65536);
16*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.size() == 65536);
17*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(0) == false);
18*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(32767) == false);
19*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(65535) == false);
20*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !set0.findFirst());
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker set0.set(22);
23*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(22) == true);
24*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.findFirst());
25*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, *set0.findFirst() == 22);
26*c8dee2aaSAndroid Build Coastguard Worker set0.set(24);
27*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(24) == true);
28*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, *set0.findFirst() == 22);
29*c8dee2aaSAndroid Build Coastguard Worker set0.set(35); // on a different DWORD
30*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(35) == true);
31*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, *set0.findFirst() == 22);
32*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(24) == true);
33*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(35) == true);
34*c8dee2aaSAndroid Build Coastguard Worker set0.set(21);
35*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(21) == true);
36*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, *set0.findFirst() == 21);
37*c8dee2aaSAndroid Build Coastguard Worker set0.reset(21);
38*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(21) == false);
39*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, *set0.findFirst() == 22);
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker std::vector<unsigned int> data;
42*c8dee2aaSAndroid Build Coastguard Worker set0.forEachSetIndex([&data](unsigned v) { data.push_back(v); });
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, data.size() == 3);
45*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, data[0] == 22);
46*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, data[1] == 24);
47*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, data[2] == 35);
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker SkBitSet set1(65536);
50*c8dee2aaSAndroid Build Coastguard Worker set1.set(12345);
51*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(12345) == false);
52*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set1.test(12345) == true);
53*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set1.test(22) == false);
54*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(35) == true);
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker set0.reset();
57*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !set0.findFirst());
58*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(1234) == false);
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker set0.set();
61*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !set0.findFirstUnset());
62*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, set0.test(5678) == true);
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BitSetComparisonSizeMatching,reporter)65*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BitSetComparisonSizeMatching, reporter) {
66*c8dee2aaSAndroid Build Coastguard Worker // Verify that bitsets of differing sizes are never equal, even if the contents match.
67*c8dee2aaSAndroid Build Coastguard Worker SkBitSet bitsetA(123);
68*c8dee2aaSAndroid Build Coastguard Worker SkBitSet bitsetB(123);
69*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, bitsetA == bitsetB);
70*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !(bitsetA != bitsetB));
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker SkBitSet bitsetC(345);
73*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, bitsetA != bitsetC);
74*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !(bitsetA == bitsetC));
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker SkBitSet bitsetD(67);
77*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, bitsetA != bitsetD);
78*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !(bitsetA == bitsetD));
79*c8dee2aaSAndroid Build Coastguard Worker }
80*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BitSetComparisonBitMatching,reporter)81*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BitSetComparisonBitMatching, reporter) {
82*c8dee2aaSAndroid Build Coastguard Worker SkRandom random;
83*c8dee2aaSAndroid Build Coastguard Worker for (int trial = 0; trial < 500; ++trial) {
84*c8dee2aaSAndroid Build Coastguard Worker // Make two identical bitsets.
85*c8dee2aaSAndroid Build Coastguard Worker int size = random.nextRangeU(1, 1000);
86*c8dee2aaSAndroid Build Coastguard Worker SkBitSet bitsetA(size);
87*c8dee2aaSAndroid Build Coastguard Worker SkBitSet bitsetB(size);
88*c8dee2aaSAndroid Build Coastguard Worker
89*c8dee2aaSAndroid Build Coastguard Worker for (int index = 0; index < size; ++index) {
90*c8dee2aaSAndroid Build Coastguard Worker if (random.nextBool()) {
91*c8dee2aaSAndroid Build Coastguard Worker bitsetA.set(index);
92*c8dee2aaSAndroid Build Coastguard Worker bitsetB.set(index);
93*c8dee2aaSAndroid Build Coastguard Worker }
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker // Verify that the sets are equal.
97*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, bitsetA == bitsetB);
98*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !(bitsetA != bitsetB));
99*c8dee2aaSAndroid Build Coastguard Worker
100*c8dee2aaSAndroid Build Coastguard Worker // Flip some bits randomly. Always flip an odd number of bits to ensure that our random bit
101*c8dee2aaSAndroid Build Coastguard Worker // flips don't all cancel each other out.
102*c8dee2aaSAndroid Build Coastguard Worker int numBitsToFlip = random.nextULessThan(size) | 1;
103*c8dee2aaSAndroid Build Coastguard Worker for (int index = 0; index < numBitsToFlip; ++index) {
104*c8dee2aaSAndroid Build Coastguard Worker int bitToFlip = random.nextULessThan(size);
105*c8dee2aaSAndroid Build Coastguard Worker if (bitsetA.test(bitToFlip)) {
106*c8dee2aaSAndroid Build Coastguard Worker bitsetA.reset(bitToFlip);
107*c8dee2aaSAndroid Build Coastguard Worker } else {
108*c8dee2aaSAndroid Build Coastguard Worker bitsetA.set(bitToFlip);
109*c8dee2aaSAndroid Build Coastguard Worker }
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker
112*c8dee2aaSAndroid Build Coastguard Worker // Verify that the sets are no longer equal.
113*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, bitsetA != bitsetB);
114*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !(bitsetA == bitsetB));
115*c8dee2aaSAndroid Build Coastguard Worker }
116*c8dee2aaSAndroid Build Coastguard Worker }
117