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