feat: Implement multiplayer game session management
Some checks failed
Build & Deploy Farolero / Análisis de código (push) Has been cancelled
Build & Deploy Farolero / Build APK + AAB release (push) Has been cancelled

- Add models for managing player assignments and game session initialization in `inicio_partida_multijugador.dart`.
- Create a multiplayer room state management system in `sala_multijugador.dart`, including user registration, selection, and session validation.
- Develop a UI screen for displaying player words sequentially in `pantalla_palabras_cliente.dart`.
- Implement unit tests for the multiplayer session management and player assignment logic in `inicio_partida_multijugador_test.dart` and `sala_multijugador_test.dart`.
This commit is contained in:
Javier Bautista Fernández
2026-04-27 14:02:33 +02:00
parent 4a1abd0be0
commit a8d5b0f002
14 changed files with 1779 additions and 421 deletions

View File

@@ -0,0 +1,77 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:farolero/modelos/inicio_partida_multijugador.dart';
void main() {
group('InicioPartidaMultijugador', () {
test('agrupa varios jugadores controlados por el mismo cliente', () {
final asignaciones = [
const AsignacionJugador(
jugadorId: 'ana',
nombre: 'Ana',
clientId: 'host',
endpointId: null,
),
const AsignacionJugador(
jugadorId: 'juan',
nombre: 'Juan',
clientId: 'host',
endpointId: null,
),
const AsignacionJugador(
jugadorId: 'sofia',
nombre: 'Sofía',
clientId: 'cliente-sofia',
endpointId: 'endpoint-2',
),
];
final impostores = {'juan': true};
final payloads = InicioPartidaMultijugador.crearPayloadsPorCliente(
asignaciones: asignaciones,
palabraSecreta: 'mate',
categoria: 'objetos',
impostoresPorJugadorId: impostores,
);
expect(payloads['host']?.jugadores.map((j) => j.jugadorId), [
'ana',
'juan',
]);
expect(payloads['host']?.jugadores.first.palabra, 'mate');
expect(payloads['host']?.jugadores.last.esImpostor, isTrue);
expect(payloads['host']?.jugadores.last.palabra, isNull);
expect(payloads['cliente-sofia']?.endpointId, 'endpoint-2');
expect(payloads['cliente-sofia']?.jugadores.single.nombre, 'Sofía');
});
test('restaura payload completo desde json', () {
final payload = InicioPartidaCliente(
clientId: 'cliente-sofia',
endpointId: 'endpoint-2',
categoria: 'todas',
jugadores: const [
JugadorInicioPartida(
jugadorId: 'sofia',
nombre: 'Sofía',
esImpostor: false,
palabra: 'luna',
),
JugadorInicioPartida(
jugadorId: 'helena',
nombre: 'Helena',
esImpostor: true,
palabra: null,
),
],
);
final restaurado = InicioPartidaCliente.fromJson(payload.toJson());
expect(restaurado.clientId, 'cliente-sofia');
expect(restaurado.endpointId, 'endpoint-2');
expect(restaurado.jugadores.length, 2);
expect(restaurado.jugadores.first.palabra, 'luna');
expect(restaurado.jugadores.last.esImpostor, isTrue);
});
});
}