@testable import Errors
import Testing

private enum FirstErrorType: Error {
    case errorCaseA
    case errorCaseB
}

private enum SecondErrorType: Equatable, Error {
    case errorCaseA
    case errorCaseB(String)
}

// Has associated type and doesn't conform to Equtable
private enum ThirdErrorType: Error {
    case errorCase(String)
}

@Suite("AnyError Tests")
struct AnyErrorTests {
    @Test func testAnyErrorEquality() async throws {
        #expect(AnyError(FirstErrorType.errorCaseA) == AnyError(FirstErrorType.errorCaseA))
        #expect(AnyError(FirstErrorType.errorCaseA) != AnyError(FirstErrorType.errorCaseB))

        // Different types
        #expect(AnyError(SecondErrorType.errorCaseA) != AnyError(FirstErrorType.errorCaseA))

        /* Equatable*/
        #expect(AnyError(SecondErrorType.errorCaseA) == AnyError(SecondErrorType.errorCaseA))
        #expect(AnyError(SecondErrorType.errorCaseB("Same")) == AnyError(SecondErrorType.errorCaseB("Same")))
        #expect(AnyError(SecondErrorType.errorCaseB("Same")) != AnyError(SecondErrorType.errorCaseB("Different")))
        #expect(AnyError(SecondErrorType.errorCaseA) != AnyError(SecondErrorType.errorCaseB("Message")))

        /* Non-Equatable with associated type */
        #expect(AnyError(ThirdErrorType.errorCase("Same")) == AnyError(ThirdErrorType.errorCase("Same")))
        #expect(AnyError(ThirdErrorType.errorCase("Same")) == AnyError(ThirdErrorType.errorCase("Different")))
    }
}
