| /* | 
 |  * 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); | 
 | } |