mirror of
https://github.com/birth1mark/orbis8.git
synced 2026-10-29 04:00:30 +01:00
946 lines
25 KiB
C++
946 lines
25 KiB
C++
#include <string>
|
|
#include <vector>
|
|
|
|
#include "doctest.h"
|
|
|
|
#include "../source/vm.h"
|
|
#include "../source/hostVmShared.h"
|
|
#include "../source/host.h"
|
|
#include "../source/printHelper.h"
|
|
#include "../source/Audio.h"
|
|
#include "../source/graphics.h"
|
|
#include "stubhost.h"
|
|
|
|
#include "../source/fontdata.h"
|
|
|
|
#include "testHelpers.h"
|
|
|
|
|
|
|
|
TEST_CASE("Print helper functions") {
|
|
StubHost* stubHost = new StubHost();
|
|
PicoRam* memory = new PicoRam();
|
|
memory->Reset();
|
|
Graphics* graphics = new Graphics(get_font_data(), memory);
|
|
Input* input = new Input(memory);
|
|
Audio* audio = new Audio(memory);
|
|
|
|
Vm* vm = new Vm(stubHost, memory, graphics, input, audio);
|
|
|
|
initPrintHelper(memory, graphics, vm, audio);
|
|
|
|
SUBCASE("print({str}) uses current color, ignoring transparency") {
|
|
graphics->cls();
|
|
graphics->color(2);
|
|
graphics->palt(2, true);
|
|
|
|
print("t");
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 2},
|
|
{1, 0, 2},
|
|
{2, 0, 2},
|
|
{1, 1, 2},
|
|
{1, 2, 2},
|
|
{1, 3, 2},
|
|
{1, 4, 2}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("print({str}) uses current text location") {
|
|
graphics->cls();
|
|
graphics->color(3);
|
|
memory->drawState.text_x = 15;
|
|
memory->drawState.text_y = 98;
|
|
|
|
print("t");
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{15, 98, 3},
|
|
{16, 98, 3},
|
|
{17, 98, 3},
|
|
{16, 99, 3},
|
|
{16, 100, 3},
|
|
{16, 101, 3},
|
|
{16, 102, 3}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("print({str}) increments text location y by 6") {
|
|
graphics->cls();
|
|
memory->drawState.text_x = 15;
|
|
memory->drawState.text_y = 110;
|
|
|
|
print("doesnt matter");
|
|
|
|
CHECK(memory->drawState.text_y == 116);
|
|
}
|
|
SUBCASE("print({str}, {x}, {y}) updates text location ") {
|
|
graphics->cls();
|
|
memory->drawState.text_x = 3;
|
|
memory->drawState.text_y = 4;
|
|
|
|
print("doesnt matter", 42, 99);
|
|
|
|
CHECK(memory->drawState.text_x == 42);
|
|
CHECK(memory->drawState.text_y == 105);
|
|
}
|
|
SUBCASE("print({str}, {x}, {y}, {c}) updates text location and color") {
|
|
graphics->cls();
|
|
memory->drawState.text_x = 3;
|
|
memory->drawState.text_y = 4;
|
|
memory->drawState.color = 10;
|
|
|
|
print("doesnt matter", 16, 18, 14);
|
|
|
|
CHECK(memory->drawState.text_x == 16);
|
|
CHECK(memory->drawState.text_y == 24);
|
|
CHECK(memory->drawState.color == 14);
|
|
}
|
|
SUBCASE("print({str}, {x}, {y}, {c}) updates text location correct in multiline situation") {
|
|
graphics->cls();
|
|
memory->drawState.text_x = 3;
|
|
memory->drawState.text_y = 4;
|
|
memory->drawState.color = 10;
|
|
|
|
print("doesnt\nmatter\nwell\nkinda\ndoes", 19, 18, 14);
|
|
|
|
CHECK(memory->drawState.text_x == 19);
|
|
CHECK(memory->drawState.text_y == 48);
|
|
}
|
|
SUBCASE("print({str}) uses pal mapped color") {
|
|
graphics->cls();
|
|
graphics->color(2);
|
|
graphics->pal(2, 12, 0);
|
|
|
|
print("t");
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 12},
|
|
{1, 0, 12},
|
|
{2, 0, 12},
|
|
{1, 1, 12},
|
|
{1, 2, 12},
|
|
{1, 3, 12},
|
|
{1, 4, 12}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("camera values apply to print")
|
|
{
|
|
graphics->cls();
|
|
graphics->camera(-100, -100);
|
|
print("t");
|
|
graphics->camera();
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{100, 100, 6},
|
|
{101, 100, 6},
|
|
{102, 100, 6},
|
|
{101, 101, 6},
|
|
{101, 102, 6},
|
|
{101, 103, 6},
|
|
{101, 104, 6}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("clip values apply to print") {
|
|
graphics->cls();
|
|
graphics->clip(101, 101, 27, 27);
|
|
graphics->camera(-100, -100);
|
|
print("t");
|
|
graphics->camera();
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{100, 100, 0},
|
|
{101, 100, 0},
|
|
{102, 100, 0},
|
|
{101, 101, 6},
|
|
{101, 102, 6},
|
|
{101, 103, 6},
|
|
{101, 104, 6}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii tab character advances to next x multiple of 16 (default tab size)") {
|
|
graphics->cls();
|
|
|
|
print("a\t:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{17, 0, 0},
|
|
{17, 1, 6},
|
|
{17, 2, 0},
|
|
{17, 3, 6},
|
|
{17, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii backspace character moves cursor backward 4 pixels (doesn't erase)") {
|
|
graphics->cls();
|
|
|
|
print("i\b-", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 6}, {1, 0, 6}, {2, 0, 6},
|
|
{0, 1, 0}, {1, 1, 6}, {2, 1, 0},
|
|
{0, 2, 6}, {1, 2, 6}, {2, 2, 6},
|
|
{0, 3, 0}, {1, 3, 6}, {2, 3, 0},
|
|
{0, 4, 6}, {1, 4, 6}, {2, 4, 6},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii carriage return character moves cursor back to current cursor x(doesn't erase)") {
|
|
graphics->cls();
|
|
|
|
print("i\r-", 10, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{10, 0, 6}, {11, 0, 6}, {12, 0, 6},
|
|
{10, 1, 0}, {11, 1, 6}, {12, 1, 0},
|
|
{10, 2, 6}, {11, 2, 6}, {12, 2, 6},
|
|
{10, 3, 0}, {11, 3, 6}, {12, 3, 0},
|
|
{10, 4, 6}, {11, 4, 6}, {12, 4, 6},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii repeat character (\\*) draws character x number of times") {
|
|
graphics->cls();
|
|
|
|
print("\x01""5:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{17, 0, 0},
|
|
{17, 1, 6},
|
|
{17, 2, 0},
|
|
{17, 3, 6},
|
|
{17, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii bg color character (\\#) changes bg color") {
|
|
graphics->cls();
|
|
|
|
print("\x02""1:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 1},
|
|
{1, 1, 6},
|
|
{1, 2, 1},
|
|
{1, 3, 6},
|
|
{1, 4, 1}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii fg color character (\\f) changes bg color") {
|
|
graphics->cls();
|
|
|
|
print("\x0c""2:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 2},
|
|
{1, 2, 0},
|
|
{1, 3, 2},
|
|
{1, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii bg color character (\\#) changes bg color using hex") {
|
|
graphics->cls();
|
|
|
|
print("\x02""c:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 12},
|
|
{1, 1, 6},
|
|
{1, 2, 12},
|
|
{1, 3, 6},
|
|
{1, 4, 12}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii horizontal move character (\\-) changes x location") {
|
|
graphics->cls();
|
|
|
|
print("\x03""a:", 10, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{5, 0, 0},
|
|
{5, 1, 6},
|
|
{5, 2, 0},
|
|
{5, 3, 6},
|
|
{5, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii vertical move character (\\|) changes y location") {
|
|
graphics->cls();
|
|
|
|
print("\x05""ab:", 6, 5);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 6},
|
|
{1, 2, 0},
|
|
{1, 3, 6},
|
|
{1, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code clear screen(\\^c) ") {
|
|
graphics->cls(2);
|
|
|
|
print("88888");
|
|
|
|
print("\x06""c3", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 3},
|
|
{1, 1, 3},
|
|
{1, 2, 3},
|
|
{1, 3, 3},
|
|
{1, 4, 3}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code home the cursor(\\^g) ") {
|
|
graphics->cls();
|
|
|
|
print("\n\n\nstuff\x06""g:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 6},
|
|
{1, 2, 0},
|
|
{1, 3, 6},
|
|
{1, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code update cursor home(\\^h) ") {
|
|
graphics->cls();
|
|
|
|
print("\n\n\n\x06""h\n\n\nmorestuff\x06""g:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 18, 0},
|
|
{1, 19, 6},
|
|
{1, 20, 0},
|
|
{1, 21, 6},
|
|
{1, 22, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code move cursor(\\^j) ") {
|
|
graphics->cls();
|
|
|
|
// coordinates x=40 ("a" = 10, 10 * 4 = 40), y=48 ("c" = 12, 12 * 4 = 48)
|
|
print("\x06""jac:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{41, 48, 0},
|
|
{41, 49, 6},
|
|
{41, 50, 0},
|
|
{41, 51, 6},
|
|
{41, 52, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
|
|
SUBCASE("p8scii special control code move cursor(\\^j) and update home and color test") {
|
|
graphics->cls();
|
|
//"\^j87\-f\|a\^h\f7:\^je8other\n:"
|
|
/*
|
|
--\^j87- move cursor to 32,28
|
|
--\-f- move cursor horizontally -1 (31,28)
|
|
--\|a- move cursor vertically -6 (31,22)
|
|
--\^h --set cursor home to be current location (31,22)
|
|
--\f7 change color to 7 (white)
|
|
--: print the ":" character
|
|
--\^je8- move cursor to 56,32
|
|
--print "other\n" followed by a new line
|
|
--print one more ":"
|
|
*/
|
|
// coordinates x=40 ("a" = 10, 10 * 4 = 40), y=48 ("c" = 12, 12 * 4 = 48)
|
|
print("\x06""j87\x03""f\x04""a\x06""h\x0c""7:\x06""je8:\n:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{32, 22, 0},
|
|
{32, 23, 7},
|
|
{32, 24, 0},
|
|
{32, 25, 7},
|
|
{32, 26, 0},
|
|
|
|
{32, 38, 0},
|
|
{32, 39, 7},
|
|
{32, 40, 0},
|
|
{32, 41, 7},
|
|
{32, 42, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code tab stop width(\\^s) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""sc \t:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{49, 0, 0},
|
|
{49, 1, 6},
|
|
{49, 2, 0},
|
|
{49, 3, 6},
|
|
{49, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for rhs wrap(\\^r) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""rsthis is a long string that should wrap somewhere", 0, 0);
|
|
|
|
//the "h" in "should" is the first character to wrap
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 6, 6},
|
|
{0, 7, 6},
|
|
{0, 8, 6},
|
|
{0, 9, 6},
|
|
{0, 10, 6},
|
|
{0, 11, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for char width(\\^x) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""x7 :", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{8, 0, 0},
|
|
{8, 1, 6},
|
|
{8, 2, 0},
|
|
{8, 3, 6},
|
|
{8, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for char width(\\^x) affects bg color ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""xz\x06""j00\x02""9 ", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{30, 0, 9},
|
|
{31, 1, 9},
|
|
{32, 2, 9},
|
|
{33, 3, 9},
|
|
{34, 4, 9},
|
|
{35, 5, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for wide character(\\^w) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""w::", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{2, 0, 0}, {3, 0, 0}, {10, 0, 0}, {11, 0, 0},
|
|
{2, 1, 6}, {3, 1, 6}, {10, 1, 6}, {11, 1, 6},
|
|
{2, 2, 0}, {3, 2, 0}, {10, 2, 0}, {11, 2, 0},
|
|
{2, 3, 6}, {3, 3, 6}, {10, 3, 6}, {11, 3, 6},
|
|
{2, 4, 0}, {3, 4, 0}, {10, 4, 0}, {11, 4, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for char height(\\^t) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""t:\n:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 0},
|
|
{1, 2, 6},
|
|
{1, 3, 6},
|
|
{1, 4, 0},
|
|
{1, 5, 0},
|
|
{1, 6, 6},
|
|
{1, 7, 6},
|
|
{1, 8, 0},
|
|
{1, 9, 0},
|
|
|
|
{1, 10, 0},
|
|
{1, 11, 0},
|
|
|
|
{1, 12, 0},
|
|
{1, 13, 0},
|
|
{1, 14, 6},
|
|
{1, 15, 6},
|
|
{1, 16, 0},
|
|
{1, 17, 0},
|
|
{1, 18, 6},
|
|
{1, 19, 6},
|
|
{1, 20, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for wide character with stripey option(\\^w\\^=) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""w""\x06""=:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{2, 0, 0}, {3, 0, 0},
|
|
{2, 1, 6}, {3, 1, 0},
|
|
{2, 2, 0}, {3, 2, 0},
|
|
{2, 3, 6}, {3, 3, 0},
|
|
{2, 4, 0}, {3, 4, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for char height with stripey option(\\^t\\^=) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""t""\x06""=:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 0},
|
|
{1, 2, 6},
|
|
{1, 3, 0},
|
|
{1, 4, 0},
|
|
{1, 5, 0},
|
|
{1, 6, 6},
|
|
{1, 7, 0},
|
|
{1, 8, 0},
|
|
{1, 9, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for pinball option(\\^p) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""p:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{2, 0, 0}, {3, 0, 0},
|
|
{2, 1, 0}, {3, 1, 0},
|
|
{2, 2, 6}, {3, 2, 0},
|
|
{2, 3, 0}, {3, 3, 0},
|
|
{2, 4, 0}, {3, 4, 0},
|
|
{2, 5, 0}, {3, 5, 0},
|
|
{2, 6, 6}, {3, 6, 0},
|
|
{2, 7, 0}, {3, 7, 0},
|
|
{2, 8, 0}, {3, 8, 0},
|
|
{2, 9, 0}, {3, 9, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code to turn off options(\\^-) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""w""\x06""t8" "\x06""-w""\x06""-t:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{9, 0, 0},
|
|
{9, 1, 6},
|
|
{9, 2, 0},
|
|
{9, 3, 6},
|
|
{9, 4, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code to turn off options uses biggest line height(\\^-) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""w""\x06""t8" "\x06""-w""\x06""-t:", 0, 0);
|
|
print(":");
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 12, 0},
|
|
{1, 13, 6},
|
|
{1, 14, 0},
|
|
{1, 15, 6},
|
|
{1, 16, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for one off character(\\^:) (colored)") {
|
|
graphics->cls();
|
|
|
|
print("\x0c""2\x06"":447cb67c3e7f0106", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 0},
|
|
{1, 0, 0},
|
|
{2, 0, 2},
|
|
{3, 0, 0},
|
|
{4, 0, 0},
|
|
{5, 0, 0},
|
|
{6, 0, 2},
|
|
{7, 0, 0},
|
|
{0, 1, 0},
|
|
{1, 1, 0},
|
|
{2, 1, 2},
|
|
{3, 1, 2},
|
|
{4, 1, 2},
|
|
{5, 1, 2},
|
|
{6, 1, 2},
|
|
{7, 1, 0},
|
|
{0, 2, 0},
|
|
{1, 2, 2},
|
|
{2, 2, 2},
|
|
{3, 2, 0},
|
|
{4, 2, 2},
|
|
{5, 2, 2},
|
|
{6, 2, 0},
|
|
{7, 2, 2},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for one off character(\\^:) (pinballed with bg)") {
|
|
graphics->cls();
|
|
|
|
print("\x02""4\x06""p\x06"":447cb67c3e7f0106", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 4},
|
|
{1, 0, 4},
|
|
{2, 0, 4},
|
|
{3, 0, 4},
|
|
{4, 0, 6},
|
|
{5, 0, 4},
|
|
{6, 0, 4},
|
|
{7, 0, 4},
|
|
{8, 0, 4},
|
|
{9, 0, 4},
|
|
{10, 0, 4},
|
|
{11, 0, 4},
|
|
{12, 0, 6},
|
|
{13, 0, 4},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("Poke default print mode but not turned on") {
|
|
graphics->cls();
|
|
|
|
//not turned on
|
|
// wide tall dotty/stripey
|
|
vm->vm_poke(0x5f58, (0x4 | 0x8 | 0x40));
|
|
print(":", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 6},
|
|
{1, 2, 0},
|
|
{1, 3, 6},
|
|
{1, 4, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("Poke default print mode (pinball)") {
|
|
graphics->cls();
|
|
|
|
// on wide tall dotty/stripey
|
|
vm->vm_poke(0x5f58, (0x1 | 0x4 | 0x8 | 0x40));
|
|
print(":", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{2, 0, 0}, {3, 0, 0},
|
|
{2, 1, 0}, {3, 1, 0},
|
|
{2, 2, 6}, {3, 2, 0},
|
|
{2, 3, 0}, {3, 3, 0},
|
|
{2, 4, 0}, {3, 4, 0},
|
|
{2, 5, 0}, {3, 5, 0},
|
|
{2, 6, 6}, {3, 6, 0},
|
|
{2, 7, 0}, {3, 7, 0},
|
|
{2, 8, 0}, {3, 8, 0},
|
|
{2, 9, 0}, {3, 9, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for char width(\\^x) and char height (\\^y) limit rendering ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""x2\x06""y3a", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 6},
|
|
{1, 0, 6},
|
|
{2, 0, 0},
|
|
{3, 0, 0},
|
|
|
|
{0, 1, 6},
|
|
{1, 1, 0},
|
|
{2, 1, 0},
|
|
{3, 1, 0},
|
|
|
|
{0, 2, 6},
|
|
{1, 2, 6},
|
|
{2, 2, 0},
|
|
{3, 2, 0},
|
|
|
|
{0, 3, 0},
|
|
{1, 3, 0},
|
|
{2, 3, 0},
|
|
{3, 3, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for char height (\\^y) sets line height correctly when lower") {
|
|
graphics->cls();
|
|
|
|
print("\x06""y3a", 0, 0);
|
|
|
|
CHECK_EQ(memory->drawState.text_y, 3);
|
|
}
|
|
SUBCASE("p8scii special control code for char height (\\^y) sets line height correctly when higher") {
|
|
graphics->cls();
|
|
|
|
print("\x06""y9a", 0, 0);
|
|
|
|
CHECK_EQ(memory->drawState.text_y, 9);
|
|
}
|
|
SUBCASE("p8scii audio control codes not printed(\\a)") {
|
|
graphics->cls();
|
|
|
|
print("\x07""aceg :", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{1, 0, 0},
|
|
{1, 1, 6},
|
|
{1, 2, 0},
|
|
{1, 3, 6},
|
|
{1, 4, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii control code for decorating prev char (\\v)") {
|
|
graphics->cls();
|
|
|
|
print("\n:\x0b""b:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{2, 0, 0},
|
|
{2, 1, 6},
|
|
{2, 2, 0},
|
|
{2, 3, 6},
|
|
{2, 4, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii custom font control code (\\014 on and \\015 off)") {
|
|
graphics->cls();
|
|
memory->data[0x5600]= 8; //width
|
|
memory->data[0x5601]= 8; //width for chars > 127
|
|
memory->data[0x5602]= 8; //height
|
|
memory->data[0x5603]= 0;
|
|
memory->data[0x5604]= 0;
|
|
|
|
//char 16
|
|
memory->data[0x5680]= 1; //#_______
|
|
memory->data[0x5681] = 3; //##______
|
|
memory->data[0x5682] = 7; //###_____
|
|
memory->data[0x5683] = 15; //####____
|
|
memory->data[0x5684] = 31; //#####___
|
|
memory->data[0x5685] = 63; //######__
|
|
memory->data[0x5686] = 127; //#######_
|
|
memory->data[0x5687] = 255; //########
|
|
|
|
//print char 16 with custom font
|
|
print("\x0e""\x10""\x0f""", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 6}, {1, 0, 0},
|
|
{0, 1, 6}, {1, 1, 6}, {2, 1, 0},
|
|
{0, 2, 6}, {1, 2, 6}, {2, 2, 6}, {3, 2, 0},
|
|
{0, 3, 6}, {1, 3, 6}, {2, 3, 6}, {3, 3, 6}, {4, 3, 0},
|
|
{0, 4, 6}, {1, 4, 6}, {2, 4, 6}, {3, 4, 6}, {4, 4, 6}, {5, 4, 0},
|
|
{0, 5, 6}, {1, 5, 6}, {2, 5, 6}, {3, 5, 6}, {4, 5, 6}, {5, 5, 6}, {6, 5, 0},
|
|
{0, 6, 6}, {1, 6, 6}, {2, 6, 6}, {3, 6, 6}, {4, 6, 6}, {5, 6, 6}, {6, 6, 6}, {7, 6, 0},
|
|
{0, 7, 6}, {1, 7, 6}, {2, 7, 6}, {3, 7, 6}, {4, 7, 6}, {5, 7, 6}, {6, 7, 6}, {7, 7, 6}, {7, 8, 0},
|
|
{0, 8, 0}
|
|
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for inverting colors(\\^i) ") {
|
|
graphics->cls(2);
|
|
|
|
print("\x06""i:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 6}, {1, 0, 6}, {2, 0, 6},
|
|
{0, 1, 6}, {1, 1, 2}, {2, 1, 6},
|
|
{0, 2, 6}, {1, 2, 6}, {2, 2, 6},
|
|
{0, 3, 6}, {1, 3, 2}, {2, 3, 6},
|
|
{0, 4, 6}, {1, 4, 6}, {2, 4, 6},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for solid background(\\^#) ") {
|
|
graphics->cls(2);
|
|
|
|
print("\x06""#:", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 0}, {1, 0, 0}, {2, 0, 0},
|
|
{0, 1, 0}, {1, 1, 6}, {2, 1, 0},
|
|
{0, 2, 0}, {1, 2, 0}, {2, 2, 0},
|
|
{0, 3, 0}, {1, 3, 6}, {2, 3, 0},
|
|
{0, 4, 0}, {1, 4, 0}, {2, 4, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("pal mapping color 0 to another color does not color background") {
|
|
graphics->cls();
|
|
graphics->pal(0, 10, 0);
|
|
|
|
print("0", 0, 0, 10);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 10}, {1, 0, 10}, {2, 0, 10},
|
|
{0, 1, 10}, {1, 1, 0}, {2, 1, 10},
|
|
{0, 2, 10}, {1, 2, 0}, {2, 2, 10},
|
|
{0, 3, 10}, {1, 3, 0}, {2, 3, 10},
|
|
{0, 4, 10}, {1, 4, 10}, {2, 4, 10},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for outline(\\^o) ") {
|
|
graphics->cls(2);
|
|
|
|
print("\x06""o8ff:", 0, 0, 3);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 8}, {1, 0, 8}, {2, 0, 8},
|
|
{0, 1, 8}, {1, 1, 3}, {2, 1, 8},
|
|
{0, 2, 8}, {1, 2, 8}, {2, 2, 8},
|
|
{0, 3, 8}, {1, 3, 3}, {2, 3, 8},
|
|
{0, 4, 8}, {1, 4, 8}, {2, 4, 8},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("p8scii special control code for underline(\\^u) ") {
|
|
graphics->cls();
|
|
|
|
print("\x06""u:", 1, 1, 3);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 0},
|
|
{2, 2, 3},
|
|
{2, 3, 0},
|
|
{2, 4, 3},
|
|
{2, 5, 0},
|
|
{2, 6, 0},
|
|
{0, 7, 3}, {1, 7, 3}, {2, 7, 3}, {3, 7, 3}, {4, 7, 3}, {5, 7, 0}
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("\\#p0 (char 2) automatically enables SOLID_BG mode") {
|
|
graphics->cls();
|
|
|
|
// \x02 (char 2) sets bgColor and enables solid bg mode
|
|
print("\x02""4 ", 0, 0);
|
|
|
|
//the space should just be a solid bg color of 4
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 4}, // bg fill from space
|
|
{1, 0, 4},
|
|
{2, 0, 4},
|
|
{3, 0, 4},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("⁶-# disables solid bg mode - subsequent chars have no bg fill") {
|
|
graphics->cls();
|
|
|
|
// \x02 4 enables solid bg with color 4
|
|
// Then \x06 -# disables solid bg mode
|
|
print("\x02""4 \x06""-# ", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 4},
|
|
{1, 0, 4},
|
|
{2, 0, 4},
|
|
{3, 0, 4},
|
|
{4, 0, 0},
|
|
{5, 0, 0},
|
|
{6, 0, 0},
|
|
{7, 0, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
SUBCASE("⁶-# disables bg fill for raw pixel drawing too") {
|
|
graphics->cls();
|
|
|
|
print("\x02""4\x06"":0000000000000000\x06""-#\x06"":0000000000000000", 0, 0);
|
|
|
|
std::vector<coloredPoint> expectedPoints = {
|
|
{0, 0, 4},
|
|
{1, 0, 4},
|
|
{7, 0, 4},
|
|
{8, 0, 0},
|
|
{9, 0, 0},
|
|
{15, 0, 0},
|
|
};
|
|
|
|
checkPoints(graphics, expectedPoints);
|
|
}
|
|
|
|
delete stubHost;
|
|
delete graphics;
|
|
delete input;
|
|
delete audio;
|
|
|
|
delete vm;
|
|
|
|
delete memory;
|
|
}
|