1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
import XCTest
@testable import WasmKit
final class LEBTest: XCTestCase {
func testUnsigned() {
XCTAssertEqual(try UInt8(LEB: [0x00]), 0)
XCTAssertEqual(try UInt8(LEB: [0x01]), 1)
XCTAssertEqual(try UInt8(LEB: [0x7f]), 127)
XCTAssertEqual(try UInt8(LEB: [0x80, 0x01]), 128)
XCTAssertEqual(try UInt8(LEB: [0xFF, 0x01]), 255)
XCTAssertEqual(try UInt16(LEB: [0x00]), 0)
XCTAssertEqual(try UInt16(LEB: [0x7f]), 127)
XCTAssertEqual(try UInt16(LEB: [0x80, 0x01]), 128)
XCTAssertEqual(try UInt16(LEB: [0xff, 0xff, 0x3]), 0xffff)
XCTAssertEqual(try UInt32(LEB: [0x00]), 0)
XCTAssertEqual(try UInt32(LEB: [0x7f]), 127)
XCTAssertEqual(try UInt32(LEB: [0x80, 0x01]), 128)
XCTAssertEqual(try UInt32(LEB: [0xe5, 0x8e, 0x26]), 624485)
XCTAssertEqual(try UInt64(LEB: [0x00]), 0)
XCTAssertEqual(try UInt64(LEB: [0x7f]), 127)
XCTAssertEqual(try UInt64(LEB: [0x80, 0x01]), 128)
XCTAssertEqual(try UInt64(LEB: [0xe5, 0x8e, 0x26]), 624485)
XCTAssertThrowsError(try UInt8(LEB: [])) { error in
guard case LEBError.insufficientBytes = error else {
return XCTFail()
}
}
XCTAssertThrowsError(try UInt8(LEB: [0x80])) { error in
guard case LEBError.insufficientBytes = error else {
return XCTFail()
}
}
XCTAssertThrowsError(try UInt8(LEB: [0x80, 0x02])) { error in
guard case LEBError.overflow = error else {
return XCTFail("Unexpected error: \(error)")
}
}
XCTAssertThrowsError(try UInt16(LEB: [0x80, 0x80, 0x04])) { error in
guard case LEBError.overflow = error else {
return XCTFail("Unexpected error: \(error)")
}
}
XCTAssertThrowsError(try UInt32(LEB: [0x80, 0x80, 0x80, 0x80, 0x16])) { error in
guard case LEBError.overflow = error else {
return XCTFail("Unexpected error: \(error)")
}
}
XCTAssertThrowsError(try UInt64(LEB: [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02])) { error in
guard case LEBError.overflow = error else {
return XCTFail("Unexpected error: \(error)")
}
}
}
func testSigned() {
XCTAssertEqual(try Int8(LEB: [0x00]), 0)
XCTAssertEqual(try Int8(LEB: [0x01]), 1)
XCTAssertEqual(try Int8(LEB: [0x7f]), -1)
XCTAssertEqual(try Int8(LEB: [0xff, 0x00]), 127)
XCTAssertEqual(try Int8(LEB: [0x81, 0x7f]), -127)
XCTAssertEqual(try Int8(LEB: [0x80, 0x7f]), -128)
XCTAssertEqual(try Int16(LEB: [0x00]), 0)
XCTAssertEqual(try Int16(LEB: [0x01]), 1)
XCTAssertEqual(try Int16(LEB: [0x7f]), -1)
XCTAssertEqual(try Int16(LEB: [0xff, 0x00]), 127)
XCTAssertEqual(try Int16(LEB: [0x81, 0x7f]), -127)
XCTAssertEqual(try Int16(LEB: [0x80, 0x7f]), -128)
XCTAssertEqual(try Int16(LEB: [0x81, 1]), 129)
XCTAssertEqual(try Int16(LEB: [0xff, 0x7e]), -129)
XCTAssertThrowsError(try Int32(LEB: [0x80, 0x80, 0x80, 0x80, 0x70])) { error in
guard case LEBError.overflow = error else {
return XCTFail("Unexpected error: \(error)")
}
}
XCTAssertThrowsError(try Int8(LEB: [])) { error in
guard case LEBError.insufficientBytes = error else {
return XCTFail("Unexpected error: \(error)")
}
}
XCTAssertThrowsError(try Int8(LEB: [0x80])) { error in
guard case LEBError.insufficientBytes = error else {
return XCTFail("Unexpected error: \(error)")
}
}
}
}
extension FixedWidthInteger where Self: UnsignedInteger {
fileprivate init(LEB bytes: [UInt8]) throws {
var iterator = bytes.makeIterator()
try self.init(LEB: { iterator.next() })
}
}
extension FixedWidthInteger where Self: SignedInteger {
fileprivate init(LEB bytes: [UInt8]) throws {
var iterator = bytes.makeIterator()
try self.init(LEB: { iterator.next() })
}
}
|