public void SaveAndRestoreChats() { ChatRuntime rtOut, rtIn; var testfile = AppDomain.CurrentDomain.BaseDirectory; testfile += "../../../../dialogic/data/noglobal.gs"; rtIn = new ChatRuntime(Client.AppConfig.TAC); rtIn.ParseFile(new FileInfo(testfile)); var bytes = serializer.ToBytes(rtIn); rtOut = ChatRuntime.Create(serializer, bytes, AppConfig.TAC); // check they are identical Assert.That(rtIn, Is.EqualTo(rtOut)); var inCmds = rtIn.Chats(); var outCmds = rtOut.Chats(); Assert.That(rtOut.ToString(), Is.EqualTo(rtIn.ToString())); Assert.That(inCmds.Count, Is.EqualTo(outCmds.Count)); for (int i = 0; i < inCmds.Count; i++) { var chat1 = inCmds.ElementAt(i); var chat2 = outCmds.ElementAt(i); Assert.That(chat1.text, Is.EqualTo(chat2.text)); Assert.That(chat1.commands.Count, Is.EqualTo(chat2.commands.Count)); Assert.That(chat1.ToTree(), Is.EqualTo(chat2.ToTree())); } }
public void FindAll2() { string[] lines = { "CHAT c0", "FIND {dev=1,day=fri}", "CHAT c1 {day=fri}", "CHAT c2 {dev=2,day=fri}", "CHAT c3 {}" }; string contents = String.Join("\n", lines); List <Chat> chats = ChatParser.ParseText(contents, NO_VALIDATORS); //chats.ForEach((ch) => Console.WriteLine(ch.ToTree())); Command finder = chats[0].commands[0]; finder.Resolve(null); Assert.That(chats[0].commands[0].GetType(), Is.EqualTo(typeof(Find))); chats = new ChatRuntime(chats).DoFindAll((Find)finder, null); Assert.That(chats, Is.Not.Null); Assert.That(chats.Count, Is.EqualTo(2)); Assert.That(chats[0], Is.Not.Null); Assert.That(chats[0].text, Is.EqualTo("c1")); lines = new[] { "CHAT c0", "FIND {!dev=1,day=fri}", "CHAT c1 {day=fri}", "CHAT c2 {dev=2,day=fri}", "CHAT c3 {}" }; contents = String.Join("\n", lines); chats = ChatParser.ParseText(contents, NO_VALIDATORS); //chats.ForEach((ch) => Console.WriteLine(ch.ToTree())); finder = chats[0].commands[0]; finder.Resolve(null); var mdev = finder.GetMeta("dev"); Assert.That(mdev is Constraint, Is.True); Constraint cons = (Constraint)mdev; Assert.That(cons.type, Is.EqualTo(ConstraintType.Hard)); Assert.That(cons.IsStrict(), Is.True); Assert.That(finder.GetType(), Is.EqualTo(typeof(Find))); var rt = new ChatRuntime(chats); rt.Chats().ForEach(c => c.Resolve(null)); chats = rt.DoFindAll((Find)finder, null); //chats.ForEach((obj) => Console.WriteLine(obj.text)); Assert.That(chats, Is.Not.Null); Assert.That(chats.Count, Is.EqualTo(0)); }
public static string Validate(IDictionary <string, string> kvs) { var code = kvs.ContainsKey("code") ? kvs["code"] : null; if (code.IsNullOrEmpty()) { return(Result.Error ("Missing 'code' arg: " + kvs.Stringify()).ToJSON()); } var parsed = ParseScript(kvs); if (parsed.Status != Result.OK) { return(parsed.ToJSON()); } var nodes = new List <JsonNode>(); var chats = runtime.Chats(); chats.ForEach(chat => { nodes.Add(new JsonNode(chat.text, chat.OutgoingLabels(), chat.ToTree())); }); var json = JsonConvert.SerializeObject(nodes); //json = json.Replace("\"", "\\\""); // yuck //Console.WriteLine("JSN: " + json); var result = Result.Success(json).ToJSON(); //Console.WriteLine("Res: " + result); return(result); }
private void CheckEquals(ChatRuntime r1, ChatRuntime r2, bool hasDynamics = false) { // check they are identical Assert.That(r2, Is.EqualTo(r1)); // double-check the chats themselves Chat c1 = r2.Chats().First(); Chat c2 = r1.Chats().First(); Assert.That(c1, Is.EqualTo(c2)); Assert.That(c1.ToTree(), Is.EqualTo(c2.ToTree())); Assert.That(c1.text, Is.EqualTo(c2.text)); for (int i = 0; i < c1.commands.Count; i++) { var cmd1 = c1.commands[i]; var cmd2 = c2.commands[i]; Assert.That(c1.commands[i], Is.EqualTo(c2.commands[i])); } if (!hasDynamics) { // no dynamics, so output should be the same var res1 = r2.InvokeImmediate(globals); var res2 = r1.InvokeImmediate(globals); Assert.That(res1, Is.EqualTo(res2)); } }
public void RuntimeIndexTest() { var rt = new ChatRuntime(); rt.ParseText("CHAT c1\nSAY OK"); Assert.That(rt.Chats()[0], Is.Not.Null); Assert.That(rt["c1"], Is.Not.Null); // ??? }
public void SaveAndRestoreChatWithAsk() { var lines = new[] { "CHAT Test {type=a,stage=b}", "ASK Is it ok?", "OPT yes #next ", "OPT no #next", "CHAT next {type=a,stage=b}", "SAY Done", }; Chat c1, c2; ChatRuntime rtOut, rtIn; var text = String.Join("\n", lines); rtIn = new ChatRuntime(Client.AppConfig.TAC); rtIn.ParseText(text); // serialize the runtime to bytes var bytes = serializer.ToBytes(rtIn); // create a new runtime from the bytes rtOut = ChatRuntime.Create(serializer, bytes, AppConfig.TAC); // check they are identical Assert.That(rtIn, Is.EqualTo(rtOut)); // double-check the chats themselves c1 = rtIn.Chats().First(); c2 = rtOut.Chats().First(); //Console.WriteLine(c1.ToTree()+"\n\n"+c2.ToTree()); Assert.That(c1, Is.EqualTo(c2)); Assert.That(c1.ToTree(), Is.EqualTo(c2.ToTree())); Assert.That(c1.text, Is.EqualTo(c2.text)); for (int i = 0; i < c1.commands.Count; i++) { var cmd1 = c1.commands[i]; Assert.That(cmd1.parent, Is.Not.Null); var cmd2 = c2.commands[i]; Assert.That(cmd2.parent, Is.Not.Null); Assert.That(c1.commands[i], Is.EqualTo(c2.commands[i])); } // no dynamics, so output should be the same var res1 = rtIn.InvokeImmediate(globals); var res2 = rtOut.InvokeImmediate(globals); Assert.That(res1, Is.EqualTo(res2)); }
private static string DoSay(ChatRuntime rt, string s) { var globs = new Dictionary <string, object> { { "ant", "hello" } }; rt.chats = new Dictionary <string, Chat>(); rt.ParseText(s); Say say = (Dialogic.Say)rt.Chats().First().commands.First(); say.Resolve(globs); s = say.Text(); //Console.WriteLine(s); return(s); }
public void SerializationPerformance() { if (!RUN_PROFILING_TESTS) { return; } ChatRuntime.VERIFY_UNIQUE_CHAT_LABELS = false; ChatRuntime rtOut, rtIn; byte[] bytes = null; int iterations = 10; var testfile = AppDomain.CurrentDomain.BaseDirectory; testfile += "../../../../dialogic/data/allchats.gs"; rtIn = new ChatRuntime(Client.AppConfig.TAC); var watch = System.Diagnostics.Stopwatch.StartNew(); for (int i = 0; i < iterations; i++) { rtIn.ParseFile(new FileInfo(testfile)); } var numChats = rtIn.Chats().Count; watch.Stop(); Console.WriteLine("Parsed " + numChats + " chats in " + watch.ElapsedMilliseconds / 1000.0 + "s"); for (int i = 0; i < iterations; i++) { watch = System.Diagnostics.Stopwatch.StartNew(); bytes = serializer.ToBytes(rtIn); watch.Stop(); Console.WriteLine("Serialize #" + i + ": " + watch.ElapsedMilliseconds / 1000.0 + "s"); } for (int i = 0; i < iterations; i++) { watch = System.Diagnostics.Stopwatch.StartNew(); rtOut = ChatRuntime.Create(serializer, bytes, AppConfig.TAC); watch.Stop(); Console.WriteLine("Deserialize #" + i + ": " + watch.ElapsedMilliseconds / 1000.0 + "s"); } }
public static void Profiling(string[] args) { ChatRuntime.VERIFY_UNIQUE_CHAT_LABELS = false; AppConfig config = AppConfig.TAC; ISerializer serializer = new SerializerMessagePack(); ChatRuntime rtOut, rtIn; byte[] bytes = null; int iterations = 10; var testfile = AppDomain.CurrentDomain.BaseDirectory; testfile += "../../../../dialogic/data/allchats.gs"; rtIn = new ChatRuntime(config); var watch = System.Diagnostics.Stopwatch.StartNew(); for (int i = 0; i < iterations; i++) { rtIn.ParseFile(new FileInfo(testfile)); } var numChats = rtIn.Chats().Count; watch.Stop(); Console.WriteLine("Parsed " + numChats + " chats in " + watch.ElapsedMilliseconds / 1000.0 + "s"); for (int i = 0; i < iterations; i++) { watch = System.Diagnostics.Stopwatch.StartNew(); bytes = serializer.ToBytes(rtIn); watch.Stop(); Console.WriteLine("Serialize #" + i + ": " + watch.ElapsedMilliseconds / 1000.0 + "s"); } for (int i = 0; i < iterations; i++) { watch = System.Diagnostics.Stopwatch.StartNew(); rtOut = ChatRuntime.Create(serializer, bytes, config); watch.Stop(); Console.WriteLine("Deserialize #" + i + ": " + watch.ElapsedMilliseconds / 1000.0 + "s"); } }
public static string SendVisualizerResponse(HttpListenerRequest request) { var testfile = "data/network.gs"; var html = PageContent.Replace("%%URL%%", SERVER_URL); var labels = new Dictionary <string, JsonNode>(); ISerializer serial = new Client.SerializerMessagePack(); runtime = new ChatRuntime(Client.AppConfig.TAC); runtime.ParseFile(new FileInfo(testfile)); runtime.Chats().ForEach(chat => { labels[chat.text] = new JsonNode(chat.text, chat.OutgoingLabels(), chat.ToTree()); //JsonConvert.SerializeObject(ChatData.Create(chat))); }); var json = NodesToJSON(labels); html = html.Replace("%%DATA%%", json); Console.WriteLine(json); return(html); }
public static string SendEditorResponse(HttpListenerRequest request) { var html = PageContent.Replace("%%URL%%", SERVER_URL); var wmsg = "Enter your script here"; IDictionary <string, string> kvs = ParsePostData(request); var path = kvs.ContainsKey("path") ? kvs["path"] : null; var code = kvs.ContainsKey("code") ? kvs["code"] : null; var mode = kvs.ContainsKey("mode") ? kvs["mode"] : "validate"; // fetch code from file if (!string.IsNullOrEmpty(path)) { code = new WebClient().DownloadString(path); } // default info message if (string.IsNullOrEmpty(code)) { return(html.Replace("%%CODE%%", wmsg)); } html = html.Replace("%%CODE%%", WebUtility.HtmlEncode(code)); html = html.Replace("%%CCLASS%%", "shown"); // only process the selection if there is one if (kvs.ContainsKey("selectionStart")) { code = kvs["selection"]; html = html.Replace("%%STARTINDEX%%", kvs["selectionStart"]); html = html.Replace("%%ENDINDEX%%", kvs["selectionEnd"]); } try { string content = string.Empty; var globals = new Dictionary <string, object>(); runtime = new ChatRuntime(Client.AppConfig.TAC); runtime.strictMode = false; // allow unbound symbols/functions runtime.ParseText(code, !kvs.ContainsKey("useValidators") || !kvs["useValidators"].Equals("true")); // true to disable validators runtime.Chats().ForEach(c => { content += c.ToTree() + "\n\n"; }); var result = string.Empty; if (mode == "execute") { // first run any chats marked with 'preload=true' runtime.Preload(globals); // run the first chat with all timing disabled result = WebUtility.HtmlEncode(runtime.InvokeImmediate(globals)); if (result.IsNullOrEmpty()) { result = "[empty-string]"; } } html = html.Replace("%%RESULT%%", WebUtility.HtmlEncode(content)); html = html.Replace("%%EXECUTE%%", result); html = html.Replace("%%RCLASS%%", "success"); } catch (ParseException ex) { OnError(ref html, ex, ex.lineNumber); } catch (Exception e) { OnError(ref html, e, -1); } return(html); }
public void TransformIssues() { ChatRuntime rt; string txt; Say say; Chat chat; Resolver.DBUG = false; txt = "SET $x = (a|a|a|a)\nSET test = (ok $x.Cap() | ok $x.Cap())\nSAY ($test).Cap()"; rt = new ChatRuntime(); rt.ParseText(txt); chat = rt.Chats().First(); say = (Say)chat.commands[2]; chat.Resolve(globals); //Console.WriteLine(res); Assert.That(say.Text(), Is.EqualTo("Ok A")); txt = "SET $x = (a|a|a|a)\nSET test = (ok $x.Cap() | ok $x.Cap())\nSAY $test.Cap()"; rt = new ChatRuntime(); rt.ParseText(txt); chat = rt.Chats().First(); say = (Say)chat.commands[2]; chat.Resolve(globals); //Console.WriteLine(res); Assert.That(say.Text(), Is.EqualTo("Ok A")); txt = "SAY (ok (a).Cap()).Cap()"; rt = new ChatRuntime(); rt.ParseText(txt); chat = rt.Chats().First(); say = (Say)chat.commands[0]; chat.Resolve(globals); //Console.WriteLine(res); Assert.That(say.Text(), Is.EqualTo("Ok A")); ///////////////////////////////////////////////////////////////// txt = "SET $thing1 = (cat | cat)\nSAY A $thing1, many $thing1.Pluralize()"; rt = new ChatRuntime(); rt.ParseText(txt); chat = rt.Chats().First(); say = (Say)chat.commands[1]; chat.Resolve(globals); //Console.WriteLine(res); Assert.That(say.Text(), Is.EqualTo("A cat, many cats")); txt = "SET $thing1 = (cat | cat | cat)\nSAY A $thing1 $thing1"; rt = new ChatRuntime(); rt.ParseText(txt); chat = rt.Chats().First(); say = (Say)chat.commands[1]; chat.Resolve(globals); Assert.That(say.Text(), Is.EqualTo("A cat cat")); txt = "SET $thing1 = (cat | crow | cow)\nSAY A [save=$thing1], many $save.Pluralize()"; rt = new ChatRuntime(); rt.ParseText(txt); chat = rt.Chats().First(); say = (Say)chat.commands[1]; chat.Resolve(globals); Assert.That(say.Text(), Is.EqualTo("A cat, many cats").Or.EqualTo("A crow, many crows").Or.EqualTo("A cow, many cows")); }
/// <summary> /// Start the Run loop for the engine /// </summary> public void Run() { var now = Util.Millis(); // a 'Load' event if (false) { Timers.SetTimeout(Util.Rand(4000, 6000), () => { Console.WriteLine("\n<load-event#chats>\n"); var runtime = new ChatRuntime(Client.AppConfig.TAC); runtime.ParseText(string.Join('\n', new[] { "CHAT GScriptTest {type=a,stage=b}", "*** Welcome to my updated world!!!" })); gameEvent = new LoadEvent(runtime.Chats()); }); } // a 'Save' event if (false) { Timers.SetTimeout(Util.Rand(4000, 6000), () => { var file = AppDomain.CurrentDomain.BaseDirectory; file += Util.EpochMs() + ".ser"; Console.WriteLine("\n<save-event#file=" + file + ">\n"); gameEvent = new SaveEvent(serializer, new FileInfo(file)); }); } // a 'Tap' event if (false) { Timers.SetTimeout(Util.Rand(2000, 9999), () => { Console.WriteLine("\n<user-event#tap>" + " after " + Util.Millis(now) + "ms\n"); gameEvent = new UserEvent("Tap"); }); } var types = new[] { "critic", "shake", "tap" }; var count = 0; // a 'Resume' event if (false) { Timers.SetInterval(1000, () => { interrupted = true; var data = "{!!type = TYPE,!stage = CORE}"; data = data.Replace("TYPE", types[++count % 3]); Console.WriteLine("\n<resume-event#" + data + ">" + " after " + Util.Millis(now) + "ms\n"); gameEvent = new ResumeEvent(data); }); } while (true) { Thread.Sleep(30); IUpdateEvent ue = dialogic.Update(globals, ref gameEvent); if (ue != null) { HandleEvent(ref ue); } } }