Improving Egg: Brackets and Tests
Brackets
Modifique la versión actual del lenguaje egg para que acepte como entrada este programa en examples/reto.egg
:
do {
def(sum, ; function
-> { nums,
do {
:= (i, 0), # Creates a local variable i and sets to 0
:= (s, 0), # Creates local var s and sets to 0
while { <(i, length(nums)),
do { =(s, +(s, <-(nums, i))),
=(i, +(i, 1))
}
},
s
}
)
},
print(+("sum(array(1, 2, 3)) := ", sum(array(1, 2, 3))))
}
- Las llaves
{}
pueden ser usados como sinónimos de los correspondientes paréntesis()
. No use los brackets/corchetes como sinónimo de los paréntesis. - Además de eso se han introducido algunas alias para
define
(:=
),fun
(->
),set
(=
),element
(<-
) etc. - Se permiten comentarios de una línea (
# ...
) y multilínea/* ... */
Tests
- Introduzca una prueba en
test/test.js
que demuestre que una entrada como la deexamples/scope-err.egg
:
do(
set(x,9),
print(x) # ReferenceError: Tried setting an undefined variable: x
)
produce una excepción.
Estudie la API de Should.js
- Introduzca una prueba en
test/test.js
que demuestre que una entrada como la deexamples/number-as-fun-err.egg
:4(5) ; Calling a number as a function
produce una excepción
Stubbing
Introduzca una prueba en test/test.js
que demuestre que una entrada como la de examples/one.egg
:
do(
define(x, 4),
define(setx, fun(val,
set(x, val)
)
),
setx(50),
print(x)
)
produce una salida en stdout
de 50.
- Utilice la técnica de stubbing (test stubs are software components that simulate the behaviors of other software components (or modules) that a module undergoing tests depends on). Haga stubbing sobre
console.log
- Algo como esto le puede ayudar:
describe("run", function() {
let originalLog;
let output = [];
beforeEach(function() {
originalLog = console.log;
console.log = function (...args) {
originalLog(...args);
output.push(...args);
return args;
};
});
// test code here
afterEach(function() {
console.log = originalLog;
output = [];
});
it("testing one.egg with mocking of console.log", function() {
let program = fs.readFileSync('examples/one.egg', 'utf8');
let r = eggvm.run(program);
output[0].should.eql(50);
}
}
- Mocha: Hooks
- Si quiere saber mas sobre stubbing estudie la librería sinon
- Jest: Setup and Teardown
Módulo npm
Publique la nueva versión del Módulo en el GitHub Registry
Recursos
- Rama
reto
del repo ULL-ESIT-PL-1617/egg - Aquí esta el repo con la versión pública de nuestra versión del lenguaje
egg
- Eloquent JS: Chapter 11. Project: A Programming Language
- NodeJS Readline gist
- En el repo ULL-ESIT-PL-1617/interpreter-egg se muestra como hacer un bucle REPL
- XRegExp
- Egg as an npm module
Notas para el profesor
Locally at branch private2019
at /Users/casiano/local/src/javascript/PLgrado/eloquentjsegg
:
- Redefining parenthesis to use
{
and}
branchprivate2019
at/Users/casiano/local/src/javascript/PLgrado/eloquentjsegg
- Aliasing ‘fun’
- Non declared variables test branch
private
at/Users/casiano/local/src/javascript/PLgrado/eloquentjsegg
repo https://github.com/ULL-ESIT-PL-1718/egg - Stubbing console.log example branch
private2019
at/Users/casiano/local/src/javascript/PLgrado/eloquentjsegg
Rúbrica
Incidencias para el Project Board para la prácticaImproving Egg: Brackets and Tests
Alias de las palabras reservadas como
set/= define/def/:=
etc.-
Analizador Léxico
Las llaves
{}
funcionan como alias de los paréntesisSticky
Comentarios
Localización
-
Pruebas
Se usa mocking
Se provee una carpeta
examples
con ejemplos de programasegg
`Se ha automatizado el proceso de pasar del “ejemplo que funciona” a “test unitario que prueba que funciona”
Se hace integración contínua
-
Documentación
Ejecutables, Lenguaje, ASTs, etc.
Documentación del módulo npm (API) y ejecutables como se usan
Opcional: Documentación de la API de los módulos (parser, eggvm), informe de cubrimiento, etc.
set (asignación y manejo de ámbitos)
Librerías separadas (Parser, Intérprete, etc.)
-
Ejecutables (uno con opciones o varios ejecutables)
-
Se ha publicado en GitHub Registry
La publicación cumple los estándares de publicación de un módulo (CI, versionado, documentación, etc.)
-
El bucle REPL
Evalúa correctamente y no se despista
Detecta expresiones incompletas
Colores