blob: 716874b26a4fcd983dca5936743acbffb81d1585 [file] [log] [blame]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// REQUIRES: objc_interop
import StdlibUnittest
import Compression
import Foundation
// Read from Data
class DataSource {
private var _buf : Data
private var _bufSize : Int // total byte count
private var _pos : Int // next byte to read
public init(_ d: Data) {
_buf = d
_bufSize = d.count
_pos = 0
}
public func readData(ofLength len: Int) -> Data? {
let n = min(len,_bufSize - _pos)
if (n == 0) { return nil } // EOF
let d = _buf.subdata(in: _pos ..< _pos + n)
_pos += n
return d
}
}
@available(macOS 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
func ofiltercompress_ifilterdecompress(
_ contents: Data, using algo: Algorithm
) throws -> Bool {
var payload = Data()
var decompressed = Data()
// Output filter compress
let f = DataSource(contents)
let ofilter = try OutputFilter(.compress, using: algo) { (x: Data?) -> () in
if let x = x { payload.append(x) }
}
while (true) {
let i = f.readData(ofLength: 900)
try ofilter.write(i) // will finalize when i is empty
if i == nil { break }
}
// Input filter decompress
let g = DataSource(payload)
let ifilter = try InputFilter(.decompress, using: algo) { (x: Int) -> Data? in
return g.readData(ofLength: x)
}
while let i = try ifilter.readData(ofLength: 400) {
decompressed.append(i)
}
print("ofilter | ifilter \(algo): \(contents.count) -> \(payload.count) -> \(decompressed.count)")
return contents == decompressed
}
@available(macOS 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
func ifiltercompress_ofilterdecompress(
_ contents: Data, using algo: Algorithm
) throws -> Bool {
var payload = Data()
var decompressed = Data()
// Input filter compress
let f = DataSource(contents)
let ifilter = try InputFilter(.compress, using: algo) {(x: Int) -> Data? in
return f.readData(ofLength:x)
}
while let i = try ifilter.readData(ofLength: 400) {
payload.append(i)
}
// Output filter decompress
let g = DataSource(payload)
let ofilter = try OutputFilter(.decompress, using: algo) {(x: Data?) -> () in
if let x = x {
decompressed.append(x)
}
}
while (true) {
let i = g.readData(ofLength: 900)
try ofilter.write(i) // will finalize when i is empty
if i == nil { break }
}
print("ifilter | ofilter \(algo): \(contents.count) -> \(payload.count) -> \(decompressed.count)")
return contents == decompressed
}
func randomString(withBlockLength n: Int) -> String {
var strings = [String]()
for _ in 0 ..< n {
var s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
// Change some random chars
for _ in 1...10 {
let pos = Int.random(in: 0 ..< s.count)
let idx = s.index(s.startIndex, offsetBy: pos)
s = String(s[..<idx] + "#" + s[idx...])
}
strings.append(s)
}
return strings.joined(separator: "")
}
let tests = TestSuite("Compression")
if #available(macOS 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *) {
do {
for blockLength in [0, 1, 2, 5, 10, 100] {
let testString = randomString(withBlockLength: blockLength)
let contents = testString.data(using: .utf8)!
for algo in Algorithm.allCases {
tests.test("OutputFilter/Compress/InputFilter/Decompress/\(algo)/\(blockLength)") {
expectDoesNotThrow({
expectTrue(
try ofiltercompress_ifilterdecompress(contents, using: algo),
"Failing input: \(testString)"
)
})
}
tests.test("InputFilter/Compress/OutputFilter/Decompress/\(algo)/\(blockLength)") {
expectDoesNotThrow({
expectTrue(
try ifiltercompress_ofilterdecompress(contents, using: algo),
"Failing input: \(testString)"
)
})
}
}
} // blockLength
}
}
runAllTests()