Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2014 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 "SkRandom.h"
      9 #include "Test.h"
     10 // This is a GPU-backend specific test
     11 #if SK_SUPPORT_GPU
     12 #include "GrOrderedSet.h"
     13 
     14 typedef GrOrderedSet<int> Set;
     15 typedef GrOrderedSet<const char*, GrStrLess> Set2;
     16 
     17 DEF_TEST(GrOrderedSet, reporter) {
     18     Set set;
     19 
     20     REPORTER_ASSERT(reporter, set.empty());
     21 
     22     SkRandom r;
     23 
     24     int count[1000] = {0};
     25     // add 10K ints
     26     for (int i = 0; i < 10000; ++i) {
     27         int x = r.nextU() % 1000;
     28         Set::Iter xi = set.insert(x);
     29         REPORTER_ASSERT(reporter, *xi == x);
     30         REPORTER_ASSERT(reporter, !set.empty());
     31         count[x] = 1;
     32     }
     33     set.insert(0);
     34     count[0] = 1;
     35     set.insert(999);
     36     count[999] = 1;
     37     int totalCount = 0;
     38     for (int i = 0; i < 1000; ++i) {
     39         totalCount += count[i];
     40     }
     41     REPORTER_ASSERT(reporter, *set.begin() == 0);
     42     REPORTER_ASSERT(reporter, *set.last() == 999);
     43     REPORTER_ASSERT(reporter, --(++set.begin()) == set.begin());
     44     REPORTER_ASSERT(reporter, --set.end() == set.last());
     45     REPORTER_ASSERT(reporter, set.count() == totalCount);
     46 
     47     int c = 0;
     48     // check that we iterate through the correct number of
     49     // elements and they are properly sorted.
     50     for (Set::Iter a = set.begin(); set.end() != a; ++a) {
     51         Set::Iter b = a;
     52         ++b;
     53         ++c;
     54         REPORTER_ASSERT(reporter, b == set.end() || *a <= *b);
     55     }
     56     REPORTER_ASSERT(reporter, c == set.count());
     57 
     58     // check that the set finds all ints and only ints added to set
     59     for (int i = 0; i < 1000; ++i) {
     60         bool existsFind = set.find(i) != set.end();
     61         bool existsCount = 0 != count[i];
     62         REPORTER_ASSERT(reporter, existsFind == existsCount);
     63     }
     64     // remove all the ints between 100 and 200.
     65     for (int i = 100; i < 200; ++i) {
     66         set.remove(set.find(i));
     67         if (1 == count[i]) {
     68             count[i] = 0;
     69             --totalCount;
     70         }
     71         REPORTER_ASSERT(reporter, set.count() == totalCount);
     72         REPORTER_ASSERT(reporter, set.find(i) == set.end());
     73     }
     74     // remove the 0 entry. (tests removing begin())
     75     REPORTER_ASSERT(reporter, *set.begin() == 0);
     76     REPORTER_ASSERT(reporter, *(--set.end()) == 999);
     77     set.remove(set.find(0));
     78     count[0] = 0;
     79     --totalCount;
     80     REPORTER_ASSERT(reporter, set.count() == totalCount);
     81     REPORTER_ASSERT(reporter, set.find(0) == set.end());
     82     REPORTER_ASSERT(reporter, 0 < *set.begin());
     83 
     84     // remove all the 999 entries (tests removing last()).
     85     set.remove(set.find(999));
     86     count[999] = 0;
     87     --totalCount;
     88     REPORTER_ASSERT(reporter, set.count() == totalCount);
     89     REPORTER_ASSERT(reporter, set.find(999) == set.end());
     90     REPORTER_ASSERT(reporter, 999 > *(--set.end()));
     91     REPORTER_ASSERT(reporter, set.last() == --set.end());
     92 
     93     // Make sure iteration still goes through correct number of entries
     94     // and is still sorted correctly.
     95     c = 0;
     96     for (Set::Iter a = set.begin(); set.end() != a; ++a) {
     97         Set::Iter b = a;
     98         ++b;
     99         ++c;
    100         REPORTER_ASSERT(reporter, b == set.end() || *a <= *b);
    101     }
    102     REPORTER_ASSERT(reporter, c == set.count());
    103 
    104     // repeat check that the set finds all ints and only ints added to set
    105     for (int i = 0; i < 1000; ++i) {
    106         bool existsFind = set.find(i) != set.end();
    107         bool existsCount = 0 != count[i];
    108         REPORTER_ASSERT(reporter, existsFind == existsCount);
    109     }
    110 
    111     // remove all entries
    112     while (!set.empty()) {
    113         set.remove(set.begin());
    114     }
    115 
    116     // test reset on empty set.
    117     set.reset();
    118     REPORTER_ASSERT(reporter, set.empty());
    119 
    120 
    121     // test using c strings
    122     const char* char1 = "dog";
    123     const char* char2 = "cat";
    124     const char* char3 = "dog";
    125 
    126     Set2 set2;
    127 
    128     set2.insert("ape");
    129     set2.insert(char1);
    130     set2.insert(char2);
    131     set2.insert(char3);
    132     set2.insert("ant");
    133     set2.insert("cat");
    134 
    135     REPORTER_ASSERT(reporter, set2.count() == 4);
    136     REPORTER_ASSERT(reporter, set2.find("dog") == set2.last());
    137     REPORTER_ASSERT(reporter, set2.find("cat") != set2.end());
    138     REPORTER_ASSERT(reporter, set2.find("ant") == set2.begin());
    139     REPORTER_ASSERT(reporter, set2.find("bug") == set2.end());
    140 
    141     set2.remove(set2.find("ant"));
    142     REPORTER_ASSERT(reporter, set2.find("ant") == set2.end());
    143     REPORTER_ASSERT(reporter, set2.count() == 3);
    144 
    145     set2.reset();
    146     REPORTER_ASSERT(reporter, set2.empty());
    147 }
    148 
    149 #endif
    150