Skip to content

Commit 9ecfa13

Browse files
committed
Refactored channel into separate file and added test
1 parent 730220f commit 9ecfa13

File tree

3 files changed

+66
-38
lines changed

3 files changed

+66
-38
lines changed

irc_channel.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
// Channel represents an IRC channel. It maps to Slack's groups and channels.
4+
// Private messages are handled differently.
5+
type Channel struct {
6+
Members []string
7+
Topic string
8+
// Slack groups are different from channels. Here I try to uniform them for
9+
// IRC, but I still need to know which is which to use the right API calls.
10+
IsGroup bool
11+
}
12+
13+
// MembersDiff compares the members of this channel with another members list
14+
// and return a slice of members who joined and a slice of members who left.
15+
func (c Channel) MembersDiff(otherMembers []string) ([]string, []string) {
16+
var membersMap = map[string]bool{}
17+
for _, m := range c.Members {
18+
membersMap[m] = true
19+
}
20+
var otherMembersMap = map[string]bool{}
21+
for _, m := range otherMembers {
22+
otherMembersMap[m] = true
23+
}
24+
25+
added := make([]string, 0)
26+
for _, m := range otherMembers {
27+
if _, ok := membersMap[m]; !ok {
28+
added = append(added, m)
29+
}
30+
}
31+
32+
removed := make([]string, 0)
33+
for _, m := range c.Members {
34+
if _, ok := otherMembersMap[m]; !ok {
35+
removed = append(removed, m)
36+
}
37+
}
38+
return added, removed
39+
}

irc_channel_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestMembersDiffEmpty(t *testing.T) {
8+
c := Channel{Members: []string{}}
9+
a, r := c.MembersDiff([]string{})
10+
if len(a) != 0 {
11+
t.Fatalf("Added members: %v; want empty list", a)
12+
}
13+
if len(r) != 0 {
14+
t.Fatalf("Removed members: %v; want empty list", r)
15+
}
16+
}
17+
18+
func TestMembersDiffNonEmpty(t *testing.T) {
19+
c := Channel{Members: []string{"removed1"}}
20+
a, r := c.MembersDiff([]string{"added1"})
21+
if !(len(a) == 1 && a[0] == "added1") {
22+
t.Fatalf("Added members: %v; want: %v", a, []string{"added1"})
23+
}
24+
if !(len(r) == 1 && r[0] == "removed1") {
25+
t.Fatalf("Removed members: %v; want: %v", a, []string{"removed1"})
26+
}
27+
}

irc_context.go

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,6 @@ import (
88
"github.com/nlopes/slack"
99
)
1010

11-
// Channel represents an IRC channel. It maps to Slack's groups and channels.
12-
// Private messages are handled differently.
13-
type Channel struct {
14-
Members []string
15-
Topic string
16-
// Slack groups are different from channels. Here I try to uniform them for
17-
// IRC, but I still need to know which is which to use the right API calls.
18-
IsGroup bool
19-
}
20-
21-
// MembersDiff compares the members of this channel with another members list
22-
// and return a slice of members who joined and a slice of members who left.
23-
func (c Channel) MembersDiff(otherMembers []string) ([]string, []string) {
24-
var membersMap = map[string]bool{}
25-
for _, m := range c.Members {
26-
membersMap[m] = true
27-
}
28-
var otherMembersMap = map[string]bool{}
29-
for _, m := range otherMembers {
30-
otherMembersMap[m] = true
31-
}
32-
33-
added := make([]string, 0)
34-
for _, m := range otherMembers {
35-
if _, ok := membersMap[m]; !ok {
36-
added = append(added, m)
37-
}
38-
}
39-
40-
removed := make([]string, 0)
41-
for _, m := range c.Members {
42-
if _, ok := otherMembersMap[m]; !ok {
43-
removed = append(removed, m)
44-
}
45-
}
46-
return added, removed
47-
}
48-
4911
// IrcContext holds the client context information
5012
type IrcContext struct {
5113
Conn *net.TCPConn

0 commit comments

Comments
 (0)