ControlByte constructor got changed, because the byte sequence is at least 1 byte, at most 5 bytes long.
Signed-off-by: Adam Rocska <adam.rocska@adams.solutions>
This commit is contained in:
parent
b020fb2944
commit
7bc612efee
|
@ -4,14 +4,19 @@ struct ControlByte {
|
||||||
|
|
||||||
let type: DataType
|
let type: DataType
|
||||||
|
|
||||||
init?(firstByte: UInt8, secondByte: UInt8 = 0b0000_0000) {
|
init?(bytes: Data) {
|
||||||
|
if bytes.count == 0 || bytes.count > 5 { return nil }
|
||||||
|
|
||||||
|
let firstByte = bytes.first!
|
||||||
let typeDefinitionOnFirstByte = firstByte &>> 5
|
let typeDefinitionOnFirstByte = firstByte &>> 5
|
||||||
|
|
||||||
guard let type = typeDefinitionOnFirstByte != 0b0000_0000
|
guard let type = typeDefinitionOnFirstByte != 0b0000_0000
|
||||||
? DataType(rawValue: typeDefinitionOnFirstByte)
|
? DataType(rawValue: typeDefinitionOnFirstByte)
|
||||||
: DataType(rawValue: secondByte + 7)
|
: DataType(rawValue: bytes[bytes.index(after: bytes.startIndex)] + 7)
|
||||||
else {
|
else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
self.type = type
|
self.type = type
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,31 +3,52 @@ import XCTest
|
||||||
@testable import MaxMindDBReader
|
@testable import MaxMindDBReader
|
||||||
|
|
||||||
class ControlByteTest: XCTestCase {
|
class ControlByteTest: XCTestCase {
|
||||||
func testInit() {
|
|
||||||
let dataTypes = (1...255).compactMap({ DataType(rawValue: $0) })
|
|
||||||
|
|
||||||
let nonExtendedTypes = dataTypes.filter({ $0.rawValue <= 7 }).map({ $0.rawValue })
|
private static let dataTypes: [DataType] = (1...255).compactMap({ DataType(rawValue: $0) })
|
||||||
let extendedTypes = dataTypes.filter({ $0.rawValue > 7 }).map({ $0.rawValue })
|
private static let nonExtendedRawValues: [DataType.RawValue] = dataTypes
|
||||||
precondition(nonExtendedTypes.count > 0, "nonExtendedTypes can't be empty.")
|
.filter({ $0.rawValue <= 7 })
|
||||||
precondition(extendedTypes.count > 0, "extendedTypes can't be empty.")
|
.map({ $0.rawValue })
|
||||||
for nonExtendedType in nonExtendedTypes {
|
private static let extendedRawValues: [DataType.RawValue] = dataTypes
|
||||||
XCTAssertEqual(
|
.filter({ $0.rawValue > 7 })
|
||||||
DataType(rawValue: nonExtendedType),
|
.map({ $0.rawValue })
|
||||||
ControlByte(firstByte: nonExtendedType &<< 5)?.type
|
|
||||||
)
|
override class func setUp() {
|
||||||
XCTAssertEqual(
|
super.setUp()
|
||||||
DataType(rawValue: nonExtendedType),
|
precondition(nonExtendedRawValues.count > 0, "nonExtendedRawValues can't be empty.")
|
||||||
ControlByte(
|
precondition(extendedRawValues.count > 0, "extendedRawValues can't be empty.")
|
||||||
firstByte: nonExtendedType &<< 5,
|
}
|
||||||
secondByte: 0b1111_1111
|
|
||||||
)?.type
|
func testInit_nilIfEmpty() {
|
||||||
)
|
XCTAssertNil(ControlByte(bytes: Data()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testInit_nilIfBiggerThanFive() {
|
||||||
|
XCTAssertNil(ControlByte(bytes: Data([0b0100_0000]) + Data(count: 5)))
|
||||||
|
XCTAssertNil(ControlByte(bytes: Data([0b0100_0000]) + Data(count: 6)))
|
||||||
|
XCTAssertNil(ControlByte(bytes: Data([0b0100_0000]) + Data(count: 7)))
|
||||||
|
XCTAssertNil(ControlByte(bytes: Data([0b0100_0000]) + Data(count: 10)))
|
||||||
|
XCTAssertNil(ControlByte(bytes: Data([0b0100_0000]) + Data(count: 100)))
|
||||||
|
XCTAssertNil(ControlByte(bytes: Data([0b0100_0000]) + Data(count: 10_000)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testInit_dataTypeIdentification() {
|
||||||
|
for value in ControlByteTest.nonExtendedRawValues {
|
||||||
|
for data in (0...4).map({ Data([value &<< 5]) + Data(count: $0) }) {
|
||||||
|
XCTAssertEqual(
|
||||||
|
DataType(rawValue: value),
|
||||||
|
ControlByte(bytes: data)?.type
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for extendedType in extendedTypes {
|
|
||||||
XCTAssertEqual(
|
for value in ControlByteTest.extendedRawValues {
|
||||||
DataType(rawValue: extendedType),
|
for data in (0...3).map({ Data([0b0000_0000, value - 7]) + Data(count: $0) }) {
|
||||||
ControlByte(firstByte: 0b0000_0000, secondByte: extendedType - 7)?.type
|
XCTAssertEqual(
|
||||||
)
|
DataType(rawValue: value),
|
||||||
|
ControlByte(bytes: data)?.type
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue