Skip to content

Commit

Permalink
Merge pull request #157 from mapbox/1ec5-intersection-coding
Browse files Browse the repository at this point in the history
Fix Intersection coding
  • Loading branch information
1ec5 authored Jul 20, 2017
2 parents d68a18c + 27380c5 commit 41af8fe
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 9 deletions.
38 changes: 38 additions & 0 deletions IntersectionTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import XCTest
@testable import MapboxDirections

class IntersectionTests: XCTestCase {
func testCoding() {
let json: JSONDictionary = [
"classes": ["toll", "restricted"],
"out": 0,
"entry": [true],
"bearings": [80.0],
"location": [-122.420018, 37.78009],
]
let intersection = Intersection(json: json)

// Encode and decode the intersection securely.
// This may raise an Objective-C exception if an error is encountered which will fail the tests.

let encodedData = NSMutableData()
let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData)
keyedArchiver.requiresSecureCoding = true
keyedArchiver.encode(intersection, forKey: "intersection")
keyedArchiver.finishEncoding()

let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data)
keyedUnarchiver.requiresSecureCoding = true
let unarchivedIntersection = keyedUnarchiver.decodeObject(of: Intersection.self, forKey: "intersection")!
keyedUnarchiver.finishDecoding()

XCTAssertNotNil(unarchivedIntersection)

