lobby tested and kinda ok
This commit is contained in:
@@ -2,11 +2,20 @@ package lobby
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"gitea/price-is-wrong/src/lib/db"
|
||||||
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
|
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
|
||||||
"io"
|
"slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (l *Lobby) withEvent(ctx context.Context, e lobby.Event) error {
|
func (l *Lobby) Join(ctx context.Context, id int) error {
|
||||||
|
return l.upsertEvent(ctx, lobby.PlayerJoin{ID: id})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Lobby) Leave(ctx context.Context, id int) error {
|
||||||
|
return l.upsertEvent(ctx, lobby.PlayerLeave{ID: id})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Lobby) upsertEvent(ctx context.Context, e lobby.Event) error {
|
||||||
if err := upsertEvent(ctx, l.id, e); err != nil {
|
if err := upsertEvent(ctx, l.id, e); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -25,6 +34,21 @@ func upsertEvent(ctx context.Context, lobbyID int, e lobby.Event) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_ = b
|
|
||||||
return io.EOF
|
_, err = db.From(ctx).ExecContext(ctx, `
|
||||||
|
INSERT INTO lobby_events (lobby_id, payload) VALUES (?, ?)
|
||||||
|
`, lobbyID, b)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Lobby) apply(e lobby.Event) error {
|
||||||
|
switch e := e.(type) {
|
||||||
|
case lobby.PlayerJoin:
|
||||||
|
if !slices.Contains(l.Players, e.ID) {
|
||||||
|
l.Players = append(l.Players, e.ID)
|
||||||
|
}
|
||||||
|
case lobby.PlayerLeave:
|
||||||
|
l.Players = slices.DeleteFunc(l.Players, func(id int) bool { return id == e.ID })
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,41 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestOpen(t *testing.T) {
|
func TestOpen(t *testing.T) {
|
||||||
l, err := lobby.Open(lib.NewTestCtx(t), "id")
|
ctx := lib.NewTestCtx(t)
|
||||||
|
|
||||||
|
l, err := lobby.Open(ctx, "id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Logf("%+v", l)
|
t.Logf("%+v", l)
|
||||||
|
|
||||||
|
if len(l.Players) != 0 {
|
||||||
|
t.Errorf("new lobby has players: %+v", l.Players)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := l.Join(ctx, 1); err != nil {
|
||||||
|
t.Fatal("failed to join:", err)
|
||||||
|
} else if len(l.Players) != 1 {
|
||||||
|
t.Errorf("wrong number of players after first join: %+v", l.Players)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := l.Leave(ctx, 1); err != nil {
|
||||||
|
t.Fatal("failed to join:", err)
|
||||||
|
} else if len(l.Players) != 0 {
|
||||||
|
t.Errorf("wrong number of players after only leaves: %+v", l.Players)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := l.Join(ctx, 1); err != nil {
|
||||||
|
t.Fatal("failed to join:", err)
|
||||||
|
} else if err := l.Join(ctx, 1); err != nil {
|
||||||
|
t.Fatal("failed to join redundant:", err)
|
||||||
|
} else if len(l.Players) != 1 {
|
||||||
|
t.Errorf("redundant join yielded wrong players: %+v", l.Players)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := l.Join(ctx, 2); err != nil {
|
||||||
|
t.Fatal("failed to second join:", err)
|
||||||
|
} else if len(l.Players) != 2 {
|
||||||
|
t.Errorf("second join yielded wrong players: %+v", l.Players)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"gitea/price-is-wrong/src/lib/db"
|
"gitea/price-is-wrong/src/lib/db"
|
||||||
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
|
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
|
||||||
"slices"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Lobby struct {
|
type Lobby struct {
|
||||||
@@ -61,7 +60,7 @@ func openID(ctx context.Context, id int) (*Lobby, error) {
|
|||||||
rows, err := db.From(ctx).QueryContext(ctx, `
|
rows, err := db.From(ctx).QueryContext(ctx, `
|
||||||
SELECT payload
|
SELECT payload
|
||||||
FROM lobby_events
|
FROM lobby_events
|
||||||
WHERE lobby_events.lobby_id=(SELECT id FROM lobbies WHERE name=?)
|
WHERE lobby_events.lobby_id=?
|
||||||
ORDER BY id
|
ORDER BY id
|
||||||
`, id)
|
`, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -79,11 +78,8 @@ func openID(ctx context.Context, id int) (*Lobby, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to parse event: %w", err)
|
return nil, fmt.Errorf("failed to parse event: %w", err)
|
||||||
}
|
}
|
||||||
switch e := event.(type) {
|
if err := result.apply(event); err != nil {
|
||||||
case lobby.PlayerJoin:
|
return nil, fmt.Errorf("failed to apply event %s: %w", b, err)
|
||||||
result.Players = append(result.Players, e.ID)
|
|
||||||
case lobby.PlayerLeave:
|
|
||||||
result.Players = slices.DeleteFunc(result.Players, func(id int) bool { return id == e.ID })
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
package lobby
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (l *Lobby) Join(ctx context.Context, id int) error {
|
|
||||||
return l.withEvent(ctx, lobby.PlayerJoin{ID: id})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Lobby) Leave(ctx context.Context, id int) error {
|
|
||||||
return l.withEvent(ctx, lobby.PlayerLeave{ID: id})
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user