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