XCTAssertEqual(unarchivedIntersection.location.latitude, unarchivedIntersection.location.latitude)
XCTAssertEqual(unarchivedIntersection.location.longitude, unarchivedIntersection.location.longitude)
XCTAssertEqual(unarchivedIntersection.headings, unarchivedIntersection.headings)
XCTAssertEqual(unarchivedIntersection.outletIndex, unarchivedIntersection.outletIndex)
XCTAssertEqual(unarchivedIntersection.outletIndexes, unarchivedIntersection.outletIndexes)
XCTAssertEqual(unarchivedIntersection.outletRoadClasses, unarchivedIntersection.outletRoadClasses)
}
}
8 changes: 8 additions & 0 deletions MapboxDirections.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@
DADD27F31E5ABD4300D31FAD /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DADD27F21E5ABD4300D31FAD /* Mapbox.framework */; };
DADD27F41E5ABD6000D31FAD /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DADD27F21E5ABD4300D31FAD /* Mapbox.framework */; };
DADD27F71E5AC8E900D31FAD /* MapboxDirections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */; };
DAE33A1B1F215DF600C06039 /* IntersectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */; };
DAE33A1C1F215DF600C06039 /* IntersectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */; };
DAE33A1D1F215DF600C06039 /* IntersectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */; };
DAE9E0F41EB7DE2E001E8E8B /* RouteOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */; };
DAE9E0F51EB7DE2E001E8E8B /* RouteOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */; };
DAE9E0F61EB7DE2E001E8E8B /* RouteOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */; };
Expand Down Expand Up @@ -219,6 +222,7 @@
DADD27EC1E5AB0EB00D31FAD /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
DADD27ED1E5AB0EB00D31FAD /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
DADD27F21E5ABD4300D31FAD /* Mapbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Mapbox.framework; path = Carthage/Build/iOS/Mapbox.framework; sourceTree = "<group>"; };
DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntersectionTests.swift; sourceTree = SOURCE_ROOT; };
DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RouteOptionsTests.swift; path = MapboxDirectionsTests/RouteOptionsTests.swift; sourceTree = SOURCE_ROOT; };
DD6254731AE70CB700017857 /* MBDirections.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBDirections.swift; sourceTree = "<group>"; };
F448F82A1DDCC5B6000BC343 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/iOS/Polyline.framework; sourceTree = "<group>"; };
Expand Down Expand Up @@ -364,6 +368,7 @@
DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */,
DA6C9DB11CAECA0E00094FBC /* Fixture.swift */,
C5247D701E818A24004B6154 /* AnnotationTests.swift */,
DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */,
DA6C9D9A1CAE442B00094FBC /* Info.plist */,
DA6C9DAD1CAEC93800094FBC /* Fixtures */,
);
Expand Down Expand Up @@ -936,6 +941,7 @@
C53A02291E92C27A009837BD /* AnnotationTests.swift in Sources */,
DA1A10CD1D00F972009F82FA /* V5Tests.swift in Sources */,
DA737EE91D0611CB005BDA16 /* V4Tests.swift in Sources */,
DAE33A1C1F215DF600C06039 /* IntersectionTests.swift in Sources */,
DA1A10CE1D00F972009F82FA /* Fixture.swift in Sources */,
DA1A110C1D01045E009F82FA /* DirectionsTests.swift in Sources */,
F4D785F01DDD82C100FF4665 /* RouteStepTests.swift in Sources */,
Expand Down Expand Up @@ -970,6 +976,7 @@
C53A022A1E92C27B009837BD /* AnnotationTests.swift in Sources */,
DA1A10F41D010251009F82FA /* V5Tests.swift in Sources */,
DA737EEA1D0611CB005BDA16 /* V4Tests.swift in Sources */,
DAE33A1D1F215DF600C06039 /* IntersectionTests.swift in Sources */,
DA1A10F51D010251009F82FA /* Fixture.swift in Sources */,
DA1A110D1D01045E009F82FA /* DirectionsTests.swift in Sources */,
F4D785F11DDD82C100FF4665 /* RouteStepTests.swift in Sources */,
Expand Down Expand Up @@ -1024,6 +1031,7 @@
C5247D711E818A24004B6154 /* AnnotationTests.swift in Sources */,
DA6C9DAC1CAEC72800094FBC /* V5Tests.swift in Sources */,
DA737EE81D0611CB005BDA16 /* V4Tests.swift in Sources */,
DAE33A1B1F215DF600C06039 /* IntersectionTests.swift in Sources */,
DA6C9DB21CAECA0E00094FBC /* Fixture.swift in Sources */,
DA1A110B1D01045E009F82FA /* DirectionsTests.swift in Sources */,
F4D785EF1DDD82C100FF4665 /* RouteStepTests.swift in Sources */,
Expand Down
20 changes: 12 additions & 8 deletions MapboxDirections/MBIntersection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ public class Intersection: NSObject, NSSecureCoding {
public let usableApproachLanes: IndexSet?

/**
Option set representing the classes of road.
The road classes of the road that the containing step uses to leave the intersection.
If no road class information is available, this property's value is `nil`.
If road class information is unavailable, this property is set to `nil`.
*/
public let roadClasses: MBRoadClasses?
public let outletRoadClasses: RoadClasses?

internal init(json: JSONDictionary) {
location = CLLocationCoordinate2D(geoJSON: json["location"] as! [Double])
Expand Down Expand Up @@ -86,14 +86,14 @@ public class Intersection: NSObject, NSSecureCoding {
}

if let classStrings = json["classes"] as? [String] {
roadClasses = RoadClasses(descriptions: classStrings)
outletRoadClasses = RoadClasses(descriptions: classStrings)
} else {
roadClasses = nil
outletRoadClasses = nil
}
}

public required init?(coder decoder: NSCoder) {
guard let locationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "maneuverLocation") as? [String: CLLocationDegrees],
guard let locationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "location") as? [String: CLLocationDegrees],
let latitude = locationDictionary["latitude"],
let longitude = locationDictionary["longitude"] else {
return nil
Expand All @@ -116,7 +116,11 @@ public class Intersection: NSObject, NSSecureCoding {
approachLanes = decoder.decodeObject(of: [NSArray.self, Lane.self], forKey: "approachLanes") as? [Lane]
usableApproachLanes = decoder.decodeObject(of: NSIndexSet.self, forKey: "usableApproachLanes") as IndexSet?

roadClasses = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "roadClasses") as? RoadClasses
guard let descriptions = decoder.decodeObject(of: NSString.self, forKey: "outletRoadClasses") as String?,
let outletRoadClasses = RoadClasses(descriptions: descriptions.components(separatedBy: ",")) else {
return nil
}
self.outletRoadClasses = outletRoadClasses
}

open static var supportsSecureCoding = true
Expand All @@ -136,6 +140,6 @@ public class Intersection: NSObject, NSSecureCoding {
coder.encode(approachLanes, forKey: "approachLanes")
coder.encode(usableApproachLanes, forKey: "usableApproachLanes")

coder.encode(roadClasses, forKey: "roadClass")
coder.encode(outletRoadClasses?.description, forKey: "outletRoadClasses")
}
}
2 changes: 1 addition & 1 deletion MapboxDirectionsTests/V5Tests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class V5Tests: XCTestCase {
XCTAssertNotNil(firstStepIntersections)
let firstIntersection = firstStepIntersections?.first
XCTAssertNotNil(firstIntersection)
let roadClasses = firstIntersection?.roadClasses
let roadClasses = firstIntersection?.outletRoadClasses
XCTAssertNotNil(roadClasses)
XCTAssertTrue(roadClasses?.contains([.toll, .restricted]) ?? false)

Expand Down

0 comments on commit 41af8fe

Please sign in to comment.