You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.8 KiB
87 lines
2.8 KiB
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);
|
|
}
|
|
}
|
|
});
|
|
});
|