From: Vincent Belaïche Date: Mon, 17 Jul 2017 18:54:20 +0000 (+0200) Subject: Fix relocation with named cell referred to by a one-symbol formula. X-Git-Tag: emacs-26.0.90~518^2~68 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=0083123499cc29e301c197218d3809b225675e57;p=emacs.git Fix relocation with named cell referred to by a one-symbol formula. * lisp/ses.el (ses-replace-name-in-formula): Fix bug for it to work also with one symbol formulas. * test/lisp/ses-tests.el (ses-tests-renaming-cell-with-one-symbol-formula): Add new test for renaming with relocating a one symbol formula. --- diff --git a/lisp/ses.el b/lisp/ses.el index 2e214348eb9..ed5e166d952 100644 --- a/lisp/ses.el +++ b/lisp/ses.el @@ -3634,8 +3634,12 @@ highlighted range in the spreadsheet." (defun ses-replace-name-in-formula (formula old-name new-name) (let ((new-formula formula)) - (unless (and (consp formula) - (eq (car-safe formula) 'quote)) + (cond + ((eq (car-safe formula) 'quote)) + ((symbolp formula) + (if (eq formula old-name) + (setq new-formula new-name))) + ((consp formula) (while formula (let ((elt (car-safe formula))) (cond @@ -3644,8 +3648,8 @@ highlighted range in the spreadsheet." ((and (symbolp elt) (eq (car-safe formula) old-name)) (setcar formula new-name)))) - (setq formula (cdr formula)))) - new-formula)) + (setq formula (cdr formula))))) + new-formula)) (defun ses-rename-cell (new-name &optional cell) "Rename current cell." diff --git a/test/lisp/ses-tests.el b/test/lisp/ses-tests.el index 196f7100721..add94ae98f6 100644 --- a/test/lisp/ses-tests.el +++ b/test/lisp/ses-tests.el @@ -106,6 +106,28 @@ renaming A1 to `foo' makes `foo' value equal to 2." (should (equal (ses-cell-formula 1 0) '(1+ foo))) (should (eq A2 2))))) +(ert-deftest ses-tests-renaming-cell-with-one-symbol-formula () + "Check that setting A1 to 1 and A2 to A1, and then renaming A1 +to `foo' makes `foo' value equal to 1. Then set A1 to 2 and check +that `foo' becomes 2." + (let ((ses-initial-size '(3 . 1))) + (with-temp-buffer + (ses-mode) + (dolist (c '((0 0 1) (1 0 A1))) + (apply 'funcall-interactively 'ses-edit-cell c)) + (ses-command-hook); deferred recalc + (ses-rename-cell 'foo (ses-get-cell 0 0)) + (ses-command-hook); deferred recalc + (should-not (local-variable-p 'A1)) + (should (eq foo 1)) + (should (equal (ses-cell-formula 1 0) 'foo)) + (should (eq A2 1)) + (funcall-interactively 'ses-edit-cell 0 0 2) + (ses-command-hook); deferred recalc + (should (eq A2 2)) + (should (eq foo 2))))) + + ;; ROW INSERTION TESTS ;; ======================================================================