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 "SkTArray.h" 9 #include "Test.h" 10 11 // Tests the SkTArray<T> class template. 12 13 template <bool MEM_COPY> 14 static void TestTSet_basic(skiatest::Reporter* reporter) { 15 SkTArray<int, MEM_COPY> a; 16 17 // Starts empty. 18 REPORTER_ASSERT(reporter, a.empty()); 19 REPORTER_ASSERT(reporter, a.count() == 0); 20 21 // { }, add a default constructed element 22 a.push_back() = 0; 23 REPORTER_ASSERT(reporter, !a.empty()); 24 REPORTER_ASSERT(reporter, a.count() == 1); 25 26 // { 0 }, removeShuffle the only element. 27 a.removeShuffle(0); 28 REPORTER_ASSERT(reporter, a.empty()); 29 REPORTER_ASSERT(reporter, a.count() == 0); 30 31 // { }, add a default, add a 1, remove first 32 a.push_back() = 0; 33 REPORTER_ASSERT(reporter, a.push_back() = 1); 34 a.removeShuffle(0); 35 REPORTER_ASSERT(reporter, !a.empty()); 36 REPORTER_ASSERT(reporter, a.count() == 1); 37 REPORTER_ASSERT(reporter, a[0] == 1); 38 39 // { 1 }, replace with new array 40 int b[5] = { 0, 1, 2, 3, 4 }; 41 a.reset(b, SK_ARRAY_COUNT(b)); 42 REPORTER_ASSERT(reporter, a.count() == SK_ARRAY_COUNT(b)); 43 REPORTER_ASSERT(reporter, a[2] == 2); 44 REPORTER_ASSERT(reporter, a[4] == 4); 45 46 // { 0, 1, 2, 3, 4 }, removeShuffle the last 47 a.removeShuffle(4); 48 REPORTER_ASSERT(reporter, a.count() == SK_ARRAY_COUNT(b) - 1); 49 REPORTER_ASSERT(reporter, a[3] == 3); 50 51 // { 0, 1, 2, 3 }, remove a middle, note shuffle 52 a.removeShuffle(1); 53 REPORTER_ASSERT(reporter, a.count() == SK_ARRAY_COUNT(b) - 2); 54 REPORTER_ASSERT(reporter, a[0] == 0); 55 REPORTER_ASSERT(reporter, a[1] == 3); 56 REPORTER_ASSERT(reporter, a[2] == 2); 57 58 // {0, 3, 2 } 59 } 60 61 namespace { 62 SkTArray<int>* make() { 63 typedef SkTArray<int> IntArray; 64 return new IntArray; 65 } 66 67 template <int N> SkTArray<int>* make_s() { 68 typedef SkSTArray<N, int> IntArray; 69 return new IntArray; 70 } 71 } 72 73 static void test_swap(skiatest::Reporter* reporter) { 74 typedef SkTArray<int>* (*ArrayMaker)(); 75 ArrayMaker arrayMakers[] = {make, make_s<5>, make_s<10>, make_s<20>}; 76 static int kSizes[] = {0, 1, 5, 10, 15, 20, 25}; 77 for (size_t arrayA = 0; arrayA < SK_ARRAY_COUNT(arrayMakers); ++arrayA) { 78 for (size_t arrayB = arrayA; arrayB < SK_ARRAY_COUNT(arrayMakers); ++arrayB) { 79 for (size_t dataSizeA = 0; dataSizeA < SK_ARRAY_COUNT(kSizes); ++dataSizeA) { 80 for (size_t dataSizeB = 0; dataSizeB < SK_ARRAY_COUNT(kSizes); ++dataSizeB) { 81 int curr = 0; 82 SkTArray<int>* a = arrayMakers[arrayA](); 83 SkTArray<int>* b = arrayMakers[arrayB](); 84 for (int i = 0; i < kSizes[dataSizeA]; ++i) { 85 a->push_back(curr++); 86 } 87 for (int i = 0; i < kSizes[dataSizeB]; ++i) { 88 b->push_back(curr++); 89 } 90 a->swap(b); 91 REPORTER_ASSERT(reporter, kSizes[dataSizeA] == b->count()); 92 REPORTER_ASSERT(reporter, kSizes[dataSizeB] == a->count()); 93 curr = 0; 94 for (int i = 0; i < kSizes[dataSizeA]; ++i) { 95 REPORTER_ASSERT(reporter, curr++ == (*b)[i]); 96 } 97 for (int i = 0; i < kSizes[dataSizeB]; ++i) { 98 REPORTER_ASSERT(reporter, curr++ == (*a)[i]); 99 } 100 delete b; 101 102 a->swap(a); 103 curr = kSizes[dataSizeA]; 104 for (int i = 0; i < kSizes[dataSizeB]; ++i) { 105 REPORTER_ASSERT(reporter, curr++ == (*a)[i]); 106 } 107 delete a; 108 } 109 } 110 } 111 } 112 } 113 114 DEF_TEST(TArray, reporter) { 115 TestTSet_basic<true>(reporter); 116 TestTSet_basic<false>(reporter); 117 test_swap(reporter); 118 } 119