mirror of https://github.com/mgba-emu/mgba.git
GB Test: Add RTC tests
This commit is contained in:
parent
a1d5c58ce0
commit
0c665cf5a3
|
@ -7,10 +7,12 @@
|
|||
|
||||
M_TEST_SUITE_DECLARE(GBCore);
|
||||
M_TEST_SUITE_DECLARE(GBMBC);
|
||||
M_TEST_SUITE_DECLARE(GBRTC);
|
||||
|
||||
int TestRunGB(void) {
|
||||
int failures = 0;
|
||||
failures += M_TEST_SUITE_RUN(GBCore);
|
||||
failures += M_TEST_SUITE_RUN(GBMBC);
|
||||
failures += M_TEST_SUITE_RUN(GBRTC);
|
||||
return failures;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,686 @@
|
|||
/* Copyright (c) 2013-2016 Jeffrey Pfau
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
#include "util/test/suite.h"
|
||||
|
||||
#include "core/core.h"
|
||||
#include "gb/core.h"
|
||||
#include "gb/gb.h"
|
||||
#include "gb/mbc.h"
|
||||
#include "util/vfs.h"
|
||||
|
||||
struct GBRTCTest {
|
||||
struct mRTCSource d;
|
||||
struct mCore* core;
|
||||
struct VFile* fakeROM;
|
||||
time_t nextTime;
|
||||
};
|
||||
|
||||
static void _sampleRtc(struct GB* gb) {
|
||||
gb->memory.rtcLastLatch = 0;
|
||||
GBStore8(gb->cpu, 0x6000, 0);
|
||||
GBStore8(gb->cpu, 0x6000, 1);
|
||||
}
|
||||
|
||||
static void _sampleRtcKeepLatch(struct GB* gb) {
|
||||
GBStore8(gb->cpu, 0x6000, 0);
|
||||
GBStore8(gb->cpu, 0x6000, 1);
|
||||
}
|
||||
|
||||
static time_t _testTime(struct mRTCSource* source) {
|
||||
struct GBRTCTest* test = (struct GBRTCTest*) source;
|
||||
return test->nextTime;
|
||||
}
|
||||
|
||||
M_TEST_SUITE_SETUP(GBRTC) {
|
||||
struct GBRTCTest* test = malloc(sizeof(*test));
|
||||
if (!test) {
|
||||
return -1;
|
||||
}
|
||||
test->core = GBCoreCreate();
|
||||
test->d.sample = NULL;
|
||||
test->d.unixTime = _testTime;
|
||||
test->nextTime = 0;
|
||||
if (!test->core) {
|
||||
*state = NULL;
|
||||
return -1;
|
||||
}
|
||||
test->core->init(test->core);
|
||||
struct VFile* vf = VFileMemChunk(NULL, 2048);
|
||||
GBSynthesizeROM(vf);
|
||||
test->core->loadROM(test->core, vf);
|
||||
test->core->setRTC(test->core, &test->d);
|
||||
struct GB* gb = test->core->board;
|
||||
struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
|
||||
cart->type = 0x0F;
|
||||
|
||||
*state = test;
|
||||
return 0;
|
||||
}
|
||||
|
||||
M_TEST_SUITE_TEARDOWN(GBRTC) {
|
||||
if (!*state) {
|
||||
return 0;
|
||||
}
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->deinit(test->core);
|
||||
free(test);
|
||||
return 0;
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(create) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tickSecond) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 1;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
expected[0] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
expected[0] = 2;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tick30Seconds) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 30;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
expected[0] = 30;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
expected[0] = 31;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 30;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 29;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tickMinute) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 60;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tick90Seconds) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 90;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 30;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 31;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 30;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 2;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 29;
|
||||
expected[1] = 2;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 30;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 31;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tick30Minutes) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 1800;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 30;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 30;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 29;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 29;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tickHour) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 3600;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 1;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 2;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tick12Hours) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 3600 * 12;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 12;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 0;
|
||||
expected[2] = 12;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
expected[2] = 12;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 1;
|
||||
expected[2] = 12;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 12;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 11;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(tickDay) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 3600 * 24;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 1;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 12;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 12;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 23;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 1;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 2;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 1;
|
||||
gb->memory.rtcRegs[3] = 1;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
expected[3] = 2;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(wideTickDay) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 3600 * 24 * 2001;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 1;
|
||||
gb->memory.rtcRegs[1] = 1;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 1;
|
||||
expected[1] = 1;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 12;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 12;
|
||||
expected[3] = 1;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 23;
|
||||
expected[3] = 1;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
gb->memory.rtcRegs[3] = 1;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 2;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 0;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
gb->memory.rtcRegs[2] = 1;
|
||||
gb->memory.rtcRegs[3] = 1;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
expected[3] = 2;
|
||||
gb->memory.rtcLastLatch = 3600 * 24 * 2000;
|
||||
_sampleRtcKeepLatch(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_DEFINE(rolloverSecond) {
|
||||
struct GBRTCTest* test = *state;
|
||||
test->core->reset(test->core);
|
||||
struct GB* gb = test->core->board;
|
||||
test->nextTime = 1;
|
||||
|
||||
uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 };
|
||||
memset(gb->memory.rtcRegs, 0, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0xFF;
|
||||
gb->memory.rtcRegs[4] = 0;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 0;
|
||||
expected[4] = 1;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
|
||||
gb->memory.rtcRegs[0] = 59;
|
||||
gb->memory.rtcRegs[1] = 59;
|
||||
gb->memory.rtcRegs[2] = 23;
|
||||
gb->memory.rtcRegs[3] = 0xFF;
|
||||
gb->memory.rtcRegs[4] = 1;
|
||||
expected[0] = 0;
|
||||
expected[1] = 0;
|
||||
expected[2] = 0;
|
||||
expected[3] = 0;
|
||||
expected[4] = 0x80;
|
||||
_sampleRtc(gb);
|
||||
assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected));
|
||||
}
|
||||
|
||||
M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBRTC,
|
||||
cmocka_unit_test(create),
|
||||
cmocka_unit_test(tickSecond),
|
||||
cmocka_unit_test(tick30Seconds),
|
||||
cmocka_unit_test(tickMinute),
|
||||
cmocka_unit_test(tick90Seconds),
|
||||
cmocka_unit_test(tick30Minutes),
|
||||
cmocka_unit_test(tickHour),
|
||||
cmocka_unit_test(tick12Hours),
|
||||
cmocka_unit_test(tickDay),
|
||||
cmocka_unit_test(wideTickDay),
|
||||
cmocka_unit_test(rolloverSecond))
|
Loading…
Reference in New Issue