File tree Expand file tree Collapse file tree 2 files changed +202
-0
lines changed
Sources/OpenSwiftUICore/Util
Tests/OpenSwiftUICoreTests/Util Expand file tree Collapse file tree 2 files changed +202
-0
lines changed Original file line number Diff line number Diff line change 1+ //
2+ // SExpPrinter.swift
3+ // OpenSwiftUICore
4+ //
5+ // Audited for RELEASE_2024
6+ // Status: Complete
7+
8+ package struct SExpPrinter {
9+ var output : String
10+ var depth : Int
11+ package internal( set) var indent : String
12+
13+ package init ( tag: String , singleLine: Bool = false ) {
14+ output = " ( \( tag) "
15+ depth = singleLine ? 0 : 1
16+ indent = singleLine ? " " : " "
17+ }
18+
19+ package mutating func end( ) -> String {
20+ if depth == 0 {
21+ output. append ( " ) " )
22+ return output
23+ } else {
24+ depth -= 1
25+ indent. removeLast ( 2 )
26+ output. append ( " ) " )
27+ return output
28+ }
29+ }
30+
31+ package mutating func print( _ string: String , newline: Bool = true ) {
32+ if newline, depth != 0 {
33+ output. append ( " \n \( indent) " )
34+ } else {
35+ output. append ( " " )
36+ }
37+ output. append ( string)
38+ }
39+
40+ package mutating func newline( ) {
41+ guard depth != 0 else {
42+ return
43+ }
44+ output. append ( " \n " )
45+ output. append ( indent)
46+ }
47+
48+ package mutating func push( _ tag: String ) {
49+ if depth == 0 {
50+ output. append ( " ( \( tag) " )
51+ } else {
52+ output. append ( " \n \( indent) ( \( tag) " )
53+ depth += 1
54+ indent. append ( " " )
55+ }
56+ }
57+
58+ package mutating func pop( ) {
59+ if depth == 0 {
60+ output. append ( " ) " )
61+ } else {
62+ depth -= 1
63+ indent. removeLast ( 2 )
64+ output. append ( " ) " )
65+ }
66+ }
67+ }
Original file line number Diff line number Diff line change 1+ //
2+ // SExpPrinterTests.swift
3+ // OpenSwiftUICoreTests
4+
5+ import OpenSwiftUICore
6+ import OpenGraphShims
7+ import Testing
8+
9+ struct SExpPrinterTests {
10+ @Test
11+ func singleLine( ) {
12+ var printer = SExpPrinter ( tag: " (test " , singleLine: true )
13+ printer. push ( " A " )
14+ printer. push ( " B " )
15+ printer. pop ( )
16+ printer. pop ( )
17+ let end = printer. end ( )
18+ #expect( end == " ((test(A(B))) " )
19+ }
20+
21+ @Test
22+ func multiLine( ) {
23+ var printer = SExpPrinter ( tag: " (test " , singleLine: false )
24+ printer. push ( " A " )
25+ printer. push ( " B " )
26+ printer. pop ( )
27+ printer. pop ( )
28+ let end = printer. end ( )
29+ #expect( end == """
30+ ((test
31+ (A
32+ (B)))
33+ """ )
34+ }
35+
36+ @Test
37+ func newline( ) {
38+ var printer = SExpPrinter ( tag: " (test " , singleLine: false )
39+ printer. push ( " A " )
40+ printer. newline ( )
41+ printer. push ( " B " )
42+ printer. newline ( )
43+ printer. pop ( )
44+ printer. pop ( )
45+ let end = printer. end ( )
46+ #expect( end == """
47+ ((test
48+ (A
49+
50+ (B
51+ )))
52+ """ )
53+ printer. newline ( )
54+ let newEnd = printer. end ( )
55+ #expect( newEnd == """
56+ ((test
57+ (A
58+
59+ (B
60+ ))))
61+ """ )
62+ }
63+
64+ @Test
65+ func printString( ) {
66+ do {
67+ var printer = SExpPrinter ( tag: " (test " , singleLine: false )
68+ printer. push ( " A " )
69+ printer. print ( " B " )
70+ printer. print ( " C " )
71+ printer. pop ( )
72+ let end = printer. end ( )
73+ #expect( end == """
74+ ((test
75+ (A
76+ B
77+ C))
78+ """ )
79+ }
80+ do {
81+ var printer = SExpPrinter ( tag: " (test " , singleLine: false )
82+ printer. push ( " A " )
83+ printer. print ( " B " )
84+ printer. pop ( )
85+ _ = printer. end ( )
86+ printer. print ( " C " )
87+ let end = printer. end ( )
88+ #expect( end == """
89+ ((test
90+ (A
91+ B)) C)
92+ """ )
93+ }
94+ do {
95+ var printer = SExpPrinter ( tag: " (test " , singleLine: true )
96+ printer. push ( " A " )
97+ printer. print ( " B " )
98+ printer. print ( " C " )
99+ printer. pop ( )
100+ let end = printer. end ( )
101+ #expect( end == """
102+ ((test(A B C))
103+ """ )
104+ }
105+ do {
106+ var printer = SExpPrinter ( tag: " (test " , singleLine: true )
107+ printer. push ( " A " )
108+ printer. print ( " B " )
109+ printer. pop ( )
110+ printer. print ( " C " )
111+ let end = printer. end ( )
112+ #expect( end == """
113+ ((test(A B) C)
114+ """ )
115+ }
116+ }
117+
118+ @Test
119+ func pushPop( ) {
120+ var printer = SExpPrinter ( tag: " (test " , singleLine: false )
121+ printer. push ( " A " )
122+ printer. push ( " B " )
123+ printer. pop ( )
124+ printer. push ( " C " )
125+ printer. pop ( )
126+ printer. pop ( )
127+ let end = printer. end ( )
128+ #expect( end == """
129+ ((test
130+ (A
131+ (B)
132+ (C)))
133+ """ )
134+ }
135+ }
You can’t perform that action at this time.
0 commit comments