// Copyright (c) 2021 Timofey Solomko
// Licensed under MIT License
//
// See LICENSE for license information

import SWCompression
import XCTest

class BZip2CompressionTests: XCTestCase {
    private static let testType: String = "bz2"

    func answerTest(_ testName: String) throws {
        let answerData = try Constants.data(forAnswer: testName)

        let compressedData = BZip2.compress(data: answerData)

        if testName != "test5" { // Compression ratio is always bad for empty file.
            let compressionRatio = Double(answerData.count) / Double(compressedData.count)
            print("BZip2.\(testName).compressionRatio = \(compressionRatio)")
        } else {
            print("No compression ratio for test5.")
        }

        let redecompressedData = try BZip2.decompress(data: compressedData)
        XCTAssertEqual(redecompressedData, answerData)
    }

    func stringTest(_ string: String) throws {
        let answerData = string.data(using: .utf8)!

        let compressedData = BZip2.compress(data: answerData)

        let redecompressedData = try BZip2.decompress(data: compressedData)
        XCTAssertEqual(redecompressedData, answerData)
    }

    func testBZip2CompressStrings() throws {
        try stringTest("banana")
        try stringTest("abaaba")
        try stringTest("abracadabra")
        try stringTest("cabbage")
        try stringTest("baabaabac")
        try stringTest("AAAAAAABBBBCCCD")
        try stringTest("AAAAAAA")
        try stringTest("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890")
    }

    func testBZip2CompressBytes() throws {
        var bytes = ""
        for i: UInt8 in 0 ... 255 {
            bytes += String(format: "%c", i)
        }
        try stringTest(bytes)
    }

    func testWithAnswer1BZip2Compress() throws {
        try answerTest("test1")
    }

    func testWithAnswer2BZip2Compress() throws {
        try answerTest("test2")
    }

    func testWithAnswer3BZip2Compress() throws {
        try answerTest("test3")
    }

    func testWithAnswer4BZip2Compress() throws {
        try answerTest("test4")
    }

    func testWithAnswer5BZip2Compress() throws {
        try answerTest("test5")
    }

    func testWithAnswer6BZip2Compress() throws {
        try answerTest("test6")
    }

//    func testWithAnswer7BZip2Compress() throws {
//        try answerTest("test7")
//    }

    func testWithAnswer8BZip2Compress() throws {
        try answerTest("test8")
    }

    func testWithAnswer9BZip2Compress() throws {
        try answerTest("test9")
    }
}
