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:
Adam Rocska 2020-04-30 14:43:44 +02:00
parent b020fb2944
commit 7bc612efee
2 changed files with 51 additions and 25 deletions

View File

@ -4,14 +4,19 @@ struct ControlByte {
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
guard let type = typeDefinitionOnFirstByte != 0b0000_0000
? DataType(rawValue: typeDefinitionOnFirstByte)
: DataType(rawValue: secondByte + 7)
: DataType(rawValue: bytes[bytes.index(after: bytes.startIndex)] + 7)
else {
return nil
}
self.type = type
}
}

View File

@ -3,31 +3,52 @@ import XCTest
@testable import MaxMindDBReader
class ControlByteTest: XCTestCase {
func testInit() {
let dataTypes = (1...255).compactMap({ DataType(rawValue: $0) })
let nonExtendedTypes = dataTypes.filter({ $0.rawValue <= 7 }).map({ $0.rawValue })
let extendedTypes = dataTypes.filter({ $0.rawValue > 7 }).map({ $0.rawValue })
precondition(nonExtendedTypes.count > 0, "nonExtendedTypes can't be empty.")
precondition(extendedTypes.count > 0, "extendedTypes can't be empty.")
for nonExtendedType in nonExtendedTypes {
XCTAssertEqual(
DataType(rawValue: nonExtendedType),
ControlByte(firstByte: nonExtendedType &<< 5)?.type
)
XCTAssertEqual(
DataType(rawValue: nonExtendedType),
ControlByte(
firstByte: nonExtendedType &<< 5,
secondByte: 0b1111_1111
)?.type
)
private static let dataTypes: [DataType] = (1...255).compactMap({ DataType(rawValue: $0) })
private static let nonExtendedRawValues: [DataType.RawValue] = dataTypes
.filter({ $0.rawValue <= 7 })
.map({ $0.rawValue })
private static let extendedRawValues: [DataType.RawValue] = dataTypes
.filter({ $0.rawValue > 7 })
.map({ $0.rawValue })
override class func setUp() {
super.setUp()
precondition(nonExtendedRawValues.count > 0, "nonExtendedRawValues can't be empty.")
precondition(extendedRawValues.count > 0, "extendedRawValues can't be empty.")
}
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(
DataType(rawValue: extendedType),
ControlByte(firstByte: 0b0000_0000, secondByte: extendedType - 7)?.type
)
for value in ControlByteTest.extendedRawValues {
for data in (0...3).map({ Data([0b0000_0000, value - 7]) + Data(count: $0) }) {
XCTAssertEqual(
DataType(rawValue: value),
ControlByte(bytes: data)?.type
)
}
}
}
}