diff --git a/index.html b/index.html
index d39158d63..a3304202f 100644
--- a/index.html
+++ b/index.html
@@ -28,6 +28,9 @@
+
+
+
diff --git a/src/Netscript/NetscriptWorker.js b/src/Netscript/NetscriptWorker.js
index 3f2546586..95110ad8a 100644
--- a/src/Netscript/NetscriptWorker.js
+++ b/src/Netscript/NetscriptWorker.js
@@ -3,6 +3,8 @@
//this flag from outside. If the evaluate() function sees that flag it rejects the current
// Promise. We can catch that rejection and stop the script.
+//TODO Tested For and while and generic call statements. Have not tested if statements
+
/* Actual Worker Code */
function WorkerScript() {
this.name = "";
diff --git a/src/Terminal.js b/src/Terminal.js
index 23ff9fa0c..c1e286cf4 100644
--- a/src/Terminal.js
+++ b/src/Terminal.js
@@ -1,3 +1,13 @@
+function TestObj() {
+ this.value = 1;
+}
+
+TestObj.prototype.setValue = function(val) {
+ this.value = val;
+}
+
+var testObj = new TestObj();
+
//Terminal
var post = function(input) {
$("#terminal-input").before('
' + input.replace( / /g, " " ) + ' |
');
@@ -365,17 +375,30 @@ var Terminal = {
break;
case "test":
- //TODO
- //TESTED: print, for loops, while loops, prog,
- // basic ops, var, assign all seem fine
- //UNTESTED: if, elif, else
-
- var code = "i = 0; while (i <= 20) {print(i); i = i+2; hack(); sleep();}";
- var ast = Parser(Tokenizer(InputStream(code)));
- console.log("Printing AST below")
- console.log(ast);
- var globalEnv = new Environment();
- evaluate(ast, globalEnv);
+ post(testObj.value.toString());
+ testObj.setValue(testObj.value + 1);
+ break;
+ case "testSave":
+ var testSave = JSONfn.stringify(testObj);
+ window.localStorage.setItem("netburnerTest", testSave);
+ console.log("Netburner TestSave saved");
+ break;
+ case "testLoad":
+ if (!window.localStorage.getItem("netburnerTest")) {
+ console.log("No TestSave file to load");
+ } else {
+ var testSave = window.localStorage.getItem("netburnerTest");
+ testObj = JSONfn.parse(testSave);
+ console.log("TestSave loaded");
+ }
+ break;
+ case "testDelete":
+ if (!window.localStorage.getItem("netburnetTest")) {
+ console.log("No TestSave file to delete");
+ } else {
+ window.localStorage.removeItem("netburnerTest");
+ console.log("TestSave deleted");
+ }
break;
default:
post("Command not found");
diff --git a/utils/JSONReviver.js b/utils/JSONReviver.js
new file mode 100644
index 000000000..4491374cf
--- /dev/null
+++ b/utils/JSONReviver.js
@@ -0,0 +1,65 @@
+/* Generic Reviver, toJSON, and fromJSON functions used for saving and loading objects */
+
+// A generic "smart reviver" function.
+// Looks for object values with a `ctor` property and
+// a `data` property. If it finds them, and finds a matching
+// constructor that has a `fromJSON` property on it, it hands
+// off to that `fromJSON` fuunction, passing in the value.
+function Reviver(key, value) {
+ var ctor;
+
+ if (typeof value === "object" &&
+ typeof value.ctor === "string" &&
+ typeof value.data !== "undefined") {
+ ctor = Reviver.constructors[value.ctor] || window[value.ctor];
+ if (typeof ctor === "function" &&
+ typeof ctor.fromJSON === "function") {
+ return ctor.fromJSON(value);
+ }
+ }
+ return value;
+}
+Reviver.constructors = {}; // A list of constructors the smart reviver should know about
+
+// A generic "toJSON" function that creates the data expected
+// by Reviver.
+// `ctorName` The name of the constructor to use to revive it
+// `obj` The object being serialized
+// `keys` (Optional) Array of the properties to serialize,
+// if not given then all of the objects "own" properties
+// that don't have function values will be serialized.
+// (Note: If you list a property in `keys`, it will be serialized
+// regardless of whether it's an "own" property.)
+// Returns: The structure (which will then be turned into a string
+// as part of the JSON.stringify algorithm)
+function Generic_toJSON(ctorName, obj, keys) {
+ var data, index, key;
+
+ if (!keys) {
+ keys = Object.keys(obj); // Only "own" properties are included
+ }
+
+ data = {};
+ for (index = 0; index < keys.length; ++index) {
+ key = keys[index];
+ data[key] = obj[key];
+ }
+ return {ctor: ctorName, data: data};
+}
+
+// A generic "fromJSON" function for use with Reviver: Just calls the
+// constructor function with no arguments, then applies all of the
+// key/value pairs from the raw data to the instance. Only useful for
+// constructors that can be reasonably called without arguments!
+// `ctor` The constructor to call
+// `data` The data to apply
+// Returns: The object
+function Generic_fromJSON(ctor, data) {
+ var obj, name;
+
+ obj = new ctor();
+ for (name in data) {
+ obj[name] = data[name];
+ }
+ return obj;
+}
\ No newline at end of file