aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/TSetTest.cpp
blob: 1cb9056a615658c395ce87be3d3a37c7b23ee8b1 (plain)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "Test.h"
#include "SkTSet.h"

// Tests the SkTSet<T> class template.
// Functions that just call SkTDArray are not tested.

static void TestTSet_basic(skiatest::Reporter* reporter) {
    SkTSet<int> set0;
    REPORTER_ASSERT(reporter,  set0.isEmpty());
    REPORTER_ASSERT(reporter, !set0.contains(-1));
    REPORTER_ASSERT(reporter, !set0.contains(0));
    REPORTER_ASSERT(reporter, !set0.contains(1));
    REPORTER_ASSERT(reporter,  set0.count() == 0);

    REPORTER_ASSERT(reporter,  set0.add(0));
    REPORTER_ASSERT(reporter, !set0.isEmpty());
    REPORTER_ASSERT(reporter, !set0.contains(-1));
    REPORTER_ASSERT(reporter,  set0.contains(0));
    REPORTER_ASSERT(reporter, !set0.contains(1));
    REPORTER_ASSERT(reporter,  set0.count() == 1);
    REPORTER_ASSERT(reporter, !set0.add(0));
    REPORTER_ASSERT(reporter,  set0.count() == 1);

#ifdef SK_DEBUG
    set0.validate();
#endif
}

#define COUNT 1732
#define PRIME1 10007
#define PRIME2 1733

// Generates a series of positive unique pseudo-random numbers.
static int f(int i) {
    return (long(i) * PRIME1) % PRIME2;
}

// Will expose contains() and find() too.
static void TestTSet_advanced(skiatest::Reporter* reporter) {
    SkTSet<int> set0;

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, !set0.contains(f(i)));
        if (i > 0) {
            REPORTER_ASSERT(reporter,  set0.contains(f(0)));
            REPORTER_ASSERT(reporter,  set0.contains(f(i / 2)));
            REPORTER_ASSERT(reporter,  set0.contains(f(i - 1)));
        }
        REPORTER_ASSERT(reporter, !set0.contains(f(i)));
        REPORTER_ASSERT(reporter,  set0.count() == i);
        REPORTER_ASSERT(reporter,  set0.add(f(i)));
        REPORTER_ASSERT(reporter,  set0.contains(f(i)));
        REPORTER_ASSERT(reporter,  set0.count() == i + 1);
        REPORTER_ASSERT(reporter, !set0.add(f(i)));
    }

    // Test copy constructor too.
    SkTSet<int> set1 = set0;

    REPORTER_ASSERT(reporter, set0.count() == set1.count());
    REPORTER_ASSERT(reporter, !set1.contains(-1000));

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set1.contains(f(i)));
    }

    // Test operator= too.
    SkTSet<int> set2;
    set2 = set0;

    REPORTER_ASSERT(reporter, set0.count() == set2.count());
    REPORTER_ASSERT(reporter, !set2.contains(-1000));

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set2.contains(f(i)));
    }

#ifdef SK_DEBUG
    set0.validate();
    set1.validate();
    set2.validate();
#endif
}

static void TestTSet_merge(skiatest::Reporter* reporter) {
    SkTSet<int> set;
    SkTSet<int> setOdd;

    for (int i = 0; i < COUNT; i++) {
        REPORTER_ASSERT(reporter, set.add(2 * i));
        REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1));
    }
    // mergeInto returns the number of duplicates. Expected 0.
    REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0);
    REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);

    // mergeInto should now find all new numbers duplicate.
    REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count());
    REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);

    for (int i = 0; i < 2 * COUNT; i++) {
        REPORTER_ASSERT(reporter, set.contains(i));
    }

#ifdef SK_DEBUG
    set.validate();
    setOdd.validate();
#endif
}

static void TestTSet(skiatest::Reporter* reporter) {
    TestTSet_basic(reporter);
    TestTSet_advanced(reporter);
    TestTSet_merge(reporter);
}

#include "TestClassDef.h"
DEFINE_TESTCLASS("TSet", TSetTest, TestTSet)