forked from mirrors/org-mode
* lisp/org-element.el (org-element-with-disabled-cache): New macro. (org-element-greater-elements): Add new org-data element. It functions like a virtual headline containing the whole buffer. The org-data properties are like headlie properties, but according to the top-level drawer. org-data's category is the buffer's category as defined by top-level property drawer, #+CATEGORY keyworsd, and the buffer file name. (org-element--cache-element-properties, org-element-set-element): New variable containing properties to be transferred when updating changed element in cache in `org-element-set-element'. (org-element--get-node-properties): Allow parsing node propreties in top-level drawer when new optional argument is passed. Respect PROPERTY+ syntax. (org-element--get-global-node-properties): New function. It returns node properties for top-level property drawer. (org-element-org-data-parser, org-element-org-data-interpreter): Implement the new org-data element. (org-element-headline-parser, org-element-section-parser): Add new :robust-begin and :robust-end properties delimiting safe changes that do not modify headline element. (org-element--list-struct): Fix cache update when adding a headline inside list. (org-element--current-element): Implement cache support. Record parsing mode (:mode) and parsing granularity (:granularity) in the element properties. (org-element-parse-buffer, org-element--next-mode): Support new org-data element. (org-element--parse-elements): Record parsing granularity in the returned tree (org-element-use-cache): Enable cache by default. (org-element-cache-persistent): New variable controlling cache persistance across sessions. Enabled by default. (org-element--cache-self-verify, org-element--cache-self-verify-frequency, org-element--cache-diagnostics, org-element--cache-map-statistics, org-element--cache-map-statistics-threshold, org-element--cache-diagnostics-level, org-element--cache-diagnostics-ring, org-element--cache-diagnostics-ring-size): New variables controlling cache diagnostics and self-diagnostics. Greatly simplifies cache debugging. (org-element--cache, org-element--cache-sync-requests, org-element--cache-sync-timer): Make cache buffer-local by default. (org-element--headline-cache): Implement separate cache storing only headlines and inlinetasks. (org-element--cache-size, org-element--headline-cache-size): New variables containing cache sizes. This is much faster than `avl-tree-size'. (org-element--cache-sync-requests): Update docstring explaning the request list structure. (org-element--cache-sync-keys-value): New variable replacing `org-element--cache-sync-keys' hash table. The hash table was not reliable because it was using elements as keys. Upon any cached element update/shift, the keys were invalidated making cache ordering incorrect and breaking the cache badly. Now, the cache keys are stored as :org-element--cache-sync-key element property and the new variable stores marker value indicating the current sync request cycle. See `org-element--cache-key' for more details. (org-element--cache-change-tic): New variable controlling buffer modification count that is registered in cache. This variable allows catching "stealth" edits. (org-element--cache-non-modifying-commands): New variable listing commands that will not be slown down if we fill cache on the fly. (org-element--request-key, org-element--request-beg, org-element--request-end, org-element--request-offset, org-element--request-parent, org-element--request-phase): New macros. They improve code readability (especially when using nameless-mode). (org-element--format-element, org-element--cache-log-message, org-element--cache-warn): New macros implementing generic logging functionality. (org-element--cache-key): Add section and org-data element support. Change cache key storage from hash map to :org-element--cache-sync-key element property + `org-element--cache-sync-keys-value'. We use the latter to group all the cache keys during a single cache request sequence. Once sync request is fully complete, the `org-element--cache-sync-keys-value' is updated making all the old sync keys obsolete (they will still be store as element properties). (org-element--headline-cache-root): New function returning headline cache root. (org-element--cache-active-p): Prevent cache updates when `inhibit-modification-hooks' is non-nil, unless non-nil optional argument is provided. (org-element--cache-find): Share cache between indirect buffers and the base buffer. We have to do it because after-change hooks for indirect buffer are not called in the base buffer and vice versa. Add support for section and org-data elements. (org-element--cache-put): Implement new approach for cache key storage. Add diagnostics. Indicate cached elements using :cached element property. Support cache size calculation. (org-element--cache-remove): Invalidate parent contents when removing element. Support cache size calculation. Detect cache corruption due to misordered elements. (org-element--cache-shift-positions): Support :robust-begin and :robust-end element properties. (org-element--cache-sync): Add diagnostics. Add detailed comments. Prevent slowdown when large cache chunks need to be deleted forcing O(N) complexity cutoff. In phase 2, fix cases when next request contains deleted cache key. In phase 2, fix scenario when newly inserted element intersects with existing elements in cache. In phase 2, detect obsolete parents removed from cache. (org-element--open-end-p): New function checking if an element can have blank lines right after its :contents-end. (org-element--parse-to): Do not alter match data. Process complex parsing mode changes correctly. Support headlines in cache. Support org-data parsing. Add detailed comments. Add diagnostics. (org-element--cache-sensitive-re): Make list lines sensitive. (org-element--cache-change-warning): Update docstring. Now, the variable can have t, nil, and number values. Numbers are used to provide more details about changed headlines. (org-element--cache-before-change, org-element--cache-after-change): Handle headline hierarchy. Properly handle cache in indirect buffers. (org-element--cache-after-change): Update docstring clarifying the return values. Add special handling for headline and org-data elements updating them in-place instead of removing together with the whole contents when possible. Use :robust-begin/:robust-end element properties to detect robust changes. (org-element--cache-submit-request): Add detailed comments. Correctly handle cache in indirect buffers. Delegate element modifications to `org-element--cache-for-removal'. (org-element--cache-verify-element): New function for cache self-verification. (org-element--cache-persist-before-write, org-element--cache-persist-before-read, org-element--cache-persist-after-read): Implement cache persistance. (org-element-cache-reset): Correctly handle cache in indirect buffers. Support cache persistance. Support new cache size calculation and new cache key schema. (org-element-cache-map): New function analagous to `org-element-map', but much faster. The function overperforms org-ql written by Adam Porter aka alphapapa [1] and reuses some ideas from there (namely, fast element skipping via regexps). [1] https://github.com/alphapapa/org-ql/ (org-element-at-point): The returned elements are now guaranteed to have correct parents up to org-data. New optional argument CACHED-ONLY limits element search to current cache---if element is not in cache and current command is not in cache `org-element--cache-non-modifying-commands', the cache is not updated and the function returns nil. Also, support cache verification. (org-element-at-point-no-context): New function. It is analogous of older `org-element-at-point' with no guarantee that :parent properties are correct beyond direct parent heading. This function does not update cache and can be useful when cache updates should be avoided for performance reasons. * lisp/ob-core.el (org-babel-where-is-src-block-result): Support section and org-data elements in cache. * lisp/org-macro.el (org-macro-replace-all, org-macro--find-keyword-value): Support org-element-cache. * lisp/org-table.el (orgtbl-to-generic): Support org-element-cache. * lisp/org.el (org-mode): Add cache persistance. (org-up-element): Preserve old behaviour when error is returned for section and org-data element. * testing/lisp/test-org-archive.el (test-org-archive/update-status-cookie): Fix test when cache is active. * testing/lisp/test-org-colview.el (test-org-colview/columns-update): Fix test. * testing/lisp/test-org-element.el (test-org-element/extract-element): Add suport for new org-data element. * testing/lisp/test-org-element.el (test-org-element/parent-property): Fix equality check. Parents returned by cache and `org-element-map' may not be `eq' now. Just `equal'. * testing/lisp/test-org-element.el (test-org-element/context): Support section and headline parents. |
||
---|---|---|
.. | ||
examples | ||
jump@820bb7d81b | ||
lisp | ||
.gitignore | ||
org-batch-test-init.el | ||
org-test.el | ||
README |
# -*- mode:org -*- #+TITLE: Org mode Testing #+PROPERTY: header-args:emacs-lisp :results silent * Dependencies The only dependency is [[http://www.emacswiki.org/emacs/ErtTestLibrary][ERT]] the Emacs testing library which ships with Emacs24. If you are running an older version of Emacs and don't already have ERT installed it can be installed from its old [[https://github.com/ohler/ert][git repository]]. * Non-interactive batch testing from the command line The simplest way to run the Org mode test suite is from the command line with the following invocation. Note that the paths below are relative to the base of the Org mode directory. Also note that many of the current tests uses babel evaluation... #+BEGIN_SRC sh :dir (expand-file-name "..") # For Emacs earlier than 24, add -L /path/to/ert emacs -Q --batch \ -L lisp/ -L testing/ -L testing/lisp -l lisp/org.el \ -l lisp/org-id.el -l testing/org-test.el \ --eval "(progn (org-reload) (setq org-confirm-babel-evaluate nil) \ (org-babel-do-load-languages 'org-babel-load-languages \ '((emacs-lisp . t) (shell . t) (org . t))))" \ -f org-test-run-batch-tests #+END_SRC The options in the above command are explained below. | -Q | ignores any personal configuration ensuring a vanilla Emacs instance is used | | --batch | runs Emacs in "batch" mode with no gui and termination after execution | | -l | loads Org mode and the Org mode test suite defined in testing/org-test.el | | --eval | reloads Org mode and allows evaluation of code blocks by the tests | | -f | actually runs the tests using the `org-test-run-batch-tests' function | * Trigger the tests with 'make' ** Recompile all Target ~test~ can be used to trigger a test run. The tests start after cleaning up and recompilation. #+BEGIN_SRC sh :dir (expand-file-name "..") :results silent make test #+END_SRC See ../mk/default.mk for details. ** Test dirty The 'dirty' targets are for recompiling without cleaning and rebuilding everything. This usually speeds up the recompilation considerably. Note that this speed up comes to the price of possibly weird errors due to the unclean build. The dirty target for testing is called ~test-dirty~. #+BEGIN_SRC sh :dir (expand-file-name "..") :results silent make test-dirty #+END_SRC ** Select tests by regexp Variable ~BTEST_RE~ can be set to limit the tests which are performed. ~BTEST_RE~ is interpreted as regexp. Example: #+begin_src shell make BTEST_RE='test-.*-inlinetask' test-dirty #+end_src yields #+begin_example ... selected tests: test-.*-inlinetask Running 2 tests (2017-12-28 15:04:45+0100) passed 1/2 test-org-export/handle-inlinetasks passed 2/2 test-org-inlinetask/goto-end Ran 2 tests, 2 results as expected (2017-12-28 15:04:45+0100) ... #+end_example * Interactive testing from within Emacs To run the Org mode test suite from a current Emacs instance simply load and run the test suite with the following commands. 1) First load the test suite. #+BEGIN_SRC emacs-lisp :var here=(buffer-file-name) (add-to-list 'load-path (file-name-directory here)) (require 'org-test) #+END_SRC 2) Load required Babel languages #+BEGIN_SRC emacs-lisp (org-babel-do-load-languages 'org-babel-load-languages (and (mapc (lambda (lang) (add-to-list 'org-babel-load-languages (cons lang t))) '(emacs-lisp shell org)) org-babel-load-languages)) #+END_SRC 3) Then run the test suite. Babel evaluation confirmation is disabled and ~C-c C-c~ is enabled while running the tests. #+BEGIN_SRC emacs-lisp (let (org-babel-no-eval-on-ctrl-c-ctrl-c org-confirm-babel-evaluate) (org-test-run-all-tests)) #+END_SRC When a test fails, run it interactively and investigate the problem in the ERT results buffer. To run one test: Use this as a demo example of a failing test #+BEGIN_SRC emacs-lisp (ert-deftest test-org/org-link-encode-ascii-character-demo-of-fail () (should (string= "%5B" ; Expecting %5B is correct. (org-link-encode "["))) (should (string= "%5C" ; Expecting %5C is wrong, %5D correct. (org-link-encode "]")))) #+END_SRC or evaluate the ~ert-deftest form~ of the test you want to run. Then ~M-x ert RET test-org/org-link-encode-ascii-character-demo-of-fail RET~. When not visible yet switch to the ERT results buffer named ~*ert*~. When a test failed the ERT results buffer shows the details of the first ~should~ that failed. See ~(info "(ert)Running Tests Interactively")~ on how to re-run, start the debugger etc. To run several tests: ~M-x ert RET "<your regexp here>" RET~. To run all tests of a single test file: ~M-x ert-delete-all-tests RET~ and confirm. ~M-x load-file RET testing/lisp/<file>.el RET M-x ert RET t RET~. Consider to set #+BEGIN_SRC emacs-lisp (setq pp-escape-newlines nil) #+END_SRC before running the test when looking at ~should~ in the ERT results buffer. Especially when using ~l~ to look at passed test results and possibly missing an appropriate setting of ~pp-escape-newlines~ made only temporarily for the running time of the test as e. g. tests using ~org-test-table-target-expect-tblfm~ do. * Troubleshooting - If the variable ~org-babel-no-eval-on-ctrl-c-ctrl-c~ is non-nil then it will result in some test failure, as there are tests which rely on this behavior.