IRC parsing, tokenization, and state handling in C#
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}