import { Builder, ByteBuffer } from 'flatbuffers'; import { describe, expect, it } from 'vitest'; import * as fb from '../gen/fbs/scrabblefb'; import { decodeGameList, decodeSession, encodeSubmitPlay } from './codec'; describe('codec', () => { it('encodes a SubmitPlayRequest the gateway can read', () => { const buf = encodeSubmitPlay('g1', 'H', [ { row: 7, col: 7, letter: 'A', blank: false }, { row: 7, col: 8, letter: 'B', blank: true }, ]); const r = fb.SubmitPlayRequest.getRootAsSubmitPlayRequest(new ByteBuffer(buf)); expect(r.gameId()).toBe('g1'); expect(r.dir()).toBe('H'); expect(r.tilesLength()).toBe(2); expect(r.tiles(0)?.letter()).toBe('A'); expect(r.tiles(1)?.blank()).toBe(true); }); it('decodes a Session', () => { const b = new Builder(64); const token = b.createString('tok'); const uid = b.createString('u1'); const name = b.createString('Me'); fb.Session.startSession(b); fb.Session.addToken(b, token); fb.Session.addUserId(b, uid); fb.Session.addIsGuest(b, true); fb.Session.addDisplayName(b, name); b.finish(fb.Session.endSession(b)); expect(decodeSession(b.asUint8Array())).toEqual({ token: 'tok', userId: 'u1', isGuest: true, displayName: 'Me', }); }); it('decodes a GameList including nested seat display names', () => { const b = new Builder(256); const aid = b.createString('a1'); const dn = b.createString('Ann'); fb.SeatView.startSeatView(b); fb.SeatView.addSeat(b, 1); fb.SeatView.addAccountId(b, aid); fb.SeatView.addScore(b, 13); fb.SeatView.addHintsUsed(b, 0); fb.SeatView.addIsWinner(b, false); fb.SeatView.addDisplayName(b, dn); const seat = fb.SeatView.endSeatView(b); const seats = fb.GameView.createSeatsVector(b, [seat]); const id = b.createString('g1'); const variant = b.createString('english'); const dv = b.createString('v1'); const status = b.createString('active'); const er = b.createString(''); fb.GameView.startGameView(b); fb.GameView.addId(b, id); fb.GameView.addVariant(b, variant); fb.GameView.addDictVersion(b, dv); fb.GameView.addStatus(b, status); fb.GameView.addPlayers(b, 2); fb.GameView.addToMove(b, 0); fb.GameView.addTurnTimeoutSecs(b, 86400); fb.GameView.addMoveCount(b, 4); fb.GameView.addEndReason(b, er); fb.GameView.addSeats(b, seats); const game = fb.GameView.endGameView(b); const games = fb.GameList.createGamesVector(b, [game]); fb.GameList.startGameList(b); fb.GameList.addGames(b, games); b.finish(fb.GameList.endGameList(b)); const gl = decodeGameList(b.asUint8Array()); expect(gl.games).toHaveLength(1); expect(gl.games[0].id).toBe('g1'); expect(gl.games[0].seats[0].displayName).toBe('Ann'); expect(gl.games[0].seats[0].score).toBe(13); }); });