diff options
author | Yuan Fu <yuan@debian-BULLSEYE-live-builder-AMD64> | 2022-06-16 11:25:08 -0700 |
---|---|---|
committer | Yuan Fu <yuan@debian-BULLSEYE-live-builder-AMD64> | 2022-06-16 11:52:04 -0700 |
commit | 33f7e10a29dad475f7872d6af87ecefaccdb55fc (patch) | |
tree | a56a323694923e5045289aed55affe68f8a9dce5 /test/src/treesit-tests.el | |
parent | dd65d1c396da2e024468196c4d5bcb72198f524a (diff) | |
download | emacs-33f7e10a29dad475f7872d6af87ecefaccdb55fc.tar.gz emacs-33f7e10a29dad475f7872d6af87ecefaccdb55fc.tar.bz2 emacs-33f7e10a29dad475f7872d6af87ecefaccdb55fc.zip |
Add treesit test for previous change
* test/src/treesit-tests.el (treesit-cross-boundary): New test.
Diffstat (limited to 'test/src/treesit-tests.el')
-rw-r--r-- | test/src/treesit-tests.el | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/test/src/treesit-tests.el b/test/src/treesit-tests.el index 32971fbacb4..416329d94dd 100644 --- a/test/src/treesit-tests.el +++ b/test/src/treesit-tests.el @@ -223,6 +223,89 @@ (treesit-parser-root-node parser)) "(document (array (number)))"))))) +(ert-deftest treesit-cross-boundary () + "Tests for cross-boundary edits. +Cross-boundary means crossing visible_beg and visible_end. We +don't test if parser parses correctly, instead we just check +edits like this don't produce assertion errors. (I inserted a +bunch of assertions that checks e.g. visible_beg <= +visible_end.)" + (with-temp-buffer + (let (parser root-node pattern doc-node object-node pair-node) + (progn + (insert "xxx[1,{\"name\": \"Bob\"},2,3]xxx") + (narrow-to-region (+ (point-min) 3) (- (point-max) 3)) + (setq parser (treesit-parser-create 'json)) + ;; Now visible_beg/end = visible boundary. + (setq root-node (treesit-parser-root-node parser))) + ;; Now parser knows the content of the visible region. + (widen) + ;; Now visible_beg/end don't change, but visible region expanded. + (delete-region 1 7) + ;; (1) This change is across visible_beg. I expect + ;; ts_record_change to receive (start=1, old_end=7, new_end=1). + (treesit-parser-root-node parser) + ;; Above form forces a parse which calls + ;; `ts_ensure_position_synced'. Now visible_beg/end matches the + ;; visible region (whole buffer). We want to test that this + ;; doesn't cause assertion error. + + (should (equal "{\"name\": \"Bob\"},2,3]xxx" (buffer-string))) + (narrow-to-region 1 16) + (should (equal "{\"name\": \"Bob\"}" (buffer-string))) + (treesit-parser-root-node parser) + ;; Call `ts_ensure_position_synced' again to update visible_beg/end. + (widen) + (goto-char 14) + (insert "by") + ;; (2) This change is inside [visible_beg, visible_end]. + (should (equal "{\"name\": \"Bobby\"},2,3]xxx" (buffer-string))) + (delete-region 14 23) + ;; This delete is across visible_end. + (should (equal "{\"name\": \"Bobxxx" (buffer-string))) + (treesit-parser-root-node parser) + ;; visible_beg/end synced. + + (narrow-to-region 3 7) + (should (equal "name" (buffer-string))) + (treesit-parser-root-node parser) + ;; visible_beg/end synced. + (widen) + (goto-char (point-min)) + (insert "zzz") + (should (equal "zzz{\"name\": \"Bobxxx" (buffer-string))) + ;; (3) Test inserting before visible_beg. + (treesit-parser-root-node parser) + ;; visible_beg/end synced. + + (narrow-to-region 4 11) + (should (equal "{\"name\"" (buffer-string))) + (treesit-parser-root-node parser) + ;; visible_beg/end synced. + (widen) + (goto-char (point-max)) + (insert "yyy") + ;; (4) This change is after visible_end. + (treesit-parser-root-node parser) + ;; Sync up visible_beg/end. + (should (equal "zzz{\"name\": \"Bobxxxyyy" (buffer-string))) + + (narrow-to-region 1 17) + (should (equal "zzz{\"name\": \"Bob" (buffer-string))) + (treesit-parser-root-node parser) + ;; Sync up visible_beg/end. + (widen) + (delete-region 13 (point-max)) + (treesit-parser-root-node parser) + ;; Sync up visible_beg/end. + (should (equal "zzz{\"name\": " (buffer-string))) + ;; Ideally we want to also test the case where we delete and + ;; insert simultaneously, but the only such use is in + ;; `casify_region', all others either only inserts or only + ;; deletes. I'll leave it to someone to try to write a test + ;; that calls that. + ))) + (ert-deftest treesit-range () "Tests if range works." (with-temp-buffer |