import Foundation
import Testing
@testable import IrdP2PCrypto
@Suite struct BytesTests {
@Test func base64VectorsRoundTrip() throws {
for v in try vector("room-crypto")["b64"]!.arr {
let data = v["bytes"]!.bytes
#expect(Bytes.base64(data) == v["b64"]!.str)
#expect(Bytes.base64URL(data) == v["b64url"]!.str)
#expect(Bytes.fromBase64(v["b64"]!.str) == data)
#expect(Bytes.fromBase64URL(v["b64url"]!.str) == data)
}
}
@Test func base64URLRejectsGarbage() {
#expect(Bytes.fromBase64URL("A") == nil)
#expect(Bytes.fromBase64URL("!!!!") == nil)
#expect(Bytes.fromBase64URL("AA==") == Data([0])) // padding tolerated on input
}
@Test func hexRoundTrip() {
let d = Data([0x00, 0x0f, 0xf0, 0xff])
#expect(Bytes.hex(d) == "000ff0ff")
#expect(Bytes.fromHex("000ff0ff") == d)
#expect(Bytes.fromHex("000FF0FF") == d)
#expect(Bytes.fromHex("abc") == nil)
#expect(Bytes.fromHex("zz") == nil)
}
@Test func randomIsFreshAndSized() {
#expect(Bytes.random(16).count == 16)
#expect(Bytes.random(16) != Bytes.random(16))
}
@Test func constantTimeEquality() {
#expect(Bytes.constantTimeEquals(Data([1, 2]), Data([1, 2])))
#expect(!Bytes.constantTimeEquals(Data([1, 2]), Data([1, 3])))
#expect(!Bytes.constantTimeEquals(Data([1, 2]), Data([1, 2, 3])))
}
}