diff --git a/internal/co_coders/criteria/criteria.go b/internal/co_coders/criteria/criteria.go new file mode 100644 index 0000000..01d9eb6 --- /dev/null +++ b/internal/co_coders/criteria/criteria.go @@ -0,0 +1,11 @@ +package criteria + +// CollabStyle .. +type CollabStyle int + +const ( + Team CollabStyle = iota + 1 + Pair + Mob +) + diff --git a/internal/co_coders/match/on_collab_style.go b/internal/co_coders/match/on_collab_style.go new file mode 100644 index 0000000..2514ae5 --- /dev/null +++ b/internal/co_coders/match/on_collab_style.go @@ -0,0 +1,17 @@ +package match + +import ( + "github.com/clean-code-projects/co-coders-api/internal/co_coders/criteria" + "github.com/clean-code-projects/co-coders-api/internal/co_coders/user" +) + +// OnCollabStyle .. +func OnCollabStyle(users []user.User, collabStyle criteria.CollabStyle) (matchedUsers []user.User) { + matchedUsers = []user.User{} + for _, aUser := range users { + if aUser.HasCollabStyle(collabStyle) { + matchedUsers = append(matchedUsers, aUser) + } + } + return matchedUsers +} diff --git a/internal/co_coders/match/on_collab_style_test.go b/internal/co_coders/match/on_collab_style_test.go new file mode 100644 index 0000000..4ae9e5d --- /dev/null +++ b/internal/co_coders/match/on_collab_style_test.go @@ -0,0 +1,41 @@ +package match_test + +import ( + "github.com/clean-code-projects/co-coders-api/internal/co_coders/criteria" + "github.com/clean-code-projects/co-coders-api/internal/co_coders/match" + "github.com/clean-code-projects/co-coders-api/internal/co_coders/user" + "github.com/clean-code-projects/co-coders-api/internal/pkg/assert" + + "testing" +) + +func TestMatchOnCollabStyleReturnsEmpty(t *testing.T) { + style := criteria.Team + actual := match.OnCollabStyle([]user.User{}, style) + assert.Equals(t, []user.User{}, actual) +} + +func TestMatchOnCollabStyleReturnsNoMatch(t *testing.T) { + aUser := user.New([]criteria.CollabStyle{criteria.Team}) + users := []user.User{aUser} + style := criteria.Mob + actual := match.OnCollabStyle(users, style) + assert.Equals(t, []user.User{}, actual) +} + +func TestMatchOnCollabStyleReturnsAMatch(t *testing.T) { + aUser := user.New([]criteria.CollabStyle{criteria.Team}) + users := []user.User{aUser} + style := criteria.Team + actual := match.OnCollabStyle(users, style) + assert.Equals(t, []user.User{aUser}, actual) +} + +func TestMatchOnCollabStyleSubsetReturnsAMatch(t *testing.T) { + aUser := user.New([]criteria.CollabStyle{criteria.Team, criteria.Pair}) + users := []user.User{aUser} + criterion := criteria.Team + actual := match.OnCollabStyle(users, criterion) + assert.Equals(t, []user.User{aUser}, actual) +} + diff --git a/internal/co_coders/user/user.go b/internal/co_coders/user/user.go new file mode 100644 index 0000000..32440cd --- /dev/null +++ b/internal/co_coders/user/user.go @@ -0,0 +1,23 @@ +package user + +import "github.com/clean-code-projects/co-coders-api/internal/co_coders/criteria" + +// User .. +type User struct { + CollabStyles []criteria.CollabStyle +} + +// HasCollabStyle .. +func (u User) HasCollabStyle(collabStyle criteria.CollabStyle) bool { + for _, style := range u.CollabStyles { + if style == collabStyle { + return true + } + } + return false +} + +// New .. +func New(collabStyles []criteria.CollabStyle) User { + return User{CollabStyles: collabStyles} +} diff --git a/internal/pkg/assert/assert.go b/internal/pkg/assert/assert.go new file mode 100644 index 0000000..07f95a2 --- /dev/null +++ b/internal/pkg/assert/assert.go @@ -0,0 +1,12 @@ +package assert + +import ( + "reflect" + "testing" +) + +func Equals(t *testing.T, expected interface{}, actual interface{}) { + if !reflect.DeepEqual(expected, actual) { + t.Errorf("%+v is not equal to %+v", expected, actual) + } +} diff --git a/match_test.go b/match_test.go deleted file mode 100644 index a39bdd2..0000000 --- a/match_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package user_test - -import ( - "reflect" - "testing" -) - -type CoStyle int - -const ( - Team CoStyle = iota + 1 - Pair - Mob -) - -// User .. -type User struct { - coStyles []CoStyle -} - -func (u User) HasCoStyle(coStyle CoStyle) bool { - for _, style := range u.coStyles { - if style == coStyle { - return true - } - } - return false -} - -func FilterOnCoStyle(users []User, coStyle CoStyle) (matchedUser []User) { - matchedUser = []User{} - for _, user := range users { - if user.HasCoStyle(coStyle) { - matchedUser = append(matchedUser, user) - } - } - return matchedUser -} - -func TestMatchOnCoStyleReturnsEmpty(t *testing.T) { - users := []User{} - style := Team - actual := FilterOnCoStyle(users, style) - AssertEqual(t, []User{}, actual) -} - -func TestMatchOnCoStyleReturnsNoMatch(t *testing.T) { - user := createUser([]CoStyle{Team}) - users := []User{user} - style := Mob - actual := FilterOnCoStyle(users, style) - AssertEqual(t, []User{}, actual) -} - -func TestMatchOnCoStyleReturnsAMatch(t *testing.T) { - user := createUser([]CoStyle{Team}) - users := []User{user} - style := Team - actual := FilterOnCoStyle(users, style) - AssertEqual(t, []User{user}, actual) -} - -func TestMatchOnCoStyleSubsetReturnsAMatch(t *testing.T) { - user := createUser([]CoStyle{Team, Pair}) - users := []User{user} - criterion := Team - actual := FilterOnCoStyle(users, criterion) - AssertEqual(t, []User{user}, actual) -} - -func createUser(coStyles []CoStyle) User { - return User{coStyles: coStyles} -} - -func AssertEqual(t *testing.T, expected interface{}, actual interface{}) { - if !reflect.DeepEqual(expected, actual) { - t.Errorf("%+v is not equal to %+v", expected, actual) - } -}