Compare commits
17 Commits
f4a76e426f
...
632eadf483
Author | SHA1 | Date |
---|---|---|
Ben Harris | 632eadf483 | |
Ben Harris | 9fbae50b5d | |
Ben Harris | cea95cf486 | |
Ben Harris | a1df2ed6b4 | |
Ben Harris | ec87e02f29 | |
Ben Harris | 8972d9a66c | |
Ben Harris | 230c990fd1 | |
Ben Harris | 4d10abfbd9 | |
Ben Harris | 06fc7cc0b3 | |
Ben Harris | fbb86120b2 | |
Ben Harris | 325b3bb30d | |
Ben Harris | a7b45f1e36 | |
Ben Harris | 44555c7971 | |
Ben Harris | bebc1bc6f0 | |
Ben Harris | 041264f05f | |
Ben Harris | 7f3cc3c6ec | |
Ben Harris | 0d3586c1ab |
|
@ -6,5 +6,5 @@ steps:
|
|||
- name: run
|
||||
image: mcr.microsoft.com/dotnet/sdk:latest
|
||||
commands:
|
||||
- dotnet test
|
||||
- dotnet test -l 'console;verbosity=detailed'
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
namespace Robots
|
||||
{
|
||||
public class Client
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
namespace Robots
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
|
@ -1,87 +1,72 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
using IRCStates;
|
||||
using IRCTokens;
|
||||
// ReSharper disable StringLiteralTypo
|
||||
|
||||
namespace States
|
||||
namespace States;
|
||||
|
||||
internal class Client(string host, int port, string nick)
|
||||
{
|
||||
internal class Client
|
||||
private readonly byte[] _bytes = new byte[1024];
|
||||
private readonly StatefulEncoder _encoder = new();
|
||||
private readonly Server _server = new("test");
|
||||
private readonly Socket _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
|
||||
private void Send(string raw)
|
||||
{
|
||||
private readonly byte[] _bytes;
|
||||
private readonly StatefulEncoder _encoder;
|
||||
private readonly string _host;
|
||||
private readonly string _nick;
|
||||
private readonly int _port;
|
||||
private readonly Server _server;
|
||||
private readonly Socket _socket;
|
||||
_encoder.Push(new(raw));
|
||||
}
|
||||
|
||||
public Client(string host, int port, string nick)
|
||||
public void Start()
|
||||
{
|
||||
_socket.Connect(host, port);
|
||||
while (!_socket.Connected) Thread.Sleep(1000);
|
||||
|
||||
Send("USER test 0 * test");
|
||||
Send($"NICK {nick}");
|
||||
|
||||
while (true)
|
||||
{
|
||||
_server = new Server("test");
|
||||
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
_encoder = new StatefulEncoder();
|
||||
_host = host;
|
||||
_port = port;
|
||||
_nick = nick;
|
||||
_bytes = new byte[1024];
|
||||
}
|
||||
|
||||
private void Send(string raw)
|
||||
{
|
||||
_encoder.Push(new Line(raw));
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
_socket.Connect(_host, _port);
|
||||
while (!_socket.Connected) Thread.Sleep(1000);
|
||||
|
||||
Send("USER test 0 * test");
|
||||
Send($"NICK {_nick}");
|
||||
|
||||
while (true)
|
||||
while (_encoder.PendingBytes.Length != 0)
|
||||
{
|
||||
while (_encoder.PendingBytes.Any())
|
||||
{
|
||||
foreach (var line in _encoder.Pop(_socket.Send(_encoder.PendingBytes)))
|
||||
Console.WriteLine($"> {line.Format()}");
|
||||
}
|
||||
foreach (var line in _encoder.Pop(_socket.Send(_encoder.PendingBytes)))
|
||||
Console.WriteLine($"> {line.Format()}");
|
||||
}
|
||||
|
||||
var bytesReceived = _socket.Receive(_bytes);
|
||||
if (bytesReceived == 0)
|
||||
{
|
||||
Console.WriteLine("! disconnected");
|
||||
_socket.Shutdown(SocketShutdown.Both);
|
||||
_socket.Close();
|
||||
break;
|
||||
}
|
||||
var bytesReceived = _socket.Receive(_bytes);
|
||||
if (bytesReceived == 0)
|
||||
{
|
||||
Console.WriteLine("! disconnected");
|
||||
_socket.Shutdown(SocketShutdown.Both);
|
||||
_socket.Close();
|
||||
break;
|
||||
}
|
||||
|
||||
var receivedLines = _server.Receive(_bytes, bytesReceived);
|
||||
foreach (var (line, _) in receivedLines)
|
||||
{
|
||||
Console.WriteLine($"< {line.Format()}");
|
||||
var receivedLines = _server.Receive(_bytes, bytesReceived);
|
||||
foreach (var (line, _) in receivedLines)
|
||||
{
|
||||
Console.WriteLine($"< {line.Format()}");
|
||||
|
||||
switch (line.Command)
|
||||
{
|
||||
case Commands.Privmsg:
|
||||
if (line.Params[1].Contains(_server.NickName))
|
||||
Send($"PRIVMSG {line.Params[0]} :hi {line.Hostmask.NickName}!");
|
||||
break;
|
||||
case "PING":
|
||||
Send($"PONG :{line.Params[0]}");
|
||||
break;
|
||||
case Numeric.RPL_WELCOME:
|
||||
if (!_server.HasChannel("#irctokens")) Send("JOIN #irctokens");
|
||||
break;
|
||||
case "INVITE":
|
||||
var c = line.Params[1];
|
||||
if (!_server.HasChannel(c)) Send($"JOIN {c}");
|
||||
break;
|
||||
}
|
||||
switch (line.Command)
|
||||
{
|
||||
case Commands.Privmsg:
|
||||
if (line.Params[1].Contains(_server.NickName))
|
||||
Send($"PRIVMSG {line.Params[0]} :hi {line.Hostmask.NickName}!");
|
||||
break;
|
||||
case "PING":
|
||||
Send($"PONG :{line.Params[0]}");
|
||||
break;
|
||||
case Numeric.RPL_WELCOME:
|
||||
if (!_server.HasChannel("#irctokens")) Send("JOIN #irctokens");
|
||||
break;
|
||||
case "INVITE":
|
||||
var c = line.Params[1];
|
||||
if (!_server.HasChannel(c)) Send($"JOIN {c}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,11 +1,5 @@
|
|||
namespace States
|
||||
{
|
||||
public static class Program
|
||||
{
|
||||
private static void Main(string[] args)
|
||||
{
|
||||
var client = new Client("localhost", 6667, "statesbot");
|
||||
client.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
using States;
|
||||
// ReSharper disable StringLiteralTypo
|
||||
|
||||
var client = new Client("localhost", 6667, "statesbot");
|
||||
client.Start();
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -2,72 +2,64 @@
|
|||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
using IRCTokens;
|
||||
// ReSharper disable StringLiteralTypo
|
||||
|
||||
namespace Tokens
|
||||
namespace Tokens;
|
||||
|
||||
public class Client
|
||||
{
|
||||
public class Client
|
||||
private readonly byte[] _bytes = new byte[1024];
|
||||
private readonly StatefulDecoder _decoder = new();
|
||||
private readonly StatefulEncoder _encoder = new();
|
||||
private readonly Socket _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
|
||||
|
||||
public void Start()
|
||||
{
|
||||
private readonly byte[] _bytes;
|
||||
private readonly StatefulDecoder _decoder;
|
||||
private readonly StatefulEncoder _encoder;
|
||||
private readonly Socket _socket;
|
||||
_socket.Connect("127.0.0.1", 6667);
|
||||
while (!_socket.Connected) Thread.Sleep(1000);
|
||||
|
||||
public Client()
|
||||
Send(new("NICK", "tokensbot"));
|
||||
Send(new("USER", "tokensbot", "0", "*", "real name"));
|
||||
|
||||
while (true)
|
||||
{
|
||||
_decoder = new StatefulDecoder();
|
||||
_encoder = new StatefulEncoder();
|
||||
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
|
||||
_bytes = new byte[1024];
|
||||
}
|
||||
var bytesReceived = _socket.Receive(_bytes);
|
||||
|
||||
public void Start()
|
||||
{
|
||||
_socket.Connect("127.0.0.1", 6667);
|
||||
while (!_socket.Connected) Thread.Sleep(1000);
|
||||
|
||||
Send(new Line("NICK", "tokensbot"));
|
||||
Send(new Line("USER", "tokensbot", "0", "*", "real name"));
|
||||
|
||||
while (true)
|
||||
if (bytesReceived == 0)
|
||||
{
|
||||
var bytesReceived = _socket.Receive(_bytes);
|
||||
Console.WriteLine("! disconnected");
|
||||
_socket.Shutdown(SocketShutdown.Both);
|
||||
_socket.Close();
|
||||
break;
|
||||
}
|
||||
|
||||
if (bytesReceived == 0)
|
||||
var lines = _decoder.Push(_bytes, bytesReceived);
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
Console.WriteLine($"< {line.Format()}");
|
||||
|
||||
switch (line.Command)
|
||||
{
|
||||
Console.WriteLine("! disconnected");
|
||||
_socket.Shutdown(SocketShutdown.Both);
|
||||
_socket.Close();
|
||||
break;
|
||||
}
|
||||
|
||||
var lines = _decoder.Push(_bytes, bytesReceived);
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
Console.WriteLine($"< {line.Format()}");
|
||||
|
||||
switch (line.Command)
|
||||
{
|
||||
case "PING":
|
||||
Send(new Line("PONG", line.Params[0]));
|
||||
break;
|
||||
case "001":
|
||||
Send(new Line("JOIN", "#irctokens"));
|
||||
break;
|
||||
case "PRIVMSG":
|
||||
Send(new Line("PRIVMSG", line.Params[0], "hello there"));
|
||||
break;
|
||||
}
|
||||
case "PING":
|
||||
Send(new("PONG", line.Params[0]));
|
||||
break;
|
||||
case "001":
|
||||
Send(new("JOIN", "#irctokens"));
|
||||
break;
|
||||
case "PRIVMSG":
|
||||
Send(new("PRIVMSG", line.Params[0], "hello there"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Send(Line line)
|
||||
{
|
||||
Console.WriteLine($"> {line.Format()}");
|
||||
_encoder.Push(line);
|
||||
while (_encoder.PendingBytes.Length > 0)
|
||||
_encoder.Pop(_socket.Send(_encoder.PendingBytes, SocketFlags.None));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Send(Line line)
|
||||
{
|
||||
Console.WriteLine($"> {line.Format()}");
|
||||
_encoder.Push(line);
|
||||
while (_encoder.PendingBytes.Length > 0)
|
||||
_encoder.Pop(_socket.Send(_encoder.PendingBytes, SocketFlags.None));
|
||||
}
|
||||
}
|
|
@ -1,25 +1,18 @@
|
|||
using System;
|
||||
// tokenization
|
||||
|
||||
using System;
|
||||
using IRCTokens;
|
||||
using Tokens;
|
||||
|
||||
namespace Tokens
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
// tokenization
|
||||
var line = new Line("@id=123 :ben!~ben@hostname PRIVMSG #channel :hello there!");
|
||||
Console.WriteLine(line);
|
||||
Console.WriteLine(line.Format());
|
||||
var line = new Line("@id=123 :ben!~ben@hostname PRIVMSG #channel :hello there!");
|
||||
Console.WriteLine(line);
|
||||
Console.WriteLine(line.Format());
|
||||
|
||||
// formatting
|
||||
var line2 = new Line("USER", "user", "0", "*", "real name");
|
||||
Console.WriteLine(line2);
|
||||
Console.WriteLine(line2.Format());
|
||||
// formatting
|
||||
var line2 = new Line("USER", "user", "0", "*", "real name");
|
||||
Console.WriteLine(line2);
|
||||
Console.WriteLine(line2.Format());
|
||||
|
||||
// stateful example
|
||||
var client = new Client();
|
||||
client.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
// stateful example
|
||||
var client = new Client();
|
||||
client.Start();
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public class Bot : IBot
|
||||
{
|
||||
public IServer CreateServer(string name)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task<bool> Disconnected(IServer server)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task Disconnect(IServer server)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task<IServer> AddServer(string name, ConnectionParams connectionParams)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task Run()
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public class Capability : ICapability
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string DraftName { get; set; }
|
||||
public string Alias { get; }
|
||||
public IEnumerable<string> DependsOn { get; set; }
|
||||
private IEnumerable<string> Caps { get; }
|
||||
|
||||
public Capability()
|
||||
{
|
||||
Alias ??= Name;
|
||||
Caps = new List<string> {Name, DraftName};
|
||||
}
|
||||
|
||||
public string? Available(IEnumerable<string> capabilities)
|
||||
{
|
||||
return Caps.FirstOrDefault(cap => cap != null && capabilities.Contains(cap));
|
||||
}
|
||||
|
||||
public bool Match(string capability)
|
||||
{
|
||||
return Caps.Contains(capability);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
#nullable enable
|
||||
namespace IRCRobots
|
||||
{
|
||||
public class ConnectionParams
|
||||
{
|
||||
public string Nickname { get; set; }
|
||||
public string Host { get; set; }
|
||||
public int Port { get; set; }
|
||||
public bool UseTLS { get; set; }
|
||||
public string? Username { get; set; } = null;
|
||||
public string? Realname { get; set; } = null;
|
||||
public string? Bindhost { get; set; } = null;
|
||||
public string? Password { get; set; } = null;
|
||||
public bool VerifyTLS { get; set; } = true;
|
||||
public SASLParams? SASL { get; set; } = null;
|
||||
public STSPolicy? STS { get; set; } = null;
|
||||
public ResumePolicy? Resume { get; set; } = null;
|
||||
public int Reconnect { get; set; } = 10; // seconds
|
||||
public IEnumerable<string> AltNicknames { get; set; } = new List<string>();
|
||||
public IEnumerable<string> Autojoin { get; set; } = new List<string>();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public interface IBot
|
||||
{
|
||||
public IServer CreateServer(string name);
|
||||
public Task<bool> Disconnected(IServer server);
|
||||
public Task Disconnect(IServer server);
|
||||
public Task<IServer> AddServer(string name, ConnectionParams connectionParams);
|
||||
public Task Run();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public interface ICapability
|
||||
{
|
||||
public string? Available(IEnumerable<string> capabilities);
|
||||
public bool Match(string capability);
|
||||
public string Copy() => "ICapability";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\IRCStates\IRCStates.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,34 @@
|
|||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using IRCTokens;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public interface IServer
|
||||
{
|
||||
public IEnumerable<SentLine> SendRaw(string line, SendPriority sendPriority = SendPriority.Default);
|
||||
public IEnumerable<SentLine> Send(Line line, SendPriority sendPriority = SendPriority.Default);
|
||||
public void SetThrottle(int rate, float time);
|
||||
public (string address, int port) ServerAddress();
|
||||
public Task Connect(ITCPTransport transport, ConnectionParams connectionParams);
|
||||
public Task Disconnect();
|
||||
public void LinePreread(Line line);
|
||||
public void LinePresend(Line line);
|
||||
public Task LineRead(Line line);
|
||||
public Task LineSend(Line line);
|
||||
public Task STSPolicy(STSPolicy stsPolicy);
|
||||
public Task ResumePolicy(ResumePolicy resumePolicy);
|
||||
public bool CapAgreed(ICapability capability);
|
||||
public string? CapAvailable(ICapability capability);
|
||||
public Task<bool> SASLAuth(SASLParams saslParams);
|
||||
}
|
||||
|
||||
public enum SendPriority
|
||||
{
|
||||
High = 0,
|
||||
Medium = 10,
|
||||
Low = 20,
|
||||
Default = Medium
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#nullable enable
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public interface ITCPTransport
|
||||
{
|
||||
public Task Connect(string hostname, int port, bool useTLS, bool verifyTLS = true, string? bindhost = null);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public class MessageTag
|
||||
{
|
||||
public MessageTag()
|
||||
{
|
||||
Tags = new[] {Name, DraftName};
|
||||
}
|
||||
|
||||
public string Name { get; set; }
|
||||
public string DraftName { get; set; }
|
||||
public IEnumerable<string> Tags { get; }
|
||||
|
||||
public string? Available(IEnumerable<string> tags)
|
||||
{
|
||||
return Tags.FirstOrDefault(tag => tag != null && tags.Contains(tag));
|
||||
}
|
||||
|
||||
public string? Get(Dictionary<string, string> tags)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
namespace IRCRobots
|
||||
{
|
||||
public class ResumePolicy
|
||||
{
|
||||
public string Address { get; set; }
|
||||
public string Token { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
namespace IRCRobots
|
||||
{
|
||||
public class SASLParams
|
||||
{
|
||||
public string Mechanism { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
namespace IRCRobots
|
||||
{
|
||||
public class STSPolicy
|
||||
{
|
||||
public int Created { get; set; }
|
||||
public int Port { get; set; }
|
||||
public int Duration { get; set; }
|
||||
public bool Preload { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
using IRCTokens;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public class SentLine
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public SendPriority Priority { get; set; }
|
||||
public Line Line { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using IRCStates;
|
||||
using IRCTokens;
|
||||
|
||||
namespace IRCRobots
|
||||
{
|
||||
public class Server : IServer
|
||||
{
|
||||
private int SentCount { get; set; }
|
||||
|
||||
public IEnumerable<SentLine> SendRaw(string line, SendPriority sendPriority = SendPriority.Default)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public IEnumerable<SentLine> Send(Line line, SendPriority sendPriority = SendPriority.Default)
|
||||
{
|
||||
LinePresend(line);
|
||||
var sentLine = new SentLine {Id = SentCount, Priority = sendPriority, Line = line};
|
||||
SentCount++;
|
||||
return new[] {sentLine};
|
||||
}
|
||||
|
||||
public void SetThrottle(int rate, float time)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public (string address, int port) ServerAddress()
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task Connect(ITCPTransport transport, ConnectionParams connectionParams)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task Disconnect()
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public void LinePreread(Line line)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public void LinePresend(Line line)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task LineRead(Line line)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task LineSend(Line line)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task STSPolicy(STSPolicy stsPolicy)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task ResumePolicy(ResumePolicy resumePolicy)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public bool CapAgreed(ICapability capability)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public string? CapAvailable(ICapability capability)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task<bool> SASLAuth(SASLParams saslParams)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,28 +1,29 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="MSTest.Sdk/3.3.1">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>true</ImplicitUsings>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
|
||||
<PackageReference Include="coverlet.collector" Version="1.3.0" />
|
||||
<PackageReference Include="YamlDotNet" Version="8.1.2" />
|
||||
<PackageReference Include="YamlDotNet" Version="15.1.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\IRCStates\IRCStates.csproj" />
|
||||
<ProjectReference Include="..\IRCTokens\IRCTokens.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="IRCTokens" />
|
||||
<Using Include="IRCStates" />
|
||||
<Using Include="System.Text" />
|
||||
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="Tokenization\Data\msg-join.yaml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="Tokenization\Data\msg-split.yaml">
|
||||
<None Update="Tokenization\Data\msg-*.yaml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace IRCSharp.Tests.Robots
|
||||
{
|
||||
[TestClass]
|
||||
public class Glob
|
||||
{
|
||||
[TestMethod]
|
||||
public void GlobCollapse()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,131 +1,126 @@
|
|||
using System.Collections.Generic;
|
||||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Cap
|
||||
{
|
||||
[TestClass]
|
||||
public class Cap
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LSOneLine()
|
||||
{
|
||||
Assert.IsFalse(_server.HasCap);
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
_server.Parse(new Line("CAP * LS :a b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}}, _server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LSTwoLines()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS * :a b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
_server.Parse(new Line("CAP * LS :c"));
|
||||
Assert.IsTrue(_server.AvailableCaps.ContainsKey("a"));
|
||||
Assert.IsTrue(_server.AvailableCaps.ContainsKey("b"));
|
||||
Assert.IsTrue(_server.AvailableCaps.ContainsKey("c"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LSValues()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a b= c=1"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", "1"}},
|
||||
_server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ACKOneLine()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a b"));
|
||||
_server.Parse(new Line("CAP * ACK :a b"));
|
||||
CollectionAssert.AreEqual(new List<string> {"a", "b"}, _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ACKTwoLines()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a b c"));
|
||||
_server.Parse(new Line("CAP * ACK * :a b"));
|
||||
_server.Parse(new Line("CAP * ACK :c"));
|
||||
CollectionAssert.AreEqual(new List<string> {"a", "b", "c"}, _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ACKNotLS()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS a"));
|
||||
_server.Parse(new Line("CAP * ACK b"));
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NEWNoLS()
|
||||
{
|
||||
_server.Parse(new Line("CAP * NEW :a"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}}, _server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NEWOneLine()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a"));
|
||||
_server.Parse(new Line("CAP * NEW :b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}}, _server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NEWTwoLines()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a"));
|
||||
_server.Parse(new Line("CAP * NEW :b c"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", ""}},
|
||||
_server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DELNotAcked()
|
||||
{
|
||||
_server.Parse(new Line("CAP * DEL a"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DELOneLS()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a"));
|
||||
_server.Parse(new Line("CAP * ACK :a"));
|
||||
_server.Parse(new Line("CAP * DEL :a"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DELTwoLS()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a b"));
|
||||
_server.Parse(new Line("CAP * ACK :a b"));
|
||||
_server.Parse(new Line("CAP * DEL :a"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"b", ""}}, _server.AvailableCaps);
|
||||
CollectionAssert.AreEqual(new List<string> {"b"}, _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DELTwoDEL()
|
||||
{
|
||||
_server.Parse(new Line("CAP * LS :a b"));
|
||||
_server.Parse(new Line("CAP * ACK :a b"));
|
||||
_server.Parse(new Line("CAP * DEL :a b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
|
||||
}
|
||||
_server = new("test");
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LSOneLine()
|
||||
{
|
||||
Assert.IsFalse(_server.HasCap);
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
_server.Parse(new("CAP * LS :a b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}}, _server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LsTwoLines()
|
||||
{
|
||||
_server.Parse(new("CAP * LS * :a b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
_server.Parse(new("CAP * LS :c"));
|
||||
Assert.IsTrue(_server.AvailableCaps.ContainsKey("a"));
|
||||
Assert.IsTrue(_server.AvailableCaps.ContainsKey("b"));
|
||||
Assert.IsTrue(_server.AvailableCaps.ContainsKey("c"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LsValues()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a b= c=1"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", "1"}},
|
||||
_server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ACKOneLine()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a b"));
|
||||
_server.Parse(new("CAP * ACK :a b"));
|
||||
CollectionAssert.AreEqual(new List<string> {"a", "b"}, _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ACKTwoLines()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a b c"));
|
||||
_server.Parse(new("CAP * ACK * :a b"));
|
||||
_server.Parse(new("CAP * ACK :c"));
|
||||
CollectionAssert.AreEqual(new List<string> {"a", "b", "c"}, _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ACKNotLs()
|
||||
{
|
||||
_server.Parse(new("CAP * LS a"));
|
||||
_server.Parse(new("CAP * ACK b"));
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewNoLs()
|
||||
{
|
||||
_server.Parse(new("CAP * NEW :a"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}}, _server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewOneLine()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a"));
|
||||
_server.Parse(new("CAP * NEW :b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}}, _server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewTwoLines()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a"));
|
||||
_server.Parse(new("CAP * NEW :b c"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", ""}},
|
||||
_server.AvailableCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DelNotAcked()
|
||||
{
|
||||
_server.Parse(new("CAP * DEL a"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DELOneLS()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a"));
|
||||
_server.Parse(new("CAP * ACK :a"));
|
||||
_server.Parse(new("CAP * DEL :a"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DelTwoLs()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a b"));
|
||||
_server.Parse(new("CAP * ACK :a b"));
|
||||
_server.Parse(new("CAP * DEL :a"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"b", ""}}, _server.AvailableCaps);
|
||||
CollectionAssert.AreEqual(new List<string> {"b"}, _server.AgreedCaps);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DelTwoDel()
|
||||
{
|
||||
_server.Parse(new("CAP * LS :a b"));
|
||||
_server.Parse(new("CAP * ACK :a b"));
|
||||
_server.Parse(new("CAP * DEL :a b"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
|
||||
}
|
||||
}
|
|
@ -1,58 +1,56 @@
|
|||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
// ReSharper disable IdentifierTypo
|
||||
// ReSharper disable StringLiteralTypo
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Casemap
|
||||
{
|
||||
[TestClass]
|
||||
public class Casemap
|
||||
[TestMethod]
|
||||
public void Rfc1459()
|
||||
{
|
||||
[TestMethod]
|
||||
public void Rfc1459()
|
||||
{
|
||||
var lower = IRCStates.Casemap.CaseFold(IRCStates.Casemap.CaseMapping.Rfc1459, @"ÀTEST[]~\");
|
||||
Assert.AreEqual("Àtest{}^|", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Ascii()
|
||||
{
|
||||
var lower = IRCStates.Casemap.CaseFold(IRCStates.Casemap.CaseMapping.Ascii, @"ÀTEST[]~\");
|
||||
Assert.AreEqual(@"Àtest[]~\", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandJoin()
|
||||
{
|
||||
var server = new Server("test");
|
||||
server.Parse(new Line("001 nickname"));
|
||||
server.Parse(new Line(":Nickname JOIN #Chan"));
|
||||
server.Parse(new Line(":Other JOIN #Chan"));
|
||||
|
||||
Assert.IsTrue(server.Users.ContainsKey("nickname"));
|
||||
Assert.IsFalse(server.Users.ContainsKey("Nickname"));
|
||||
Assert.IsTrue(server.Users.ContainsKey("other"));
|
||||
Assert.IsFalse(server.Users.ContainsKey("Other"));
|
||||
Assert.IsTrue(server.Channels.ContainsKey("#chan"));
|
||||
Assert.IsFalse(server.Channels.ContainsKey("#Chan"));
|
||||
|
||||
var channel = server.Channels["#chan"];
|
||||
Assert.AreEqual("#Chan", channel.Name);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandNick()
|
||||
{
|
||||
var server = new Server("test");
|
||||
server.Parse(new Line("001 nickname"));
|
||||
server.Parse(new Line(":nickname JOIN #chan"));
|
||||
var user = server.Users["nickname"];
|
||||
server.Parse(new Line(":nickname NICK NewNickname"));
|
||||
Assert.AreEqual(1, server.Users.Count);
|
||||
Assert.IsTrue(server.Users.ContainsKey("newnickname"));
|
||||
Assert.AreEqual("NewNickname", user.NickName);
|
||||
Assert.AreEqual("newnickname", user.NickNameLower);
|
||||
Assert.AreEqual("NewNickname", server.NickName);
|
||||
Assert.AreEqual("newnickname", server.NickNameLower);
|
||||
}
|
||||
var lower = IRCStates.Casemap.CaseFold(IRCStates.Casemap.CaseMapping.Rfc1459, @"ÀTEST[]~\");
|
||||
Assert.AreEqual("Àtest{}^|", lower);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Ascii()
|
||||
{
|
||||
var lower = IRCStates.Casemap.CaseFold(IRCStates.Casemap.CaseMapping.Ascii, @"ÀTEST[]~\");
|
||||
Assert.AreEqual(@"Àtest[]~\", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandJoin()
|
||||
{
|
||||
var server = new Server("test");
|
||||
server.Parse(new("001 nickname"));
|
||||
server.Parse(new(":Nickname JOIN #Chan"));
|
||||
server.Parse(new(":Other JOIN #Chan"));
|
||||
|
||||
Assert.IsTrue(server.Users.ContainsKey("nickname"));
|
||||
Assert.IsFalse(server.Users.ContainsKey("Nickname"));
|
||||
Assert.IsTrue(server.Users.ContainsKey("other"));
|
||||
Assert.IsFalse(server.Users.ContainsKey("Other"));
|
||||
Assert.IsTrue(server.Channels.ContainsKey("#chan"));
|
||||
Assert.IsFalse(server.Channels.ContainsKey("#Chan"));
|
||||
|
||||
var channel = server.Channels["#chan"];
|
||||
Assert.AreEqual("#Chan", channel.Name);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandNick()
|
||||
{
|
||||
var server = new Server("test");
|
||||
server.Parse(new("001 nickname"));
|
||||
server.Parse(new(":nickname JOIN #chan"));
|
||||
var user = server.Users["nickname"];
|
||||
server.Parse(new(":nickname NICK NewNickname"));
|
||||
Assert.AreEqual(1, server.Users.Count);
|
||||
Assert.IsTrue(server.Users.ContainsKey("newnickname"));
|
||||
Assert.AreEqual("NewNickname", user.NickName);
|
||||
Assert.AreEqual("newnickname", user.NickNameLower);
|
||||
Assert.AreEqual("NewNickname", server.NickName);
|
||||
Assert.AreEqual("newnickname", server.NickNameLower);
|
||||
}
|
||||
}
|
|
@ -1,202 +1,194 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Channel
|
||||
{
|
||||
[TestClass]
|
||||
public class Channel
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("001 nickname"));
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void JoinSelf()
|
||||
{
|
||||
Assert.IsTrue(_server.Channels.ContainsKey("#chan"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("nickname"));
|
||||
Assert.AreEqual(1, _server.Channels.Count);
|
||||
Assert.AreEqual(1, _server.Users.Count);
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var chan = _server.Channels["#chan"];
|
||||
Assert.IsTrue(chan.Users.ContainsKey(user.NickNameLower));
|
||||
var chanUser = chan.Users[user.NickNameLower];
|
||||
CollectionAssert.AreEqual(new List<string> {chan.NameLower}, user.Channels.ToList());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void JoinOther()
|
||||
{
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
|
||||
Assert.AreEqual(2, _server.Users.Count);
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
Assert.AreEqual(2, channel.Users.Count);
|
||||
|
||||
var user = _server.Users["other"];
|
||||
CollectionAssert.AreEqual(new List<string> {channel.NameLower}, user.Channels.ToList());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PartSelf()
|
||||
{
|
||||
_server.Parse(new Line(":nickname PART #chan"));
|
||||
|
||||
Assert.AreEqual(0, _server.Users.Count);
|
||||
Assert.AreEqual(0, _server.Channels.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PartOther()
|
||||
{
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":other PART #chan"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser = channel.Users[user.NickNameLower];
|
||||
|
||||
Assert.AreEqual(channel.NameLower, user.Channels.Single());
|
||||
CollectionAssert.AreEqual(new Dictionary<string, IRCStates.User> {{"nickname", user}}, _server.Users);
|
||||
CollectionAssert.AreEqual(new Dictionary<string, IRCStates.Channel> {{"#chan", channel}}, _server.Channels);
|
||||
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{"nickname", chanUser}}, channel.Users);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void KickSelf()
|
||||
{
|
||||
_server.Parse(new Line(":nickname KICK #chan nickname"));
|
||||
|
||||
Assert.AreEqual(0, _server.Users.Count);
|
||||
Assert.AreEqual(0, _server.Channels.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void KickOther()
|
||||
{
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname KICK #chan other"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser = channel.Users[user.NickNameLower];
|
||||
|
||||
Assert.AreEqual(1, _server.Users.Count);
|
||||
Assert.AreEqual(1, _server.Channels.Count);
|
||||
Assert.AreEqual(channel.NameLower, user.Channels.Single());
|
||||
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{user.NickNameLower, chanUser}},
|
||||
channel.Users);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void QuitSelf()
|
||||
{
|
||||
_server.Parse(new Line("QUIT :i'm outta here"));
|
||||
Assert.IsFalse(_server.Users.Any());
|
||||
Assert.IsFalse(_server.Channels.Any());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void QuitSelfWithSource()
|
||||
{
|
||||
_server.Parse(new Line(":nickname QUIT :i'm outta here"));
|
||||
Assert.IsFalse(_server.Users.Any());
|
||||
Assert.IsFalse(_server.Channels.Any());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void QuitOther()
|
||||
{
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":other QUIT :see ya"));
|
||||
Assert.IsFalse(_server.Users.ContainsKey("other"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TopicText()
|
||||
{
|
||||
_server.Parse(new Line("332 * #chan :test"));
|
||||
Assert.AreEqual("test", _server.Channels["#chan"].Topic);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TopicSetByAt()
|
||||
{
|
||||
var dt = DateTimeOffset.FromUnixTimeSeconds(1584023277).DateTime;
|
||||
_server.Parse(new Line("333 * #chan other 1584023277"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
|
||||
Assert.AreEqual("other", channel.TopicSetter);
|
||||
Assert.AreEqual(dt, channel.TopicTime);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TopicCommand()
|
||||
{
|
||||
_server.Parse(new Line("TOPIC #chan :hello there"));
|
||||
Assert.AreEqual("hello there", _server.Channels["#chan"].Topic);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CreationDate()
|
||||
{
|
||||
_server.Parse(new Line("329 * #chan 1584041889"));
|
||||
Assert.AreEqual(DateTimeOffset.FromUnixTimeSeconds(1584041889).DateTime, _server.Channels["#chan"].Created);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NamesCommand()
|
||||
{
|
||||
_server.Parse(new Line("353 * * #chan :nickname @+other"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("nickname"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other"));
|
||||
|
||||
var user = _server.Users["other"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser1 = channel.Users[user.NickNameLower];
|
||||
var chanUser2 = channel.Users[_server.NickNameLower];
|
||||
|
||||
Assert.AreEqual(2, channel.Users.Count);
|
||||
CollectionAssert.AreEqual(chanUser1.Modes, channel.Users[user.NickNameLower].Modes);
|
||||
CollectionAssert.AreEqual(chanUser2.Modes, channel.Users[_server.NickNameLower].Modes);
|
||||
CollectionAssert.AreEqual(new List<string> {"o", "v"}, chanUser1.Modes);
|
||||
Assert.AreEqual(channel.NameLower, user.Channels.Single());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UserhostInNames()
|
||||
{
|
||||
_server.Parse(new Line("353 * * #chan :nickname!user@host other!user2@host2"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user2", user.UserName);
|
||||
Assert.AreEqual("host2", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NickAfterJoin()
|
||||
{
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser = channel.Users[user.NickNameLower];
|
||||
_server.Parse(new Line(":nickname NICK nickname2"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{user.NickNameLower, chanUser}},
|
||||
channel.Users);
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("001 nickname"));
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void JoinSelf()
|
||||
{
|
||||
Assert.IsTrue(_server.Channels.ContainsKey("#chan"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("nickname"));
|
||||
Assert.AreEqual(1, _server.Channels.Count);
|
||||
Assert.AreEqual(1, _server.Users.Count);
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var chan = _server.Channels["#chan"];
|
||||
Assert.IsTrue(chan.Users.ContainsKey(user.NickNameLower));
|
||||
CollectionAssert.AreEqual(new List<string> {chan.NameLower}, user.Channels.ToList());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void JoinOther()
|
||||
{
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
|
||||
Assert.AreEqual(2, _server.Users.Count);
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
Assert.AreEqual(2, channel.Users.Count);
|
||||
|
||||
var user = _server.Users["other"];
|
||||
CollectionAssert.AreEqual(new List<string> {channel.NameLower}, user.Channels.ToList());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PartSelf()
|
||||
{
|
||||
_server.Parse(new(":nickname PART #chan"));
|
||||
|
||||
Assert.AreEqual(0, _server.Users.Count);
|
||||
Assert.AreEqual(0, _server.Channels.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PartOther()
|
||||
{
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":other PART #chan"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser = channel.Users[user.NickNameLower];
|
||||
|
||||
Assert.AreEqual(channel.NameLower, user.Channels.Single());
|
||||
CollectionAssert.AreEqual(new Dictionary<string, IRCStates.User> {{"nickname", user}}, _server.Users);
|
||||
CollectionAssert.AreEqual(new Dictionary<string, IRCStates.Channel> {{"#chan", channel}}, _server.Channels);
|
||||
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{"nickname", chanUser}}, channel.Users);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void KickSelf()
|
||||
{
|
||||
_server.Parse(new(":nickname KICK #chan nickname"));
|
||||
|
||||
Assert.AreEqual(0, _server.Users.Count);
|
||||
Assert.AreEqual(0, _server.Channels.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void KickOther()
|
||||
{
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":nickname KICK #chan other"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser = channel.Users[user.NickNameLower];
|
||||
|
||||
Assert.AreEqual(1, _server.Users.Count);
|
||||
Assert.AreEqual(1, _server.Channels.Count);
|
||||
Assert.AreEqual(channel.NameLower, user.Channels.Single());
|
||||
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{user.NickNameLower, chanUser}},
|
||||
channel.Users);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void QuitSelf()
|
||||
{
|
||||
_server.Parse(new("QUIT :i'm outta here"));
|
||||
Assert.AreEqual(0, _server.Users.Count);
|
||||
Assert.AreEqual(0, _server.Channels.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void QuitSelfWithSource()
|
||||
{
|
||||
_server.Parse(new(":nickname QUIT :i'm outta here"));
|
||||
Assert.AreEqual(0, _server.Users.Count);
|
||||
Assert.AreEqual(0, _server.Channels.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void QuitOther()
|
||||
{
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":other QUIT :see ya"));
|
||||
Assert.IsFalse(_server.Users.ContainsKey("other"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TopicText()
|
||||
{
|
||||
_server.Parse(new("332 * #chan :test"));
|
||||
Assert.AreEqual("test", _server.Channels["#chan"].Topic);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TopicSetByAt()
|
||||
{
|
||||
var dt = DateTimeOffset.FromUnixTimeSeconds(1584023277).DateTime;
|
||||
_server.Parse(new("333 * #chan other 1584023277"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
|
||||
Assert.AreEqual("other", channel.TopicSetter);
|
||||
Assert.AreEqual(dt, channel.TopicTime);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TopicCommand()
|
||||
{
|
||||
_server.Parse(new("TOPIC #chan :hello there"));
|
||||
Assert.AreEqual("hello there", _server.Channels["#chan"].Topic);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CreationDate()
|
||||
{
|
||||
_server.Parse(new("329 * #chan 1584041889"));
|
||||
Assert.AreEqual(DateTimeOffset.FromUnixTimeSeconds(1584041889).DateTime, _server.Channels["#chan"].Created);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NamesCommand()
|
||||
{
|
||||
_server.Parse(new("353 * * #chan :nickname @+other"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("nickname"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other"));
|
||||
|
||||
var user = _server.Users["other"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser1 = channel.Users[user.NickNameLower];
|
||||
var chanUser2 = channel.Users[_server.NickNameLower];
|
||||
|
||||
Assert.AreEqual(2, channel.Users.Count);
|
||||
CollectionAssert.AreEqual(chanUser1.Modes, channel.Users[user.NickNameLower].Modes);
|
||||
CollectionAssert.AreEqual(chanUser2.Modes, channel.Users[_server.NickNameLower].Modes);
|
||||
CollectionAssert.AreEqual(new List<string> {"o", "v"}, chanUser1.Modes);
|
||||
Assert.AreEqual(channel.NameLower, user.Channels.Single());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UserhostInNames()
|
||||
{
|
||||
_server.Parse(new("353 * * #chan :nickname!user@host other!user2@host2"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user2", user.UserName);
|
||||
Assert.AreEqual("host2", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NickAfterJoin()
|
||||
{
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var chanUser = channel.Users[user.NickNameLower];
|
||||
_server.Parse(new(":nickname NICK nickname2"));
|
||||
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{user.NickNameLower, chanUser}},
|
||||
channel.Users);
|
||||
}
|
||||
}
|
|
@ -1,117 +1,112 @@
|
|||
using System.Collections.Generic;
|
||||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Emit
|
||||
{
|
||||
[TestClass]
|
||||
public class Emit
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("001 nickname"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitJoin()
|
||||
{
|
||||
var emit = _server.Parse(new Line(":nickname JOIN #chan"));
|
||||
|
||||
Assert.AreEqual("JOIN", emit.Command);
|
||||
Assert.IsTrue(emit.Self);
|
||||
Assert.AreEqual(_server.Users["nickname"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
|
||||
emit = _server.Parse(new Line(":other JOIN #chan"));
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("JOIN", emit.Command);
|
||||
Assert.IsFalse(emit.Self);
|
||||
Assert.AreEqual(_server.Users["other"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitPrivmsg()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
var emit = _server.Parse(new Line(":nickname PRIVMSG #chan :hello"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("PRIVMSG", emit.Command);
|
||||
Assert.AreEqual("hello", emit.Text);
|
||||
Assert.IsTrue(emit.SelfSource);
|
||||
Assert.AreEqual(_server.Users["nickname"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
emit = _server.Parse(new Line(":other PRIVMSG #chan :hello2"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("PRIVMSG", emit.Command);
|
||||
Assert.AreEqual("hello2", emit.Text);
|
||||
Assert.IsFalse(emit.SelfSource);
|
||||
Assert.AreEqual(_server.Users["other"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitPrivmsgNoJoin()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
var emit = _server.Parse(new Line(":other PRIVMSG #chan :hello"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("PRIVMSG", emit.Command);
|
||||
Assert.AreEqual("hello", emit.Text);
|
||||
Assert.IsFalse(emit.SelfSource);
|
||||
Assert.IsNotNull(emit.User);
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
Assert.AreEqual(channel, emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitKick()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
var userOther = _server.Users["other"];
|
||||
var emit = _server.Parse(new Line(":nickname KICK #chan other :reason"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("KICK", emit.Command);
|
||||
Assert.AreEqual("reason", emit.Text);
|
||||
Assert.IsTrue(emit.SelfSource);
|
||||
Assert.AreEqual(user, emit.UserSource);
|
||||
Assert.AreEqual(userOther, emit.UserTarget);
|
||||
Assert.AreEqual(channel, emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitMode()
|
||||
{
|
||||
var emit = _server.Parse(new Line("MODE nickname x+i-i+wi-wi"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("MODE", emit.Command);
|
||||
Assert.IsTrue(emit.SelfTarget);
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"+x",
|
||||
"+i",
|
||||
"-i",
|
||||
"+w",
|
||||
"+i",
|
||||
"-w",
|
||||
"-i"
|
||||
}, emit.Tokens);
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("001 nickname"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitJoin()
|
||||
{
|
||||
var emit = _server.Parse(new(":nickname JOIN #chan"));
|
||||
|
||||
Assert.AreEqual("JOIN", emit.Command);
|
||||
Assert.IsTrue(emit.Self);
|
||||
Assert.AreEqual(_server.Users["nickname"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
|
||||
emit = _server.Parse(new(":other JOIN #chan"));
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("JOIN", emit.Command);
|
||||
Assert.IsFalse(emit.Self);
|
||||
Assert.AreEqual(_server.Users["other"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitPrivmsg()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
var emit = _server.Parse(new(":nickname PRIVMSG #chan :hello"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("PRIVMSG", emit.Command);
|
||||
Assert.AreEqual("hello", emit.Text);
|
||||
Assert.IsTrue(emit.SelfSource);
|
||||
Assert.AreEqual(_server.Users["nickname"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
emit = _server.Parse(new(":other PRIVMSG #chan :hello2"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("PRIVMSG", emit.Command);
|
||||
Assert.AreEqual("hello2", emit.Text);
|
||||
Assert.IsFalse(emit.SelfSource);
|
||||
Assert.AreEqual(_server.Users["other"], emit.User);
|
||||
Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitPrivmsgNoJoin()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
var emit = _server.Parse(new(":other PRIVMSG #chan :hello"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("PRIVMSG", emit.Command);
|
||||
Assert.AreEqual("hello", emit.Text);
|
||||
Assert.IsFalse(emit.SelfSource);
|
||||
Assert.IsNotNull(emit.User);
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
Assert.AreEqual(channel, emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitKick()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
var userOther = _server.Users["other"];
|
||||
var emit = _server.Parse(new(":nickname KICK #chan other :reason"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("KICK", emit.Command);
|
||||
Assert.AreEqual("reason", emit.Text);
|
||||
Assert.IsTrue(emit.SelfSource);
|
||||
Assert.AreEqual(user, emit.UserSource);
|
||||
Assert.AreEqual(userOther, emit.UserTarget);
|
||||
Assert.AreEqual(channel, emit.Channel);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmitMode()
|
||||
{
|
||||
var emit = _server.Parse(new("MODE nickname x+i-i+wi-wi"));
|
||||
|
||||
Assert.IsNotNull(emit);
|
||||
Assert.AreEqual("MODE", emit.Command);
|
||||
Assert.IsTrue(emit.SelfTarget);
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"+x",
|
||||
"+i",
|
||||
"-i",
|
||||
"+w",
|
||||
"+i",
|
||||
"-w",
|
||||
"-i"
|
||||
}, emit.Tokens);
|
||||
}
|
||||
}
|
|
@ -1,210 +1,205 @@
|
|||
using System.Collections.Generic;
|
||||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
// ReSharper disable InconsistentNaming
|
||||
// ReSharper disable StringLiteralTypo
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
// ReSharper disable InconsistentNaming
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class ISupport
|
||||
{
|
||||
[TestClass]
|
||||
public class ISupport
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("001 nickname"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChanModes()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string> {"b"}, _server.ISupport.ChanModes.ListModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"k"}, _server.ISupport.ChanModes.SettingBModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"l"}, _server.ISupport.ChanModes.SettingCModes);
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"i",
|
||||
"m",
|
||||
"n",
|
||||
"p",
|
||||
"s",
|
||||
"t"
|
||||
}, _server.ISupport.ChanModes.SettingDModes);
|
||||
|
||||
_server.Parse(new Line("005 * CHANMODES=a,b,c,d *"));
|
||||
|
||||
CollectionAssert.AreEqual(new List<string> {"a"}, _server.ISupport.ChanModes.ListModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"b"}, _server.ISupport.ChanModes.SettingBModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"c"}, _server.ISupport.ChanModes.SettingCModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"d"}, _server.ISupport.ChanModes.SettingDModes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Prefix()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string> {"o", "v"}, _server.ISupport.Prefix.Modes);
|
||||
CollectionAssert.AreEqual(new List<string> {"@", "+"}, _server.ISupport.Prefix.Prefixes);
|
||||
|
||||
Assert.AreEqual("@", _server.ISupport.Prefix.FromMode("o"));
|
||||
Assert.IsNull(_server.ISupport.Prefix.FromMode("a"));
|
||||
Assert.AreEqual("o", _server.ISupport.Prefix.FromPrefix("@"));
|
||||
Assert.IsNull(_server.ISupport.Prefix.FromPrefix("&"));
|
||||
|
||||
_server.Parse(new Line("005 * PREFIX=(qaohv)~&@%+ *"));
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"q",
|
||||
"a",
|
||||
"o",
|
||||
"h",
|
||||
"v"
|
||||
}, _server.ISupport.Prefix.Modes);
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"~",
|
||||
"&",
|
||||
"@",
|
||||
"%",
|
||||
"+"
|
||||
}, _server.ISupport.Prefix.Prefixes);
|
||||
Assert.AreEqual("&", _server.ISupport.Prefix.FromMode("a"));
|
||||
Assert.AreEqual("a", _server.ISupport.Prefix.FromPrefix("&"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChanTypes()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string> {"#"}, _server.ISupport.ChanTypes);
|
||||
_server.Parse(new Line("005 * CHANTYPES=#& *"));
|
||||
CollectionAssert.AreEqual(new List<string> {"#", "&"}, _server.ISupport.ChanTypes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Modes()
|
||||
{
|
||||
Assert.AreEqual(3, _server.ISupport.Modes);
|
||||
|
||||
_server.Parse(new Line("005 * MODES *"));
|
||||
Assert.AreEqual(-1, _server.ISupport.Modes);
|
||||
|
||||
_server.Parse(new Line("005 * MODES=5 *"));
|
||||
Assert.AreEqual(5, _server.ISupport.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Rfc1459()
|
||||
{
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
|
||||
_server.Parse(new Line("005 * CASEMAPPING=rfc1459 *"));
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
|
||||
var lower = _server.CaseFold(@"ÀTEST[]~\");
|
||||
Assert.AreEqual("Àtest{}^|", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Ascii()
|
||||
{
|
||||
_server.Parse(new Line("005 * CASEMAPPING=ascii *"));
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Ascii, _server.ISupport.CaseMapping);
|
||||
var lower = _server.CaseFold(@"ÀTEST[]~\");
|
||||
Assert.AreEqual(@"Àtest[]~\", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FallbackToRfc1459()
|
||||
{
|
||||
_server.Parse(new Line("005 * CASEMAPPING=nonexistent *"));
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
|
||||
var lower = _server.CaseFold(@"ÀTEST[]~\");
|
||||
Assert.AreEqual("Àtest{}^|", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Network()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Network);
|
||||
_server.Parse(new Line("005 * NETWORK=testnet *"));
|
||||
Assert.AreEqual("testnet", _server.ISupport.Network);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void StatusMsg()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.ISupport.StatusMsg);
|
||||
_server.Parse(new Line("005 * STATUSMSG=&@ *"));
|
||||
CollectionAssert.AreEqual(new List<string> {"&", "@"}, _server.ISupport.StatusMsg);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CallerId()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.CallerId);
|
||||
|
||||
_server.Parse(new Line("005 * CALLERID=U *"));
|
||||
Assert.AreEqual("U", _server.ISupport.CallerId);
|
||||
|
||||
_server.Parse(new Line("005 * CALLERID *"));
|
||||
Assert.AreEqual("g", _server.ISupport.CallerId);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Excepts()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Excepts);
|
||||
|
||||
_server.Parse(new Line("005 * EXCEPTS=U *"));
|
||||
Assert.AreEqual("U", _server.ISupport.Excepts);
|
||||
|
||||
_server.Parse(new Line("005 * EXCEPTS *"));
|
||||
Assert.AreEqual("e", _server.ISupport.Excepts);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Invex()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Invex);
|
||||
|
||||
_server.Parse(new Line("005 * INVEX=U *"));
|
||||
Assert.AreEqual("U", _server.ISupport.Invex);
|
||||
|
||||
_server.Parse(new Line("005 * INVEX *"));
|
||||
Assert.AreEqual("I", _server.ISupport.Invex);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Whox()
|
||||
{
|
||||
Assert.IsFalse(_server.ISupport.Whox);
|
||||
|
||||
_server.Parse(new Line("005 * WHOX *"));
|
||||
Assert.IsTrue(_server.ISupport.Whox);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Monitor()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Monitor);
|
||||
|
||||
_server.Parse(new Line("005 * MONITOR=123 *"));
|
||||
Assert.AreEqual(123, _server.ISupport.Monitor);
|
||||
|
||||
_server.Parse(new Line("005 * MONITOR *"));
|
||||
Assert.AreEqual(-1, _server.ISupport.Monitor);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Watch()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Watch);
|
||||
|
||||
_server.Parse(new Line("005 * WATCH=123 *"));
|
||||
Assert.AreEqual(123, _server.ISupport.Watch);
|
||||
|
||||
_server.Parse(new Line("005 * WATCH *"));
|
||||
Assert.AreEqual(-1, _server.ISupport.Watch);
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("001 nickname"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChanModes()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string> {"b"}, _server.ISupport.ChanModes.ListModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"k"}, _server.ISupport.ChanModes.SettingBModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"l"}, _server.ISupport.ChanModes.SettingCModes);
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"i",
|
||||
"m",
|
||||
"n",
|
||||
"p",
|
||||
"s",
|
||||
"t"
|
||||
}, _server.ISupport.ChanModes.SettingDModes);
|
||||
|
||||
_server.Parse(new("005 * CHANMODES=a,b,c,d *"));
|
||||
|
||||
CollectionAssert.AreEqual(new List<string> {"a"}, _server.ISupport.ChanModes.ListModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"b"}, _server.ISupport.ChanModes.SettingBModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"c"}, _server.ISupport.ChanModes.SettingCModes);
|
||||
CollectionAssert.AreEqual(new List<string> {"d"}, _server.ISupport.ChanModes.SettingDModes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Prefix()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string> {"o", "v"}, _server.ISupport.Prefix.Modes);
|
||||
CollectionAssert.AreEqual(new List<string> {"@", "+"}, _server.ISupport.Prefix.Prefixes);
|
||||
|
||||
Assert.AreEqual("@", _server.ISupport.Prefix.FromMode("o"));
|
||||
Assert.IsNull(_server.ISupport.Prefix.FromMode("a"));
|
||||
Assert.AreEqual("o", _server.ISupport.Prefix.FromPrefix("@"));
|
||||
Assert.IsNull(_server.ISupport.Prefix.FromPrefix("&"));
|
||||
|
||||
_server.Parse(new("005 * PREFIX=(qaohv)~&@%+ *"));
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"q",
|
||||
"a",
|
||||
"o",
|
||||
"h",
|
||||
"v"
|
||||
}, _server.ISupport.Prefix.Modes);
|
||||
CollectionAssert.AreEqual(new List<string>
|
||||
{
|
||||
"~",
|
||||
"&",
|
||||
"@",
|
||||
"%",
|
||||
"+"
|
||||
}, _server.ISupport.Prefix.Prefixes);
|
||||
Assert.AreEqual("&", _server.ISupport.Prefix.FromMode("a"));
|
||||
Assert.AreEqual("a", _server.ISupport.Prefix.FromPrefix("&"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChanTypes()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string> {"#"}, _server.ISupport.ChanTypes);
|
||||
_server.Parse(new("005 * CHANTYPES=#& *"));
|
||||
CollectionAssert.AreEqual(new List<string> {"#", "&"}, _server.ISupport.ChanTypes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Modes()
|
||||
{
|
||||
Assert.AreEqual(3, _server.ISupport.Modes);
|
||||
|
||||
_server.Parse(new("005 * MODES *"));
|
||||
Assert.AreEqual(-1, _server.ISupport.Modes);
|
||||
|
||||
_server.Parse(new("005 * MODES=5 *"));
|
||||
Assert.AreEqual(5, _server.ISupport.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Rfc1459()
|
||||
{
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
|
||||
_server.Parse(new("005 * CASEMAPPING=rfc1459 *"));
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
|
||||
var lower = _server.CaseFold(@"ÀTEST[]~\");
|
||||
Assert.AreEqual("Àtest{}^|", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Ascii()
|
||||
{
|
||||
_server.Parse(new("005 * CASEMAPPING=ascii *"));
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Ascii, _server.ISupport.CaseMapping);
|
||||
var lower = _server.CaseFold(@"ÀTEST[]~\");
|
||||
Assert.AreEqual(@"Àtest[]~\", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FallbackToRfc1459()
|
||||
{
|
||||
_server.Parse(new("005 * CASEMAPPING=nonexistent *"));
|
||||
Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
|
||||
var lower = _server.CaseFold(@"ÀTEST[]~\");
|
||||
Assert.AreEqual("Àtest{}^|", lower);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Network()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Network);
|
||||
_server.Parse(new("005 * NETWORK=testnet *"));
|
||||
Assert.AreEqual("testnet", _server.ISupport.Network);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void StatusMsg()
|
||||
{
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.ISupport.StatusMsg);
|
||||
_server.Parse(new("005 * STATUSMSG=&@ *"));
|
||||
CollectionAssert.AreEqual(new List<string> {"&", "@"}, _server.ISupport.StatusMsg);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CallerId()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.CallerId);
|
||||
|
||||
_server.Parse(new("005 * CALLERID=U *"));
|
||||
Assert.AreEqual("U", _server.ISupport.CallerId);
|
||||
|
||||
_server.Parse(new("005 * CALLERID *"));
|
||||
Assert.AreEqual("g", _server.ISupport.CallerId);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Excepts()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Excepts);
|
||||
|
||||
_server.Parse(new("005 * EXCEPTS=U *"));
|
||||
Assert.AreEqual("U", _server.ISupport.Excepts);
|
||||
|
||||
_server.Parse(new("005 * EXCEPTS *"));
|
||||
Assert.AreEqual("e", _server.ISupport.Excepts);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Invex()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Invex);
|
||||
|
||||
_server.Parse(new("005 * INVEX=U *"));
|
||||
Assert.AreEqual("U", _server.ISupport.Invex);
|
||||
|
||||
_server.Parse(new("005 * INVEX *"));
|
||||
Assert.AreEqual("I", _server.ISupport.Invex);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Whox()
|
||||
{
|
||||
Assert.IsFalse(_server.ISupport.Whox);
|
||||
|
||||
_server.Parse(new("005 * WHOX *"));
|
||||
Assert.IsTrue(_server.ISupport.Whox);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Monitor()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Monitor);
|
||||
|
||||
_server.Parse(new("005 * MONITOR=123 *"));
|
||||
Assert.AreEqual(123, _server.ISupport.Monitor);
|
||||
|
||||
_server.Parse(new("005 * MONITOR *"));
|
||||
Assert.AreEqual(-1, _server.ISupport.Monitor);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Watch()
|
||||
{
|
||||
Assert.IsNull(_server.ISupport.Watch);
|
||||
|
||||
_server.Parse(new("005 * WATCH=123 *"));
|
||||
Assert.AreEqual(123, _server.ISupport.Watch);
|
||||
|
||||
_server.Parse(new("005 * WATCH *"));
|
||||
Assert.AreEqual(-1, _server.ISupport.Watch);
|
||||
}
|
||||
}
|
|
@ -1,179 +1,175 @@
|
|||
using System.Collections.Generic;
|
||||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
// ReSharper disable StringLiteralTypo
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Mode
|
||||
{
|
||||
[TestClass]
|
||||
public class Mode
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("001 nickname"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UModeAdd()
|
||||
{
|
||||
_server.Parse(new Line("MODE nickname +i"));
|
||||
CollectionAssert.AreEqual(new List<string> {"i"}, _server.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UModeRemove()
|
||||
{
|
||||
_server.Parse(new Line("MODE nickname +i"));
|
||||
_server.Parse(new Line("MODE nickname -i"));
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PrefixAdd()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +ov nickname nickname"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var channelUser = channel.Users[user.NickNameLower];
|
||||
CollectionAssert.AreEqual(new List<string> {"o", "v"}, channelUser.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PrefixRemove()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +ov nickname nickname"));
|
||||
_server.Parse(new Line("MODE #chan -ov nickname nickname"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var channelUser = channel.Users[user.NickNameLower];
|
||||
CollectionAssert.AreEqual(new List<string>(), channelUser.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelListAdd()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +b asd!*@*"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new List<string> {"asd!*@*"}, channel.ListModes["b"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelListRemove()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +b asd!*@*"));
|
||||
_server.Parse(new Line("MODE #chan -b asd!*@*"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, List<string>>(), channel.ListModes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeBAdd()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +k password"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"k", "password"}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeBRemove()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +k password"));
|
||||
_server.Parse(new Line("MODE #chan -k *"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeCAdd()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +l 100"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"l", "100"}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeCRemove()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +l 100"));
|
||||
_server.Parse(new Line("MODE #chan -l"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeDAdd()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +i"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"i", null}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeDRemove()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("MODE #chan +i"));
|
||||
_server.Parse(new Line("MODE #chan -i"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelNumeric()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("324 * #chan +bkli *!*@* pass 10"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"k", "pass"}, {"l", "10"}, {"i", null}},
|
||||
channel.Modes);
|
||||
CollectionAssert.AreEqual(new List<string> {"*!*@*"}, channel.ListModes["b"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelNumericWithoutPlus()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("324 * #chan il 10"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"i", null}, {"l", "10"}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UserNumeric()
|
||||
{
|
||||
_server.Parse(new Line("221 * +iw"));
|
||||
CollectionAssert.AreEqual(new List<string> {"i", "w"}, _server.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UserNumericWithoutPlus()
|
||||
{
|
||||
_server.Parse(new Line("221 * iw"));
|
||||
CollectionAssert.AreEqual(new List<string> {"i", "w"}, _server.Modes);
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("001 nickname"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UModeAdd()
|
||||
{
|
||||
_server.Parse(new("MODE nickname +i"));
|
||||
CollectionAssert.AreEqual(new List<string> {"i"}, _server.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UModeRemove()
|
||||
{
|
||||
_server.Parse(new("MODE nickname +i"));
|
||||
_server.Parse(new("MODE nickname -i"));
|
||||
CollectionAssert.AreEqual(new List<string>(), _server.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PrefixAdd()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +ov nickname nickname"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var channelUser = channel.Users[user.NickNameLower];
|
||||
CollectionAssert.AreEqual(new List<string> {"o", "v"}, channelUser.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PrefixRemove()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +ov nickname nickname"));
|
||||
_server.Parse(new("MODE #chan -ov nickname nickname"));
|
||||
|
||||
var user = _server.Users["nickname"];
|
||||
var channel = _server.Channels["#chan"];
|
||||
var channelUser = channel.Users[user.NickNameLower];
|
||||
CollectionAssert.AreEqual(new List<string>(), channelUser.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelListAdd()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +b asd!*@*"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new List<string> {"asd!*@*"}, channel.ListModes["b"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelListRemove()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +b asd!*@*"));
|
||||
_server.Parse(new("MODE #chan -b asd!*@*"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, List<string>>(), channel.ListModes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeBAdd()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +k password"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"k", "password"}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeBRemove()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +k password"));
|
||||
_server.Parse(new("MODE #chan -k *"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeCAdd()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +l 100"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"l", "100"}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeCRemove()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +l 100"));
|
||||
_server.Parse(new("MODE #chan -l"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeDAdd()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +i"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"i", null}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelTypeDRemove()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("MODE #chan +i"));
|
||||
_server.Parse(new("MODE #chan -i"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelNumeric()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("324 * #chan +bkli *!*@* pass 10"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"k", "pass"}, {"l", "10"}, {"i", null}},
|
||||
channel.Modes);
|
||||
CollectionAssert.AreEqual(new List<string> {"*!*@*"}, channel.ListModes["b"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ChannelNumericWithoutPlus()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("324 * #chan il 10"));
|
||||
|
||||
var channel = _server.Channels["#chan"];
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"i", null}, {"l", "10"}}, channel.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UserNumeric()
|
||||
{
|
||||
_server.Parse(new("221 * +iw"));
|
||||
CollectionAssert.AreEqual(new List<string> {"i", "w"}, _server.Modes);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UserNumericWithoutPlus()
|
||||
{
|
||||
_server.Parse(new("221 * iw"));
|
||||
CollectionAssert.AreEqual(new List<string> {"i", "w"}, _server.Modes);
|
||||
}
|
||||
}
|
|
@ -1,23 +1,18 @@
|
|||
using System.Collections.Generic;
|
||||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Motd
|
||||
{
|
||||
[TestClass]
|
||||
public class Motd
|
||||
[TestMethod]
|
||||
public void MessageOfTheDay()
|
||||
{
|
||||
[TestMethod]
|
||||
public void MessageOfTheDay()
|
||||
{
|
||||
var server = new Server("test");
|
||||
server.Parse(new Line("001 nickname"));
|
||||
server.Parse(new Line("375 * :start of motd"));
|
||||
server.Parse(new Line("372 * :first line of motd"));
|
||||
server.Parse(new Line("372 * :second line of motd"));
|
||||
var server = new Server("test");
|
||||
server.Parse(new("001 nickname"));
|
||||
server.Parse(new("375 * :start of motd"));
|
||||
server.Parse(new("372 * :first line of motd"));
|
||||
server.Parse(new("372 * :second line of motd"));
|
||||
|
||||
CollectionAssert.AreEqual(new List<string> {"start of motd", "first line of motd", "second line of motd"},
|
||||
server.Motd);
|
||||
}
|
||||
CollectionAssert.AreEqual(new List<string> {"start of motd", "first line of motd", "second line of motd"},
|
||||
server.Motd);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,38 +1,34 @@
|
|||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Sasl
|
||||
{
|
||||
[TestClass]
|
||||
public class Sasl
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("900 * nick!user@host account"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LoggedIn()
|
||||
{
|
||||
Assert.AreEqual("nick", _server.NickName);
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
Assert.AreEqual("account", _server.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LoggedOut()
|
||||
{
|
||||
_server.Parse(new Line("901 * nick1!user1@host1"));
|
||||
|
||||
Assert.AreEqual("nick1", _server.NickName);
|
||||
Assert.AreEqual("user1", _server.UserName);
|
||||
Assert.AreEqual("host1", _server.HostName);
|
||||
Assert.IsTrue(string.IsNullOrEmpty(_server.Account));
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("900 * nick!user@host account"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LoggedIn()
|
||||
{
|
||||
Assert.AreEqual("nick", _server.NickName);
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
Assert.AreEqual("account", _server.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LoggedOut()
|
||||
{
|
||||
_server.Parse(new("901 * nick1!user1@host1"));
|
||||
|
||||
Assert.AreEqual("nick1", _server.NickName);
|
||||
Assert.AreEqual("user1", _server.UserName);
|
||||
Assert.AreEqual("host1", _server.HostName);
|
||||
Assert.IsTrue(string.IsNullOrEmpty(_server.Account));
|
||||
}
|
||||
}
|
|
@ -1,298 +1,294 @@
|
|||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class User
|
||||
{
|
||||
[TestClass]
|
||||
public class User
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("001 nickname"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Welcome()
|
||||
{
|
||||
Assert.AreEqual("test", _server.Name);
|
||||
Assert.AreEqual("nickname", _server.NickName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NicknameChange()
|
||||
{
|
||||
_server.Parse(new Line(":nickname NICK nickname2"));
|
||||
Assert.AreEqual("nickname2", _server.NickName);
|
||||
|
||||
_server.Parse(new Line(":nickname2 JOIN #chan"));
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other"));
|
||||
|
||||
_server.Parse(new Line(":other NICK other2"));
|
||||
Assert.IsFalse(_server.Users.ContainsKey("other"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other2"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskJoinBoth()
|
||||
{
|
||||
_server.Parse(new Line(":nickname!user@host JOIN #chan"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other!user@host JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskJoinUser()
|
||||
{
|
||||
_server.Parse(new Line(":nickname!user JOIN #chan"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.IsNull(_server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other!user JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.IsNull(user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskJoinHost()
|
||||
{
|
||||
_server.Parse(new Line(":nickname@host JOIN #chan"));
|
||||
Assert.IsNull(_server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other@host JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ExtendedJoinWithoutExtendedJoin()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
Assert.IsNull(_server.Account);
|
||||
Assert.IsNull(_server.RealName);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.Account);
|
||||
Assert.IsNull(user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ExtendedJoinWithAccount()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan acc :realname"));
|
||||
Assert.AreEqual("acc", _server.Account);
|
||||
Assert.AreEqual("realname", _server.RealName);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan acc2 :realname2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("acc2", user.Account);
|
||||
Assert.AreEqual("realname2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ExtendedJoinWithoutAccount()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan * :realname"));
|
||||
Assert.AreEqual("", _server.Account);
|
||||
Assert.AreEqual("realname", _server.RealName);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan * :realname2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("", user.Account);
|
||||
Assert.AreEqual("realname2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AccountNotifyWithAccount()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname ACCOUNT acc"));
|
||||
Assert.AreEqual("acc", _server.Account);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":other ACCOUNT acc2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("acc2", user.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AccountNotifyWithoutAccount()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname ACCOUNT *"));
|
||||
Assert.AreEqual("", _server.Account);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":other ACCOUNT *"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("", user.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskPrivmsgBoth()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname!user@host PRIVMSG #chan :hi"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other!user@host PRIVMSG #chan :hi"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskPrivmsgUser()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname!user PRIVMSG #chan :hi"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.IsNull(_server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other!user PRIVMSG #chan :hi"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.IsNull(user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskPrivmsgHost()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname@host PRIVMSG #chan :hi"));
|
||||
Assert.IsNull(_server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other@host PRIVMSG #chan :hi"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void VisibleHostWithoutUsername()
|
||||
{
|
||||
_server.Parse(new Line("396 * hostname"));
|
||||
Assert.IsNull(_server.UserName);
|
||||
Assert.AreEqual("hostname", _server.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void VisibleHostWithUsername()
|
||||
{
|
||||
_server.Parse(new Line("396 * username@hostname"));
|
||||
Assert.AreEqual("username", _server.UserName);
|
||||
Assert.AreEqual("hostname", _server.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Who()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line("352 * #chan user host * nickname * :0 real"));
|
||||
_server.Parse(new Line("352 * #chan user2 host2 * other * :0 real2"));
|
||||
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
Assert.AreEqual("real", _server.RealName);
|
||||
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user2", user.UserName);
|
||||
Assert.AreEqual("host2", user.HostName);
|
||||
Assert.AreEqual("real2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Chghost()
|
||||
{
|
||||
_server.Parse(new Line(":nickname!user@host JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname CHGHOST u h"));
|
||||
Assert.AreEqual("u", _server.UserName);
|
||||
Assert.AreEqual("h", _server.HostName);
|
||||
|
||||
_server.Parse(new Line(":other!user2@host2 JOIN #chan"));
|
||||
_server.Parse(new Line(":other CHGHOST u2 h2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("u2", user.UserName);
|
||||
Assert.AreEqual("h2", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Whois()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line("311 * nickname u h * :r"));
|
||||
Assert.AreEqual("u", _server.UserName);
|
||||
Assert.AreEqual("h", _server.HostName);
|
||||
Assert.AreEqual("r", _server.RealName);
|
||||
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":other CHGHOST u2 h2"));
|
||||
_server.Parse(new Line("311 * other u2 h2 * :r2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("u2", user.UserName);
|
||||
Assert.AreEqual("h2", user.HostName);
|
||||
Assert.AreEqual("r2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AwaySet()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(_server.Away);
|
||||
Assert.IsNull(user.Away);
|
||||
|
||||
_server.Parse(new Line(":nickname AWAY :bye bye"));
|
||||
_server.Parse(new Line(":other AWAY :ich geh weg"));
|
||||
Assert.AreEqual("bye bye", _server.Away);
|
||||
Assert.AreEqual("ich geh weg", user.Away);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AwayUnset()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
_server.Parse(new Line(":nickname AWAY :bye bye"));
|
||||
_server.Parse(new Line(":nickname AWAY"));
|
||||
_server.Parse(new Line(":other AWAY :ich geh weg"));
|
||||
_server.Parse(new Line(":other AWAY"));
|
||||
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(_server.Away);
|
||||
Assert.IsNull(user.Away);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Setname()
|
||||
{
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
_server.Parse(new Line(":other JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.RealName);
|
||||
Assert.IsNull(_server.RealName);
|
||||
|
||||
_server.Parse(new Line(":nickname SETNAME :new now know how"));
|
||||
_server.Parse(new Line(":other SETNAME :tyrannosaurus hex"));
|
||||
Assert.AreEqual("new now know how", _server.RealName);
|
||||
Assert.AreEqual("tyrannosaurus hex", user.RealName);
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("001 nickname"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Welcome()
|
||||
{
|
||||
Assert.AreEqual("test", _server.Name);
|
||||
Assert.AreEqual("nickname", _server.NickName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NicknameChange()
|
||||
{
|
||||
_server.Parse(new(":nickname NICK nickname2"));
|
||||
Assert.AreEqual("nickname2", _server.NickName);
|
||||
|
||||
_server.Parse(new(":nickname2 JOIN #chan"));
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other"));
|
||||
|
||||
_server.Parse(new(":other NICK other2"));
|
||||
Assert.IsFalse(_server.Users.ContainsKey("other"));
|
||||
Assert.IsTrue(_server.Users.ContainsKey("other2"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskJoinBoth()
|
||||
{
|
||||
_server.Parse(new(":nickname!user@host JOIN #chan"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new(":other!user@host JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskJoinUser()
|
||||
{
|
||||
_server.Parse(new(":nickname!user JOIN #chan"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.IsNull(_server.HostName);
|
||||
|
||||
_server.Parse(new(":other!user JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.IsNull(user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskJoinHost()
|
||||
{
|
||||
_server.Parse(new(":nickname@host JOIN #chan"));
|
||||
Assert.IsNull(_server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new(":other@host JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ExtendedJoinWithoutExtendedJoin()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
Assert.IsNull(_server.Account);
|
||||
Assert.IsNull(_server.RealName);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.Account);
|
||||
Assert.IsNull(user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ExtendedJoinWithAccount()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan acc :realname"));
|
||||
Assert.AreEqual("acc", _server.Account);
|
||||
Assert.AreEqual("realname", _server.RealName);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan acc2 :realname2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("acc2", user.Account);
|
||||
Assert.AreEqual("realname2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ExtendedJoinWithoutAccount()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan * :realname"));
|
||||
Assert.AreEqual("", _server.Account);
|
||||
Assert.AreEqual("realname", _server.RealName);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan * :realname2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("", user.Account);
|
||||
Assert.AreEqual("realname2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AccountNotifyWithAccount()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":nickname ACCOUNT acc"));
|
||||
Assert.AreEqual("acc", _server.Account);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":other ACCOUNT acc2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("acc2", user.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AccountNotifyWithoutAccount()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":nickname ACCOUNT *"));
|
||||
Assert.AreEqual("", _server.Account);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":other ACCOUNT *"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("", user.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskPrivmsgBoth()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":nickname!user@host PRIVMSG #chan :hi"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new(":other!user@host PRIVMSG #chan :hi"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskPrivmsgUser()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":nickname!user PRIVMSG #chan :hi"));
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.IsNull(_server.HostName);
|
||||
|
||||
_server.Parse(new(":other!user PRIVMSG #chan :hi"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.IsNull(user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskPrivmsgHost()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":nickname@host PRIVMSG #chan :hi"));
|
||||
Assert.IsNull(_server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
|
||||
_server.Parse(new(":other@host PRIVMSG #chan :hi"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void VisibleHostWithoutUsername()
|
||||
{
|
||||
_server.Parse(new("396 * hostname"));
|
||||
Assert.IsNull(_server.UserName);
|
||||
Assert.AreEqual("hostname", _server.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void VisibleHostWithUsername()
|
||||
{
|
||||
_server.Parse(new("396 * username@hostname"));
|
||||
Assert.AreEqual("username", _server.UserName);
|
||||
Assert.AreEqual("hostname", _server.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Who()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new("352 * #chan user host * nickname * :0 real"));
|
||||
_server.Parse(new("352 * #chan user2 host2 * other * :0 real2"));
|
||||
|
||||
Assert.AreEqual("user", _server.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
Assert.AreEqual("real", _server.RealName);
|
||||
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("user2", user.UserName);
|
||||
Assert.AreEqual("host2", user.HostName);
|
||||
Assert.AreEqual("real2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Chghost()
|
||||
{
|
||||
_server.Parse(new(":nickname!user@host JOIN #chan"));
|
||||
_server.Parse(new(":nickname CHGHOST u h"));
|
||||
Assert.AreEqual("u", _server.UserName);
|
||||
Assert.AreEqual("h", _server.HostName);
|
||||
|
||||
_server.Parse(new(":other!user2@host2 JOIN #chan"));
|
||||
_server.Parse(new(":other CHGHOST u2 h2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("u2", user.UserName);
|
||||
Assert.AreEqual("h2", user.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Whois()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new("311 * nickname u h * :r"));
|
||||
Assert.AreEqual("u", _server.UserName);
|
||||
Assert.AreEqual("h", _server.HostName);
|
||||
Assert.AreEqual("r", _server.RealName);
|
||||
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":other CHGHOST u2 h2"));
|
||||
_server.Parse(new("311 * other u2 h2 * :r2"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.AreEqual("u2", user.UserName);
|
||||
Assert.AreEqual("h2", user.HostName);
|
||||
Assert.AreEqual("r2", user.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AwaySet()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(_server.Away);
|
||||
Assert.IsNull(user.Away);
|
||||
|
||||
_server.Parse(new(":nickname AWAY :bye bye"));
|
||||
_server.Parse(new(":other AWAY :ich geh weg"));
|
||||
Assert.AreEqual("bye bye", _server.Away);
|
||||
Assert.AreEqual("ich geh weg", user.Away);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AwayUnset()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
_server.Parse(new(":nickname AWAY :bye bye"));
|
||||
_server.Parse(new(":nickname AWAY"));
|
||||
_server.Parse(new(":other AWAY :ich geh weg"));
|
||||
_server.Parse(new(":other AWAY"));
|
||||
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(_server.Away);
|
||||
Assert.IsNull(user.Away);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Setname()
|
||||
{
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
_server.Parse(new(":other JOIN #chan"));
|
||||
var user = _server.Users["other"];
|
||||
Assert.IsNull(user.RealName);
|
||||
Assert.IsNull(_server.RealName);
|
||||
|
||||
_server.Parse(new(":nickname SETNAME :new now know how"));
|
||||
_server.Parse(new(":other SETNAME :tyrannosaurus hex"));
|
||||
Assert.AreEqual("new now know how", _server.RealName);
|
||||
Assert.AreEqual("tyrannosaurus hex", user.RealName);
|
||||
}
|
||||
}
|
|
@ -1,61 +1,58 @@
|
|||
using IRCTokens;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
// ReSharper disable StringLiteralTypo
|
||||
namespace IRCSharp.Tests.State;
|
||||
|
||||
namespace IRCStates.Tests
|
||||
[TestClass]
|
||||
public class Who
|
||||
{
|
||||
[TestClass]
|
||||
public class Who
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
private Server _server;
|
||||
|
||||
[TestInitialize]
|
||||
public void TestInitialize()
|
||||
{
|
||||
_server = new Server("test");
|
||||
_server.Parse(new Line("001 nickname"));
|
||||
_server.Parse(new Line(":nickname JOIN #chan"));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void WhoResponse()
|
||||
{
|
||||
_server.Parse(new Line("352 * #chan user host server nickname * :0 real"));
|
||||
var user = _server.Users["nickname"];
|
||||
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
Assert.AreEqual("real", user.RealName);
|
||||
|
||||
Assert.AreEqual(user.UserName, _server.UserName);
|
||||
Assert.AreEqual(user.HostName, _server.HostName);
|
||||
Assert.AreEqual(user.RealName, _server.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Whox()
|
||||
{
|
||||
_server.Parse(new Line($"354 * {Server.WhoType} user realip host nickname account :real"));
|
||||
var user = _server.Users["nickname"];
|
||||
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
Assert.AreEqual("real", user.RealName);
|
||||
Assert.AreEqual("account", user.Account);
|
||||
|
||||
Assert.AreEqual(user.UserName, _server.UserName);
|
||||
Assert.AreEqual(user.HostName, _server.HostName);
|
||||
Assert.AreEqual(user.RealName, _server.RealName);
|
||||
Assert.AreEqual(user.Account, _server.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void WhoxNoAccount()
|
||||
{
|
||||
_server.Parse(new Line($"354 * {Server.WhoType} user realip host nickname 0 :real"));
|
||||
var user = _server.Users["nickname"];
|
||||
|
||||
Assert.IsNull(user.Account);
|
||||
Assert.AreEqual(user.Account, _server.Account);
|
||||
}
|
||||
_server = new("test");
|
||||
_server.Parse(new("001 nickname"));
|
||||
_server.Parse(new(":nickname JOIN #chan"));
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void WhoResponse()
|
||||
{
|
||||
_server.Parse(new("352 * #chan user host server nickname * :0 real"));
|
||||
var user = _server.Users["nickname"];
|
||||
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", _server.HostName);
|
||||
Assert.AreEqual("real", user.RealName);
|
||||
|
||||
Assert.AreEqual(user.UserName, _server.UserName);
|
||||
Assert.AreEqual(user.HostName, _server.HostName);
|
||||
Assert.AreEqual(user.RealName, _server.RealName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Whox()
|
||||
{
|
||||
_server.Parse(new($"354 * {Server.WhoType} user realip host nickname account :real"));
|
||||
var user = _server.Users["nickname"];
|
||||
|
||||
Assert.AreEqual("user", user.UserName);
|
||||
Assert.AreEqual("host", user.HostName);
|
||||
Assert.AreEqual("real", user.RealName);
|
||||
Assert.AreEqual("account", user.Account);
|
||||
|
||||
Assert.AreEqual(user.UserName, _server.UserName);
|
||||
Assert.AreEqual(user.HostName, _server.HostName);
|
||||
Assert.AreEqual(user.RealName, _server.RealName);
|
||||
Assert.AreEqual(user.Account, _server.Account);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void WhoxNoAccount()
|
||||
{
|
||||
_server.Parse(new($"354 * {Server.WhoType} user realip host nickname 0 :real"));
|
||||
var user = _server.Users["nickname"];
|
||||
|
||||
Assert.IsNull(user.Account);
|
||||
Assert.AreEqual(user.Account, _server.Account);
|
||||
}
|
||||
}
|
|
@ -1,30 +1,28 @@
|
|||
using System.Collections.Generic;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization;
|
||||
|
||||
namespace IRCTokens.Tests.Data
|
||||
namespace IRCSharp.Tests.Tokenization.Data;
|
||||
|
||||
public class JoinModel
|
||||
{
|
||||
public class JoinModel
|
||||
public List<Test> Tests { get; set; }
|
||||
|
||||
public class Test
|
||||
{
|
||||
public List<Test> Tests { get; set; }
|
||||
[YamlMember(Alias = "desc")] public string Description { get; set; }
|
||||
|
||||
public class Test
|
||||
{
|
||||
[YamlMember(Alias = "desc")] public string Description { get; set; }
|
||||
public Atoms Atoms { get; set; }
|
||||
|
||||
public Atoms Atoms { get; set; }
|
||||
|
||||
public List<string> Matches { get; set; }
|
||||
}
|
||||
|
||||
public class Atoms
|
||||
{
|
||||
public Dictionary<string, string> Tags { get; set; }
|
||||
|
||||
public string Source { get; set; }
|
||||
|
||||
public string Verb { get; set; }
|
||||
|
||||
public List<string> Params { get; set; }
|
||||
}
|
||||
public List<string> Matches { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
public class Atoms
|
||||
{
|
||||
public Dictionary<string, string> Tags { get; set; }
|
||||
|
||||
public string Source { get; set; }
|
||||
|
||||
public string Verb { get; set; }
|
||||
|
||||
public List<string> Params { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,15 +1,12 @@
|
|||
using System.Collections.Generic;
|
||||
namespace IRCSharp.Tests.Tokenization.Data;
|
||||
|
||||
namespace IRCTokens.Tests.Data
|
||||
public class SplitModel
|
||||
{
|
||||
public class SplitModel
|
||||
{
|
||||
public List<Test> Tests { get; set; }
|
||||
public List<Test> Tests { get; set; }
|
||||
|
||||
public class Test
|
||||
{
|
||||
public string Input { get; set; }
|
||||
public JoinModel.Atoms Atoms { get; set; }
|
||||
}
|
||||
public class Test
|
||||
{
|
||||
public string Input { get; set; }
|
||||
public JoinModel.Atoms Atoms { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -133,7 +133,7 @@ tests:
|
|||
tags:
|
||||
"a": "b"
|
||||
"c": "32"
|
||||
"k": ""
|
||||
"k":
|
||||
"rt": "ql7"
|
||||
|
||||
# with escaped tags
|
||||
|
@ -149,7 +149,7 @@ tests:
|
|||
- input: "@c;h=;a=b :quux ab cd"
|
||||
atoms:
|
||||
tags:
|
||||
"c": ""
|
||||
"c":
|
||||
"h": ""
|
||||
"a": "b"
|
||||
source: "quux"
|
||||
|
@ -213,7 +213,7 @@ tests:
|
|||
atoms:
|
||||
tags:
|
||||
tag1: "value1"
|
||||
tag2: ""
|
||||
tag2:
|
||||
vendor1/tag3: "value2"
|
||||
vendor2/tag4: ""
|
||||
source: "irc.example.com"
|
||||
|
@ -236,9 +236,9 @@ tests:
|
|||
atoms:
|
||||
tags:
|
||||
tag1: "value1"
|
||||
tag2: ""
|
||||
tag2:
|
||||
vendor1/tag3: "value2"
|
||||
vendor2/tag4: ""
|
||||
vendor2/tag4:
|
||||
verb: "COMMAND"
|
||||
params:
|
||||
- "param1"
|
||||
|
|
|
@ -1,105 +1,101 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
// ReSharper disable StringLiteralTypo
|
||||
namespace IRCSharp.Tests.Tokenization;
|
||||
|
||||
namespace IRCTokens.Tests
|
||||
[TestClass]
|
||||
public class Format
|
||||
{
|
||||
[TestClass]
|
||||
public class Format
|
||||
[TestMethod]
|
||||
public void Tags()
|
||||
{
|
||||
[TestMethod]
|
||||
public void Tags()
|
||||
var line = new Line("PRIVMSG", "#channel", "hello")
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello")
|
||||
{
|
||||
Tags = new Dictionary<string, string> {{"id", "\\" + " " + ";" + "\r\n"}}
|
||||
}.Format();
|
||||
Tags = new() {{"id", "\\" + " " + ";" + "\r\n"}}
|
||||
}.Format();
|
||||
|
||||
Assert.AreEqual("@id=\\\\\\s\\:\\r\\n PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MissingTag()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NullTag()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello") {Tags = new Dictionary<string, string> {{"a", null}}}
|
||||
.Format();
|
||||
|
||||
Assert.AreEqual("@a PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmptyTag()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello") {Tags = new Dictionary<string, string> {{"a", ""}}}
|
||||
.Format();
|
||||
|
||||
Assert.AreEqual("@a PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Source()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello") {Source = "nick!user@host"}.Format();
|
||||
|
||||
Assert.AreEqual(":nick!user@host PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandLowercase()
|
||||
{
|
||||
var line = new Line {Command = "privmsg"}.Format();
|
||||
Assert.AreEqual("privmsg", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandUppercase()
|
||||
{
|
||||
var line = new Line {Command = "PRIVMSG"}.Format();
|
||||
Assert.AreEqual("PRIVMSG", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TrailingSpace()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello world").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel :hello world", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TrailingNoSpace()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "helloworld").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel helloworld", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TrailingDoubleColon()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", ":helloworld").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel ::helloworld", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void InvalidNonLastSpace()
|
||||
{
|
||||
Assert.ThrowsException<ArgumentException>(() => { new Line("USER", "user", "0 *", "real name").Format(); });
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void InvalidNonLastColon()
|
||||
{
|
||||
Assert.ThrowsException<ArgumentException>(() => { new Line("PRIVMSG", ":#channel", "hello").Format(); });
|
||||
}
|
||||
Assert.AreEqual(@"@id=\\\s\:\r\n PRIVMSG #channel hello", line);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MissingTag()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NullTag()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello") {Tags = new() {{"a", null}}}
|
||||
.Format();
|
||||
|
||||
Assert.AreEqual("@a PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmptyTag()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello") {Tags = new() {{"a", ""}}}
|
||||
.Format();
|
||||
|
||||
Assert.AreEqual("@a PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Source()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello") {Source = "nick!user@host"}.Format();
|
||||
|
||||
Assert.AreEqual(":nick!user@host PRIVMSG #channel hello", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandLowercase()
|
||||
{
|
||||
var line = new Line {Command = "privmsg"}.Format();
|
||||
Assert.AreEqual("privmsg", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CommandUppercase()
|
||||
{
|
||||
var line = new Line {Command = "PRIVMSG"}.Format();
|
||||
Assert.AreEqual("PRIVMSG", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TrailingSpace()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "hello world").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel :hello world", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TrailingNoSpace()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", "helloworld").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel helloworld", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TrailingDoubleColon()
|
||||
{
|
||||
var line = new Line("PRIVMSG", "#channel", ":helloworld").Format();
|
||||
|
||||
Assert.AreEqual("PRIVMSG #channel ::helloworld", line);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void InvalidNonLastSpace()
|
||||
{
|
||||
Assert.ThrowsException<ArgumentException>(() => { new Line("USER", "user", "0 *", "real name").Format(); });
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void InvalidNonLastColon()
|
||||
{
|
||||
Assert.ThrowsException<ArgumentException>(() => { new Line("PRIVMSG", ":#channel", "hello").Format(); });
|
||||
}
|
||||
}
|
|
@ -1,64 +1,61 @@
|
|||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.Tokenization;
|
||||
|
||||
namespace IRCTokens.Tests
|
||||
[TestClass]
|
||||
public class Hostmask
|
||||
{
|
||||
[TestClass]
|
||||
public class Hostmask
|
||||
[TestMethod]
|
||||
public void FullHostmask()
|
||||
{
|
||||
[TestMethod]
|
||||
public void FullHostmask()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick!user@host");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.AreEqual("user", hostmask.UserName);
|
||||
Assert.AreEqual("host", hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NoHostName()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick!user");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.AreEqual("user", hostmask.UserName);
|
||||
Assert.IsNull(hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NoUserName()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick@host");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.IsNull(hostmask.UserName);
|
||||
Assert.AreEqual("host", hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void OnlyNickName()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.IsNull(hostmask.UserName);
|
||||
Assert.IsNull(hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskFromLine()
|
||||
{
|
||||
var line = new Line(":nick!user@host PRIVMSG #channel hello");
|
||||
var hostmask = new IRCTokens.Hostmask("nick!user@host");
|
||||
Assert.AreEqual(hostmask.ToString(), line.Hostmask.ToString());
|
||||
Assert.AreEqual("nick", line.Hostmask.NickName);
|
||||
Assert.AreEqual("user", line.Hostmask.UserName);
|
||||
Assert.AreEqual("host", line.Hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmptyHostmaskFromLine()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
Assert.IsNull(line.Hostmask.HostName);
|
||||
Assert.IsNull(line.Hostmask.UserName);
|
||||
Assert.IsNull(line.Hostmask.NickName);
|
||||
}
|
||||
var hostmask = new IRCTokens.Hostmask("nick!user@host");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.AreEqual("user", hostmask.UserName);
|
||||
Assert.AreEqual("host", hostmask.HostName);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NoHostName()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick!user");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.AreEqual("user", hostmask.UserName);
|
||||
Assert.IsNull(hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NoUserName()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick@host");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.IsNull(hostmask.UserName);
|
||||
Assert.AreEqual("host", hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void OnlyNickName()
|
||||
{
|
||||
var hostmask = new IRCTokens.Hostmask("nick");
|
||||
Assert.AreEqual("nick", hostmask.NickName);
|
||||
Assert.IsNull(hostmask.UserName);
|
||||
Assert.IsNull(hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void HostmaskFromLine()
|
||||
{
|
||||
var line = new Line(":nick!user@host PRIVMSG #channel hello");
|
||||
var hostmask = new IRCTokens.Hostmask("nick!user@host");
|
||||
Assert.AreEqual(hostmask.ToString(), line.Hostmask.ToString());
|
||||
Assert.AreEqual("nick", line.Hostmask.NickName);
|
||||
Assert.AreEqual("user", line.Hostmask.UserName);
|
||||
Assert.AreEqual("host", line.Hostmask.HostName);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EmptyHostmaskFromLine()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
Assert.IsNull(line.Hostmask.HostName);
|
||||
Assert.IsNull(line.Hostmask.UserName);
|
||||
Assert.IsNull(line.Hostmask.NickName);
|
||||
}
|
||||
}
|
|
@ -1,55 +1,51 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using IRCTokens.Tests.Data;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using System.Globalization;
|
||||
using IRCSharp.Tests.Tokenization.Data;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization.NamingConventions;
|
||||
|
||||
namespace IRCTokens.Tests
|
||||
namespace IRCSharp.Tests.Tokenization;
|
||||
|
||||
[TestClass]
|
||||
public class Parser
|
||||
{
|
||||
[TestClass]
|
||||
public class Parser
|
||||
private static T LoadYaml<T>(string path)
|
||||
{
|
||||
private static T LoadYaml<T>(string path)
|
||||
var deserializer = new DeserializerBuilder()
|
||||
.WithNamingConvention(CamelCaseNamingConvention.Instance)
|
||||
.Build();
|
||||
|
||||
return deserializer.Deserialize<T>(File.ReadAllText(path));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Split()
|
||||
{
|
||||
foreach (var test in LoadYaml<SplitModel>("Tokenization/Data/msg-split.yaml").Tests)
|
||||
{
|
||||
var deserializer = new DeserializerBuilder()
|
||||
.WithNamingConvention(CamelCaseNamingConvention.Instance)
|
||||
.Build();
|
||||
var tokens = new Line(test.Input);
|
||||
var atoms = test.Atoms;
|
||||
|
||||
return deserializer.Deserialize<T>(File.ReadAllText(path));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Split()
|
||||
{
|
||||
foreach (var test in LoadYaml<SplitModel>("Tokenization/Data/msg-split.yaml").Tests)
|
||||
{
|
||||
var tokens = new Line(test.Input);
|
||||
var atoms = test.Atoms;
|
||||
|
||||
Assert.AreEqual(atoms.Verb.ToUpper(CultureInfo.InvariantCulture), tokens.Command,
|
||||
$"command failed on: '{test.Input}'");
|
||||
Assert.AreEqual(atoms.Source, tokens.Source, $"source failed on: '{test.Input}'");
|
||||
CollectionAssert.AreEqual(atoms.Tags, tokens.Tags, $"tags failed on: '{test.Input}'");
|
||||
CollectionAssert.AreEqual(atoms.Params ?? new List<string>(), tokens.Params,
|
||||
$"params failed on: '{test.Input}'");
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Join()
|
||||
{
|
||||
foreach (var test in LoadYaml<JoinModel>("Tokenization/Data/msg-join.yaml").Tests)
|
||||
{
|
||||
var atoms = test.Atoms;
|
||||
var line = new Line
|
||||
{
|
||||
Command = atoms.Verb, Params = atoms.Params, Source = atoms.Source, Tags = atoms.Tags
|
||||
}.Format();
|
||||
|
||||
Assert.IsTrue(test.Matches.Contains(line), test.Description);
|
||||
}
|
||||
Assert.AreEqual(atoms.Verb.ToUpper(CultureInfo.InvariantCulture), tokens.Command,
|
||||
$"command failed on: '{test.Input}'");
|
||||
Assert.AreEqual(atoms.Source, tokens.Source, $"source failed on: '{test.Input}'");
|
||||
CollectionAssert.AreEqual(atoms.Tags, tokens.Tags, $"tags failed on: '{test.Input}'");
|
||||
CollectionAssert.AreEqual(atoms.Params ?? [], tokens.Params,
|
||||
$"params failed on: '{test.Input}'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Join()
|
||||
{
|
||||
foreach (var test in LoadYaml<JoinModel>("Tokenization/Data/msg-join.yaml").Tests)
|
||||
{
|
||||
var atoms = test.Atoms;
|
||||
var line = new Line
|
||||
{
|
||||
Command = atoms.Verb, Params = atoms.Params, Source = atoms.Source, Tags = atoms.Tags
|
||||
}.Format();
|
||||
|
||||
Assert.IsTrue(test.Matches.Contains(line), test.Description);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,88 +1,83 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.Tokenization;
|
||||
|
||||
namespace IRCTokens.Tests
|
||||
[TestClass]
|
||||
public class StatefulDecoder
|
||||
{
|
||||
[TestClass]
|
||||
public class StatefulDecoder
|
||||
private IRCTokens.StatefulDecoder _decoder;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
private IRCTokens.StatefulDecoder _decoder;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
_decoder = new IRCTokens.StatefulDecoder();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Partial()
|
||||
{
|
||||
var lines = _decoder.Push("PRIVMSG ");
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
|
||||
lines = _decoder.Push("#channel hello\r\n");
|
||||
Assert.AreEqual(1, lines.Count);
|
||||
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
CollectionAssert.AreEqual(new List<Line> {line}, lines);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Multiple()
|
||||
{
|
||||
var lines = _decoder.Push("PRIVMSG #channel1 hello\r\nPRIVMSG #channel2 hello\r\n");
|
||||
Assert.AreEqual(2, lines.Count);
|
||||
|
||||
var line1 = new Line("PRIVMSG #channel1 hello");
|
||||
var line2 = new Line("PRIVMSG #channel2 hello");
|
||||
Assert.AreEqual(line1, lines[0]);
|
||||
Assert.AreEqual(line2, lines[1]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EncodingIso8859()
|
||||
{
|
||||
var iso8859 = Encoding.GetEncoding("iso-8859-1");
|
||||
_decoder = new IRCTokens.StatefulDecoder {Encoding = iso8859};
|
||||
var bytes = iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n");
|
||||
var lines = _decoder.Push(bytes, bytes.Length);
|
||||
var line = new Line("PRIVMSG #channel :hello Ç");
|
||||
Assert.IsTrue(line.Equals(lines[0]));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EncodingFallback()
|
||||
{
|
||||
var latin1 = Encoding.GetEncoding("iso-8859-1");
|
||||
_decoder = new IRCTokens.StatefulDecoder {Encoding = null, Fallback = latin1};
|
||||
var bytes = latin1.GetBytes("PRIVMSG #channel hélló\r\n");
|
||||
var lines = _decoder.Push(bytes, bytes.Length);
|
||||
Assert.AreEqual(1, lines.Count);
|
||||
Assert.IsTrue(new Line("PRIVMSG #channel hélló").Equals(lines[0]));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Empty()
|
||||
{
|
||||
var lines = _decoder.Push(string.Empty);
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void BufferUnfinished()
|
||||
{
|
||||
_decoder.Push("PRIVMSG #channel hello");
|
||||
var lines = _decoder.Push(string.Empty);
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Clear()
|
||||
{
|
||||
_decoder.Push("PRIVMSG ");
|
||||
_decoder.Clear();
|
||||
Assert.AreEqual(string.Empty, _decoder.Pending);
|
||||
}
|
||||
_decoder = new();
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Partial()
|
||||
{
|
||||
var lines = _decoder.Push("PRIVMSG ");
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
|
||||
lines = _decoder.Push("#channel hello\r\n");
|
||||
Assert.AreEqual(1, lines.Count);
|
||||
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
CollectionAssert.AreEqual(new List<Line> {line}, lines);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Multiple()
|
||||
{
|
||||
var lines = _decoder.Push("PRIVMSG #channel1 hello\r\nPRIVMSG #channel2 hello\r\n");
|
||||
Assert.AreEqual(2, lines.Count);
|
||||
|
||||
var line1 = new Line("PRIVMSG #channel1 hello");
|
||||
var line2 = new Line("PRIVMSG #channel2 hello");
|
||||
Assert.AreEqual(line1, lines[0]);
|
||||
Assert.AreEqual(line2, lines[1]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EncodingIso8859()
|
||||
{
|
||||
var iso8859 = Encoding.GetEncoding("iso-8859-1");
|
||||
_decoder = new() {Encoding = iso8859};
|
||||
var bytes = iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n");
|
||||
var lines = _decoder.Push(bytes, bytes.Length);
|
||||
var line = new Line("PRIVMSG #channel :hello Ç");
|
||||
Assert.IsTrue(line.Equals(lines[0]));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EncodingFallback()
|
||||
{
|
||||
var latin1 = Encoding.GetEncoding("iso-8859-1");
|
||||
_decoder = new() {Encoding = null, Fallback = latin1};
|
||||
var bytes = latin1.GetBytes("PRIVMSG #channel hélló\r\n");
|
||||
var lines = _decoder.Push(bytes, bytes.Length);
|
||||
Assert.AreEqual(1, lines.Count);
|
||||
Assert.IsTrue(new Line("PRIVMSG #channel hélló").Equals(lines[0]));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Empty()
|
||||
{
|
||||
var lines = _decoder.Push(string.Empty);
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void BufferUnfinished()
|
||||
{
|
||||
_decoder.Push("PRIVMSG #channel hello");
|
||||
var lines = _decoder.Push(string.Empty);
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Clear()
|
||||
{
|
||||
_decoder.Push("PRIVMSG ");
|
||||
_decoder.Clear();
|
||||
Assert.AreEqual(string.Empty, _decoder.Pending);
|
||||
}
|
||||
}
|
|
@ -1,84 +1,80 @@
|
|||
using System.Text;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.Tokenization;
|
||||
|
||||
namespace IRCTokens.Tests
|
||||
[TestClass]
|
||||
public class StatefulEncoder
|
||||
{
|
||||
[TestClass]
|
||||
public class StatefulEncoder
|
||||
private IRCTokens.StatefulEncoder _encoder;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
private IRCTokens.StatefulEncoder _encoder;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
_encoder = new IRCTokens.StatefulEncoder();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Push()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
Assert.AreEqual("PRIVMSG #channel hello\r\n", _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PopPartial()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
_encoder.Pop("PRIVMSG #channel hello".Length);
|
||||
Assert.AreEqual("\r\n", _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TestPopReturned()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
_encoder.Push(line);
|
||||
var lines = _encoder.Pop("PRIVMSG #channel hello\r\n".Length);
|
||||
Assert.AreEqual(1, lines.Count);
|
||||
Assert.AreEqual(line, lines[0]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PopNoneReturned()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
var lines = _encoder.Pop(1);
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PopMultipleLines()
|
||||
{
|
||||
var line1 = new Line("PRIVMSG #channel1 hello");
|
||||
_encoder.Push(line1);
|
||||
var line2 = new Line("PRIVMSG #channel2 hello");
|
||||
_encoder.Push(line2);
|
||||
|
||||
var lines = _encoder.Pop(_encoder.Pending().Length);
|
||||
Assert.AreEqual(2, lines.Count);
|
||||
Assert.AreEqual(string.Empty, _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Clear()
|
||||
{
|
||||
_encoder.Push(new Line("PRIVMSG #channel hello"));
|
||||
_encoder.Clear();
|
||||
Assert.AreEqual(string.Empty, _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EncodingIso8859()
|
||||
{
|
||||
var iso8859 = Encoding.GetEncoding("iso-8859-1");
|
||||
_encoder = new IRCTokens.StatefulEncoder {Encoding = iso8859};
|
||||
_encoder.Push(new Line("PRIVMSG #channel :hello Ç"));
|
||||
CollectionAssert.AreEqual(iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n"), _encoder.PendingBytes);
|
||||
}
|
||||
_encoder = new();
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Push()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
Assert.AreEqual("PRIVMSG #channel hello\r\n", _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PopPartial()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
_encoder.Pop("PRIVMSG #channel hello".Length);
|
||||
Assert.AreEqual("\r\n", _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TestPopReturned()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
_encoder.Push(line);
|
||||
var lines = _encoder.Pop("PRIVMSG #channel hello\r\n".Length);
|
||||
Assert.AreEqual(1, lines.Count);
|
||||
Assert.AreEqual(line, lines[0]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PopNoneReturned()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel hello");
|
||||
_encoder.Push(line);
|
||||
var lines = _encoder.Pop(1);
|
||||
Assert.AreEqual(0, lines.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PopMultipleLines()
|
||||
{
|
||||
var line1 = new Line("PRIVMSG #channel1 hello");
|
||||
_encoder.Push(line1);
|
||||
var line2 = new Line("PRIVMSG #channel2 hello");
|
||||
_encoder.Push(line2);
|
||||
|
||||
var lines = _encoder.Pop(_encoder.Pending().Length);
|
||||
Assert.AreEqual(2, lines.Count);
|
||||
Assert.AreEqual(string.Empty, _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Clear()
|
||||
{
|
||||
_encoder.Push(new("PRIVMSG #channel hello"));
|
||||
_encoder.Clear();
|
||||
Assert.AreEqual(string.Empty, _encoder.Pending());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EncodingIso8859()
|
||||
{
|
||||
var iso8859 = Encoding.GetEncoding("iso-8859-1");
|
||||
_encoder = new() {Encoding = iso8859};
|
||||
_encoder.Push(new("PRIVMSG #channel :hello Ç"));
|
||||
CollectionAssert.AreEqual(iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n"), _encoder.PendingBytes);
|
||||
}
|
||||
}
|
|
@ -1,133 +1,127 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace IRCSharp.Tests.Tokenization;
|
||||
|
||||
namespace IRCTokens.Tests
|
||||
[TestClass]
|
||||
public class Tokenization
|
||||
{
|
||||
[TestClass]
|
||||
public class Tokenization
|
||||
[TestMethod]
|
||||
public void TagsMissing()
|
||||
{
|
||||
[TestMethod]
|
||||
public void TagsMissing()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel");
|
||||
Assert.IsNull(line.Tags);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsMissingValue()
|
||||
{
|
||||
var line = new Line("@id= PRIVMSG #channel");
|
||||
Assert.AreEqual(string.Empty, line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsMissingEqual()
|
||||
{
|
||||
var line = new Line("@id PRIVMSG #channel");
|
||||
Assert.AreEqual(string.Empty, line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsUnescape()
|
||||
{
|
||||
var line = new Line(@"@id=1\\\:\r\n\s2 PRIVMSG #channel");
|
||||
Assert.AreEqual("1\\;\r\n 2", line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsOverlap()
|
||||
{
|
||||
var line = new Line(@"@id=1\\\s\\s PRIVMSG #channel");
|
||||
Assert.AreEqual("1\\ \\s", line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsLoneEndSlash()
|
||||
{
|
||||
var line = new Line("@id=1\\ PRIVMSG #channel");
|
||||
Assert.AreEqual("1", line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceWithoutTags()
|
||||
{
|
||||
var line = new Line(":nick!user@host PRIVMSG #channel");
|
||||
Assert.AreEqual("nick!user@host", line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceWithTags()
|
||||
{
|
||||
var line = new Line("@id=123 :nick!user@host PRIVMSG #channel");
|
||||
Assert.AreEqual("nick!user@host", line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceMissingWithoutTags()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel");
|
||||
Assert.IsNull(line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceMissingWithTags()
|
||||
{
|
||||
var line = new Line("@id=123 PRIVMSG #channel");
|
||||
Assert.IsNull(line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Command()
|
||||
{
|
||||
var line = new Line("privmsg #channel");
|
||||
Assert.AreEqual("PRIVMSG", line.Command);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ParamsTrailing()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel :hello world");
|
||||
CollectionAssert.AreEqual(new List<string> {"#channel", "hello world"}, line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ParamsOnlyTrailing()
|
||||
{
|
||||
var line = new Line("PRIVMSG :hello world");
|
||||
CollectionAssert.AreEqual(new List<string> {"hello world"}, line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ParamsMissing()
|
||||
{
|
||||
var line = new Line("PRIVMSG");
|
||||
Assert.AreEqual("PRIVMSG", line.Command);
|
||||
CollectionAssert.AreEqual(new List<string>(), line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AllTokens()
|
||||
{
|
||||
var line = new Line("@id=123 :nick!user@host PRIVMSG #channel :hello world");
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"id", "123"}}, line.Tags);
|
||||
Assert.AreEqual("nick!user@host", line.Source);
|
||||
Assert.AreEqual("PRIVMSG", line.Command);
|
||||
CollectionAssert.AreEqual(new List<string> {"#channel", "hello world"}, line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NulByte()
|
||||
{
|
||||
var decoder = new IRCTokens.StatefulDecoder();
|
||||
var bytes = Encoding.UTF8.GetBytes(":nick!user@host PRIVMSG #channel :hello")
|
||||
.Concat(Encoding.UTF8.GetBytes("\0"))
|
||||
.Concat(Encoding.UTF8.GetBytes("world"))
|
||||
.ToArray();
|
||||
var line = decoder.Push(bytes, bytes.Length).First();
|
||||
|
||||
CollectionAssert.AreEqual(new List<string> {"#channel", "hello"}, line.Params);
|
||||
}
|
||||
var line = new Line("PRIVMSG #channel");
|
||||
Assert.IsNull(line.Tags);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsMissingValue()
|
||||
{
|
||||
var line = new Line("@id= PRIVMSG #channel");
|
||||
Assert.AreEqual(string.Empty, line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsMissingEqual()
|
||||
{
|
||||
var line = new Line("@id PRIVMSG #channel");
|
||||
Assert.IsNull(line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsUnescape()
|
||||
{
|
||||
var line = new Line(@"@id=1\\\:\r\n\s2 PRIVMSG #channel");
|
||||
Assert.AreEqual("1\\;\r\n 2", line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsOverlap()
|
||||
{
|
||||
var line = new Line(@"@id=1\\\s\\s PRIVMSG #channel");
|
||||
Assert.AreEqual(@"1\ \s", line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TagsLoneEndSlash()
|
||||
{
|
||||
var line = new Line("@id=1\\ PRIVMSG #channel");
|
||||
Assert.AreEqual("1", line.Tags["id"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceWithoutTags()
|
||||
{
|
||||
var line = new Line(":nick!user@host PRIVMSG #channel");
|
||||
Assert.AreEqual("nick!user@host", line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceWithTags()
|
||||
{
|
||||
var line = new Line("@id=123 :nick!user@host PRIVMSG #channel");
|
||||
Assert.AreEqual("nick!user@host", line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceMissingWithoutTags()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel");
|
||||
Assert.IsNull(line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SourceMissingWithTags()
|
||||
{
|
||||
var line = new Line("@id=123 PRIVMSG #channel");
|
||||
Assert.IsNull(line.Source);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Command()
|
||||
{
|
||||
var line = new Line("privmsg #channel");
|
||||
Assert.AreEqual("PRIVMSG", line.Command);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ParamsTrailing()
|
||||
{
|
||||
var line = new Line("PRIVMSG #channel :hello world");
|
||||
CollectionAssert.AreEqual(new List<string> {"#channel", "hello world"}, line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ParamsOnlyTrailing()
|
||||
{
|
||||
var line = new Line("PRIVMSG :hello world");
|
||||
CollectionAssert.AreEqual(new List<string> {"hello world"}, line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ParamsMissing()
|
||||
{
|
||||
var line = new Line("PRIVMSG");
|
||||
Assert.AreEqual("PRIVMSG", line.Command);
|
||||
CollectionAssert.AreEqual(new List<string>(), line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AllTokens()
|
||||
{
|
||||
var line = new Line("@id=123 :nick!user@host PRIVMSG #channel :hello world");
|
||||
CollectionAssert.AreEqual(new Dictionary<string, string> {{"id", "123"}}, line.Tags);
|
||||
Assert.AreEqual("nick!user@host", line.Source);
|
||||
Assert.AreEqual("PRIVMSG", line.Command);
|
||||
CollectionAssert.AreEqual(new List<string> {"#channel", "hello world"}, line.Params);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NulByte()
|
||||
{
|
||||
var decoder = new IRCTokens.StatefulDecoder();
|
||||
var bytes = ":nick!user@host PRIVMSG #channel :hello"u8.ToArray()
|
||||
.Concat("\0"u8.ToArray())
|
||||
.Concat("world"u8.ToArray())
|
||||
.ToArray();
|
||||
var line = decoder.Push(bytes, bytes.Length).First();
|
||||
|
||||
CollectionAssert.AreEqual(new List<string> {"#channel", "hello"}, line.Params);
|
||||
}
|
||||
}
|
13
IRCSharp.sln
13
IRCSharp.sln
|
@ -20,6 +20,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IRCSharp.Tests", "IRCSharp.
|
|||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{4260E03C-6E28-4519-8943-5B477841A75A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IRCRobots", "IRCRobots\IRCRobots.csproj", "{BACE834E-B190-46F1-8687-E994316FF768}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Robots", "Examples\Robots\Robots.csproj", "{932066DD-A44A-47EA-94F5-D7847CAA8EC7}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
@ -46,6 +50,14 @@ Global
|
|||
{B420F0F3-1ED0-4FD3-9E91-2E7F96F9FF7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B420F0F3-1ED0-4FD3-9E91-2E7F96F9FF7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B420F0F3-1ED0-4FD3-9E91-2E7F96F9FF7F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BACE834E-B190-46F1-8687-E994316FF768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BACE834E-B190-46F1-8687-E994316FF768}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BACE834E-B190-46F1-8687-E994316FF768}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BACE834E-B190-46F1-8687-E994316FF768}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{932066DD-A44A-47EA-94F5-D7847CAA8EC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{932066DD-A44A-47EA-94F5-D7847CAA8EC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{932066DD-A44A-47EA-94F5-D7847CAA8EC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{932066DD-A44A-47EA-94F5-D7847CAA8EC7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -53,6 +65,7 @@ Global
|
|||
GlobalSection(NestedProjects) = preSolution
|
||||
{A45DA39B-6B47-4713-8049-3B36E0235B67} = {4260E03C-6E28-4519-8943-5B477841A75A}
|
||||
{BC9F6696-9D83-4F7A-9E15-CE4D3626C1AF} = {4260E03C-6E28-4519-8943-5B477841A75A}
|
||||
{932066DD-A44A-47EA-94F5-D7847CAA8EC7} = {4260E03C-6E28-4519-8943-5B477841A75A}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {0B91F0EA-8564-4318-8EEC-ED0640475141}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:schemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ACK/@EntryIndexedValue">ACK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SASL/@EntryIndexedValue">SASL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=STS/@EntryIndexedValue">STS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TLS/@EntryIndexedValue">TLS</s:String>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=CHGHOST/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Invex/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=realname/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=SETNAME/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Autojoin/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Bindhost/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Realname/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
// ReSharper disable IdentifierTypo
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
|
@ -13,7 +14,7 @@ namespace IRCStates
|
|||
private const string AsciiUpperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
private const string AsciiLowerChars = "abcdefghijklmnopqrstuvwxyz";
|
||||
private const string Rfc1459UpperChars = AsciiUpperChars + @"[]~\";
|
||||
private const string Rfc1459LowerChars = AsciiLowerChars + @"{}^|";
|
||||
private const string Rfc1459LowerChars = AsciiLowerChars + "{}^|";
|
||||
|
||||
private static string Replace(string s, string upper, string lower)
|
||||
{
|
||||
|
|
|
@ -1,27 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
// ReSharper disable AutoPropertyCanBeMadeGetOnly.Local
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
public class Channel
|
||||
{
|
||||
public Channel()
|
||||
{
|
||||
Users = new Dictionary<string, ChannelUser>();
|
||||
ListModes = new Dictionary<string, List<string>>();
|
||||
Modes = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
public string Name { get; private set; }
|
||||
public string NameLower { get; private set; }
|
||||
public Dictionary<string, ChannelUser> Users { get; private set; }
|
||||
public Dictionary<string, ChannelUser> Users { get; private set; } = new Dictionary<string, ChannelUser>();
|
||||
public string Topic { get; set; }
|
||||
public string TopicSetter { get; set; }
|
||||
public DateTime TopicTime { get; set; }
|
||||
public DateTime Created { get; set; }
|
||||
public Dictionary<string, List<string>> ListModes { get; private set; }
|
||||
public Dictionary<string, string> Modes { get; private set; }
|
||||
public Dictionary<string, List<string>> ListModes { get; private set; } = new Dictionary<string, List<string>>();
|
||||
public Dictionary<string, string> Modes { get; private set; } = new Dictionary<string, string>();
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
|
|
|
@ -4,12 +4,7 @@ namespace IRCStates
|
|||
{
|
||||
public class ChannelUser
|
||||
{
|
||||
public ChannelUser()
|
||||
{
|
||||
Modes = new List<string>();
|
||||
}
|
||||
|
||||
public List<string> Modes { get; }
|
||||
public List<string> Modes { get; } = new List<string>();
|
||||
|
||||
private bool Equals(ChannelUser other)
|
||||
{
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
namespace IRCStates
|
||||
// ReSharper disable IdentifierTypo
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
public static class Commands
|
||||
{
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
// ReSharper disable UnusedMember.Global
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<PackageId>IRCStates</PackageId>
|
||||
<Version>1.2.0</Version>
|
||||
<Version>1.4.0</Version>
|
||||
<Authors>Ben Harris</Authors>
|
||||
<Company>tildeverse.org</Company>
|
||||
<IsPackable>true</IsPackable>
|
||||
|
@ -11,20 +11,25 @@
|
|||
<PackageProjectUrl>https://tildegit.org/irctokens/ircsharp</PackageProjectUrl>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<RepositoryUrl>https://tildegit.org/irctokens/ircsharp/src/branch/main/IRCStates</RepositoryUrl>
|
||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<PackageTags>irc</PackageTags>
|
||||
<PackageVersion>1.2.0</PackageVersion>
|
||||
<PackageVersion>1.4.0</PackageVersion>
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
<DebugType>embedded</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\IRCTokens\IRCTokens.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="README.md" Pack="true" PackagePath="\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.SourceLink.Gitea" Version="8.0.0" PrivateAssets="All"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -1,34 +1,23 @@
|
|||
// ReSharper disable InconsistentNaming
|
||||
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
// ReSharper disable InconsistentNaming
|
||||
// ReSharper disable StringLiteralTypo
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
public class ISupport
|
||||
{
|
||||
public ISupport()
|
||||
{
|
||||
Raw = new Dictionary<string, string>();
|
||||
Modes = 3;
|
||||
CaseMapping = Casemap.CaseMapping.Rfc1459;
|
||||
Prefix = new ISupportPrefix("(ov)@+");
|
||||
ChanModes = new ISupportChanModes("b,k,l,imnpst");
|
||||
ChanTypes = new List<string> {"#"};
|
||||
StatusMsg = new List<string>();
|
||||
Whox = false;
|
||||
}
|
||||
|
||||
public Dictionary<string, string> Raw { get; }
|
||||
public Dictionary<string, string> Raw { get; } = new Dictionary<string, string>();
|
||||
public string Network { get; private set; }
|
||||
public ISupportChanModes ChanModes { get; private set; }
|
||||
public ISupportPrefix Prefix { get; private set; }
|
||||
public int? Modes { get; private set; }
|
||||
public Casemap.CaseMapping CaseMapping { get; private set; }
|
||||
public List<string> ChanTypes { get; private set; }
|
||||
public List<string> StatusMsg { get; private set; }
|
||||
public ISupportChanModes ChanModes { get; private set; } = new ISupportChanModes("b,k,l,imnpst");
|
||||
public ISupportPrefix Prefix { get; private set; } = new ISupportPrefix("(ov)@+");
|
||||
public int? Modes { get; private set; } = 3;
|
||||
public Casemap.CaseMapping CaseMapping { get; private set; } = Casemap.CaseMapping.Rfc1459;
|
||||
public List<string> ChanTypes { get; private set; } = new List<string> { "#" };
|
||||
public List<string> StatusMsg { get; private set; } = new List<string>();
|
||||
public string CallerId { get; private set; }
|
||||
public string Excepts { get; private set; }
|
||||
public string Invex { get; private set; }
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
// ReSharper disable CommentTypo
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
// ReSharper disable once InconsistentNaming
|
||||
public class ISupportChanModes
|
||||
{
|
||||
/// <summary>
|
||||
|
|
|
@ -5,6 +5,7 @@ using System.Linq;
|
|||
|
||||
namespace IRCStates
|
||||
{
|
||||
// ReSharper disable once InconsistentNaming
|
||||
public class ISupportPrefix
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -16,7 +17,7 @@ namespace IRCStates
|
|||
{
|
||||
if (splitVal == null) throw new ArgumentNullException(nameof(splitVal));
|
||||
|
||||
var split = splitVal.Substring(1).Split(')', 2);
|
||||
var split = splitVal[1..].Split(')', 2);
|
||||
Modes = new List<string>();
|
||||
Modes.AddRange(split[0].Select(c => c.ToString(CultureInfo.InvariantCulture)));
|
||||
Prefixes = new List<string>();
|
||||
|
@ -26,6 +27,7 @@ namespace IRCStates
|
|||
public List<string> Modes { get; }
|
||||
public List<string> Prefixes { get; }
|
||||
|
||||
// ReSharper disable once UnusedMember.Global
|
||||
public string FromMode(char mode)
|
||||
{
|
||||
return FromMode(mode.ToString(CultureInfo.InvariantCulture));
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// ReSharper disable InconsistentNaming
|
||||
|
||||
// ReSharper disable UnusedMember.Global
|
||||
// ReSharper disable IdentifierTypo
|
||||
namespace IRCStates
|
||||
{
|
||||
/// <summary>
|
||||
|
|
|
@ -3,6 +3,11 @@ using System.Collections.Generic;
|
|||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using IRCTokens;
|
||||
// ReSharper disable AutoPropertyCanBeMadeGetOnly.Global
|
||||
// ReSharper disable MemberCanBePrivate.Global
|
||||
// ReSharper disable UnusedAutoPropertyAccessor.Global
|
||||
// ReSharper disable CommentTypo
|
||||
// ReSharper disable IdentifierTypo
|
||||
|
||||
namespace IRCStates
|
||||
{
|
||||
|
@ -46,6 +51,7 @@ namespace IRCStates
|
|||
public Dictionary<string, string> AvailableCaps { get; set; }
|
||||
public List<string> AgreedCaps { get; set; }
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
public ISupport ISupport { get; set; }
|
||||
public bool HasCap { get; set; }
|
||||
|
||||
|
@ -75,7 +81,7 @@ namespace IRCStates
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check for a user - not case sensitive
|
||||
/// Check for a user - not case-sensitive
|
||||
/// </summary>
|
||||
/// <param name="nickname"></param>
|
||||
/// <returns></returns>
|
||||
|
@ -360,9 +366,8 @@ namespace IRCStates
|
|||
RealName = realname;
|
||||
}
|
||||
|
||||
if (Users.ContainsKey(nicknameLower))
|
||||
if (Users.TryGetValue(nicknameLower, out var user))
|
||||
{
|
||||
var user = Users[nicknameLower];
|
||||
emit.User = user;
|
||||
user.RealName = realname;
|
||||
}
|
||||
|
@ -387,9 +392,8 @@ namespace IRCStates
|
|||
Away = away;
|
||||
}
|
||||
|
||||
if (Users.ContainsKey(nicknameLower))
|
||||
if (Users.TryGetValue(nicknameLower, out var user))
|
||||
{
|
||||
var user = Users[nicknameLower];
|
||||
emit.User = user;
|
||||
user.Away = away;
|
||||
}
|
||||
|
@ -414,9 +418,8 @@ namespace IRCStates
|
|||
Account = account;
|
||||
}
|
||||
|
||||
if (Users.ContainsKey(nicknameLower))
|
||||
if (Users.TryGetValue(nicknameLower, out var user))
|
||||
{
|
||||
var user = Users[nicknameLower];
|
||||
emit.User = user;
|
||||
user.Account = account;
|
||||
}
|
||||
|
@ -473,7 +476,7 @@ namespace IRCStates
|
|||
foreach (var key in tokens.Keys)
|
||||
if (key.StartsWith('-'))
|
||||
{
|
||||
var k = key.Substring(1);
|
||||
var k = key[1..];
|
||||
if (AgreedCaps.Contains(k)) AgreedCaps.Remove(k);
|
||||
}
|
||||
else if (!AgreedCaps.Contains(key) && AvailableCaps.ContainsKey(key))
|
||||
|
@ -518,9 +521,8 @@ namespace IRCStates
|
|||
HostName = hostname;
|
||||
}
|
||||
|
||||
if (Users.ContainsKey(nicknameLower))
|
||||
if (Users.TryGetValue(nicknameLower, out var user))
|
||||
{
|
||||
var user = Users[nicknameLower];
|
||||
emit.User = user;
|
||||
user.UserName = username;
|
||||
user.HostName = hostname;
|
||||
|
@ -688,7 +690,7 @@ namespace IRCStates
|
|||
if (ISupport.StatusMsg.Contains(t))
|
||||
{
|
||||
statusMsg.Add(t);
|
||||
target = target.Substring(1);
|
||||
target = target[1..];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -895,8 +897,8 @@ namespace IRCStates
|
|||
break;
|
||||
}
|
||||
|
||||
var hostmask = new Hostmask(nick.Substring(modes.Length));
|
||||
var user = GetUser(hostmask.NickName) ?? AddUser(hostmask.NickName);
|
||||
var hostmask = new Hostmask(nick[modes.Length..]);
|
||||
var user = GetUser(hostmask.NickName) ?? AddUser(hostmask.NickName);
|
||||
|
||||
users.Add(user);
|
||||
var channelUser = UserJoin(channel, user);
|
||||
|
|
|
@ -4,11 +4,6 @@ namespace IRCStates
|
|||
{
|
||||
public class User
|
||||
{
|
||||
public User()
|
||||
{
|
||||
Channels = new HashSet<string>();
|
||||
}
|
||||
|
||||
public string NickName { get; private set; }
|
||||
public string NickNameLower { get; private set; }
|
||||
|
||||
|
@ -17,7 +12,7 @@ namespace IRCStates
|
|||
public string RealName { get; set; }
|
||||
public string Account { get; set; }
|
||||
public string Away { get; set; }
|
||||
public HashSet<string> Channels { get; private set; }
|
||||
public HashSet<string> Channels { get; private set; } = new HashSet<string>();
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<PackageId>IRCTokens</PackageId>
|
||||
<Version>1.2.0</Version>
|
||||
<Version>1.4.0</Version>
|
||||
<Authors>Ben Harris</Authors>
|
||||
<Company>tildeverse.org</Company>
|
||||
<IsPackable>true</IsPackable>
|
||||
|
@ -11,18 +11,21 @@
|
|||
<PackageProjectUrl>https://tildegit.org/irctokens/ircsharp</PackageProjectUrl>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<RepositoryUrl>https://tildegit.org/irctokens/ircsharp/src/branch/main/IRCTokens</RepositoryUrl>
|
||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<PackageTags>irc</PackageTags>
|
||||
<PackageVersion>1.2.0</PackageVersion>
|
||||
<PackageVersion>1.4.0</PackageVersion>
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
<DebugType>embedded</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.0" />
|
||||
<PackageReference Include="System.Text.Encoding.Extensions" Version="4.3.0" />
|
||||
<None Include="README.md" Pack="true" PackagePath="\"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.SourceLink.Gitea" Version="8.0.0" PrivateAssets="all"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
// ReSharper disable CommentTypo
|
||||
|
||||
namespace IRCTokens
|
||||
{
|
||||
|
@ -13,7 +14,7 @@ namespace IRCTokens
|
|||
{
|
||||
private static readonly string[] TagUnescaped = {"\\", " ", ";", "\r", "\n"};
|
||||
|
||||
private static readonly string[] TagEscaped = {"\\\\", "\\s", "\\:", "\\r", "\\n"};
|
||||
private static readonly string[] TagEscaped = {@"\\", "\\s", "\\:", "\\r", "\\n"};
|
||||
|
||||
private Hostmask _hostmask;
|
||||
|
||||
|
@ -23,7 +24,7 @@ namespace IRCTokens
|
|||
|
||||
public Line(string command, params string[] parameters)
|
||||
{
|
||||
Command = command;
|
||||
Command = command.ToUpperInvariant();
|
||||
Params = parameters.ToList();
|
||||
}
|
||||
|
||||
|
@ -47,7 +48,7 @@ namespace IRCTokens
|
|||
var messageTags = split[0];
|
||||
line = split[1];
|
||||
|
||||
foreach (var part in messageTags.Substring(1).Split(';'))
|
||||
foreach (var part in messageTags[1..].Split(';'))
|
||||
if (part.Contains('=', StringComparison.Ordinal))
|
||||
{
|
||||
split = part.Split('=', 2);
|
||||
|
@ -55,7 +56,7 @@ namespace IRCTokens
|
|||
}
|
||||
else
|
||||
{
|
||||
Tags[part] = string.Empty;
|
||||
Tags[part] = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -77,13 +78,13 @@ namespace IRCTokens
|
|||
|
||||
if (Params[0].StartsWith(':'))
|
||||
{
|
||||
Source = Params[0].Substring(1);
|
||||
Source = Params[0][1..];
|
||||
Params.RemoveAt(0);
|
||||
}
|
||||
|
||||
if (Params.Count > 0)
|
||||
{
|
||||
Command = Params[0].ToUpper(CultureInfo.InvariantCulture);
|
||||
Command = Params[0].ToUpperInvariant();
|
||||
Params.RemoveAt(0);
|
||||
}
|
||||
|
||||
|
@ -212,10 +213,10 @@ namespace IRCTokens
|
|||
foreach (var p in withoutLast)
|
||||
{
|
||||
if (p.Contains(' ', StringComparison.Ordinal))
|
||||
throw new ArgumentException(@"non-last parameters cannot have spaces", p);
|
||||
throw new ArgumentException("non-last parameters cannot have spaces", p);
|
||||
|
||||
if (p.StartsWith(':'))
|
||||
throw new ArgumentException(@"non-last parameters cannot start with colon", p);
|
||||
throw new ArgumentException("non-last parameters cannot start with colon", p);
|
||||
}
|
||||
|
||||
outs.AddRange(withoutLast);
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"sdk": {
|
||||
"version": "8.0.0",
|
||||
"rollForward": "latestMajor",
|
||||
"allowPrerelease": true
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue