From 76755b2836b0dadd88f82635f661f9d9df77604d Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 10 Nov 2015 21:35:42 -0800 Subject: 2423 - describe shape-shifting in html docs --- html/072scenario_screen.cc.html | 122 ++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 55 deletions(-) (limited to 'html/072scenario_screen.cc.html') diff --git a/html/072scenario_screen.cc.html b/html/072scenario_screen.cc.html index 5100c44c..ade20fff 100644 --- a/html/072scenario_screen.cc.html +++ b/html/072scenario_screen.cc.html @@ -13,8 +13,8 @@ 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; } -.traceAbsent { color: #c00000; } .traceContains { color: #008000; } +.traceAbsent { color: #c00000; } .cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -43,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:screen <- print-character screen:address:screen, 97 # 'a' ] screen-should-contain [ # 01234 @@ -57,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:screen <- print-character screen:address:screen, 955/greek-small-lambda, 1/red + screen:address:screen <- print-character screen:address:screen, 97/a ] screen-should-contain [ # 01234 @@ -73,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:screen <- print-character screen:address:screen, 955/greek-small-lambda, 1/red + screen:address:screen <- print-character screen:address:screen, 97/a, 7/white ] # screen-should-contain shows everything screen-should-contain [ @@ -102,11 +102,11 @@ scenario screen-in-scenario-color [ :(scenario screen_in_scenario_error) % Scenario_testing_scenario = true; -% Hide_warnings = true; +% Hide_errors = true; scenario screen-in-scenario-error [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 97 # 'a' + screen:address:screen <- print-character screen:address:screen, 97 # 'a' ] screen-should-contain [ # 01234 @@ -115,16 +115,16 @@ scenario screen-in-scenario-error [ . . ] ] -+warn: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a') ++error: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a') :(scenario screen_in_scenario_color_error) % Scenario_testing_scenario = true; -% Hide_warnings = true; +% Hide_errors = true; # screen-should-contain can check unicode characters in the fake screen scenario screen-in-scenario-color [ assume-screen 5/width, 3/height run [ - screen:address <- print-character screen:address, 97/a, 1/red + screen:address:screen <- print-character screen:address:screen, 97/a, 1/red ] screen-should-contain-in-color 2/green, [ # 01234 @@ -133,21 +133,21 @@ scenario screen-in-scenario-color [ . . ] ] -+warn: expected screen location (0, 0) to be in color 2 instead of 1 ++error: 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; :(scenarios run) -:(scenario convert_names_does_not_warn_when_mixing_special_names_and_numeric_locations) +:(scenario convert_names_does_not_fail_when_mixing_special_names_and_numeric_locations) % Scenario_testing_scenario = true; -% Hide_warnings = true; +% Hide_errors = true; recipe main [ screen:number <- copy 1:number ] --warn: mixing variable names and numeric addresses in main -$warn: 0 +-error: mixing variable names and numeric addresses in main +$error: 0 :(scenarios run_mu_scenario) :(before "End Globals") @@ -171,15 +171,13 @@ const long long int SCREEN = Next_predefined_global_for_scenarios++:(before "End Special Scenario Variable Names(r)") Name[r]["screen"] = SCREEN; -:(before "End Rewrite Instruction(curr)") +:(before "End Rewrite Instruction(curr, recipe result)") // rewrite `assume-screen width, height` to -// `screen:address <- new-fake-screen width, height` +// `screen:address:screen <- new-fake-screen width, height` if (curr.name == "assume-screen") { - curr.operation = Recipe_ordinal["new-fake-screen"]; curr.name = "new-fake-screen"; - assert(curr.operation); assert(curr.products.empty()); - curr.products.push_back(reagent("screen:address")); + curr.products.push_back(reagent("screen:address:screen")); curr.products.at(0).set_value(SCREEN); } @@ -187,7 +185,11 @@ if (curr.name == < :(before "End Primitive Recipe Declarations") SCREEN_SHOULD_CONTAIN, :(before "End Primitive Recipe Numbers") -Recipe_ordinal["screen-should-contain"] = SCREEN_SHOULD_CONTAIN; +put(Recipe_ordinal, "screen-should-contain", SCREEN_SHOULD_CONTAIN); +:(before "End Primitive Recipe Checks") +case SCREEN_SHOULD_CONTAIN: { + break; +} :(before "End Primitive Recipe Implementations") case SCREEN_SHOULD_CONTAIN: { if (!Passed) break; @@ -198,7 +200,11 @@ case SCREEN_SHOULD_CONTAIN: { :(before "End Primitive Recipe Declarations") SCREEN_SHOULD_CONTAIN_IN_COLOR, :(before "End Primitive Recipe Numbers") -Recipe_ordinal["screen-should-contain-in-color"] = SCREEN_SHOULD_CONTAIN_IN_COLOR; +put(Recipe_ordinal, "screen-should-contain-in-color", SCREEN_SHOULD_CONTAIN_IN_COLOR); +:(before "End Primitive Recipe Checks") +case SCREEN_SHOULD_CONTAIN_IN_COLOR: { + break; +} :(before "End Primitive Recipe Implementations") case SCREEN_SHOULD_CONTAIN_IN_COLOR: { if (!Passed) break; @@ -223,16 +229,16 @@ struct raw_string_stream { :(code) 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"); + assert(!current_call().default_space); // not supported + long long int screen_location = get_or_insert(Memory, SCREEN); + int data_offset = find_element_name(get(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_start = get_or_insert(Memory, screen_data_location); // type: array:character + int width_offset = find_element_name(get(Type_ordinal, "screen"), "num-columns", ""); + long long int screen_width = get_or_insert(Memory, screen_location+width_offset); + int height_offset = find_element_name(get(Type_ordinal, "screen"), "num-rows", ""); + long long int screen_height = get_or_insert(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 @@ -243,21 +249,21 @@ void check_screen(const string& expected_cont 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]) { + if (get_or_insert(Memory, addr) == 0 && isspace(curr)) continue; + if (curr == ' ' && color != -1 && color != get_or_insert(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 (get_or_insert(Memory, addr) != 0 && Memory[addr] == curr) { + if (color == -1 || color == get_or_insert(Memory, addr+cell_color_offset)) continue; // contents match but color is off 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(); + raise_error << "\nF - " << Current_scenario->name << ": expected screen location (" << row << ", " << column << ", address " << addr << ", value " << no_scientific(get_or_insert(Memory, addr)) << ") to be in color " << color << " instead of " << no_scientific(Memory[addr+cell_color_offset]) << "\n" << end(); } 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(); + raise_error << "expected screen location (" << row << ", " << column << ") to be in color " << color << " instead of " << no_scientific(get_or_insert(Memory, addr+cell_color_offset)) << '\n' << end(); } if (!Scenario_testing_scenario) { Passed = false; @@ -267,26 +273,28 @@ void check_screen(const string& expected_cont } // really a mismatch - // can't print multi-byte unicode characters in warnings just yet. not very useful for debugging anyway. + // can't print multi-byte unicode characters in errors just yet. not very useful for debugging anyway. 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'; } char actual_pretty[10] = {0}; - if (Memory[addr] < 256 && !iscntrl(Memory[addr])) { + if (get_or_insert(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>(get_or_insert(Memory, addr)), actual_pretty[4] = '\'', actual_pretty[5] = ')', actual_pretty[6] = '\0'; } + ostringstream color_phrase; + if (color != -1) color_phrase << " in color " << color; 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(); + raise_error << "\nF - " << Current_scenario->name << ": expected screen location (" << row << ", " << column << ") to contain " << curr << expected_pretty << color_phrase.str() << " instead of " << no_scientific(get_or_insert(Memory, addr)) << actual_pretty << '\n' << end(); dump_screen(); } else { // just testing check_screen - raise << "expected screen location (" << row << ", " << column << ") to contain " << curr << expected_pretty << " instead of " << Memory[addr] << actual_pretty << '\n' << end(); + raise_error << "expected screen location (" << row << ", " << column << ") to contain " << curr << expected_pretty << color_phrase.str() << " instead of " << no_scientific(get_or_insert(Memory, addr)) << actual_pretty << '\n' << end(); } if (!Scenario_testing_scenario) { Passed = false; @@ -305,7 +313,7 @@ raw_string_stream::raw_string_stream(const string 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(); + raise_error << "unicode string seems corrupted at index "<< index << " character " << static_cast<int>(buf[index]) << '\n' << end(); return true; } return false; @@ -343,7 +351,11 @@ void raw_string_stream::skip_whitespace_and_comments():(before "End Primitive Recipe Declarations") _DUMP_SCREEN, :(before "End Primitive Recipe Numbers") -Recipe_ordinal["$dump-screen"] = _DUMP_SCREEN; +put(Recipe_ordinal, "$dump-screen", _DUMP_SCREEN); +:(before "End Primitive Recipe Checks") +case _DUMP_SCREEN: { + break; +} :(before "End Primitive Recipe Implementations") case _DUMP_SCREEN: { dump_screen(); @@ -352,23 +364,23 @@ case _DUMP_SCREEN: { :(code) 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"); + assert(!current_call().default_space); // not supported + long long int screen_location = get_or_insert(Memory, SCREEN); + int width_offset = find_element_name(get(Type_ordinal, "screen"), "num-columns", ""); + long long int screen_width = get_or_insert(Memory, screen_location+width_offset); + int height_offset = find_element_name(get(Type_ordinal, "screen"), "num-rows", ""); + long long int screen_height = get_or_insert(Memory, screen_location+height_offset); + int data_offset = find_element_name(get(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 - assert(Memory[screen_data_start] == screen_width*screen_height); + long long int screen_data_start = get_or_insert(Memory, screen_data_location); // type: array:character + assert(get_or_insert(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) { cerr << '.'; for (long long int col = 0; col < screen_width; ++col) { - if (Memory[curr]) - cerr << to_unicode(Memory[curr]); + if (get_or_insert(Memory, curr)) + cerr << to_unicode(static_cast<uint32_t>(get_or_insert(Memory, curr))); else cerr << ' '; curr += /*size of screen-cell*/2; -- cgit 1.4.1-2-gfad0