/*
* Copyright 2014 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkRandom.h"
#include "Test.h"
// This is a GPU-backend specific test
#if SK_SUPPORT_GPU
#include "GrOrderedSet.h"
typedef GrOrderedSet<int> Set;
typedef GrOrderedSet<const char*, GrStrLess> Set2;
DEF_TEST(GrOrderedSet, reporter) {
Set set;
REPORTER_ASSERT(reporter, set.empty());
SkRandom r;
int count[1000] = {0};
// add 10K ints
for (int i = 0; i < 10000; ++i) {
int x = r.nextU() % 1000;
Set::Iter xi = set.insert(x);
REPORTER_ASSERT(reporter, *xi == x);
REPORTER_ASSERT(reporter, !set.empty());
count[x] = 1;
}
set.insert(0);
count[0] = 1;
set.insert(999);
count[999] = 1;
int totalCount = 0;
for (int i = 0; i < 1000; ++i) {
totalCount += count[i];
}
REPORTER_ASSERT(reporter, *set.begin() == 0);
REPORTER_ASSERT(reporter, *set.last() == 999);
REPORTER_ASSERT(reporter, --(++set.begin()) == set.begin());
REPORTER_ASSERT(reporter, --set.end() == set.last());
REPORTER_ASSERT(reporter, set.count() == totalCount);
int c = 0;
// check that we iterate through the correct number of
// elements and they are properly sorted.
for (Set::Iter a = set.begin(); set.end() != a; ++a) {
Set::Iter b = a;
++b;
++c;
REPORTER_ASSERT(reporter, b == set.end() || *a <= *b);
}
REPORTER_ASSERT(reporter, c == set.count());
// check that the set finds all ints and only ints added to set
for (int i = 0; i < 1000; ++i) {
bool existsFind = set.find(i) != set.end();
bool existsCount = 0 != count[i];
REPORTER_ASSERT(reporter, existsFind == existsCount);
}
// remove all the ints between 100 and 200.
for (int i = 100; i < 200; ++i) {
set.remove(set.find(i));
if (1 == count[i]) {
count[i] = 0;
--totalCount;
}
REPORTER_ASSERT(reporter, set.count() == totalCount);
REPORTER_ASSERT(reporter, set.find(i) == set.end());
}
// remove the 0 entry. (tests removing begin())
REPORTER_ASSERT(reporter, *set.begin() == 0);
REPORTER_ASSERT(reporter, *(--set.end()) == 999);
set.remove(set.find(0));
count[0] = 0;
--totalCount;
REPORTER_ASSERT(reporter, set.count() == totalCount);
REPORTER_ASSERT(reporter, set.find(0) == set.end());
REPORTER_ASSERT(reporter, 0 < *set.begin());
// remove all the 999 entries (tests removing last()).
set.remove(set.find(999));
count[999] = 0;
--totalCount;
REPORTER_ASSERT(reporter, set.count() == totalCount);
REPORTER_ASSERT(reporter, set.find(999) == set.end());
REPORTER_ASSERT(reporter, 999 > *(--set.end()));
REPORTER_ASSERT(reporter, set.last() == --set.end());
// Make sure iteration still goes through correct number of entries
// and is still sorted correctly.
c = 0;
for (Set::Iter a = set.begin(); set.end() != a; ++a) {
Set::Iter b = a;
++b;
++c;
REPORTER_ASSERT(reporter, b == set.end() || *a <= *b);
}
REPORTER_ASSERT(reporter, c == set.count());
// repeat check that the set finds all ints and only ints added to set
for (int i = 0; i < 1000; ++i) {
bool existsFind = set.find(i) != set.end();
bool existsCount = 0 != count[i];
REPORTER_ASSERT(reporter, existsFind == existsCount);
}
// remove all entries
while (!set.empty()) {
set.remove(set.begin());
}
// test reset on empty set.
set.reset();
REPORTER_ASSERT(reporter, set.empty());
// test using c strings
const char* char1 = "dog";
const char* char2 = "cat";
const char* char3 = "dog";
Set2 set2;
set2.insert("ape");
set2.insert(char1);
set2.insert(char2);
set2.insert(char3);
set2.insert("ant");
set2.insert("cat");
REPORTER_ASSERT(reporter, set2.count() == 4);
REPORTER_ASSERT(reporter, set2.find("dog") == set2.last());
REPORTER_ASSERT(reporter, set2.find("cat") != set2.end());
REPORTER_ASSERT(reporter, set2.find("ant") == set2.begin());
REPORTER_ASSERT(reporter, set2.find("bug") == set2.end());
set2.remove(set2.find("ant"));
REPORTER_ASSERT(reporter, set2.find("ant") == set2.end());
REPORTER_ASSERT(reporter, set2.count() == 3);
set2.reset();
REPORTER_ASSERT(reporter, set2.empty());
}
#endif