1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/*
2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2012 Google Inc.
3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file.
6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */
7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "Test.h"
8096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkTSet.h"
9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Tests the SkTSet<T> class template.
11096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Functions that just call SkTDArray are not tested.
12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet_basic(skiatest::Reporter* reporter) {
14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkTSet<int> set0;
15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter,  set0.isEmpty());
16096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.contains(-1));
17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.contains(0));
18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.contains(1));
19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter,  set0.count() == 0);
20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter,  set0.add(0));
22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.isEmpty());
23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.contains(-1));
24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter,  set0.contains(0));
25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.contains(1));
26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter,  set0.count() == 1);
27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set0.add(0));
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter,  set0.count() == 1);
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEBUG
31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    set0.validate();
32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif
33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}
34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define COUNT 1732
36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define PRIME1 10007
37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define PRIME2 1733
38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Generates a series of positive unique pseudo-random numbers.
40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic int f(int i) {
41096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    return (long(i) * PRIME1) % PRIME2;
42096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}
43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// Will expose contains() too.
45096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet_advanced(skiatest::Reporter* reporter) {
46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkTSet<int> set0;
47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    for (int i = 0; i < COUNT; i++) {
49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, !set0.contains(f(i)));
50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (i > 0) {
51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            REPORTER_ASSERT(reporter,  set0.contains(f(0)));
52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            REPORTER_ASSERT(reporter,  set0.contains(f(i / 2)));
53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            REPORTER_ASSERT(reporter,  set0.contains(f(i - 1)));
54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, !set0.contains(f(i)));
56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter,  set0.count() == i);
57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter,  set0.add(f(i)));
58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter,  set0.contains(f(i)));
59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter,  set0.count() == i + 1);
60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, !set0.add(f(i)));
61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
62096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // Test deterministic output
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    for (int i = 0; i < COUNT; i++) {
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        REPORTER_ASSERT(reporter, set0[i] == f(i));
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // Test copy constructor too.
69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkTSet<int> set1 = set0;
70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, set0.count() == set1.count());
72096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set1.contains(-1000));
73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
74096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    for (int i = 0; i < COUNT; i++) {
75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, set1.contains(f(i)));
7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        REPORTER_ASSERT(reporter, set1[i] == f(i));
77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
78096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // Test operator= too.
80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkTSet<int> set2;
81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    set2 = set0;
82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
83096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, set0.count() == set2.count());
84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, !set2.contains(-1000));
85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    for (int i = 0; i < COUNT; i++) {
87096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, set2.contains(f(i)));
8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        REPORTER_ASSERT(reporter, set2[i] == f(i));
89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEBUG
92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    set0.validate();
93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    set1.validate();
94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    set2.validate();
95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif
96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}
97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet_merge(skiatest::Reporter* reporter) {
99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkTSet<int> set;
100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkTSet<int> setOdd;
101096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    for (int i = 0; i < COUNT; i++) {
103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, set.add(2 * i));
104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1));
105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // mergeInto returns the number of duplicates. Expected 0.
107096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0);
108096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);
109096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // mergeInto should now find all new numbers duplicate.
111096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count());
112096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);
113096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
114096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    for (int i = 0; i < 2 * COUNT; i++) {
115096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        REPORTER_ASSERT(reporter, set.contains(i));
116096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
117096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // check deterministic output
11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    for (int i = 0; i < COUNT; i++) {
12058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        REPORTER_ASSERT(reporter, set[i] == 2 * i);
12158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1);
12258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
124096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEBUG
125096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    set.validate();
126096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    setOdd.validate();
127096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif
128096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}
129096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
130096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet(skiatest::Reporter* reporter) {
131096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    TestTSet_basic(reporter);
132096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    TestTSet_advanced(reporter);
133096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    TestTSet_merge(reporter);
134096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}
135096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
136096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "TestClassDef.h"
137096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_TESTCLASS("TSet", TSetTest, TestTSet)
138