コード例 #1
0
        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()));
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
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);
        }
コード例 #4
0
        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));
            }
        }
コード例 #5
0
        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); // ???
        }
コード例 #6
0
        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));
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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");
            }
        }
コード例 #9
0
ファイル: Demo.cs プロジェクト: gitter-badger/dialogic
        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");
            }
        }
コード例 #10
0
ファイル: Editor.cs プロジェクト: johannahrodgers/dialogic
        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);
        }
コード例 #11
0
ファイル: Editor.cs プロジェクト: johannahrodgers/dialogic
        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);
        }
コード例 #12
0
        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"));
        }
コード例 #13
0
ファイル: Demo.cs プロジェクト: siusoon/dialogic
        /// <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);
                }
            }
        }