예제 #1
0
        public void AssertResource(string name)
        {
            var parser = new AnnotationParser();

            parser.RegisterAnnotation <AssertInspectionAnnotation>();
            SkriptFile file = null;

            var host = new InspectionDelegatingHost((uri, list) =>
            {
                foreach (var diagnostic in list)
                {
                    // ReSharper disable AccessToModifiedClosure
                    Debug.Assert(file != null, nameof(file) + " != null");

                    var node = file.Nodes[diagnostic.Range.Start.Line];

                    //TODO: Allow multiple annotations to a single node by parsing the comments directly above.
                    var comment = node.RawComment.TrimStart('#').Trim();
                    if (!comment.StartsWith("@"))
                    {
                        continue;
                    }

                    var annotation = parser.TryParse(comment);

                    switch (annotation)
                    {
                    case AssertInspectionAnnotation assertInspectionAnnotation:
                        Assert.Equal(assertInspectionAnnotation.InspectionType, diagnostic.Code);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(annotation));
                    }


                    // ReSharper restore AccessToModifiedClosure
                }
            });

            WorkspaceManager.CurrentHost = host;
            var current = WorkspaceManager.CurrentWorkspace;

            var code = ReadResource(name);

            file = new SkriptFile(new Uri($"memory://{name}"));

            file.HandleChange(new TextDocumentContentChangeEvent
            {
                Text = code
            });

            file.PrepareNodes();

            parser.UnregisterAnnotation <AssertInspectionAnnotation>();
        }
        public void MatchesMessagePlayer(string code, int expectedMatches)
        {
            var file = new SkriptFile(new Uri("memory://file"))
            {
                RawContents = ("on chat:\n" +
                               "    " + code).SplitOnNewLines()
            };

            WorkspaceManager.Instance.HandleOpenedFile(file);
            file.PrepareNodes();
            var effMessageNode = file.Nodes[1];

            Assert.NotNull(effMessageNode);
            Assert.NotNull(effMessageNode.MatchedSyntax);
            Assert.True(effMessageNode.MatchedSyntax.Result.IsSuccess);
            Assert.Equal(expectedMatches, effMessageNode.MatchedSyntax.Result.Matches.Count);
        }
        public void EmptyUnitTest()
        {
            Debugger.Break();
            var code = "{_test}.hello().world().bruh()";

            var file = new SkriptFile(new Uri("memory://file"))
            {
                RawContents = ("on chat:\n" +
                               "    " + code).SplitOnNewLines()
            };

            WorkspaceManager.Instance.HandleOpenedFile(file);
            file.PrepareNodes();

            var node = file.Nodes[1];

            Debugger.Break();
            _testOutputHelper.WriteLine(node.ToJson());
        }
예제 #4
0
        public void KnowsHowToParseSimpleSendEffect()
        {
            var url      = new Uri("memory://file1");
            var contents = "on chat\n    send \"hi\"".SplitOnNewLines();
            var file     = new SkriptFile(url)
            {
                RawContents = contents
            };

            WorkspaceManager.Instance.HandleOpenedFile(file);
            file.PrepareNodes();

            file.HandleChange(new TextDocumentContentChangeEvent
            {
                Range       = RangeExtensions.From(0, 7, 7),
                RangeLength = 1,
                Text        = ":"
            });

            Assert.Equal(2, file.Nodes.Count);

            //Basic node match just to be sure
            for (var i = 0; i < file.Nodes.Count; i++)
            {
                Assert.Equal(contents[i], file.Nodes[i].ToString());
            }


            var results = new[] { "org.bukkit.event.player.AsyncPlayerChatEvent", "ch.njol.skript.effects.EffMessage" };

            for (var i = 0; i < results.Length; i++)
            {
                Assert.True(file.Nodes[i].IsMatchOfType(results[i]),
                            $"{i}: {file.Nodes[i].NodeContent} supposed to be {results[i]}");
            }
        }
예제 #5
0
        public void KnowsHowToHandleParentsAndChildren()
        {
            var url      = new Uri("memory://file1");
            var contents = (
                "on chat\n" +
                "    if message contains \"h\"\n" +
                "        if message contains \"i\"\n" +
                "            send \"hi\""
                ).SplitOnNewLines();
            var file = new SkriptFile(url)
            {
                RawContents = contents
            };

            WorkspaceManager.Instance.HandleOpenedFile(file);
            file.PrepareNodes();

            file.HandleChange(new TextDocumentContentChangeEvent
            {
                Range       = RangeExtensions.From(2, 31, 31),
                RangeLength = 1,
                Text        = ":"
            });

            file.HandleChange(new TextDocumentContentChangeEvent
            {
                Range       = RangeExtensions.From(1, 27, 27),
                RangeLength = 1,
                Text        = ":"
            });

            file.HandleChange(new TextDocumentContentChangeEvent
            {
                Range       = RangeExtensions.From(0, 7, 7),
                RangeLength = 1,
                Text        = ":"
            });

            Assert.Equal(4, file.Nodes.Count);

            //Basic node match just to be sure
            for (var i = 0; i < file.Nodes.Count; i++)
            {
                Assert.Equal(contents[i], file.Nodes[i].ToString());
            }


            var results = new[]
            { "org.bukkit.event.player.AsyncPlayerChatEvent", "", "", "ch.njol.skript.effects.EffMessage" };

            for (var i = 0; i < results.Length; i++)
            {
                if (!string.IsNullOrEmpty(results[i]))
                {
                    Assert.True(file.Nodes[i].IsMatchOfType(results[i]),
                                $"{i}: {file.Nodes[i].NodeContent} supposed to be {results[i]}");
                }
            }


            Assert.Equal(file.Nodes[0], file.Nodes[1].Parent);
            Assert.Equal(file.Nodes[1], file.Nodes[2].Parent);
            Assert.Equal(file.Nodes[2], file.Nodes[3].Parent);
        }