using System.Collections.Generic; using System.Text; using Cthangover.Core.Mods.Testing; namespace Mods.ModManager.Tests { /// Colouring preserves source literally and recognises each supported fence grammar. public class ModCodeSyntaxTests { [ModTest("documentation/code_languages")] static void Languages(ModTestContext ctx) { ModAssert.Equal("csharp", ModCodeSyntax.Language(" C# title=example ")); ModAssert.Equal("gdscript", ModCodeSyntax.Language("GD")); ModAssert.Equal("bash", ModCodeSyntax.Language("shell")); ModAssert.Equal("yaml", ModCodeSyntax.Language("yml")); ModAssert.Equal("glsl", ModCodeSyntax.Language("gdshader")); ModAssert.Equal("", ModCodeSyntax.Language(null)); ModAssert.Equal("unknown", ModCodeSyntax.Language("unknown")); } [ModTest("documentation/code_jsonc")] static void Jsonc(ModTestContext ctx) { const string source = "{\r\n\t\"name\": \"// literal \\\"quoted\\\" Русский\", // comment\r\n \"enabled\": true, /* two\nlines */ \"count\": 22\n} "; var spans = ModCodeSyntax.Tokenize("jsonc", source); ModAssert.Equal(source, Join(spans), "all whitespace and Unicode preserved"); Expect(spans, "\"name\"", "attr"); Expect(spans, "\"// literal \\\"quoted\\\" Русский\"", "string"); Expect(spans, "// comment", "comment"); Expect(spans, "/* two\nlines */", "comment"); Expect(spans, "true", "literal"); Expect(spans, "22", "number"); } [ModTest("documentation/code_site_languages")] static void SiteLanguages(ModTestContext ctx) { Expect(ModCodeSyntax.Tokenize("csharp", "public class Example { var value = 42; }"), "public", "keyword"); Expect(ModCodeSyntax.Tokenize("gdscript", "func start():\n # comment\n return true"), "func", "keyword"); var scenario = ModCodeSyntax.Tokenize("scenario", "scene: intro\n---\ntext \"# literal\" key=intro\noption \"Go\" -> :next\n-- comment"); Expect(scenario, "text", "keyword"); Expect(scenario, "\"# literal\"", "string"); Expect(scenario, "key", "attr"); Expect(scenario, ":next", "label"); Expect(scenario, "---", "meta"); Expect(scenario, "-- comment", "comment"); var tree = ModCodeSyntax.Tokenize("filestree", "mods/\n└── music_pack/ # shared music\n └── manifest.json"); Expect(tree, "music_pack/", "directory"); Expect(tree, "# shared music", "treecomment"); Expect(ModCodeSyntax.Tokenize("glsl", "uniform vec4 color;\nvoid fragment() { COLOR = color; }"), "uniform", "keyword"); Expect(ModCodeSyntax.Tokenize("bash", "export GAME=demo # comment\necho $GAME"), "$GAME", "variable"); Expect(ModCodeSyntax.Tokenize("python", "def start():\n return True"), "def", "keyword"); Expect(ModCodeSyntax.Tokenize("yaml", "enabled: true\ncount: 22"), "enabled", "attr"); Expect(ModCodeSyntax.Tokenize("ini", "[section]\nname=value\n# comment"), "[section]", "meta"); Expect(ModCodeSyntax.Tokenize("properties", "mod/name=Музыка\n"), "Музыка", "string"); } [ModTest("documentation/code_plain_fallback")] static void PlainFallback(ModTestContext ctx) { const string literal = "[url=javascript:bad]literal[/url]