Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / tests / TSetTest.cpp
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #include "SkTSet.h"
9 #include "Test.h"
10
11 // Tests the SkTSet<T> class template.
12 // Functions that just call SkTDArray are not tested.
13
14 static void TestTSet_basic(skiatest::Reporter* reporter) {
15     SkTSet<int> set0;
16     REPORTER_ASSERT(reporter,  set0.isEmpty());
17     REPORTER_ASSERT(reporter, !set0.contains(-1));
18     REPORTER_ASSERT(reporter, !set0.contains(0));
19     REPORTER_ASSERT(reporter, !set0.contains(1));
20     REPORTER_ASSERT(reporter,  set0.count() == 0);
21
22     REPORTER_ASSERT(reporter,  set0.add(0));
23     REPORTER_ASSERT(reporter, !set0.isEmpty());
24     REPORTER_ASSERT(reporter, !set0.contains(-1));
25     REPORTER_ASSERT(reporter,  set0.contains(0));
26     REPORTER_ASSERT(reporter, !set0.contains(1));
27     REPORTER_ASSERT(reporter,  set0.count() == 1);
28     REPORTER_ASSERT(reporter, !set0.add(0));
29     REPORTER_ASSERT(reporter,  set0.count() == 1);
30
31 #ifdef SK_DEBUG
32     set0.validate();
33 #endif
34 }
35
36 #define COUNT 1732
37 #define PRIME1 10007
38 #define PRIME2 1733
39
40 // Generates a series of positive unique pseudo-random numbers.
41 static int f(int i) {
42     return (long(i) * PRIME1) % PRIME2;
43 }
44
45 // Will expose contains() too.
46 static void TestTSet_advanced(skiatest::Reporter* reporter) {
47     SkTSet<int> set0;
48
49     for (int i = 0; i < COUNT; i++) {
50         REPORTER_ASSERT(reporter, !set0.contains(f(i)));
51         if (i > 0) {
52             REPORTER_ASSERT(reporter,  set0.contains(f(0)));
53             REPORTER_ASSERT(reporter,  set0.contains(f(i / 2)));
54             REPORTER_ASSERT(reporter,  set0.contains(f(i - 1)));
55         }
56         REPORTER_ASSERT(reporter, !set0.contains(f(i)));
57         REPORTER_ASSERT(reporter,  set0.count() == i);
58         REPORTER_ASSERT(reporter,  set0.add(f(i)));
59         REPORTER_ASSERT(reporter,  set0.contains(f(i)));
60         REPORTER_ASSERT(reporter,  set0.count() == i + 1);
61         REPORTER_ASSERT(reporter, !set0.add(f(i)));
62     }
63
64     // Test deterministic output
65     for (int i = 0; i < COUNT; i++) {
66         REPORTER_ASSERT(reporter, set0[i] == f(i));
67     }
68
69     // Test copy constructor too.
70     SkTSet<int> set1 = set0;
71
72     REPORTER_ASSERT(reporter, set0.count() == set1.count());
73     REPORTER_ASSERT(reporter, !set1.contains(-1000));
74
75     for (int i = 0; i < COUNT; i++) {
76         REPORTER_ASSERT(reporter, set1.contains(f(i)));
77         REPORTER_ASSERT(reporter, set1[i] == f(i));
78     }
79
80     // Test operator= too.
81     SkTSet<int> set2;
82     set2 = set0;
83
84     REPORTER_ASSERT(reporter, set0.count() == set2.count());
85     REPORTER_ASSERT(reporter, !set2.contains(-1000));
86
87     for (int i = 0; i < COUNT; i++) {
88         REPORTER_ASSERT(reporter, set2.contains(f(i)));
89         REPORTER_ASSERT(reporter, set2[i] == f(i));
90     }
91
92 #ifdef SK_DEBUG
93     set0.validate();
94     set1.validate();
95     set2.validate();
96 #endif
97 }
98
99 static void TestTSet_merge(skiatest::Reporter* reporter) {
100     SkTSet<int> set;
101     SkTSet<int> setOdd;
102
103     for (int i = 0; i < COUNT; i++) {
104         REPORTER_ASSERT(reporter, set.add(2 * i));
105         REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1));
106     }
107     // mergeInto returns the number of duplicates. Expected 0.
108     REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0);
109     REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);
110
111     // mergeInto should now find all new numbers duplicate.
112     REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count());
113     REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);
114
115     for (int i = 0; i < 2 * COUNT; i++) {
116         REPORTER_ASSERT(reporter, set.contains(i));
117     }
118
119     // check deterministic output
120     for (int i = 0; i < COUNT; i++) {
121         REPORTER_ASSERT(reporter, set[i] == 2 * i);
122         REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1);
123     }
124
125 #ifdef SK_DEBUG
126     set.validate();
127     setOdd.validate();
128 #endif
129 }
130
131 DEF_TEST(TSet, reporter) {
132     TestTSet_basic(reporter);
133     TestTSet_advanced(reporter);
134     TestTSet_merge(reporter);
135 }