/** assert that cumulative values are correctly calculated when drawing the first time */ TEST(DrawList, Cumulative) { DrawList<MyData> list; list.push_back(MyData(), 0.11); list.push_back(MyData(), 0.22); list.push_back(MyData(), 0.33); list.push_back(MyData(), 0.44); list.push_back(MyData(), 0.55); list.push_back(MyData(), 0.66); for (DrawListEntry<MyData>& dle : list.entries) { ASSERT_EQ(0, dle.cumulativeProbability); } list.draw(); ASSERT_FLOAT_EQ(0.11f, list.entries[0].cumulativeProbability); ASSERT_FLOAT_EQ(0.33f, list.entries[1].cumulativeProbability); ASSERT_FLOAT_EQ(0.66f, list.entries[2].cumulativeProbability); ASSERT_FLOAT_EQ(1.10f, list.entries[3].cumulativeProbability); ASSERT_FLOAT_EQ(1.65f, list.entries[4].cumulativeProbability); ASSERT_FLOAT_EQ(2.31f, list.entries[5].cumulativeProbability); list.set(0, MyData(), 0.22); ASSERT_FLOAT_EQ(0.00f, list.entries[0].cumulativeProbability); ASSERT_FLOAT_EQ(0.33f, list.entries[1].cumulativeProbability); ASSERT_FLOAT_EQ(0.66f, list.entries[2].cumulativeProbability); ASSERT_FLOAT_EQ(1.10f, list.entries[3].cumulativeProbability); ASSERT_FLOAT_EQ(1.65f, list.entries[4].cumulativeProbability); ASSERT_FLOAT_EQ(2.31f, list.entries[5].cumulativeProbability); list.draw(); ASSERT_FLOAT_EQ(0.22f, list.entries[0].cumulativeProbability); ASSERT_FLOAT_EQ(0.44f, list.entries[1].cumulativeProbability); ASSERT_FLOAT_EQ(0.77f, list.entries[2].cumulativeProbability); ASSERT_FLOAT_EQ(1.21f, list.entries[3].cumulativeProbability); ASSERT_FLOAT_EQ(1.76f, list.entries[4].cumulativeProbability); ASSERT_FLOAT_EQ(2.42f, list.entries[5].cumulativeProbability); }
void TestDrawListRandom(int numEntries) { DrawList<MyData> list; std::vector<double> configured; std::vector<double> drawn; const unsigned int cnt = numEntries; const unsigned int numDraw = cnt * 4096; double probSum = 0; list.resize(cnt); drawn.resize(cnt); configured.resize(cnt); // fill for (unsigned int i = 0; i < cnt; ++i) { double rnd = double(rand()) / double(RAND_MAX); configured[i] = rnd; list.set(i, MyData(i,i), rnd); probSum += rnd; } // draw for (unsigned int i = 0; i < numDraw; ++i) { MyData& d = list.draw(); drawn[d.x]++; } // compare for (unsigned int i = 0; i < cnt; ++i) { double a = (configured[i] / probSum); double b = (drawn[i] / numDraw); ASSERT_NEAR(a, b, a*0.50); // allow 50% difference between cfg and drawn } }