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 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]}"); } }
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); }