115 lines
4.1 KiB
EmacsLisp
115 lines
4.1 KiB
EmacsLisp
;;; -*- lexical-binding: t; coding: utf-8 -*-
|
|
|
|
;; (defsubst dir-up (x)
|
|
;; "Replica of f-parent without using f.el.
|
|
|
|
;; I should just use f.el since ecukes loads it anyway."
|
|
;; (file-name-directory (directory-file-name x)))
|
|
|
|
;; (let ((root-path (car (last (-iterate 'dir-up load-file-name 4)))))
|
|
;; (add-to-list 'load-path (concat root-path "lisp"))
|
|
;; (add-to-list 'load-path (concat root-path "tests")))
|
|
|
|
(require 'ecukes)
|
|
(require 'espuds)
|
|
|
|
(add-to-list 'load-path (f-expand "lisp" (ecukes-project-path)))
|
|
(add-to-list 'load-path (f-expand "tests" (ecukes-project-path)))
|
|
|
|
(require 'nndiscourse-test)
|
|
|
|
(defvar incoming-iteration 0 "Used in filter-args advice of `nndiscourse--incoming'.")
|
|
|
|
(defmacro if-demote (demote &rest forms)
|
|
(declare (debug t) (indent 1))
|
|
`(if ,demote
|
|
(with-demoted-errors "demoted: %s"
|
|
,@forms)
|
|
,@forms))
|
|
|
|
(defun cleanup ()
|
|
(let ((quick-file (concat (or (bound-and-true-p gnus-newsrc-file)
|
|
(bound-and-true-p gnus-current-startup-file))
|
|
".eld")))
|
|
(when (file-exists-p quick-file)
|
|
(message "Deleting %s" quick-file)
|
|
(delete-file quick-file))))
|
|
|
|
(defun save-log (buffer-or-name file-name)
|
|
"from tkf/emacs-ipython-notebook ein:testing-save-buffer."
|
|
(when (and buffer-or-name (get-buffer buffer-or-name) file-name)
|
|
(with-current-buffer buffer-or-name
|
|
(let ((coding-system-for-write 'raw-text))
|
|
(write-region (point-min) (point-max) file-name)))))
|
|
|
|
(defvar scenario-recording-alist '((touched nil)))
|
|
(defvar scenario-recording-p t)
|
|
|
|
(Setup
|
|
(add-function
|
|
:around (symbol-function 'nndiscourse-rpc-request)
|
|
(lambda (f server method &rest method-args)
|
|
(let ((sig (intern (mapconcat (apply-partially #'format "%s")
|
|
(cons method method-args) "-"))))
|
|
(if scenario-recording-p
|
|
(let ((result (apply f server method method-args)))
|
|
(prog1 result
|
|
(gnus-score-set sig
|
|
(append (gnus-score-get sig scenario-recording-alist)
|
|
(list result))
|
|
scenario-recording-alist)))
|
|
(let* ((values (gnus-score-get sig scenario-recording-alist))
|
|
(result (pop values)))
|
|
(gnus-score-set sig values scenario-recording-alist)
|
|
(or result (error "nndiscourse-rpc-request: could not playback %s" sig))))))))
|
|
|
|
(defmacro with-scenario (scenario &rest body)
|
|
(declare (indent defun))
|
|
`(let* ((name (ecukes-scenario-name ,scenario))
|
|
(filename (f-expand (replace-regexp-in-string "\\s-+" "-" name)
|
|
(f-expand "tests/recordings" (ecukes-project-path)))))
|
|
,@body))
|
|
|
|
(Before
|
|
(dolist (server (mapcar #'car nndiscourse-processes))
|
|
(setf (nndiscourse-by-server server :last-scan-time) 0))
|
|
(setq ecukes-reporter-before-scenario-hook
|
|
(lambda (scenario)
|
|
(with-scenario scenario
|
|
(setq scenario-recording-p (not (file-exists-p filename)))
|
|
(setq scenario-recording-alist
|
|
(if scenario-recording-p
|
|
'((touched nil))
|
|
(with-temp-buffer
|
|
(let ((coding-system-for-read score-mode-coding-system))
|
|
(insert-file-contents filename))
|
|
(goto-char (point-min))
|
|
(read (current-buffer))))))))
|
|
(setq ecukes-reporter-after-scenario-hook
|
|
(lambda (scenario)
|
|
(with-scenario scenario
|
|
(when scenario-recording-p
|
|
(setq scenario-recording-alist
|
|
(assq-delete-all 'touched scenario-recording-alist))
|
|
(gnus-make-directory (file-name-directory filename))
|
|
(with-temp-buffer
|
|
(gnus-prin1 scenario-recording-alist)
|
|
(let ((coding-system-for-write score-mode-coding-system))
|
|
(gnus-write-buffer filename)))))
|
|
(setq scenario-recording-alist '((touched nil)))
|
|
(setq scenario-recording-p t))))
|
|
|
|
(After
|
|
)
|
|
|
|
(Teardown
|
|
(cleanup)
|
|
)
|
|
|
|
(Fail
|
|
(if noninteractive
|
|
(with-demoted-errors "demote: %s"
|
|
(Teardown))
|
|
(backtrace)
|
|
(keyboard-quit))) ;; useful to prevent emacs from quitting
|