Gamificación

This commit is contained in:
2026-05-09 17:24:46 +02:00
parent dcecee805b
commit e2cebafdbb
29 changed files with 877 additions and 58 deletions
+79
View File
@@ -0,0 +1,79 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:farolero/modelos/gamificacion_usuario.dart';
import 'package:farolero/modelos/usuario.dart';
import 'package:farolero/servicios/servicio_perfil_usuario.dart';
void main() {
group('EstadisticasPerfilUsuario', () {
test('sube fuego con rendimientos decrecientes y tope diario', () {
var stats = const EstadisticasPerfilUsuario();
final fecha = DateTime(2026, 5, 9);
for (var i = 0; i < 20; i++) {
stats = stats.registrarPartida(victoria: false, fecha: fecha);
}
expect(stats.fuego, 25);
expect(stats.subidaFuegoHoy, 25);
expect(stats.partidasHoy, 20);
});
test('permite descansar un dia sin penalizar y penaliza dias extra', () {
final inicial = EstadisticasPerfilUsuario(
fuego: 50,
fechaUltimaPartidaIso: DateTime(2026, 5, 1).toIso8601String(),
);
final unDiaDespues = inicial.registrarPartida(
victoria: false,
fecha: DateTime(2026, 5, 2),
);
final tresDiasDespues = inicial.registrarPartida(
victoria: false,
fecha: DateTime(2026, 5, 4),
);
expect(unDiaDespues.fuego, 56);
expect(tresDiasDespues.fuego, 48);
});
test('calcula medallas principales sin usar llama para partidas jugadas', () {
final stats = const EstadisticasPerfilUsuario(
partidasJugadas: 10,
partidasGanadas: 1,
fuego: 20,
);
expect(stats.medallas, contains('habitual'));
expect(stats.medallas, contains('brasa'));
expect(stats.medallas, isNot(contains('llama_suave')));
expect(stats.medallasPrincipales, contains('habitual'));
});
});
test('Usuario serializa fuego y medallas', () {
final usuario = Usuario(
id: 'u1',
nombre: 'León',
fuego: 42,
medallas: const ['brasa', 'habitual'],
);
final restaurado = Usuario.fromJson(usuario.toJson());
expect(restaurado.nombre, 'León');
expect(restaurado.fuego, 42);
expect(restaurado.medallas, ['brasa', 'habitual']);
});
test('los avatares de capibara están disponibles en el perfil', () {
expect(
ServicioPerfilUsuario.avatares,
contains('assets/avatars/capybara_01.png'),
);
expect(
ServicioPerfilUsuario.avatares,
contains('assets/avatars/capybara_12.png'),
);
});
}