IRC parsing, tokenization, and state handling in C#
at ircrobotsv2 100 lines 3.8 kB view raw
1namespace IRCSharp.Tests.State; 2 3public class Emit 4{ 5 private readonly Server _server = new("test"); 6 7 public Emit() 8 { 9 _server.Parse(new Line("001 nickname")); 10 } 11 12 [Test] 13 public async Task EmitJoin() 14 { 15 var emit = _server.Parse(new Line(":nickname JOIN #chan")); 16 17 await Assert.That(emit.Command).IsEqualTo("JOIN"); 18 await Assert.That(emit.Self).IsTrue(); 19 await Assert.That(emit.User).IsEqualTo(_server.Users["nickname"]); 20 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]); 21 22 emit = _server.Parse(new Line(":other JOIN #chan")); 23 await Assert.That(emit).IsNotNull(); 24 await Assert.That(emit.Command).IsEqualTo("JOIN"); 25 await Assert.That(emit.Self).IsFalse(); 26 await Assert.That(emit.User).IsEqualTo(_server.Users["other"]); 27 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]); 28 } 29 30 [Test] 31 public async Task EmitPrivmsg() 32 { 33 _server.Parse(new Line(":nickname JOIN #chan")); 34 var emit = _server.Parse(new Line(":nickname PRIVMSG #chan :hello")); 35 36 await Assert.That(emit).IsNotNull(); 37 await Assert.That(emit.Command).IsEqualTo("PRIVMSG"); 38 await Assert.That(emit.Text).IsEqualTo("hello"); 39 await Assert.That(emit.SelfSource).IsTrue(); 40 await Assert.That(emit.User).IsEqualTo(_server.Users["nickname"]); 41 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]); 42 43 _server.Parse(new Line(":other JOIN #chan")); 44 emit = _server.Parse(new Line(":other PRIVMSG #chan :hello2")); 45 46 await Assert.That(emit).IsNotNull(); 47 await Assert.That(emit.Command).IsEqualTo("PRIVMSG"); 48 await Assert.That(emit.Text).IsEqualTo("hello2"); 49 await Assert.That(emit.SelfSource).IsFalse(); 50 await Assert.That(emit.User).IsEqualTo(_server.Users["other"]); 51 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]); 52 } 53 54 [Test] 55 public async Task EmitPrivmsgNoJoin() 56 { 57 _server.Parse(new Line(":nickname JOIN #chan")); 58 var emit = _server.Parse(new Line(":other PRIVMSG #chan :hello")); 59 60 await Assert.That(emit).IsNotNull(); 61 await Assert.That(emit.Command).IsEqualTo("PRIVMSG"); 62 await Assert.That(emit.Text).IsEqualTo("hello"); 63 await Assert.That(emit.SelfSource).IsFalse(); 64 await Assert.That(emit.User).IsNotNull(); 65 66 var channel = _server.Channels["#chan"]; 67 await Assert.That(emit.Channel).IsEqualTo(channel); 68 } 69 70 [Test] 71 public async Task EmitKick() 72 { 73 _server.Parse(new Line(":nickname JOIN #chan")); 74 75 var user = _server.Users["nickname"]; 76 var channel = _server.Channels["#chan"]; 77 _server.Parse(new Line(":other JOIN #chan")); 78 var userOther = _server.Users["other"]; 79 var emit = _server.Parse(new Line(":nickname KICK #chan other :reason")); 80 81 await Assert.That(emit).IsNotNull(); 82 await Assert.That(emit.Command).IsEqualTo("KICK"); 83 await Assert.That(emit.Text).IsEqualTo("reason"); 84 await Assert.That(emit.SelfSource).IsTrue(); 85 await Assert.That(emit.UserSource).IsEqualTo(user); 86 await Assert.That(emit.UserTarget).IsEqualTo(userOther); 87 await Assert.That(emit.Channel).IsEqualTo(channel); 88 } 89 90 [Test] 91 public async Task EmitMode() 92 { 93 var emit = _server.Parse(new Line("MODE nickname x+i-i+wi-wi")); 94 95 await Assert.That(emit).IsNotNull(); 96 await Assert.That(emit.Command).IsEqualTo("MODE"); 97 await Assert.That(emit.SelfTarget).IsTrue(); 98 await Assert.That(emit.Tokens).IsEquivalentTo(["+x", "+i", "-i", "+w", "+i", "-w", "-i"]); 99 } 100}