castelog
Version:
Programación JavaScript en castellano.
298 lines (266 loc) • 9.75 kB
JavaScript
const { expect } = require("chai");
const { execSync } = require("child_process");
const fs = require("fs");
const path = require("path");
describe("Castelog: Sintaxis del lenguaje", function() {
this.timeout(1000 * 10);
before(async function() {});
after(async function() {});
let CastelogParser = undefined;
it("Sentencia: El típico 'Hola mundo'", async function() {
try {
CastelogParser = require(__dirname + "/../src/castelog.js");
const output = CastelogParser.parse("Hago console.log('Hola, mundo!').");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Condicional (basic)", async function() {
try {
const output = CastelogParser.parse("Si 0 {} pero si 1 {} y si no {}.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Bucle (mientras) (basic)", async function() {
try {
const output = CastelogParser.parse("Mientras 0 {}.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Retorno (basic)", async function() {
try {
const output = CastelogParser.parse("Retorno 0.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Hago (basic)", async function() {
try {
const output = CastelogParser.parse("Hago console.log('algo').");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Hago (asyincrono)", async function() {
try {
const output = CastelogParser.parse("Hago asíncronamente console.log('algo').");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Asigno (basic)", async function() {
try {
const output = CastelogParser.parse("Asigno x como 0.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Creo (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como 0.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Sentencia: Creo variable (basic)", async function() {
try {
const output = CastelogParser.parse("Creo variable x como 0.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
/*
Generativa_numero /
Generativa_texto /
Generativa_objeto /
Generativa_array /
Generativa_funcion /
Generativa_variable_llamable
//*/
it("Generativas: numero (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como 0.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: texto (') (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como ''.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: texto (\") (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como \"\".");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: texto (`) (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como ``.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: objeto (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como {}.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: objeto (con propiedades)", async function() {
try {
const output = CastelogParser.parse("Creo x como { a: 0, b: 1 }.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: lista (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como [0, 1].");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: función (basic)", async function() {
try {
const output = CastelogParser.parse("Creo x como una función.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: función (parámetros sin bloque)", async function() {
try {
const output = CastelogParser.parse("Creo x como una función con (a, b).");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: función (parámetros sin bloque)", async function() {
try {
const output = CastelogParser.parse("Creo x como una función(a, b).");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: función (sin parámetros y con bloque)", async function() {
try {
const output = CastelogParser.parse("Creo x como una función {}.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: función (con parámetros y con bloque)", async function() {
try {
const output = CastelogParser.parse("Creo x como una función con (a, b) donde {}.");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
it("Generativas: llamada", async function() {
try {
const output = CastelogParser.parse("Creo x como parseInt('90').");
expect(typeof output).to.equal("string");
} catch(error) {
throw error;
}
});
const scriptsDir = __dirname + "/scripts_de_sintaxis/";
const files = fs.readdirSync(scriptsDir);
IteratingClgFiles:
for(let index = 0; index < files.length; index++) {
const file = files[index];
if(!file.endsWith(".calo")) {
continue IteratingClgFiles;
}
it("Script execution por API: " + file, async function() {
try {
const contents = fs.readFileSync(scriptsDir + file).toString();
const output = CastelogParser.parse(contents, {
});
expect(typeof output).to.equal("string");
const outputFile = scriptsDir + file.replace(/\.calo$/g, ".js");
fs.writeFileSync(outputFile, output, "utf8");
await require(outputFile);
//fs.unlinkSync(outputFile);
} catch(error) {
console.error("[Error en test 'execution por API'] File: " + file, error);
throw error;
}
});
}
const binScriptsDir = __dirname + "/scripts_de_binario/";
const compilations = [
[
binScriptsDir + "P01/main.calo",
binScriptsDir + "P01/F01.lib.calo",
binScriptsDir + "P01/F02.lib.calo",
binScriptsDir + "P01/F03.lib.calo",
],[
binScriptsDir + "P02/main.calo",
binScriptsDir + "P02/F01.lib.calo",
binScriptsDir + "P02/F02.lib.calo",
binScriptsDir + "P02/F03.lib.calo",
],[
binScriptsDir + "P03/main.calo",
binScriptsDir + "P03/F01.lib.calo",
binScriptsDir + "P03/F02.lib.calo",
binScriptsDir + "P03/F03.lib.calo",
],
];
const { execSync } = require("child_process");
IteratingClgFiles:
for(let index = 0; index < compilations.length; index++) {
const files = compilations[index];
it("Script compilation por CLI:\n - " + (files).join("\n - "), async function() {
try {
execSync(`${__dirname}/../src/castelog.bin.js ${files.map(file => JSON.stringify(file)).join(" ")}`);
} catch(error) {
console.error("[Error en test 'compilation por CLI'] Compilando:\n" + files.join("\n"), error);
throw error;
}
});
}
it("Script de API 'todo en uno':\n", async function() {
try {
const source1 = path.resolve(__dirname,"scripts_de_api/todo_en_uno.calo");
const contents = fs.readFileSync(source1).toString();
CastelogParser = require(__dirname + "/../src/castelog.js");
const output = CastelogParser.parse(contents, {});
expect(typeof output).to.equal("string");
const outputFile = source1.replace(/\.calo$/g, ".js");
fs.writeFileSync(outputFile, output, "utf8");
await require(outputFile);
} catch(error) {
console.error("[Error en test 'todo en uno'] En test de API 'todo en uno':", error);
throw error;
}
});
});