1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/* 2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2012 Google Inc. 3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file. 6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "Test.h" 8096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkTSet.h" 9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Tests the SkTSet<T> class template. 11096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Functions that just call SkTDArray are not tested. 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet_basic(skiatest::Reporter* reporter) { 14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTSet<int> set0; 15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.isEmpty()); 16096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(-1)); 17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(0)); 18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(1)); 19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == 0); 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.add(0)); 22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.isEmpty()); 23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(-1)); 24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.contains(0)); 25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(1)); 26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == 1); 27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.add(0)); 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == 1); 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEBUG 31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger set0.validate(); 32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define COUNT 1732 36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define PRIME1 10007 37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define PRIME2 1733 38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Generates a series of positive unique pseudo-random numbers. 40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic int f(int i) { 41096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return (long(i) * PRIME1) % PRIME2; 42096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// Will expose contains() too. 45096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet_advanced(skiatest::Reporter* reporter) { 46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTSet<int> set0; 47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (int i = 0; i < COUNT; i++) { 49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(f(i))); 50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (i > 0) { 51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.contains(f(0))); 52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.contains(f(i / 2))); 53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.contains(f(i - 1))); 54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.contains(f(i))); 56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == i); 57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.add(f(i))); 58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.contains(f(i))); 59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == i + 1); 60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set0.add(f(i))); 61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 62096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger // Test deterministic output 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < COUNT; i++) { 6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger REPORTER_ASSERT(reporter, set0[i] == f(i)); 6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // Test copy constructor too. 69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTSet<int> set1 = set0; 70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == set1.count()); 72096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set1.contains(-1000)); 73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 74096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (int i = 0; i < COUNT; i++) { 75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set1.contains(f(i))); 7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger REPORTER_ASSERT(reporter, set1[i] == f(i)); 77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 78096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // Test operator= too. 80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTSet<int> set2; 81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger set2 = set0; 82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 83096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set0.count() == set2.count()); 84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, !set2.contains(-1000)); 85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (int i = 0; i < COUNT; i++) { 87096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set2.contains(f(i))); 8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger REPORTER_ASSERT(reporter, set2[i] == f(i)); 89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEBUG 92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger set0.validate(); 93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger set1.validate(); 94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger set2.validate(); 95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet_merge(skiatest::Reporter* reporter) { 99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTSet<int> set; 100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTSet<int> setOdd; 101096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (int i = 0; i < COUNT; i++) { 103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set.add(2 * i)); 104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1)); 105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // mergeInto returns the number of duplicates. Expected 0. 107096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0); 108096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set.count() == 2 * COUNT); 109096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger // mergeInto should now find all new numbers duplicate. 111096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count()); 112096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set.count() == 2 * COUNT); 113096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 114096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger for (int i = 0; i < 2 * COUNT; i++) { 115096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger REPORTER_ASSERT(reporter, set.contains(i)); 116096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 117096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger // check deterministic output 11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < COUNT; i++) { 12058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger REPORTER_ASSERT(reporter, set[i] == 2 * i); 12158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1); 12258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 124096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEBUG 125096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger set.validate(); 126096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger setOdd.validate(); 127096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 128096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 129096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 130096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic void TestTSet(skiatest::Reporter* reporter) { 131096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger TestTSet_basic(reporter); 132096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger TestTSet_advanced(reporter); 133096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger TestTSet_merge(reporter); 134096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 135096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 136096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "TestClassDef.h" 137096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerDEFINE_TESTCLASS("TSet", TSetTest, TestTSet) 138