diff --git a/Package.swift b/Package.swift index a7e634a..60e5267 100644 --- a/Package.swift +++ b/Package.swift @@ -27,6 +27,11 @@ let package = Package( dependencies: ["MaxMindDecoder"], path: "Sources/Index" ), + .target( + name: "Metadata", + dependencies: ["MaxMindDecoder"], + path: "Sources/Metadata" + ), .target( name: "MaxMindDBReader", @@ -54,6 +59,11 @@ let package = Package( dependencies: ["Index"] ), + .testTarget( + name: "MetadataTests", + dependencies: ["Metadata"] + ), + .testTarget( name: "MaxMindDecoderTests", dependencies: ["MaxMindDecoder"] diff --git a/Sources/MaxMindDBReader/InMemoryReader.swift b/Sources/MaxMindDBReader/InMemoryReader.swift index bbcbc17..79c8f72 100644 --- a/Sources/MaxMindDBReader/InMemoryReader.swift +++ b/Sources/MaxMindDBReader/InMemoryReader.swift @@ -10,7 +10,7 @@ public class InMemoryReader { private let databaseContent: Data private let indexRange: Range - let metadata: Metadata + let metadata: MetadataStruct public init(data: Data) throws { databaseContent = data diff --git a/Sources/MaxMindDBReader/Metadata.swift b/Sources/MaxMindDBReader/Metadata.swift index c251390..db3988d 100644 --- a/Sources/MaxMindDBReader/Metadata.swift +++ b/Sources/MaxMindDBReader/Metadata.swift @@ -17,8 +17,3 @@ public protocol Metadata { var searchTreeSize: UInt64 { get } } - -public extension Metadata { - var nodeByteSize: UInt16 { get { return recordSize / 4 } } - var searchTreeSize: UInt64 { get { return UInt64(nodeCount * UInt32(nodeByteSize)) } } -} \ No newline at end of file diff --git a/Sources/MaxMindDBReader/MetadataStruct.swift b/Sources/MaxMindDBReader/MetadataStruct.swift index f10d8ce..6a965b2 100644 --- a/Sources/MaxMindDBReader/MetadataStruct.swift +++ b/Sources/MaxMindDBReader/MetadataStruct.swift @@ -1,7 +1,7 @@ import Foundation import MaxMindDecoder -struct MetadataStruct: Metadata { +struct MetadataStruct { let nodeCount: UInt32 let recordSize: UInt16 let ipVersion: UInt16 @@ -11,6 +11,8 @@ struct MetadataStruct: Metadata { let binaryFormatMinorVersion: UInt16 let buildEpoch: UInt64 let description: LanguageToDescription + var nodeByteSize: UInt16 { get { return recordSize / 4 } } + var searchTreeSize: UInt64 { get { return UInt64(nodeCount * UInt32(nodeByteSize)) } } init?(_ iterator: MaxMindIterator) { guard let mapControlByte = iterator.next() else { return nil } diff --git a/Tests/MaxMindDBReaderTests/MetadataStructTest.swift b/Tests/MaxMindDBReaderTests/MetadataStructTest.swift index fb8cdc7..aa93bdc 100644 --- a/Tests/MaxMindDBReaderTests/MetadataStructTest.swift +++ b/Tests/MaxMindDBReaderTests/MetadataStructTest.swift @@ -3,58 +3,17 @@ import XCTest @testable import MaxMindDBReader import MaxMindDecoder -fileprivate struct MetadataTestImpl: Metadata { - let nodeCount: UInt32 - let recordSize: UInt16 - let ipVersion: UInt16 = 4 - let databaseType: String = "" - let languages: [String] = [""] - let binaryFormatMajorVersion: UInt16 = 1 - let binaryFormatMinorVersion: UInt16 = 3 - let buildEpoch: UInt64 = 1588065718 - let description: LanguageToDescription = [:] -} - class MetadataStructTest: XCTestCase { - private func assertCalculatedValues(nodeCount: UInt32, recordSize: UInt16) { - let expectedNodeByteSize: UInt16 = recordSize / 4 - let expectedSearchTreeSize = UInt64(nodeCount * UInt32(expectedNodeByteSize)) - XCTAssertEqual( - expectedNodeByteSize, - MetadataTestImpl( - nodeCount: nodeCount, - recordSize: recordSize - ).nodeByteSize - ) - XCTAssertEqual( - expectedSearchTreeSize, - MetadataTestImpl( - nodeCount: nodeCount, - recordSize: recordSize - ).searchTreeSize - ) - } - - func testCalculatedValues() { - assertCalculatedValues(nodeCount: 3, recordSize: 3) - assertCalculatedValues(nodeCount: 3, recordSize: 10) - assertCalculatedValues(nodeCount: 3, recordSize: 100) - assertCalculatedValues(nodeCount: 3, recordSize: 1000) - assertCalculatedValues(nodeCount: 3, recordSize: 1000) - assertCalculatedValues(nodeCount: 3, recordSize: 10000) - assertCalculatedValues(nodeCount: 5, recordSize: 3) - assertCalculatedValues(nodeCount: 5, recordSize: 10) - assertCalculatedValues(nodeCount: 5, recordSize: 100) - assertCalculatedValues(nodeCount: 5, recordSize: 1000) - assertCalculatedValues(nodeCount: 5, recordSize: 1000) - assertCalculatedValues(nodeCount: 5, recordSize: 10000) - assertCalculatedValues(nodeCount: 500, recordSize: 3) - assertCalculatedValues(nodeCount: 500, recordSize: 10) - assertCalculatedValues(nodeCount: 500, recordSize: 100) - assertCalculatedValues(nodeCount: 500, recordSize: 1000) - assertCalculatedValues(nodeCount: 500, recordSize: 1000) - assertCalculatedValues(nodeCount: 500, recordSize: 10000) + private func assertCalculatedValues( + _ metadata: MetadataStruct, + file: StaticString = #file, + line: UInt = #line + ) { + let expectedNodeByteSize: UInt16 = metadata.recordSize / 4 + let expectedSearchTreeSize = UInt64(metadata.nodeCount * UInt32(expectedNodeByteSize)) + XCTAssertEqual(expectedNodeByteSize, metadata.nodeByteSize, file: file, line: line) + XCTAssertEqual(expectedSearchTreeSize, metadata.searchTreeSize, file: file, line: line) } func testInit_nilIfCantCreateIterator() { @@ -88,6 +47,7 @@ class MetadataStructTest: XCTestCase { XCTAssertEqual(["en": "GeoLite2 Country database"], metadata.description) XCTAssertEqual(6, metadata.nodeByteSize) XCTAssertEqual(3710754, metadata.searchTreeSize) + assertCalculatedValues(metadata) } func testInit_withIterator() { @@ -111,6 +71,7 @@ class MetadataStructTest: XCTestCase { XCTAssertEqual(["en": "GeoLite2 Country database"], metadata.description) XCTAssertEqual(6, metadata.nodeByteSize) XCTAssertEqual(3710754, metadata.searchTreeSize) + assertCalculatedValues(metadata) } }