tangled
alpha
login
or
join now
benharri.org
/
ircsharp
1
fork
atom
IRC parsing, tokenization, and state handling in C#
1
fork
atom
overview
issues
pulls
pipelines
Start to port some ircstates tests
benharri.org
6 years ago
53da4d4c
e2d93c59
+206
-13
5 changed files
expand all
collapse all
unified
split
IrcStates
Emit.cs
Server.cs
Tests
Cap.cs
Casemap.cs
User.cs
+18
-1
IrcStates/Emit.cs
reviewed
···
1
1
-
namespace IrcStates
1
1
+
using System.Collections.Generic;
2
2
+
3
3
+
namespace IrcStates
2
4
{
3
5
public class Emit
4
6
{
7
7
+
public string Command { get; set; }
8
8
+
public string Subcommand { get; set; }
9
9
+
public string Text { get; set; }
10
10
+
public List<string> Tokens { get; set; }
11
11
+
public bool Finished { get; set; }
12
12
+
public bool SelfSource { get; set; }
13
13
+
public bool SelfTarget { get; set; }
14
14
+
public Tests.User User { get; set; }
15
15
+
public Tests.User UserSource { get; set; }
16
16
+
public Tests.User UserTarget { get; set; }
17
17
+
public List<Tests.User> Users { get; set; }
18
18
+
public Tests.Channel Channel { get; set; }
19
19
+
public Tests.Channel ChannelSource { get; set; }
20
20
+
public Tests.Channel ChannelTarget { get; set; }
21
21
+
public string Target { get; set; }
5
22
}
6
23
}
+14
-8
IrcStates/Server.cs
reviewed
···
64
64
return null;
65
65
}
66
66
67
67
-
private Emit ParseTokens(Line line)
67
67
+
public Emit ParseTokens(Line line)
68
68
{
69
69
-
Emit ret;
70
70
-
if (LineHandlers.ContainsKey(line.Command))
71
71
-
foreach (var callback in LineHandlers[line.Command])
72
72
-
{
73
73
-
var emit = callback(line.Command, line);
74
74
-
}
69
69
+
if (line != null && !LineHandlers.ContainsKey(line.Command)) return null;
70
70
+
var ret = new Emit();
75
71
76
76
-
throw new NotImplementedException();
72
72
+
var handlers = LineHandlers[line.Command]
73
73
+
.Select(callback => callback(line.Command, line))
74
74
+
.Where(emit => emit != null);
75
75
+
76
76
+
foreach (var emit in handlers)
77
77
+
{
78
78
+
emit.Command = line.Command;
79
79
+
ret = emit;
80
80
+
}
81
81
+
82
82
+
return ret;
77
83
}
78
84
}
79
85
}
+122
-1
IrcStates/Tests/Cap.cs
reviewed
···
1
1
-
using Microsoft.VisualStudio.TestTools.UnitTesting;
1
1
+
using System.Collections.Generic;
2
2
+
using IrcTokens;
3
3
+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2
4
3
5
namespace IrcStates.Tests
4
6
{
5
7
[TestClass]
6
8
public class Cap
7
9
{
10
10
+
private Server _server;
11
11
+
12
12
+
[TestInitialize]
13
13
+
public void TestInitialize()
14
14
+
{
15
15
+
_server = new Server("test");
16
16
+
}
17
17
+
18
18
+
[TestMethod]
19
19
+
public void LSOneLine()
20
20
+
{
21
21
+
Assert.IsFalse(_server.HasCap);
22
22
+
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
23
23
+
_server.ParseTokens(new Line("CAP * LS :a b"));
24
24
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}}, _server.AvailableCaps);
25
25
+
}
26
26
+
27
27
+
[TestMethod]
28
28
+
public void LSTwoLines()
29
29
+
{
30
30
+
_server.ParseTokens(new Line("CAP * LS * :a b"));
31
31
+
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
32
32
+
_server.ParseTokens(new Line("CAP * LS :c"));
33
33
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", ""}},
34
34
+
_server.AvailableCaps);
35
35
+
}
36
36
+
37
37
+
[TestMethod]
38
38
+
public void LSValues()
39
39
+
{
40
40
+
_server.ParseTokens(new Line("CAP * LS :a b= c=1"));
41
41
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", "1"}},
42
42
+
_server.AvailableCaps);
43
43
+
}
44
44
+
45
45
+
[TestMethod]
46
46
+
public void ACKOneLine()
47
47
+
{
48
48
+
_server.ParseTokens(new Line("CAP * LS :a b"));
49
49
+
_server.ParseTokens(new Line("CAP * ACK :a b"));
50
50
+
CollectionAssert.AreEqual(new List<string> {"a", "b"}, _server.AgreedCaps);
51
51
+
}
52
52
+
53
53
+
[TestMethod]
54
54
+
public void ACKTwoLines()
55
55
+
{
56
56
+
_server.ParseTokens(new Line("CAP * LS :a b c"));
57
57
+
_server.ParseTokens(new Line("CAP * ACK * :a b"));
58
58
+
_server.ParseTokens(new Line("CAP * ACK :c"));
59
59
+
CollectionAssert.AreEqual(new List<string> {"a", "b", "c"}, _server.AgreedCaps);
60
60
+
}
61
61
+
62
62
+
[TestMethod]
63
63
+
public void ACKNotLS()
64
64
+
{
65
65
+
_server.ParseTokens(new Line("CAP * LS a"));
66
66
+
_server.ParseTokens(new Line("CAP * ACK b"));
67
67
+
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
68
68
+
}
69
69
+
70
70
+
[TestMethod]
71
71
+
public void NEWNoLS()
72
72
+
{
73
73
+
_server.ParseTokens(new Line("CAP * NEW :a"));
74
74
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}}, _server.AvailableCaps);
75
75
+
}
76
76
+
77
77
+
[TestMethod]
78
78
+
public void NEWOneLine()
79
79
+
{
80
80
+
_server.ParseTokens(new Line("CAP * LS :a"));
81
81
+
_server.ParseTokens(new Line("CAP * NEW :b"));
82
82
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}}, _server.AvailableCaps);
83
83
+
}
84
84
+
85
85
+
[TestMethod]
86
86
+
public void NEWTwoLines()
87
87
+
{
88
88
+
_server.ParseTokens(new Line("CAP * LS :a"));
89
89
+
_server.ParseTokens(new Line("CAP * NEW :b c"));
90
90
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"a", ""}, {"b", ""}, {"c", ""}},
91
91
+
_server.AvailableCaps);
92
92
+
}
93
93
+
94
94
+
[TestMethod]
95
95
+
public void DELNotAcked()
96
96
+
{
97
97
+
_server.ParseTokens(new Line("CAP * DEL a"));
98
98
+
}
99
99
+
100
100
+
[TestMethod]
101
101
+
public void DELOneLS()
102
102
+
{
103
103
+
_server.ParseTokens(new Line("CAP * LS :a"));
104
104
+
_server.ParseTokens(new Line("CAP * ACK :a"));
105
105
+
_server.ParseTokens(new Line("CAP * DEL :a"));
106
106
+
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
107
107
+
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
108
108
+
}
109
109
+
110
110
+
[TestMethod]
111
111
+
public void DELTwoLS()
112
112
+
{
113
113
+
_server.ParseTokens(new Line("CAP * LS :a b"));
114
114
+
_server.ParseTokens(new Line("CAP * ACK :a b"));
115
115
+
_server.ParseTokens(new Line("CAP * DEL :a"));
116
116
+
CollectionAssert.AreEqual(new Dictionary<string, string> {{"b", ""}}, _server.AvailableCaps);
117
117
+
CollectionAssert.AreEqual(new List<string> {"b"}, _server.AgreedCaps);
118
118
+
}
119
119
+
120
120
+
[TestMethod]
121
121
+
public void DELTwoDEL()
122
122
+
{
123
123
+
_server.ParseTokens(new Line("CAP * LS :a b"));
124
124
+
_server.ParseTokens(new Line("CAP * ACK :a b"));
125
125
+
_server.ParseTokens(new Line("CAP * DEL :a b"));
126
126
+
CollectionAssert.AreEqual(new Dictionary<string, string>(), _server.AvailableCaps);
127
127
+
CollectionAssert.AreEqual(new List<string>(), _server.AgreedCaps);
128
128
+
}
8
129
}
9
130
}
+50
-1
IrcStates/Tests/Casemap.cs
reviewed
···
1
1
-
using Microsoft.VisualStudio.TestTools.UnitTesting;
1
1
+
using IrcTokens;
2
2
+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2
3
3
4
namespace IrcStates.Tests
4
5
{
5
6
[TestClass]
6
7
public class Casemap
7
8
{
9
9
+
[TestMethod]
10
10
+
public void Rfc1459()
11
11
+
{
12
12
+
var lower = IrcStates.Casemap.CaseFold(IrcStates.Casemap.CaseMapping.Rfc1459, @"ÀTEST[]~\");
13
13
+
Assert.AreEqual("Àtest{}^|", lower);
14
14
+
}
15
15
+
16
16
+
[TestMethod]
17
17
+
public void Ascii()
18
18
+
{
19
19
+
var lower = IrcStates.Casemap.CaseFold(IrcStates.Casemap.CaseMapping.Ascii, @"ÀTEST[]~\");
20
20
+
Assert.AreEqual(@"Àtest[]~\", lower);
21
21
+
}
22
22
+
23
23
+
[TestMethod]
24
24
+
public void CommandJoin()
25
25
+
{
26
26
+
var server = new Server("test");
27
27
+
server.ParseTokens(new Line("001 nickname"));
28
28
+
server.ParseTokens(new Line(":Nickname JOIN #Chan"));
29
29
+
server.ParseTokens(new Line(":Other JOIN #Chan"));
30
30
+
31
31
+
Assert.IsTrue(server.Users.ContainsKey("nickname"));
32
32
+
Assert.IsFalse(server.Users.ContainsKey("Nickname"));
33
33
+
Assert.IsTrue(server.Users.ContainsKey("other"));
34
34
+
Assert.IsFalse(server.Users.ContainsKey("Other"));
35
35
+
Assert.IsTrue(server.Channels.ContainsKey("#chan"));
36
36
+
Assert.IsFalse(server.Channels.ContainsKey("#Chan"));
37
37
+
38
38
+
var channel = server.Channels["#chan"];
39
39
+
Assert.AreEqual("#Chan", channel.Name);
40
40
+
}
41
41
+
42
42
+
[TestMethod]
43
43
+
public void CommandNick()
44
44
+
{
45
45
+
var server = new Server("test");
46
46
+
server.ParseTokens(new Line("001 nickname"));
47
47
+
server.ParseTokens(new Line(":nickname JOIN #chan"));
48
48
+
var user = server.Users["nickname"];
49
49
+
server.ParseTokens(new Line(":nickname NICK NewNickname"));
50
50
+
Assert.AreEqual(1, server.Users.Count);
51
51
+
Assert.IsTrue(server.Users.ContainsKey("newnickname"));
52
52
+
Assert.AreEqual("NewNickname", user.NickName);
53
53
+
Assert.AreEqual("newnickname", user.NickNameLower);
54
54
+
Assert.AreEqual("NewNickName", server.NickName);
55
55
+
Assert.AreEqual("newnickname", server.NickNameLower);
56
56
+
}
8
57
}
9
58
}
+2
-2
IrcStates/User.cs
reviewed
···
4
4
{
5
5
public class User
6
6
{
7
7
-
private string NickName;
8
8
-
private string NickNameLower;
7
7
+
public string NickName { get; set; }
8
8
+
public string NickNameLower { get; set; }
9
9
10
10
public string UserName { get; set; }
11
11
public string HostName { get; set; }