diff options
Diffstat (limited to 'test/src/eval-tests.el')
-rw-r--r-- | test/src/eval-tests.el | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/test/src/eval-tests.el b/test/src/eval-tests.el index b62178d9e8b..187dc2f34d5 100644 --- a/test/src/eval-tests.el +++ b/test/src/eval-tests.el @@ -247,4 +247,120 @@ expressions works for identifiers starting with period." (should (equal (string-trim (buffer-string)) expected-messages)))))))) +(defvar-local eval-test--local-var 'global) + +(ert-deftest eval-test--bug62419 () + (with-temp-buffer + (setq eval-test--local-var 'first-local) + (let ((eval-test--local-var t)) + (kill-local-variable 'eval-test--local-var) + (setq eval-test--local-var 'second-local) + (should (eq eval-test--local-var 'second-local))) + ;; FIXME: It's not completely clear if exiting the above `let' + ;; should restore the buffer-local binding to `first-local' + ;; (i.e. reset the value of the second buffer-local binding to the + ;; first's initial value) or should do nothing (on the principle that + ;; the first buffer-local binding doesn't exists any more so there's + ;; nothing to restore). I think both semantics make sense. + ;;(should (eq eval-test--local-var 'first-local)) + ) + (should (eq eval-test--local-var 'global))) + +(ert-deftest eval-tests-defvaralias () + (defvar eval-tests--my-var 'coo) + (defvaralias 'eval-tests--my-var1 'eval-tests--my-var) + (defvar eval-tests--my-var1) + (should (equal eval-tests--my-var 'coo)) + (should (equal eval-tests--my-var1 'coo)) + + (defvaralias 'eval-tests--my-a 'eval-tests--my-b) + (defvaralias 'eval-tests--my-b 'eval-tests--my-c) + + (should-error (defvaralias 'eval-tests--my-c 'eval-tests--my-c) + :type 'cyclic-variable-indirection) + (defvaralias 'eval-tests--my-d 'eval-tests--my-a) + (should-error (defvaralias 'eval-tests--my-c 'eval-tests--my-d) + :type 'cyclic-variable-indirection)) + +(defvar eval-tests/global-var 'global-value) +(defvar-local eval-tests/buffer-local-var 'default-value) +(ert-deftest eval-tests/default-value () + ;; `let' overrides the default value for global variables. + (should (default-boundp 'eval-tests/global-var)) + (should (eq 'global-value (default-value 'eval-tests/global-var))) + (should (eq 'global-value eval-tests/global-var)) + (let ((eval-tests/global-var 'let-value)) + (should (eq 'let-value (default-value 'eval-tests/global-var))) + (should (eq 'let-value eval-tests/global-var))) + ;; `let' overrides the default value everywhere, but leaves + ;; buffer-local values unchanged in current buffer and in the + ;; buffers where there is no explicitly set buffer-local value. + (should (default-boundp 'eval-tests/buffer-local-var)) + (should (eq 'default-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'default-value eval-tests/buffer-local-var)) + (with-temp-buffer + (let ((eval-tests/buffer-local-var 'let-value)) + (should (eq 'let-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'let-value eval-tests/buffer-local-var)))) + ;; When current buffer has explicit buffer-local binding, `let' does + ;; not alter the default binding. + (with-temp-buffer + (setq-local eval-tests/buffer-local-var 'local-value) + (let ((eval-tests/buffer-local-var 'let-value)) + ;; Let in a buffer with local binding does not change the + ;; default value for variable. + (should (eq 'default-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'let-value eval-tests/buffer-local-var)) + (with-temp-buffer + ;; We are in a new buffer - `eval-tests/buffer-local-var' has its global default value. + (should (eq 'default-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'default-value eval-tests/buffer-local-var)))))) + +(ert-deftest eval-tests--handler-bind () + ;; A `handler-bind' has no effect if no error is signaled. + (should (equal (catch 'tag + (handler-bind ((error (lambda (_err) (throw 'tag 'wow)))) + 'noerror)) + 'noerror)) + ;; The handler is called from within the dynamic extent where the + ;; error is signaled, unlike `condition-case'. + (should (equal (catch 'tag + (handler-bind ((error (lambda (_err) (throw 'tag 'err)))) + (list 'inner-catch + (catch 'tag + (user-error "hello"))))) + '(inner-catch err))) + ;; But inner condition handlers are temporarily muted. + (should (equal (condition-case nil + (handler-bind + ((error (lambda (_err) + (signal 'wrong-type-argument nil)))) + (list 'result + (condition-case nil + (user-error "hello") + (wrong-type-argument 'inner-handler)))) + (wrong-type-argument 'wrong-type-argument)) + 'wrong-type-argument)) + ;; Handlers do not apply to the code run within the handlers. + (should (equal (condition-case nil + (handler-bind + ((error (lambda (_err) + (signal 'wrong-type-argument nil))) + (wrong-type-argument + (lambda (_err) (user-error "wrong-type-argument")))) + (user-error "hello")) + (wrong-type-argument 'wrong-type-argument) + (error 'plain-error)) + 'wrong-type-argument))) + +(ert-deftest eval-tests--error-id () + (let* (inner-error + (outer-error + (condition-case err + (handler-bind ((error (lambda (err) (setq inner-error err)))) + (car 1)) + (error err)))) + (should (eq inner-error outer-error)))) + + ;;; eval-tests.el ends here |