#include using namespace Upp; template void Compare(C1& a, C2& b) { ASSERT(a.GetCount() == b.GetCount()); for(int i = 0; i < a.GetCount(); i++) ASSERT(a[i] == b[i]); typename C1::Iterator ia = a.Begin(); typename C2::Iterator ib = b.Begin(); while(ib != b.End()) { ASSERT(*ia == *ib); ia++; ib++; } } void InArrayTest() { SeedRandom(); Vector q; InArray iv; Compare(q, iv); iv.Insert(0) = 0; q.Insert(0) = 0; iv.Insert(1) = -1; q.Insert(1) = -1; for(int j = 0; j < 10000; j++) { if(j % 1000 == 0) LOG(j); int i = Random(iv.GetCount()); iv.Insert(i) = i; q.Insert(i) = i; Compare(q, iv); ASSERT(iv.End() - iv.Begin() == iv.GetCount()); } for(int i = 0; i < 100; i++) { int n = Random(100) + 20; InArray::Iterator it2, it = iv.Begin(); it += n; ASSERT(it - iv.Begin() == n); it2 = it; for(int j = 0; j < 10; j++) { ASSERT(it2 - iv.Begin() == n + j); ++it2; } it2 = it; for(int j = 0; j < 10; j++) { ASSERT(it2 - iv.Begin() == n - j); --it2; } } StableSort(q); StableSort(iv); Compare(q, iv); } void TestUpperBound() { { InArray v; for(int i = 0; i < 3000; i++) { if(i % 1000 == 0) LOG(i); v.Insert(i) = i; ASSERT(v.FindUpperBound(i) == i + 1); for(int j = 0; j < i; j++) ASSERT(v.FindUpperBound(j) == j + 1); } } { InArray v; for(int i = 0; i < 3000; i++) { if(i % 1000 == 0) LOG(i); for(int j = 0; j < 7; j++) v.Insert(7 * i) = i; ASSERT(v.FindUpperBound(i) == 7 * i + 7); for(int j = 0; j < i; j++) ASSERT(v.FindUpperBound(j) == 7 * j + 7); } } } void TestLowerBound() { { InArray v; for(int i = 0; i < 3000; i++) { if(i % 1000 == 0) LOG(i); v.Insert(i) = i; ASSERT(v.FindLowerBound(i) == i); for(int j = 0; j < i; j++) ASSERT(v.FindLowerBound(j) == j); } } { InArray v; for(int i = 0; i < 3000; i++) { if(i % 1000 == 0) LOG(i); for(int j = 0; j < 7; j++) v.Insert(7 * i) = i; ASSERT(v.FindLowerBound(i) == 7 * i); for(int j = 0; j < i; j++) ASSERT(v.FindLowerBound(j) == 7 * j); } } } void SetTest() { for(int j = 0; j < 100; j++) { LOG(j); Vector va; InArray ia; for(int i = 0; i < 1000; i++) { int q = Random(100); int ii = FindUpperBound(va, q); va.Insert(ii) = q; ia.InsertUpperBound(q); Compare(va, ia); ii = ia.Find(q); ASSERT(ia[ii] == q); ASSERT(ia.Find(200) < 0); } } } void RemoveTest() { SeedRandom(); Vector q; InArray iv; Compare(q, iv); iv.Insert(0) = 0; q.Insert(0) = 0; iv.Insert(1) = -1; q.Insert(1) = -1; for(int j = 0; j < 10000000; j++) { if(j % 1000 == 0) LOG(j); if(iv.GetCount() > 200 && Random(4) == 1) { int i = Random(iv.GetCount() - 21); int n = Random(20); iv.Remove(i, n); q.Remove(i, n); } else { int i = Random(iv.GetCount()); iv.Insert(i) = i; q.Insert(i) = i; } Compare(q, iv); ASSERT(iv.End() - iv.Begin() == iv.GetCount()); } } void InsertNTest() { SeedRandom(); Vector av; InArray iv; for(int i = 0; i < 100000; i++) { if(i % 1000 == 0) LOG(i); if(av.GetCount() > 2000) { av.Clear(); iv.Clear(); } int pos = av.GetCount() ? Random(av.GetCount()) : 0; int n = Random(30); av.InsertN(pos, n); iv.InsertN(pos, n); for(int j = 0; j < n; j++) { int r = Random(); av[pos + j] = r; iv[pos + j] = r; } Compare(av, iv); } } CONSOLE_APP_MAIN { StdLogSetup(LOG_FILE|LOG_COUT); SeedRandom(); RemoveTest(); InsertNTest(); SetTest(); TestLowerBound(); TestUpperBound(); InArrayTest(); }