|
|
nono 0.1.6
#include "test_tool.h"
#include "event.h"
#include "eventqueue.h"
#include <string>
static void
do_test()
{
eventqueue q {};
std::vector<Event> events {};
Event *e;
int N;
// 実体を用意する
N = 9;
for (int i = 0; i < N; i++) {
Event ev;
ev.vtime = i + 1;
events.emplace_back(ev);
}
//
// Test1. 正順に追加
//
for (int i = 0; i < N; i++) {
q.push(&events[i]);
}
// 取り出して検査
for (int i = 0; i < N; i++) {
// 先頭を参照
e = q.front();
if (e == NULL) {
printf("%s:%d: e expects non-null but null\n", __func__, __LINE__);
exit(1);
}
xp_eq(i + 1, e->vtime, string_format("i=%d", i));
// 取り出す
q.pop_front();
xp_eq(N - 1 - i, q.size());
}
// 全部なくなった (q.front() は empty() 時に呼んではいけない)
xp_eq(true, q.empty());
//
// Test2. 逆順に追加
//
for (int i = N - 1; i >= 0; i--) {
q.push(&events[i]);
}
// 取り出して検査
for (int i = 0; i < N; i++) {
// 先頭を参照
e = q.front();
if (e == NULL) {
printf("%s:%d: e expects non-null but null\n", __func__, __LINE__);
exit(1);
}
xp_eq(i + 1, e->vtime);
// 取り出す
q.pop_front();
xp_eq(N - 1 - i, q.size());
}
// 全部なくなった (q.front() は empty() 時に呼んではいけない)
xp_eq(true, q.empty());
//
// Test3. 同値を含む。(同値同士はどう評価しても構わない)
//
N = 4;
events[0].vtime = 10;
events[1].vtime = 40;
events[2].vtime = 20;
events[3].vtime = 20;
for (int i = 0; i < N; i++) {
q.push(&events[i]);
}
// 取り出して検査
for (int i = 0; i < N; i++) {
// 先頭を取り出す。この辺が動いてることはすでに確認済み
e = q.front();
q.pop_front();
// 評価する。同値同士の順序は問わない
switch (i) {
case 0:
xp_eq(10, e->vtime);
break;
case 1:
case 2:
xp_eq(20, e->vtime);
break;
case 3:
xp_eq(40, e->vtime);
break;
}
}
//
// Test4. 削除
//
N = 4;
// 中間の events[2] を削除
events[0].vtime = 10;
events[1].vtime = 40;
events[2].vtime = 20;
events[3].vtime = 20;
for (int i = 0; i < N; i++) {
q.push(&events[i]);
}
q.erase(&events[2]);
e = q.front(); q.pop_front(); xp_eq(10, e->vtime);
e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
e = q.front(); q.pop_front(); xp_eq(40, e->vtime);
xp_eq(true, q.empty());
// 末尾を削除
N = 4;
events[0].vtime = 10;
events[1].vtime = 40;
events[2].vtime = 20;
events[3].vtime = 20;
for (int i = 0; i < N; i++) {
q.push(&events[i]);
}
q.erase(&events[1]);
e = q.front(); q.pop_front(); xp_eq(10, e->vtime);
e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
xp_eq(true, q.empty());
// 先頭を削除
N = 2;
events[0].vtime = 10;
events[1].vtime = 20;
for (int i = 0; i < N; i++) {
q.push(&events[i]);
}
q.erase(&events[0]);
e = q.front(); xp_eq(20, e->vtime);
xp_eq(false, q.empty());
// 最後の一つを削除
q.erase(&events[1]);
xp_eq(true, q.empty());
}
static void
do_perf()
{
}
static void
usage()
{
fprintf(stderr, "usage: %s [test | perf]\n", getprogname());
exit(1);
}
int
main(int ac, char *av[])
{
bool perf = false;
for (int i = 1; i < ac; i++) {
std::string cmd = av[i];
if (cmd == "test") {
// default
} else if (cmd == "perf") {
perf = true;
} else {
usage();
}
}
// テストは常に実施
do_test();
// 測定は指定された時だけ
if (perf) {
do_perf();
}
return 0;
}
// 以下リンカを通すためのダミー
Event::Event()
{
}
Event::~Event()
{
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.