File:  [Isaki's NoNo m68k/m88k emulator] / nono / vm / test_eventqueue.cpp
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:04:53 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v014, v013, v012, v011, v010, HEAD
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()
{
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.