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 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
} }
} }

View File

@ -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
)
}
} }
} }
} }