#include #include #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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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; }