import 'dart:convert'; import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; /// Guardas sobre los ficheros de palabras. Son datos, no código, y una pista /// mal escrita le regala la partida al impostor sin que falle nada. void main() { final ficheros = Directory('assets/words') .listSync() .whereType() .where((f) => f.path.endsWith('.json')) .toList(); test('hay un fichero de palabras por idioma soportado', () { expect(ficheros.length, 18); }); for (final fichero in ficheros) { final nombre = fichero.uri.pathSegments.last; final datos = json.decode(fichero.readAsStringSync()) as Map; final categorias = datos['categorias'] as Map; group(nombre, () { test('declara el formato con pista por palabra', () { expect(datos['version'], 3); }); test('tiene 10 categorías de 100 palabras', () { expect(categorias.length, 10); for (final categoria in categorias.entries) { final palabras = (categoria.value as Map)['palabras'] as List; expect(palabras.length, 100, reason: categoria.key); } }); test('cada palabra trae una pista no vacía', () { for (final categoria in categorias.entries) { final palabras = (categoria.value as Map)['palabras'] as List; for (final entrada in palabras) { expect( entrada, isA>(), reason: '${categoria.key}: entrada en formato antiguo', ); final mapa = entrada as Map; expect((mapa['palabra'] as String).trim(), isNotEmpty); expect( (mapa['pista'] as String?)?.trim(), isNotEmpty, reason: '${categoria.key}: ${mapa['palabra']} sin pista', ); } } }); test('ninguna pista contiene la palabra que debe ocultar', () { final fugas = []; for (final categoria in categorias.entries) { final palabras = (categoria.value as Map)['palabras'] as List; for (final entrada in palabras.cast>()) { final palabra = (entrada['palabra'] as String).toLowerCase(); final pista = (entrada['pista'] as String).toLowerCase(); // Las palabras de una sola letra dan falsos positivos: cualquier // frase las contiene y no revelan nada. if (palabra.length < 2) continue; if (pista.contains(palabra)) { fugas.add('${categoria.key}: "$palabra" -> "$pista"'); } } } expect(fugas, isEmpty, reason: fugas.join('\n')); }); }); } }