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))))
  }
  1. 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.
  2. Además de eso se han introducido algunas alias para define (:=), fun (->), set (=), element (<-) etc.
  3. Se permiten comentarios de una línea (# ...) y multilínea /* ... */

Tests

  1. Introduzca una prueba en test/test.js que demuestre que una entrada como la de examples/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

  1. Introduzca una prueba en test/test.js que demuestre que una entrada como la de examples/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);
  }

}

Módulo npm

Publique la nueva versión del Módulo en el GitHub Registry

Recursos

Notas para el profesor

Locally at branch private2019 at /Users/casiano/local/src/javascript/PLgrado/eloquentjsegg:

Rúbrica

Incidencias para el Project Board para la práctica

Improving Egg: Brackets and Tests

  • Alias de las palabras reservadas como set/= define/def/:= etc.

  • Analizador Léxico

    1. Las llaves {} funcionan como alias de los paréntesis

    2. Sticky

    3. Comentarios

    4. Localización

  • Pruebas

    1. Se usa mocking

    2. Se provee una carpeta examples con ejemplos de programas egg`

    3. Se ha automatizado el proceso de pasar del “ejemplo que funciona” a “test unitario que prueba que funciona

    4. Se hace integración contínua

  • Documentación

    1. Ejecutables, Lenguaje, ASTs, etc.

    2. Documentación del módulo npm (API) y ejecutables como se usan

    3. 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

    1. La publicación cumple los estándares de publicación de un módulo (CI, versionado, documentación, etc.)

  • El bucle REPL

    1. Evalúa correctamente y no se despista

    2. Detecta expresiones incompletas

    3. Colores