From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id aDpsCty3tGFLjAAAgWs5BA (envelope-from ) for ; Sat, 11 Dec 2021 15:38:20 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id 0KYABty3tGEBDwAAbx9fmQ (envelope-from ) for ; Sat, 11 Dec 2021 14:38:20 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 3CD6C15E56 for ; Sat, 11 Dec 2021 15:38:19 +0100 (CET) Received: from localhost ([::1]:59146 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mw3Vy-0004Gy-Eu for larch@yhetil.org; Sat, 11 Dec 2021 09:38:18 -0500 Received: from eggs.gnu.org ([209.51.188.92]:55830) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mw3VU-0004Gp-7A for emacs-orgmode@gnu.org; Sat, 11 Dec 2021 09:37:48 -0500 Received: from [2a00:1450:4864:20::132] (port=43540 helo=mail-lf1-x132.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mw3VR-0000VP-C1 for emacs-orgmode@gnu.org; Sat, 11 Dec 2021 09:37:47 -0500 Received: by mail-lf1-x132.google.com with SMTP id b40so23010680lfv.10 for ; Sat, 11 Dec 2021 06:37:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:mime-version; bh=JZ+DZg9dYj2pNJlLD7Bz9IjqpnaNSzG2bY45JINhkNc=; b=SNXYvipK61Sr6V8Z4RK5rCllrl07DSYf1blBcpjTI0Sthli6241hklXa83Q2tVmcgr PX0PE1B1l4BRB+8If0wYEeN728xVlfzFaYwLp0gZHkdvfa5ArbRlBIlFh+v3LbtEa8Jr /8i95tyL0UI6/sQfKlj2q4H/ky3cUKdijaBXqFNQ/tHdwJ46ngTb2lnb8H+keRymCh8x bIFbC2pVexJgUYsw6rDKhXt5nKZkO4wk3ORqkzlLP1MutUgcwXHRJkesqQlXX8YK11nQ qJQJ1fEdDwFZdocDPhOteKpZ7VcGPYm4US2swcsNMJoWXGg+/s0dtYRpJv5D6KoUolZ6 f3kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=JZ+DZg9dYj2pNJlLD7Bz9IjqpnaNSzG2bY45JINhkNc=; b=afI0Cay07JHYdJhyqqCbLfWA65pNhcNj/jnwAmhABNM/x+Sti60gdJuWdCpnvVsbNp y8eYhvSHlR+WSIdvmVIc/04caHZozskXwJae7WZEbrfKuc/v41juoPIoLW8GrVBTGjTS jAq1MrAQiKFdUND6HOuwGgbhcP6ce9pSRHAs7kdJWP5uKBxOsuqo9Z0mJRNbXcTAoHHC Vt4hE1t9gw3arFSdCzvGmEc2qNyFur4czDxKBr0f5NnAIx3yMK+5taNj6arcSW8PXhqZ fhWHCzJ0Ej/cHWCA0a/KGyZFpWm+IdMCu0Sqv2q/VPBxTIdvhSdGg+kgC9CADpkWIr5+ 08mA== X-Gm-Message-State: AOAM533pBNnCNvAiitDRP9fR+z2I89crOAXQiyD01hVMYQqvZU/872LY SVaNodvjc2MESjd/BSHZKz4UKQJnpikUw6Nn X-Google-Smtp-Source: ABdhPJxGYiZ0BM7tVgY9oqIuF29BG0aP33H6nPFNB4cpX5S9e7azSK1sabVWBvmEHWSr9qsmykg1Ag== X-Received: by 2002:a05:6512:1047:: with SMTP id c7mr18822666lfb.26.1639233463613; Sat, 11 Dec 2021 06:37:43 -0800 (PST) Received: from localhost ([158.255.2.9]) by smtp.gmail.com with ESMTPSA id e17sm655745lfr.46.2021.12.11.06.37.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Dec 2021 06:37:43 -0800 (PST) From: Ihor Radchenko To: emacs-orgmode@gnu.org Subject: [PATCH] org-test: Create a collaborative test set for Org buffer parser Date: Sat, 11 Dec 2021 22:39:07 +0800 Message-ID: <87fsqzi4tw.fsf@localhost> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::132 (failed) Received-SPF: pass client-ip=2a00:1450:4864:20::132; envelope-from=yantar92@gmail.com; helo=mail-lf1-x132.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Migadu-Flow: FLOW_IN ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1639233499; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=kfFlIwrhSCUxp3JRItrbE5cAykJzZT08MjL/ZGIHV8Q=; b=BcR4p5GbK+Dm29UUkqCUkRjta8eAmCQIRd+OtjNxPesWJSpn/SDi3LYrma2UOxi6K8oBYj MJfr03H74WLzmSXrEHX4RMTjspvzBt3Z4iDYu87NtxQsAz91wxDWggPJiyrAcDkCiTwHbe o9RxBDcCe4xpJftqcbyeTWN8dSnSNuzg5jmOYBL+2PuJMjINIDL47fXYZws+HX1UHRthL1 v5k1Ee5rHyYVe8vugCj4zZsZmNcO/18e+36A75BzrRzv1YukTIAGVZldrotgZN3V9lrt3C jxPwoTeVswrOQajccyVIIFvxjslvOdJbV6uDV0VbFfOcho7b/P9w82dGEn/zmQ== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1639233499; a=rsa-sha256; cv=none; b=ZdhMt9tFttv923S1S3KLNh3wiNO1up5Y+uxzRMGrPljqFRUxacpj/1lMZcX7pF9UFepZgu qBbpgq9+ZEL3ufehehZ3/FapmEbrRvs81kKHpTxnwwCgOjZ3q8BhuB9hx9aWAveCNJI+NW VRYGj8lSVhyAyexRmmuH9ZJKyMsKhwXUiNVpcbx4S/TmfXdbXGeYJx6aG9QAKJizbcDF6k lo8ZHZ8sNZRilVR6mcXd0vYhigQ+e4RsqxvFgrbHpkLKQeRs/2clc9crGDyjEYP00vlHm/ bXqNynOCSIiucsDmjdSrQYDAKG+osuZwwGygRF75ivEfCeLgUp6ojJ5GdFtijA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=gmail.com header.s=20210112 header.b=SNXYvipK; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: -1.36 Authentication-Results: aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=gmail.com header.s=20210112 header.b=SNXYvipK; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: 3CD6C15E56 X-Spam-Score: -1.36 X-Migadu-Scanner: scn1.migadu.com X-TUID: nlMkDF/k5e79 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Dear all, The attached patch is an attempt to create something like shared repo for Org element parser tests. The idea is moving the tests out from Elisp into a set of text files. That way, anyone interested in developing Org syntax support can use our tests and potentially contribute more test files to the benefit of Org mode for Emacs. The test set is essentially a series of .org files alongside .el files containing normalised output of `org-element-parse-buffer'. (see the patch) Anyone can contribute to the test set by adding new .org files and generating the canonical parser output with new M-x test-org-element-parser-save-expected-result function. README.org in the repo also serves as a test file =F0=9F=98=9D. Any comments or suggestions? I am particularly looking for thoughts about licensing and possible distribution of the test set in separate repository. Best, Ihor --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-org-test-Create-a-separate-testset-for-Org-element-p.patch >From f7bb947517e8793a45864b614f06460d1132539d Mon Sep 17 00:00:00 2001 Message-Id: From: Ihor Radchenko Date: Sat, 11 Dec 2021 22:24:39 +0800 Subject: [PATCH] org-test: Create a separate testset for Org element parser * testing/lisp/test-org-element-parser-sources/README.org: Add readme file describing the test file format and organisation. * testing/lisp/test-org-element-parser-sources/simple-heading.org: Add an example test file. * testing/lisp/test-org-element-parser-sources/README.el: * testing/lisp/test-org-element-parser-sources/simple-heading.el: Add normalised expected parser output files. * testing/lisp/test-org-element-parser.el: New testset integration to main Org test suite. The file defines ERT tests for files inside test-org-element-parser-sources and an interactive function `test-org-element-parser-save-expected-result' to generate parser output files. --- .../test-org-element-parser-sources/README.el | 42 ++++++ .../README.org | 64 +++++++++ .../simple-heading.el | 11 ++ .../simple-heading.org | 5 + testing/lisp/test-org-element-parser.el | 129 ++++++++++++++++++ 5 files changed, 251 insertions(+) create mode 100644 testing/lisp/test-org-element-parser-sources/README.el create mode 100644 testing/lisp/test-org-element-parser-sources/README.org create mode 100644 testing/lisp/test-org-element-parser-sources/simple-heading.el create mode 100644 testing/lisp/test-org-element-parser-sources/simple-heading.org create mode 100644 testing/lisp/test-org-element-parser.el diff --git a/testing/lisp/test-org-element-parser-sources/README.el b/testing/lisp/test-org-element-parser-sources/README.el new file mode 100644 index 000000000..852df032f --- /dev/null +++ b/testing/lisp/test-org-element-parser-sources/README.el @@ -0,0 +1,42 @@ +(org-data + (:begin 1 :contents-begin 2 :contents-end 1306 :end 1306 :post-affiliated 1 :post-blank 0) + (section + (:begin 2 :contents-begin 2 :contents-end 837 :end 838 :post-affiliated 2 :post-blank 1) + (paragraph + (:begin 2 :contents-begin 2 :contents-end 51 :end 52 :post-affiliated 2 :post-blank 1) + "This is a shared test suite for Org mode syntax.\n") + (paragraph + (:begin 52 :contents-begin 52 :contents-end 247 :end 248 :post-affiliated 52 :post-blank 1) + "The test suite consists of a number of .org example files alongside\nwith the expected parser output. Each .org file can be parsed as is\nand the result should match the corresponding .el file. \n") + (paragraph + (:begin 248 :contents-begin 248 :contents-end 424 :end 425 :post-affiliated 248 :post-blank 1) + "The parser results in .el files are Emacs sexps. Each sexp is an\noutput of " + (verbatim + (:begin 324 :end 351 :post-blank 1)) + "stripped from unessential\nproperties. Each sexp has the following form:\n") + (src-block + (:begin 425 :end 773 :post-affiliated 425 :post-blank 1)) + (paragraph + (:begin 773 :contents-begin 773 :contents-end 837 :end 837 :post-affiliated 773 :post-blank 0) + "The properties of elements can be specified in arbitrary order.\n")) + (headline + (:archivedp nil :begin 838 :commentedp nil :contents-begin 854 :contents-end 1306 :end 1306 :footnote-section-p nil :level 1 :post-affiliated 838 :post-blank 0 :pre-blank 1 :priority nil :raw-value "Contributing" :tags nil :title + ("Contributing") + :todo-keyword nil :todo-type nil) + (section + (:begin 854 :contents-begin 854 :contents-end 1306 :end 1306 :post-affiliated 854 :post-blank 0) + (paragraph + (:begin 854 :contents-begin 854 :contents-end 983 :end 984 :post-affiliated 854 :post-blank 1) + "To add new test files to this suite, send a patch to Org mode mailing\nlist, as described in " + (link + (:begin 946 :contents-begin nil :contents-end nil :end 981 :post-blank 0)) + ".\n") + (paragraph + (:begin 984 :contents-begin 984 :contents-end 1306 :end 1306 :post-affiliated 984 :post-blank 0) + "The expected parser output can be generated using Emacs and latest\nversion of Org mode. You need to open an Org file in Emacs, load\n" + (verbatim + (:begin 1117 :end 1180 :post-blank 0)) + ", and\nrun " + (verbatim + (:begin 1190 :end 1240 :post-blank 0)) + ". The expected\noutput will be saved alongside with the Org file.\n")))) diff --git a/testing/lisp/test-org-element-parser-sources/README.org b/testing/lisp/test-org-element-parser-sources/README.org new file mode 100644 index 000000000..78e33eb36 --- /dev/null +++ b/testing/lisp/test-org-element-parser-sources/README.org @@ -0,0 +1,64 @@ +#+TITLE: Shared Org parser testing fileset +#+AUTHOR: Ihor Radchenko +#+EMAIL: yantar92 at gmail dot com + +This is a shared test suite for Org mode syntax. It is a part of Org +mode's own test suite extracted for easier contributions. + +The test suite consists of a number of .org example files alongside +with the expected parser output. Each .org file can be parsed as is +and the result should match the corresponding .el file. + +The parser results in .el files are Emacs sexps. Each sexp is an +output of =org-element-parse-buffer= stripped from unessential +properties. Each sexp has the following form: + +#+begin_src emacs-lisp +(org-data + (:property1 value-1 :property2 value-2 ...) + (inner-element-1 + (:inner-element-property1 value ...) + ... ) + ... + "string element is not a list, but a string" + ... + (heading + (:property1 value1 ... :title (object-inside-title1 () ...)) + ...) + ...) +#+end_src + +The properties of elements can be specified in arbitrary order. + +The common properties are =:begin=, =:end=, =:contents-begin=, and +=:contents-end=. Their values are 1-indexed char positions from the +beginning of the Org file. + +* Contributing + +To add new test files to this suite, send a patch to Org mode mailing +list, as described in https://orgmode.org/contribute.html. + +The expected parser output can be generated using Emacs and latest +version of Org mode. You need to open an Org file in Emacs, load +=/path/to/Org/git/repo/testing/lisp/test-org-element-parser.el=, and +run =M-x test-org-element-parser-save-expected-result=. The expected +output will be saved alongside with the Org file. + +* License + +Org-mode is published under [[https://www.gnu.org/licenses/gpl-3.0.html][the GNU GPLv3 license]] or any later +version, the same as GNU Emacs. + +Org-mode is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Org mode. If not, see . diff --git a/testing/lisp/test-org-element-parser-sources/simple-heading.el b/testing/lisp/test-org-element-parser-sources/simple-heading.el new file mode 100644 index 000000000..6ca7a54f6 --- /dev/null +++ b/testing/lisp/test-org-element-parser-sources/simple-heading.el @@ -0,0 +1,11 @@ +(org-data + (:begin 1 :contents-begin 3 :contents-end 46 :end 46 :post-affiliated 1 :post-blank 0) + (headline + (:archivedp nil :begin 3 :commentedp nil :contents-begin 24 :contents-end 46 :end 46 :footnote-section-p nil :level 1 :post-affiliated 3 :post-blank 0 :pre-blank 1 :priority nil :raw-value "this is a heading" :tags nil :title + ("this is a heading") + :todo-keyword nil :todo-type nil) + (section + (:begin 24 :contents-begin 24 :contents-end 46 :end 46 :post-affiliated 24 :post-blank 0) + (paragraph + (:begin 24 :contents-begin 24 :contents-end 46 :end 46 :post-affiliated 24 :post-blank 0) + "With some text below.\n")))) diff --git a/testing/lisp/test-org-element-parser-sources/simple-heading.org b/testing/lisp/test-org-element-parser-sources/simple-heading.org new file mode 100644 index 000000000..b508ecfec --- /dev/null +++ b/testing/lisp/test-org-element-parser-sources/simple-heading.org @@ -0,0 +1,5 @@ + + +* this is a heading + +With some text below. diff --git a/testing/lisp/test-org-element-parser.el b/testing/lisp/test-org-element-parser.el new file mode 100644 index 000000000..d12307d98 --- /dev/null +++ b/testing/lisp/test-org-element-parser.el @@ -0,0 +1,129 @@ +;;; test-org-element-parser.el --- Tests for org-element.el parser + +;; Copyright (C) 2021 Ihor Radchenko + +;; Author: Ihor Radchenko + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Code: + +(require 'org-element) + +(defvar test-org-element-parser-properties + '((:global :begin :end :contents-begin :contents-end :pre-blank :post-blank :post-affiliated) + (headline :raw-value :title :level :priority :tags :todo-keyword :todo-type :footnote-section-p :archivedp :commentedp)) + "List of important properties that should be parsed.") + +(defvar test-org-element-parser-source-directory "../lisp/test-org-element-parser-sources/" + "Path to directory containing all the test Org files. +The expected parsed representation is stored alongside in .el files. +For example, parsed representation of file.org is in file.el.") + +(defun test-org-element-parser-generate-syntax-sexp () + "Return SEXP with important parts of parsed representation of current Org buffer." + (unless (derived-mode-p 'org-mode) (user-error "Not an Org buffer.")) + (let ((datum (org-element-parse-buffer 'object)) + (strip-func (lambda (el) + (let ((type (org-element-type el)) + (plist (when (listp el) (nth 1 el))) + prop value tmpalist) + (if (eq type 'plain-text) + (set-text-properties 0 (length el) nil el) + (while plist + (setq prop (car plist)) + (setq value (cadr plist)) + (when (stringp value) (setq value (substring-no-properties value))) + (setq plist (cddr plist)) + (when (or (memq prop (alist-get :global test-org-element-parser-properties)) + (memq prop (alist-get type test-org-element-parser-properties))) + (push (cons prop value) tmpalist))) + (setq tmpalist (sort tmpalist (lambda (a b) (string< (symbol-name (car a)) + (symbol-name (car b)))))) + (setf (nth 1 el) + (apply #'append + (mapcar (lambda (c) (list (car c) (cdr c))) + tmpalist)))))))) + (org-element-map datum (append '(plain-text) org-element-all-elements org-element-all-objects) + strip-func nil nil nil 'with-affiliated) + ;; `org-element-map' never maps over `org-data'. Update it separately. + (funcall strip-func datum) + datum)) + +(defun test-org-element-parser-save-expected-result (&optional file) + "Save reference parsed representation of current Org buffer or FILE. +The parsed representation will be saved alongside with the buffer file." + (interactive) + (with-current-buffer (if file + (get-buffer-create file) + (current-buffer)) + (save-buffer) + (let ((datum (test-org-element-parser-generate-syntax-sexp)) + (path (buffer-file-name)) + newpath) + (unless (and path (file-exists-p path)) (user-error "Not in a file buffer.")) + (setq newpath (format "%s.el" (file-name-base path))) + (with-temp-file newpath + (condition-case err + (progn + (pp datum (current-buffer)) + (message "Parsed representation saved to %s" (expand-file-name newpath))) + (err (message "Failed to save parsed representation: \"%S\"" err))))))) + +(defmacro org-test-element-verify (&optional file) + "Verify `org-element-parse-buffer' for current Org buffer or FILE." + `(progn + (unless ,file + (setq file (buffer-file-name)) + (save-buffer)) + (unless (and ,file (file-exists-p ,file)) + (user-error "%s does not exist." ,file)) + (let ((reference-file (format "%s%s.el" + (file-name-directory ,file) + (file-name-base ,file)))) + (unless (file-exists-p reference-file) + (user-error "Reference result file %s does not exist." reference-file)) + (with-temp-buffer + (insert-file-contents ,file) + (org-mode) + (should + (equal (test-org-element-parser-generate-syntax-sexp) + (with-temp-buffer + (insert-file-contents reference-file) + (read (current-buffer))))))))) + +(defmacro test-org-element-parser-files (&rest files) + "Run `org-test-element-verify' for each file in FILES." + `(progn + (unless (and test-org-element-parser-source-directory + (file-exists-p test-org-element-parser-source-directory)) + (error "%s does not exist." test-org-element-parser-source-directory)) + (dolist (file '(,@files)) + (setq file (format "%s%s.org" + (file-name-as-directory test-org-element-parser-source-directory) + (file-name-base file))) + (org-test-element-verify file)))) + + + +(ert-deftest test-org-element-parser/simple-headlines () + "Basic tests for Org files with headings and plain text paragraphs." + (test-org-element-parser-files "simple-heading")) + +(ert-deftest test-org-element-parser/README () + "Test README.org in the example file repo." + (test-org-element-parser-files "README")) + +(provide 'test-org-element-parser) +;;; test-org-element-parser.el ends here -- 2.32.0 --=-=-=--