krz/orgstar

A native macOS editor for org-mode files. editor org-mode swift

Tests/OrgCoreTests/ElementParseTests.swift

c1295824f55c7bba681fca8338bf08167e110105
orgstar/Tests/OrgCoreTests/ElementParseTests.swift history · blame · raw

51 lines · 2036 bytes

 1import Foundation
 2import Testing
 3@testable import OrgCore
 4
 5/// Where org-element finds inline tasks, property drawers and list items.
 6struct ElementParseTests {
 7    static let oracle = ProcessInfo.processInfo.environment["ORGSTAR_SKIP_ORACLE"] == nil
 8
 9    static let text = """
10        # A comment
11        :PROPERTIES:
12        :Owner:    me
13        :END:
14        Intro.
15        * Heading
16        Body.
17        *************** TODO Inline task :tag:
18        :PROPERTIES:
19        :Effort:   1:00
20        :END:
21        Task body.
22        *************** END
23        After the task.
24        *************** Single-line task
25        More text.
26        ** Child
27        a. alpha item
28        b) beta item
29        - plain
30        1. one
31        """ + "\n"
32
33    static let kinds: [(lisp: String, ours: SyntaxKind)] = [("inlinetask", .inlineTask), ("property-drawer", .propertyDrawer), ("item", .item), ("headline", .section)]
34
35    @Test(.enabled(if: oracle))
36    func elementsMatchOrgElement() throws {
37        var settings = OrgSettings.default
38        settings.listAllowAlphabetical = true
39        let tree = OrgParser.parse(Self.text, defaults: settings)
40        let forms = Self.kinds.map { kind in
41            "(mapconcat (lambda (o) (format \"%d\" (1- (org-element-begin o)))) (org-element-map (org-element-parse-buffer) '\(kind.lisp) #'identity) \",\")"
42        }
43        let emacs = try EmacsOracle.evaluate(Self.text, "(with-current-buffer (find-file-noselect \"oracle.org\") (org-mode) (list \(forms.joined(separator: " "))))",
44                                             prelude: "(require 'org-inlinetask) (setq org-list-allow-alphabetical t)")
45        for (i, kind) in Self.kinds.enumerated() {
46            let ours = tree.root.descendants().filter { $0.kind == kind.ours }.map { String($0.range.lowerBound) }
47            #expect(ours == emacs[i].split(separator: ",").map(String.init), "\(kind.lisp)")
48        }
49        #expect(DocumentModel(tree: tree).fileProperties.contains { $0.key == "Owner" && $0.value == "me" })
50    }
51}