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.
senzapaura_es/scripts/db/escansion.spec.mjs

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);
}
}
});
});

Powered by TurnKey Linux.