From 4bbd3ded0b767ae0919551776e4c17189140e735 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sat, 30 May 2015 19:30:33 -0700 Subject: 1517 --- html/072scenario_screen.cc.html | 127 +++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 21 deletions(-) (limited to 'html/072scenario_screen.cc.html') diff --git a/html/072scenario_screen.cc.html b/html/072scenario_screen.cc.html index ecf37ed3..093a0173 100644 --- a/html/072scenario_screen.cc.html +++ b/html/072scenario_screen.cc.html @@ -10,17 +10,17 @@ @@ -35,12 +35,13 @@ body { font-family: monospace; color: #d0d0d0; background-color: #000000; } //: Clean syntax to manipulate and check the screen in scenarios. //: Instructions 'assume-screen' and 'screen-should-contain' implicitly create //: a variable called 'screen' that is accessible inside other 'run' -//: instructions in the scenario. +//: instructions in the scenario. 'screen-should-contain' can check unicode +//: characters in the fake screen :(scenarios run_mu_scenario) :(scenario screen_in_scenario) scenario screen-in-scenario [ -#? $start-tracing +#? $start-tracing #? 2 assume-screen 5:literal/width, 3:literal/height run [ screen:address <- print-character screen:address, 97:literal # 'a' @@ -51,17 +52,50 @@ scenario screen-in-scenario [ . . . . ] -#? $exit +#? $exit #? 1 ] :(scenario screen_in_scenario_unicode) +scenario screen-in-scenario-unicode-color [ + assume-screen 5:literal/width, 3:literal/height + run [ + screen:address <- print-character screen:address, 955:literal/greek-small-lambda, 1:literal/red + screen:address <- print-character screen:address, 97:literal/a + ] + screen-should-contain [ + # 01234 + .λa . + . . + . . + ] +#? $exit +] + +:(scenario screen_in_scenario_color) # screen-should-contain can check unicode characters in the fake screen -scenario screen-in-scenario [ +scenario screen-in-scenario-color [ assume-screen 5:literal/width, 3:literal/height run [ - screen:address <- print-character screen:address, 955:literal # 'λ' + screen:address <- print-character screen:address, 955:literal/greek-small-lambda, 1:literal/red + screen:address <- print-character screen:address, 97:literal/a, 7:literal/white ] + # screen-should-contain shows everything screen-should-contain [ + # 01234 + .λa . + . . + . . + ] + # screen-should-contain-in-color filters out everything except the given + # color, all you see is the 'a' in white. + screen-should-contain-in-color 7:literal/white, [ + # 01234 + . a . + . . + . . + ] + # ..and the λ in red. + screen-should-contain-in-color 1:literal/red, [ # 01234 .λ . . . @@ -71,7 +105,6 @@ scenario screen-in-scenario [ ] :(scenario screen_in_scenario_error) -#? % cerr << "AAA\n"; % Hide_warnings = true; scenario screen-in-scenario-error [ assume-screen 5:literal/width, 3:literal/height @@ -87,6 +120,23 @@ scenario screen-in-scenario-error [ ] +warn: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a') +:(scenario screen_in_scenario_color_error) +% Hide_warnings = true; +# screen-should-contain can check unicode characters in the fake screen +scenario screen-in-scenario-color [ + assume-screen 5:literal/width, 3:literal/height + run [ + screen:address <- print-character screen:address, 97:literal/a, 1:literal/red + ] + screen-should-contain-in-color 2:literal/green, [ + # 01234 + .a . + . . + . . + ] +] ++warn: expected screen location (0, 0) to be in color 2 instead of 1 + //: allow naming just for 'screen' :(before "End is_special_name Cases") if (s == "screen") return true; @@ -132,8 +182,20 @@ SCREEN_SHOULD_CONTAIN, Recipe_number["screen-should-contain"] = SCREEN_SHOULD_CONTAIN; :(before "End Primitive Recipe Implementations") case SCREEN_SHOULD_CONTAIN: { -//? cout << "AAA\n"; //? 1 - check_screen(current_instruction().ingredients.at(0).name); + if (!Passed) break; + check_screen(current_instruction().ingredients.at(0).name, -1); + break; +} + +:(before "End Primitive Recipe Declarations") +SCREEN_SHOULD_CONTAIN_IN_COLOR, +:(before "End Primitive Recipe Numbers") +Recipe_number["screen-should-contain-in-color"] = SCREEN_SHOULD_CONTAIN_IN_COLOR; +:(before "End Primitive Recipe Implementations") +case SCREEN_SHOULD_CONTAIN_IN_COLOR: { + if (!Passed) break; + assert(scalar(ingredients.at(0))); + check_screen(current_instruction().ingredients.at(1).name, ingredients.at(0).at(0)); break; } @@ -152,8 +214,8 @@ struct raw_string_stream { }; :(code) -void check_screen(const string& expected_contents) { -//? cerr << "Checking screen\n"; //? 1 +void check_screen(const string& expected_contents, const int color) { +//? cerr << "Checking screen for color " << color << "\n"; //? 2 assert(!Current_routine->calls.front().default_space); // not supported long long int screen_location = Memory[SCREEN]; int data_offset = find_element_name(Type_number["screen"], "data"); @@ -171,26 +233,49 @@ void check_screen(const string& expected_cont cursor.skip_whitespace_and_comments(); if (cursor.at_end()) break; assert(cursor.get() == '.'); - for (long long int column = 0; column < screen_width; ++column, ++addr) { + for (long long int column = 0; column < screen_width; ++column, addr+= /*size of screen-cell*/2) { + const int cell_color_offset = 1; uint32_t curr = cursor.get(); if (Memory[addr] == 0 && isspace(curr)) continue; - if (Memory[addr] != 0 && Memory[addr] == curr) continue; - // mismatch +//? cerr << color << " vs " << Memory[addr+1] << '\n'; //? 1 + if (curr == ' ' && color != -1 && color != Memory[addr+cell_color_offset]) { + // filter out other colors + continue; + } + if (Memory[addr] != 0 && Memory[addr] == curr) { + if (color == -1 || color == Memory[addr+cell_color_offset]) continue; + // contents match but color is off + if (Current_scenario && !Hide_warnings) { + // genuine test in a mu file + raise << "\nF - " << Current_scenario->name << ": expected screen location (" << row << ", " << column << ", address " << addr << ", value " << Memory[addr] << ") to be in color " << color << " instead of " << Memory[addr+cell_color_offset] << "'\n"; + } + else { + // just testing check_screen + raise << "expected screen location (" << row << ", " << column << ") to be in color " << color << " instead of " << Memory[addr+cell_color_offset] << '\n'; + } + if (!Hide_warnings) { + Passed = false; + ++Num_failures; + } + return; + } + + // really a mismatch // can't print multi-byte unicode characters in warnings just yet. not very useful for debugging anyway. char expected_pretty[10] = {0}; - if (curr < 256) { + if (curr < 256 && !iscntrl(curr)) { // " ('<curr>')" expected_pretty[0] = ' ', expected_pretty[1] = '(', expected_pretty[2] = '\'', expected_pretty[3] = static_cast<unsigned char>(curr), expected_pretty[4] = '\'', expected_pretty[5] = ')', expected_pretty[6] = '\0'; } char actual_pretty[10] = {0}; - if (Memory[addr] < 256) { + if (Memory[addr] < 256 && !iscntrl(Memory[addr])) { // " ('<curr>')" actual_pretty[0] = ' ', actual_pretty[1] = '(', actual_pretty[2] = '\'', actual_pretty[3] = static_cast<unsigned char>(Memory[addr]), actual_pretty[4] = '\'', actual_pretty[5] = ')', actual_pretty[6] = '\0'; } if (Current_scenario && !Hide_warnings) { // genuine test in a mu file - raise << "\nF - " << Current_scenario->name << ": expected screen location (" << row << ", " << column << ") to contain " << curr << expected_pretty << " instead of " << Memory[addr] << actual_pretty << "'\n"; + raise << "\nF - " << Current_scenario->name << ": expected screen location (" << row << ", " << column << ") to contain " << curr << expected_pretty << " instead of " << Memory[addr] << actual_pretty << '\n'; dump_screen(); } else { @@ -278,7 +363,7 @@ void dump_screen() {//? cerr << curr << ":\n"; //? 1 for (long long int col = 0; col < screen_width; ++col) { cerr << static_cast<char>(Memory[curr]); - ++curr; + curr += /*size of screen-cell*/2; } cerr << '\n'; } -- cgit 1.4.1-2-gfad0