|  | /* | 
|  | * 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 "SkTSet.h" | 
|  | #include "Test.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() 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 deterministic output | 
|  | for (int i = 0; i < COUNT; i++) { | 
|  | REPORTER_ASSERT(reporter, set0[i] == 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))); | 
|  | REPORTER_ASSERT(reporter, set1[i] == 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))); | 
|  | REPORTER_ASSERT(reporter, set2[i] == 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)); | 
|  | } | 
|  |  | 
|  | // check deterministic output | 
|  | for (int i = 0; i < COUNT; i++) { | 
|  | REPORTER_ASSERT(reporter, set[i] == 2 * i); | 
|  | REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1); | 
|  | } | 
|  |  | 
|  | #ifdef SK_DEBUG | 
|  | set.validate(); | 
|  | setOdd.validate(); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | DEF_TEST(TSet, reporter) { | 
|  | TestTSet_basic(reporter); | 
|  | TestTSet_advanced(reporter); | 
|  | TestTSet_merge(reporter); | 
|  | } |