import fs from 'node:fs'; import { describe, expect, it } from 'vitest'; import { fallosDeEscansion, revisarSemilla } from './escansion.mjs'; /** * Lo que se prueba aquí no es código: es que los ejemplos que el taller enseña * estén bien contados. Un octosílabo mal escandido en una ficha enseña a contar * mal, y eso no lo detecta ningún tipo ni ningún lint. */ const llano = { texto: 'Dejaste la taza a medias', silabas: 'De jas te la ta za_a me dias'.split(' '), tonicas: [2, 5, 7], medida: 8 }; describe('fallosDeEscansion', () => { it('acepta un octosílabo llano: la cuenta es la que se ve', () => { expect(fallosDeEscansion(llano)).toBeNull(); }); it('acepta un octosílabo agudo: siete casillas y ocho sílabas', () => { // La ley del acento final. Es la regla que más cuesta automatizar al // escribir, y por eso hay un ejemplo de ella en la ficha del son. expect( fallosDeEscansion({ texto: 'yo respondo con el son', silabas: 'yo res pon do con el son'.split(' '), tonicas: [1, 3, 7], medida: 8 }) ).toBeNull(); }); it('acepta un verso esdrújulo: una sílaba menos', () => { expect( fallosDeEscansion({ texto: 'la casa que se vuelve música', silabas: 'la ca sa que se vuel ve mú si ca'.split(' '), tonicas: [2, 6, 8], medida: 9 }) ).toBeNull(); }); it('rechaza una cuenta que no sale del acento', () => { expect(fallosDeEscansion({ ...llano, medida: 9 })).toMatch(/miden 8, no 9/); }); it('rechaza una tónica fuera del verso', () => { expect(fallosDeEscansion({ ...llano, tonicas: [2, 5, 12] })).toMatch(/fuera de las 8/); }); it('rechaza las tónicas desordenadas, que suelen ser un error de tecleo', () => { expect(fallosDeEscansion({ ...llano, tonicas: [7, 2, 5] })).toMatch(/en orden/); }); it('rechaza un verso sin acento: no existe', () => { expect(fallosDeEscansion({ ...llano, tonicas: [] })).toMatch(/tónica/); }); }); describe('la semilla que se publica', () => { it('está bien escandida, verso por verso', () => { const semilla = JSON.parse(fs.readFileSync('scripts/db/semilla-versos.json', 'utf8')); expect(revisarSemilla(semilla)).toEqual([]); }); it('trae ejemplos para todos los géneros que tienen ficha', () => { const semilla = JSON.parse(fs.readFileSync('scripts/db/semilla-versos.json', 'utf8')); const generos = Object.keys(semilla.generos); // Los ocho con capítulo publicado. El bolero-son no tiene ficha todavía. expect(generos).toHaveLength(8); for (const ejemplos of Object.values(semilla.generos)) { expect(ejemplos.length).toBeGreaterThan(0); for (const ejemplo of ejemplos) { // Un ejemplo sin análisis es decoración: el verso no dice solo qué // hay que mirar en él. expect(ejemplo.analisis).toBeTruthy(); expect(ejemplo.lineas.length).toBeGreaterThan(1); } } }); });