diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-05-01 15:56:43 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-05-01 16:53:26 -0700 |
commit | c0ac457610db622d8f77c7317cab4c418c94c8c5 (patch) | |
tree | 772abcd98f180ee523113eae238c88c58e5acd78 /cpp | |
parent | 0a8b00c06d4a41b3604c7f8c5065d93296848d78 (diff) | |
download | mu-c0ac457610db622d8f77c7317cab4c418c94c8c5.tar.gz |
1231
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/.traces/memory_check | 18 | ||||
-rw-r--r-- | cpp/.traces/memory_check_multiple | 23 | ||||
-rw-r--r-- | cpp/.traces/memory_check_string | 52 | ||||
-rw-r--r-- | cpp/.traces/memory_check_string_length | 52 | ||||
-rw-r--r-- | cpp/049scenario_helpers.cc | 109 |
5 files changed, 254 insertions, 0 deletions
diff --git a/cpp/.traces/memory_check b/cpp/.traces/memory_check new file mode 100644 index 00000000..2f883ae7 --- /dev/null +++ b/cpp/.traces/memory_check @@ -0,0 +1,18 @@ +parse/0: instruction: memory-should-contain +parse/0: ingredient: {name: " + 1 <- 13 + ", value: 0, type: 0, properties: [" + 1 <- 13 + ": "literal-string"]} +after-brace/0: recipe main +after-brace/0: memory-should-contain ... +new/0: routine allocated memory from 1000 to 101000 +schedule/0: main +run/0: instruction main/0 +run/0: memory-should-contain {name: " + 1 <- 13 + ", value: 0, type: 0, properties: [" + 1 <- 13 + ": "literal-string"]} +run/0: checking location 1 +warn/0: expected location 1 to contain 13 but saw 0 diff --git a/cpp/.traces/memory_check_multiple b/cpp/.traces/memory_check_multiple new file mode 100644 index 00000000..230bdc6f --- /dev/null +++ b/cpp/.traces/memory_check_multiple @@ -0,0 +1,23 @@ +parse/0: instruction: memory-should-contain +parse/0: ingredient: {name: " + 1 <- 0 + 1 <- 0 + ", value: 0, type: 0, properties: [" + 1 <- 0 + 1 <- 0 + ": "literal-string"]} +after-brace/0: recipe main +after-brace/0: memory-should-contain ... +new/0: routine allocated memory from 1000 to 101000 +schedule/0: main +run/0: instruction main/0 +run/0: memory-should-contain {name: " + 1 <- 0 + 1 <- 0 + ", value: 0, type: 0, properties: [" + 1 <- 0 + 1 <- 0 + ": "literal-string"]} +run/0: checking location 1 +warn/0: duplicate expectation for location 1 +run/0: checking location 1 diff --git a/cpp/.traces/memory_check_string b/cpp/.traces/memory_check_string new file mode 100644 index 00000000..d81ccd3e --- /dev/null +++ b/cpp/.traces/memory_check_string @@ -0,0 +1,52 @@ +parse/0: instruction: copy +parse/0: ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]} +parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} +parse/0: instruction: copy +parse/0: ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]} +parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} +parse/0: instruction: copy +parse/0: ingredient: {name: "98", value: 0, type: 0, properties: ["98": "literal"]} +parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} +parse/0: instruction: copy +parse/0: ingredient: {name: "99", value: 0, type: 0, properties: ["99": "literal"]} +parse/0: product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]} +parse/0: instruction: memory-should-contain +parse/0: ingredient: {name: " + 1:string <- [abc] + ", value: 0, type: 0, properties: [" + 1:string <- [abc] + ": "literal-string"]} +after-brace/0: recipe main +after-brace/0: copy ... +after-brace/0: copy ... +after-brace/0: copy ... +after-brace/0: copy ... +after-brace/0: memory-should-contain ... +new/0: routine allocated memory from 1000 to 101000 +schedule/0: main +run/0: instruction main/0 +run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy {name: "3", value: 3, type: 0, properties: ["3": "literal"]} +run/0: ingredient 0 is 3 +mem/0: storing 3 in location 1 +run/0: instruction main/1 +run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- copy {name: "97", value: 97, type: 0, properties: ["97": "literal"]} +run/0: ingredient 0 is 97 +mem/0: storing 97 in location 2 +run/0: instruction main/2 +run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- copy {name: "98", value: 98, type: 0, properties: ["98": "literal"]} +run/0: ingredient 0 is 98 +mem/0: storing 98 in location 3 +run/0: instruction main/3 +run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy {name: "99", value: 99, type: 0, properties: ["99": "literal"]} +run/0: ingredient 0 is 99 +mem/0: storing 99 in location 4 +run/0: instruction main/4 +run/0: memory-should-contain {name: " + 1:string <- [abc] + ", value: 0, type: 0, properties: [" + 1:string <- [abc] + ": "literal-string"]} +run/0: checking array length at 1 +run/0: checking location 2 +run/0: checking location 3 +run/0: checking location 4 diff --git a/cpp/.traces/memory_check_string_length b/cpp/.traces/memory_check_string_length new file mode 100644 index 00000000..13ddd812 --- /dev/null +++ b/cpp/.traces/memory_check_string_length @@ -0,0 +1,52 @@ +parse/0: instruction: copy +parse/0: ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]} +parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]} +parse/0: instruction: copy +parse/0: ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]} +parse/0: product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]} +parse/0: instruction: copy +parse/0: ingredient: {name: "98", value: 0, type: 0, properties: ["98": "literal"]} +parse/0: product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]} +parse/0: instruction: copy +parse/0: ingredient: {name: "99", value: 0, type: 0, properties: ["99": "literal"]} +parse/0: product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]} +parse/0: instruction: memory-should-contain +parse/0: ingredient: {name: " + 1:string <- [ab] + ", value: 0, type: 0, properties: [" + 1:string <- [ab] + ": "literal-string"]} +after-brace/0: recipe main +after-brace/0: copy ... +after-brace/0: copy ... +after-brace/0: copy ... +after-brace/0: copy ... +after-brace/0: memory-should-contain ... +new/0: routine allocated memory from 1000 to 101000 +schedule/0: main +run/0: instruction main/0 +run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy {name: "3", value: 3, type: 0, properties: ["3": "literal"]} +run/0: ingredient 0 is 3 +mem/0: storing 3 in location 1 +run/0: instruction main/1 +run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- copy {name: "97", value: 97, type: 0, properties: ["97": "literal"]} +run/0: ingredient 0 is 97 +mem/0: storing 97 in location 2 +run/0: instruction main/2 +run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- copy {name: "98", value: 98, type: 0, properties: ["98": "literal"]} +run/0: ingredient 0 is 98 +mem/0: storing 98 in location 3 +run/0: instruction main/3 +run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy {name: "99", value: 99, type: 0, properties: ["99": "literal"]} +run/0: ingredient 0 is 99 +mem/0: storing 99 in location 4 +run/0: instruction main/4 +run/0: memory-should-contain {name: " + 1:string <- [ab] + ", value: 0, type: 0, properties: [" + 1:string <- [ab] + ": "literal-string"]} +run/0: checking array length at 1 +warn/0: expected location 1 to contain length 2 of string [ab] but saw 3 +run/0: checking location 2 +run/0: checking location 3 diff --git a/cpp/049scenario_helpers.cc b/cpp/049scenario_helpers.cc index 8234c21f..a647db33 100644 --- a/cpp/049scenario_helpers.cc +++ b/cpp/049scenario_helpers.cc @@ -42,3 +42,112 @@ recipe main [ ] +mem: storing 13 in location 1 +mem: storing 13 in location 2 + +:(scenario memory_check) +% Hide_warnings = true; +recipe main [ + memory-should-contain [ + 1 <- 13 + ] +] ++run: checking location 1 ++warn: expected location 1 to contain 13 but saw 0 + +:(before "End Primitive Recipe Declarations") +MEMORY_SHOULD_CONTAIN, +:(before "End Primitive Recipe Numbers") +Recipe_number["memory-should-contain"] = MEMORY_SHOULD_CONTAIN; +:(before "End Primitive Recipe Implementations") +case MEMORY_SHOULD_CONTAIN: { +//? cout << current_instruction().ingredients[0].name << '\n'; //? 1 + check_memory(current_instruction().ingredients[0].name); + break; +} + +:(code) +void check_memory(const string& s) { + istringstream in(s); + in >> std::noskipws; + set<size_t> locations_checked; + while (true) { + skip_whitespace_and_comments(in); + if (in.eof()) break; + string lhs = next_word(in); + if (!is_number(lhs)) { + check_type(lhs, in); + continue; + } + int address = to_int(lhs); + skip_whitespace_and_comments(in); + string _assign; in >> _assign; assert(_assign == "<-"); + skip_whitespace_and_comments(in); + int value = 0; in >> value; + if (locations_checked.find(address) != locations_checked.end()) + raise << "duplicate expectation for location " << address << '\n'; + trace("run") << "checking location " << address; + if (Memory[address] != value) + raise << "expected location " << address << " to contain " << value << " but saw " << Memory[address] << '\n'; + locations_checked.insert(address); + } +} + +void check_type(const string& lhs, istream& in) { + reagent x(lhs); + if (x.properties[0].second[0] == "string") { + x.set_value(to_int(x.name)); + skip_whitespace_and_comments(in); + string _assign = next_word(in); + assert(_assign == "<-"); + skip_whitespace_and_comments(in); + string literal = next_word(in); + size_t address = x.value; + trace("run") << "checking array length at " << address; + if (Memory[address] != static_cast<signed>(literal.size()-2)) // exclude quoting brackets + raise << "expected location " << address << " to contain length " << literal.size()-2 << " of string " << literal << " but saw " << Memory[address] << '\n'; + for (size_t i = 1; i < literal.size()-1; ++i) { + trace("run") << "checking location " << address+i; + if (Memory[address+i] != literal[i]) + raise << "expected location " << (address+i) << " to contain " << literal[i] << " but saw " << Memory[address+i] << '\n'; + } + return; + } + raise << "don't know how to check memory for " << lhs << '\n'; +} + +:(scenario memory_check_multiple) +% Hide_warnings = true; +recipe main [ + memory-should-contain [ + 1 <- 0 + 1 <- 0 + ] +] ++warn: duplicate expectation for location 1 + +:(scenario memory_check_string_length) +% Hide_warnings = true; +recipe main [ + 1:integer <- copy 3:literal + 2:integer <- copy 97:literal # 'a' + 3:integer <- copy 98:literal # 'b' + 4:integer <- copy 99:literal # 'c' + memory-should-contain [ + 1:string <- [ab] + ] +] ++warn: expected location 1 to contain length 2 of string [ab] but saw 3 + +:(scenario memory_check_string) +recipe main [ + 1:integer <- copy 3:literal + 2:integer <- copy 97:literal # 'a' + 3:integer <- copy 98:literal # 'b' + 4:integer <- copy 99:literal # 'c' + memory-should-contain [ + 1:string <- [abc] + ] +] ++run: checking array length at 1 ++run: checking location 2 ++run: checking location 3 ++run: checking location 4 |