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