Me gusta la función Python de doc-tests para probar funciones de forma independiente. ¿Emacs Lisp tiene algo similar, o podría emularlo de alguna manera?

Por ejemplo, esta función obtiene marcas de tiempo de un segmento de reloj en modo Org:

(defun org-get-timestamps (line)
  "Parses a clock segment line and returns the first and last timestamps in a list."
  (let* ((org-clock-regexp (concat "CLOCK: " org-ts-regexp3 "--" org-ts-regexp3))
     (t1 (if (string-match org-clock-regexp line)
         (match-string 1 line)
           (user-error "The argument must have a valid CLOCK range")))
     (t2 (match-string 9 line)))
    (cons t1 (cons t2 '()))))

Me gustaría un doc-test como:

(org-get-timestamps "CLOCK: [2019-09-26 Thu 00:29]--[2019-09-26 Thu 01:11] =>  0:42")
("2019-09-26 Thu 00:29" "2019-09-26 Thu 01:11")

Una prueba del user-error también estaría bien.

También me gustaría asegurarme de que cualquier refactorización pase la prueba de documento, por lo que también es una prueba de regresión.

¿Existe eso?

0
miguelmorin 26 sep. 2019 a las 22:44

1 respuesta

La mejor respuesta

Una característica importante de Python doctest es cómo su entrada se ve como una sesión REPL interactiva de Python, como se describe en documentación de prueba de documentos:

El módulo doctest busca fragmentos de texto que parecen sesiones interactivas de Python y luego ejecuta esas sesiones para verificar que funcionen exactamente como se muestra.

No conozco ninguna instalación de elisp exactamente como esta, pero creo que puede lograr lo que desea usando Marco Emacs Lisp Regression Testing (ERT), que admite la ejecución de pruebas interactivas y por lotes.

Para probar la función org-get-timestamps, puede definir una prueba como esta:

(require 'ert)

(ert-deftest org-timestamp-test ()
  (should (equal
           (org-get-timestamps "CLOCK: [2019-09-26 Thu 00:29]--[2019-09-26 Thu 01:11] => 0:42")
           '("2019-09-26 Thu 00:29" "2019-09-26 Thu 01:11"))))

Para ejecutar la prueba de forma interactiva, puede escribir Mx ert , presionar enter y luego presionar enter nuevamente para seleccionar todas las pruebas usando el argumento predeterminado t o escribir el nombre de la prueba para ejecutar y presione enter, y los resultados de la prueba se mostrarán en el búfer *ert*:

Selector: org-timestamp-test
Passed:  1
Failed:  0
Skipped: 0
Total:   1/1

Started at:   2019-09-27 08:44:57-0400
Finished.
Finished at:  2019-09-27 08:44:57-0400

.

El carácter de punto al final de arriba representa la prueba que se ejecutó. Si se ejecutaran varias pruebas, habría varios puntos.

Para ejecutar la prueba en modo por lotes, guárdelo en el archivo org-timestamp-test.el y asumiendo que la función org-get-timestamps reside en el archivo org-timestamps.el, ejecútelo así desde la línea de comandos de su shell:

emacs -batch -l ert -l org-timestamps.el -l org-timestamp-test.el -f ert-run-tests-batch-and-exit

Luego, los resultados de la prueba se presentan en la salida del shell:

La ejecución de 1 pruebas (2019-09-27 06: 03: 09-0700) pasó 1/1 org-timestamp-test

Realicé 1 pruebas, 1 resultados como se esperaba (2019-09-27 06: 03: 09-0700)

1
Steve Vinoski 27 sep. 2019 a las 13:19