@@ -57,6 +57,14 @@ final class ZipTests: XCTestCase {
57
57
let fileB = subdir. appendingPathComponent ( " b.txt " )
58
58
try " b " . write ( to: fileB, atomically: true , encoding: . utf8)
59
59
60
+ // temp/subdir/subsubdir
61
+ let subsubdir = subdir. appendingPathComponent ( " subsubdir " )
62
+ try FileManager . default. createDirectory ( at: subsubdir, withIntermediateDirectories: false )
63
+
64
+ // temp/subdir/subdir/c.txt
65
+ let fileC = subsubdir. appendingPathComponent ( " c.txt " )
66
+ try " c " . write ( to: fileC, atomically: true , encoding: . utf8)
67
+
60
68
let zipFile = tempURL. appendingPathComponent ( " out.zip " )
61
69
try Zipper . zip ( paths: [ fileA, subdir] , to: zipFile)
62
70
XCTAssert ( FileManager . default. fileExists ( atPath: zipFile. path) )
@@ -69,10 +77,64 @@ final class ZipTests: XCTestCase {
69
77
// roundtrip/subdir/b.txt
70
78
let fileA = roundtrip. appendingPathComponent ( " a.txt " )
71
79
let fileB = roundtrip. appendingPathComponent ( " subdir " ) . appendingPathComponent ( " b.txt " )
80
+ let fileC = roundtrip. appendingPathComponent ( " subdir " ) . appendingPathComponent ( " subsubdir " ) . appendingPathComponent ( " c.txt " )
81
+ XCTAssert ( FileManager . default. fileExists ( atPath: fileA. path) )
82
+ XCTAssert ( FileManager . default. fileExists ( atPath: fileB. path) )
83
+ XCTAssert ( FileManager . default. fileExists ( atPath: fileC. path) )
84
+ XCTAssertEqual ( try String ( contentsOf: fileA) , " a " )
85
+ XCTAssertEqual ( try String ( contentsOf: fileB) , " b " )
86
+ XCTAssertEqual ( try String ( contentsOf: fileC) , " c " )
87
+ }
88
+ }
89
+ }
90
+
91
+ func test_zip_roundtrip_shellTool( ) async throws {
92
+ try XCTSkipIf ( !FileManager. default. fileExists ( atPath: Zipper . zip. path) )
93
+
94
+ // Test basic zip roundtrip with the shellTool method
95
+ try await withTempDir { tempDir in
96
+ // temp
97
+ let tempURL = URL ( fileURLWithPath: tempDir)
98
+
99
+ // temp/a.txt
100
+ let fileA = tempURL. appendingPathComponent ( " a.txt " )
101
+ try " a " . write ( to: fileA, atomically: true , encoding: . utf8)
102
+
103
+ // temp/subdir/
104
+ let subdir = tempURL. appendingPathComponent ( " subdir " )
105
+ try FileManager . default. createDirectory ( at: subdir, withIntermediateDirectories: false )
106
+
107
+ // temp/subdir/b.txt
108
+ let fileB = subdir. appendingPathComponent ( " b.txt " )
109
+ try " b " . write ( to: fileB, atomically: true , encoding: . utf8)
110
+
111
+ // temp/subdir/subsubdir
112
+ let subsubdir = subdir. appendingPathComponent ( " subsubdir " )
113
+ try FileManager . default. createDirectory ( at: subsubdir, withIntermediateDirectories: false )
114
+
115
+ // temp/subdir/subdir/c.txt
116
+ let fileC = subsubdir. appendingPathComponent ( " c.txt " )
117
+ try " c " . write ( to: fileC, atomically: true , encoding: . utf8)
118
+
119
+ let zipFile = tempURL. appendingPathComponent ( " out.zip " )
120
+ try Zipper . zip ( paths: [ fileA, subdir] , to: zipFile, method: . zipTool( workingDirectory: tempDir) )
121
+ XCTAssert ( FileManager . default. fileExists ( atPath: zipFile. path) )
122
+
123
+ do { // unzip what we zipped and check results
124
+ let roundtrip = tempURL. appendingPathComponent ( " roundtrip " )
125
+ try Zipper . unzip ( from: zipFile, to: roundtrip)
126
+ XCTAssert ( FileManager . default. fileExists ( atPath: roundtrip. path) )
127
+ // roundtrip/a.txt
128
+ // roundtrip/subdir/b.txt
129
+ let fileA = roundtrip. appendingPathComponent ( " a.txt " )
130
+ let fileB = roundtrip. appendingPathComponent ( " subdir " ) . appendingPathComponent ( " b.txt " )
131
+ let fileC = roundtrip. appendingPathComponent ( " subdir " ) . appendingPathComponent ( " subsubdir " ) . appendingPathComponent ( " c.txt " )
72
132
XCTAssert ( FileManager . default. fileExists ( atPath: fileA. path) )
73
133
XCTAssert ( FileManager . default. fileExists ( atPath: fileB. path) )
134
+ XCTAssert ( FileManager . default. fileExists ( atPath: fileC. path) )
74
135
XCTAssertEqual ( try String ( contentsOf: fileA) , " a " )
75
136
XCTAssertEqual ( try String ( contentsOf: fileB) , " b " )
137
+ XCTAssertEqual ( try String ( contentsOf: fileC) , " c " )
76
138
}
77
139
}
78
140
}
0 commit comments