about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-01 15:56:43 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-01 16:53:26 -0700
commitc0ac457610db622d8f77c7317cab4c418c94c8c5 (patch)
tree772abcd98f180ee523113eae238c88c58e5acd78 /cpp
parent0a8b00c06d4a41b3604c7f8c5065d93296848d78 (diff)
downloadmu-c0ac457610db622d8f77c7317cab4c418c94c8c5.tar.gz
1231
Diffstat (limited to 'cpp')
-rw-r--r--cpp/.traces/memory_check18
-rw-r--r--cpp/.traces/memory_check_multiple23
-rw-r--r--cpp/.traces/memory_check_string52
-rw-r--r--cpp/.traces/memory_check_string_length52
-rw-r--r--cpp/049scenario_helpers.cc109
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