IRC parsing, tokenization, and state handling in C#
at tunit 51 lines 1.8 kB view raw
1using System.Globalization; 2using IRCSharp.Tests.Tokenization.Data; 3using YamlDotNet.Serialization; 4using YamlDotNet.Serialization.NamingConventions; 5 6namespace IRCSharp.Tests.Tokenization; 7 8public class Parser 9{ 10 private static T LoadYaml<T>(string path) 11 { 12 return new DeserializerBuilder() 13 .WithNamingConvention(CamelCaseNamingConvention.Instance) 14 .Build() 15 .Deserialize<T>(File.ReadAllText(path)); 16 } 17 18 [Test] 19 public async Task Split() 20 { 21 foreach (var test in LoadYaml<SplitModel>("Tokenization/Data/msg-split.yaml").Tests) 22 { 23 var tokens = new Line(test.Input); 24 var atoms = test.Atoms; 25 26 await Assert.That(tokens.Command).IsEqualTo(atoms.Verb.ToUpper(CultureInfo.InvariantCulture)) 27 .Because($"command failed on: '{test.Input}'"); 28 await Assert.That(tokens.Source).IsEqualTo(atoms.Source) 29 .Because($"source failed on: '{test.Input}'"); 30 await Assert.That(tokens.Tags).IsEquivalentTo(atoms.Tags) 31 .Because($"tags failed on: '{test.Input}'"); 32 await Assert.That(tokens.Params).IsEquivalentTo(atoms.Params ?? []) 33 .Because($"params failed on: '{test.Input}'"); 34 } 35 } 36 37 [Test] 38 public async Task Join() 39 { 40 foreach (var test in LoadYaml<JoinModel>("Tokenization/Data/msg-join.yaml").Tests) 41 { 42 var atoms = test.Atoms; 43 var line = new Line 44 { 45 Command = atoms.Verb, Params = atoms.Params, Source = atoms.Source, Tags = atoms.Tags 46 }.Format(); 47 48 await Assert.That(test.Matches.Contains(line)).IsTrue().Because(test.Description); 49 } 50 } 51}