From 90560d7194f3e451ddab9d4033c98d2e6aec977b Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sun, 23 Aug 2015 10:19:23 -0700 Subject: 2062 --- html/072scenario_screen.cc.html | 183 ++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 92 deletions(-) (limited to 'html/072scenario_screen.cc.html') diff --git a/html/072scenario_screen.cc.html b/html/072scenario_screen.cc.html index 99c13565..5100c44c 100644 --- a/html/072scenario_screen.cc.html +++ b/html/072scenario_screen.cc.html @@ -13,15 +13,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; } body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } -.traceContains { color: #008000; } .traceAbsent { color: #c00000; } -.Constant { color: #00a0a0; } +.traceContains { color: #008000; } .cSpecial { color: #008000; } -.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } .Identifier { color: #804000; } +.Constant { color: #00a0a0; } --> @@ -44,7 +43,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario screen-in-scenario [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 97 # 'a' + screen:address <- print-character screen:address, 97 # 'a' ] screen-should-contain [ # 01234 @@ -58,8 +57,8 @@ scenario screen-in-scenario [ scenario screen-in-scenario-unicode-color [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 955/greek-small-lambda, 1/red - screen:address <- print-character screen:address, 97/a + screen:address <- print-character screen:address, 955/greek-small-lambda, 1/red + screen:address <- print-character screen:address, 97/a ] screen-should-contain [ # 01234 @@ -74,8 +73,8 @@ scenario screen-in-scenario-unicode-color [ scenario screen-in-scenario-color [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 955/greek-small-lambda, 1/red - screen:address <- print-character screen:address, 97/a, 7/white + screen:address <- print-character screen:address, 955/greek-small-lambda, 1/red + screen:address <- print-character screen:address, 97/a, 7/white ] # screen-should-contain shows everything screen-should-contain [ @@ -107,7 +106,7 @@ scenario screen-in-scenario-color [ scenario screen-in-scenario-error [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 97 # 'a' + screen:address <- print-character screen:address, 97 # 'a' ] screen-should-contain [ # 01234 @@ -125,7 +124,7 @@ scenario screen-in-scenario-error [ scenario screen-in-scenario-color [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 97/a, 1/red + screen:address <- print-character screen:address, 97/a, 1/red ] screen-should-contain-in-color 2/green, [ # 01234 @@ -138,14 +137,14 @@ scenario screen-in-scenario-color [ //: allow naming just for 'screen' :(before "End is_special_name Cases") -if (s == "screen") return true; +if (s == "screen") return true; :(scenarios run) :(scenario convert_names_does_not_warn_when_mixing_special_names_and_numeric_locations) % Scenario_testing_scenario = true; % Hide_warnings = true; recipe main [ - screen:number <- copy 1:number + screen:number <- copy 1:number ] -warn: mixing variable names and numeric addresses in main $warn: 0 @@ -155,8 +154,8 @@ $warn: 0 // Scenarios may not define default-space, so they should fit within the // initial area of memory reserved for tests. We'll put the predefined // variables available to them at the end of that region. -const long long int Max_variables_in_scenarios = Reserved_for_tests-100; -long long int Next_predefined_global_for_scenarios = Max_variables_in_scenarios; +const long long int Max_variables_in_scenarios = Reserved_for_tests-100; +long long int Next_predefined_global_for_scenarios = Max_variables_in_scenarios; :(before "End Setup") assert(Next_predefined_global_for_scenarios < Reserved_for_tests); :(after "transform_all()" following "case RUN:") @@ -167,7 +166,7 @@ assert(Name[tmp_recipe.:(before "End Globals") // Scenario Globals. -const long long int SCREEN = Next_predefined_global_for_scenarios++; +const long long int SCREEN = Next_predefined_global_for_scenarios++; // End Scenario Globals. :(before "End Special Scenario Variable Names(r)") Name[r]["screen"] = SCREEN; @@ -175,7 +174,7 @@ Name[r]["screen"] = SCREEN:(before "End Rewrite Instruction(curr)") // rewrite `assume-screen width, height` to // `screen:address <- new-fake-screen width, height` -if (curr.name == "assume-screen") { +if (curr.name == "assume-screen") { curr.operation = Recipe_ordinal["new-fake-screen"]; curr.name = "new-fake-screen"; assert(curr.operation); @@ -190,8 +189,8 @@ SCREEN_SHOULD_CONTAIN, :(before "End Primitive Recipe Numbers") Recipe_ordinal["screen-should-contain"] = SCREEN_SHOULD_CONTAIN; :(before "End Primitive Recipe Implementations") -case SCREEN_SHOULD_CONTAIN: { - if (!Passed) break; +case SCREEN_SHOULD_CONTAIN: { + if (!Passed) break; check_screen(current_instruction().ingredients.at(0).name, -1); break; } @@ -201,8 +200,8 @@ SCREEN_SHOULD_CONTAIN_IN_COLOR, :(before "End Primitive Recipe Numbers") Recipe_ordinal["screen-should-contain-in-color"] = SCREEN_SHOULD_CONTAIN_IN_COLOR; :(before "End Primitive Recipe Implementations") -case SCREEN_SHOULD_CONTAIN_IN_COLOR: { - if (!Passed) break; +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; @@ -210,57 +209,57 @@ Recipe_ordinal["screen-should-contain-in-color" :(before "End Types") // scan an array of characters in a unicode-aware, bounds-checked manner -struct raw_string_stream { - long long int index; - const long long int max; - const char* buf; +struct raw_string_stream { + long long int index; + const long long int max; + const char* buf; - raw_string_stream(const string&); - uint32_t get(); // unicode codepoint - uint32_t peek(); // unicode codepoint - bool at_end() const; - void skip_whitespace_and_comments(); + raw_string_stream(const string&); + uint32_t get(); // unicode codepoint + uint32_t peek(); // unicode codepoint + bool at_end() const; + void skip_whitespace_and_comments(); }; :(code) -void check_screen(const string& expected_contents, const int color) { +void check_screen(const string& expected_contents, const int color) { assert(!Current_routine->calls.front().default_space); // not supported - long long int screen_location = Memory[SCREEN]; - int data_offset = find_element_name(Type_ordinal["screen"], "data"); + long long int screen_location = Memory[SCREEN]; + int data_offset = find_element_name(Type_ordinal["screen"], "data"); assert(data_offset >= 0); - long long int screen_data_location = screen_location+data_offset; // type: address:array:character - long long int screen_data_start = Memory[screen_data_location]; // type: array:character - int width_offset = find_element_name(Type_ordinal["screen"], "num-columns"); - long long int screen_width = Memory[screen_location+width_offset]; - int height_offset = find_element_name(Type_ordinal["screen"], "num-rows"); - long long int screen_height = Memory[screen_location+height_offset]; + long long int screen_data_location = screen_location+data_offset; // type: address:array:character + long long int screen_data_start = Memory[screen_data_location]; // type: array:character + int width_offset = find_element_name(Type_ordinal["screen"], "num-columns"); + long long int screen_width = Memory[screen_location+width_offset]; + int height_offset = find_element_name(Type_ordinal["screen"], "num-rows"); + long long int screen_height = Memory[screen_location+height_offset]; raw_string_stream cursor(expected_contents); // todo: too-long expected_contents should fail - long long int addr = screen_data_start+1; // skip length - for (long long int row = 0; row < screen_height; ++row) { + long long int addr = screen_data_start+1; // skip length + for (long long int row = 0; row < screen_height; ++row) { cursor.skip_whitespace_and_comments(); - if (cursor.at_end()) break; + if (cursor.at_end()) break; assert(cursor.get() == '.'); - 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 (curr == ' ' && color != -1 && color != Memory[addr+cell_color_offset]) { + 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 (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; + 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 && !Scenario_testing_scenario) { + if (Current_scenario && !Scenario_testing_scenario) { // 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" << end(); } - else { + else { // just testing check_screen raise << "expected screen location (" << row << ", " << column << ") to be in color " << color << " instead of " << Memory[addr+cell_color_offset] << '\n' << end(); } - if (!Scenario_testing_scenario) { + if (!Scenario_testing_scenario) { Passed = false; ++Num_failures; } @@ -269,27 +268,27 @@ Recipe_ordinal["screen-should-contain-in-color" // 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 && !iscntrl(curr)) { + char expected_pretty[10] = {0}; + 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'; + 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 && !iscntrl(Memory[addr])) { + char actual_pretty[10] = {0}; + 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'; + 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 && !Scenario_testing_scenario) { + if (Current_scenario && !Scenario_testing_scenario) { // 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' << end(); dump_screen(); } - else { + else { // just testing check_screen raise << "expected screen location (" << row << ", " << column << ") to contain " << curr << expected_pretty << " instead of " << Memory[addr] << actual_pretty << '\n' << end(); } - if (!Scenario_testing_scenario) { + if (!Scenario_testing_scenario) { Passed = false; ++Num_failures; } @@ -301,43 +300,43 @@ Recipe_ordinal["screen-should-contain-in-color" assert(cursor.at_end()); } -raw_string_stream::raw_string_stream(const string& backing) :index(0), max(SIZE(backing)), buf(backing.c_str()) {} +raw_string_stream::raw_string_stream(const string& backing) :index(0), max(SIZE(backing)), buf(backing.c_str()) {} -bool raw_string_stream::at_end() const { - if (index >= max) return true; - if (tb_utf8_char_length(buf[index]) > max-index) { - raise << "unicode string seems corrupted at index "<< index << " character " << static_cast<int>(buf[index]) << '\n' << end(); +bool raw_string_stream::at_end() const { + if (index >= max) return true; + if (tb_utf8_char_length(buf[index]) > max-index) { + raise << "unicode string seems corrupted at index "<< index << " character " << static_cast<int>(buf[index]) << '\n' << end(); return true; } return false; } -uint32_t raw_string_stream::get() { +uint32_t raw_string_stream::get() { assert(index < max); // caller must check bounds before calling 'get' - uint32_t result = 0; - int length = tb_utf8_char_to_unicode(&result, &buf[index]); + uint32_t result = 0; + int length = tb_utf8_char_to_unicode(&result, &buf[index]); assert(length != TB_EOF); index += length; return result; } -uint32_t raw_string_stream::peek() { +uint32_t raw_string_stream::peek() { assert(index < max); // caller must check bounds before calling 'get' - uint32_t result = 0; - int length = tb_utf8_char_to_unicode(&result, &buf[index]); + uint32_t result = 0; + int length = tb_utf8_char_to_unicode(&result, &buf[index]); assert(length != TB_EOF); return result; } -void raw_string_stream::skip_whitespace_and_comments() { - while (!at_end()) { - if (isspace(peek())) get(); - else if (peek() == '#') { +void raw_string_stream::skip_whitespace_and_comments() { + while (!at_end()) { + if (isspace(peek())) get(); + else if (peek() == '#') { // skip comment get(); - while (peek() != '\n') get(); // implicitly also handles CRLF + while (peek() != '\n') get(); // implicitly also handles CRLF } - else break; + else break; } } @@ -346,31 +345,31 @@ _DUMP_SCREEN, :(before "End Primitive Recipe Numbers") Recipe_ordinal["$dump-screen"] = _DUMP_SCREEN; :(before "End Primitive Recipe Implementations") -case _DUMP_SCREEN: { +case _DUMP_SCREEN: { dump_screen(); break; } :(code) -void dump_screen() { +void dump_screen() { assert(!Current_routine->calls.front().default_space); // not supported - long long int screen_location = Memory[SCREEN]; - int width_offset = find_element_name(Type_ordinal["screen"], "num-columns"); - long long int screen_width = Memory[screen_location+width_offset]; - int height_offset = find_element_name(Type_ordinal["screen"], "num-rows"); - long long int screen_height = Memory[screen_location+height_offset]; - int data_offset = find_element_name(Type_ordinal["screen"], "data"); + long long int screen_location = Memory[SCREEN]; + int width_offset = find_element_name(Type_ordinal["screen"], "num-columns"); + long long int screen_width = Memory[screen_location+width_offset]; + int height_offset = find_element_name(Type_ordinal["screen"], "num-rows"); + long long int screen_height = Memory[screen_location+height_offset]; + int data_offset = find_element_name(Type_ordinal["screen"], "data"); assert(data_offset >= 0); - long long int screen_data_location = screen_location+data_offset; // type: address:array:character - long long int screen_data_start = Memory[screen_data_location]; // type: array:character + long long int screen_data_location = screen_location+data_offset; // type: address:array:character + long long int screen_data_start = Memory[screen_data_location]; // type: array:character assert(Memory[screen_data_start] == screen_width*screen_height); - long long int curr = screen_data_start+1; // skip length - for (long long int row = 0; row < screen_height; ++row) { + long long int curr = screen_data_start+1; // skip length + for (long long int row = 0; row < screen_height; ++row) { cerr << '.'; - for (long long int col = 0; col < screen_width; ++col) { - if (Memory[curr]) + for (long long int col = 0; col < screen_width; ++col) { + if (Memory[curr]) cerr << to_unicode(Memory[curr]); - else + else cerr << ' '; curr += /*size of screen-cell*/2; } -- cgit 1.4.1-2-gfad0