Tests/OrgCoreTests/ElementParseTests.swift
51 lines · 2036 bytes
2 symbols in this file
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}