diff --git a/Package.swift b/Package.swift index 60d9f4b..1dca8fa 100644 --- a/Package.swift +++ b/Package.swift @@ -1,6 +1,7 @@ -// swift-tools-version:5.0 +// swift-tools-version:5.3 import PackageDescription +import Foundation let package = Package( name: "SwiftSVG", @@ -15,7 +16,10 @@ let package = Package( .target( name: "SwiftSVG", dependencies: [], - path: "SwiftSVG" + path: "SwiftSVG", + resources: [ + .process("cssColorNames.json") + ] ), .testTarget( name: "SwiftSVGTests", diff --git a/SwiftSVG/SVG Extensions/SVGLayer.swift b/SwiftSVG/SVG Extensions/SVGLayer.swift index 2a348da..79dc9f2 100644 --- a/SwiftSVG/SVG Extensions/SVGLayer.swift +++ b/SwiftSVG/SVG Extensions/SVGLayer.swift @@ -87,10 +87,25 @@ public extension SVGLayer { Returns a copy of the given SVGLayer */ var svgLayerCopy: SVGLayer? { - let tmp = NSKeyedArchiver.archivedData(withRootObject: self) - let copiedLayer = NSKeyedUnarchiver.unarchiveObject(with: tmp) as? SVGLayer - copiedLayer?.boundingBox = self.boundingBox - return copiedLayer + /// new recommended method + if #available(iOS 11.0, *) { + do { + let tmp = try NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false) + let copiedLayer = try? NSKeyedUnarchiver.unarchivedObject(ofClass: SVGLayer.self, from: tmp) + copiedLayer?.boundingBox = self.boundingBox + return copiedLayer + } catch let error { + print("SVGLayer error occured: " + error.localizedDescription) + return nil + } + } + /// old method + else { + let tmp = NSKeyedArchiver.archivedData(withRootObject: self) + let copiedLayer = NSKeyedUnarchiver.unarchiveObject(with: tmp) as? SVGLayer + copiedLayer?.boundingBox = self.boundingBox + return copiedLayer + } } } diff --git a/SwiftSVG/SVG/Attributes/Fillable.swift b/SwiftSVG/SVG/Attributes/Fillable.swift index b4ef502..93664de 100644 --- a/SwiftSVG/SVG/Attributes/Fillable.swift +++ b/SwiftSVG/SVG/Attributes/Fillable.swift @@ -66,7 +66,13 @@ extension Fillable where Self : SVGShapeElement { - SeeAlso: CAShapeLayer's [`fillColor`](https://developer.apple.com/documentation/quartzcore/cashapelayer/1522248-fillcolor) */ func fill(fillColor: String) { - guard let colorComponents = self.svgLayer.fillColor?.components else { + // force if color is none + if fillColor == "none" { + self.svgLayer.fillColor = UIColor.clear.cgColor + return + } + // continue with the another color + guard let colorComponents = self.svgLayer.fillColor?.components, colorComponents.count == 4 else { return } guard let fillColor = UIColor(svgString: fillColor) else { @@ -93,7 +99,7 @@ extension Fillable where Self : SVGShapeElement { guard let opacity = CGFloat(opacity) else { return } - guard let colorComponents = self.svgLayer.fillColor?.components else { + guard let colorComponents = self.svgLayer.fillColor?.components, colorComponents.count == 4 else { return } self.svgLayer.fillColor = UIColor(red: colorComponents[0], green: colorComponents[1], blue: colorComponents[2], alpha: opacity).cgColor diff --git a/SwiftSVG/SVG/Helpers/Dictionary+JSON.swift b/SwiftSVG/SVG/Helpers/Dictionary+JSON.swift index d932c79..a515581 100644 --- a/SwiftSVG/SVG/Helpers/Dictionary+JSON.swift +++ b/SwiftSVG/SVG/Helpers/Dictionary+JSON.swift @@ -31,7 +31,7 @@ import Foundation extension Dictionary where Key: Decodable, Value: Decodable { init?(jsonFile name: String?) { - guard let jsonPath = Bundle(for: NSXMLSVGParser.self).url(forResource: name, withExtension: "json") else { + guard let jsonPath = Bundle.module.url(forResource: "cssColorNames", withExtension: "json") else { return nil } guard let jsonData = try? Data(contentsOf: jsonPath) else { diff --git a/SwiftSVG/SVG/Iterators/PathCommand.swift b/SwiftSVG/SVG/Iterators/PathCommand.swift index 9e918b5..910a02a 100644 --- a/SwiftSVG/SVG/Iterators/PathCommand.swift +++ b/SwiftSVG/SVG/Iterators/PathCommand.swift @@ -35,14 +35,14 @@ #endif -internal enum PathType { +public enum PathType { case absolute, relative } /** A protocol that describes an instance that can process an individual SVG Element */ -internal protocol PathCommand: PreviousCommand { +public protocol PathCommand: PreviousCommand { /** An array that stores processed coordinates values @@ -75,7 +75,7 @@ internal protocol PathCommand: PreviousCommand { /** A protocol that describes an instance that represents an SVGElement right before the current one */ -internal protocol PreviousCommand { +public protocol PreviousCommand { /** An array that stores processed coordinates values diff --git a/SwiftSVG/cssColorNames.json b/SwiftSVG/cssColorNames.json new file mode 100644 index 0000000..cb5c169 --- /dev/null +++ b/SwiftSVG/cssColorNames.json @@ -0,0 +1,153 @@ +{ + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkgrey": "#a9a9a9", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "goldenrod": "#daa520", + "gold": "#ffd700", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "grey": "#808080", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavenderblush": "#fff0f5", + "lavender": "#e6e6fa", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgray": "#d3d3d3", + "lightgreen": "#90ee90", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "none": "#00000000", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "transparent": "00000000", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32" +} + diff --git a/SwiftSVGTests/CGPathPoints.swift b/SwiftSVGTests/CGPathPoints.swift index 74b93e9..ff85ed1 100644 --- a/SwiftSVGTests/CGPathPoints.swift +++ b/SwiftSVGTests/CGPathPoints.swift @@ -27,9 +27,12 @@ // THE SOFTWARE. - -import UIKit - +#if os(iOS) || os(tvOS) + import UIKit +#elseif os(OSX) + import AppKit +#endif +import SwiftSVG extension CGPath { @@ -50,6 +53,8 @@ extension CGPath { arrayPoints.append(element.points[2]) case .closeSubpath: arrayPoints.append(element.points[0]) + @unknown default: + fatalError("CGPath:points: no such element") } } return arrayPoints @@ -72,6 +77,8 @@ extension CGPath { arrayPoints.append((element.points[2], .addCurveToPoint)) case .closeSubpath: arrayPoints.append((element.points[0], .closeSubpath)) + @unknown default: + fatalError("CGPath:points: no such element") } } return arrayPoints @@ -97,7 +104,3 @@ extension PathCommand { } } - - - - diff --git a/SwiftSVGTests/ClosePathTests.swift b/SwiftSVGTests/ClosePathTests.swift index 3e2c75f..d98f037 100644 --- a/SwiftSVGTests/ClosePathTests.swift +++ b/SwiftSVGTests/ClosePathTests.swift @@ -29,14 +29,19 @@ import XCTest +@testable +import SwiftSVG class ClosePathTests: XCTestCase { func testClosePath() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [20, -30], pathType: .absolute, path:testPath) - _ = ClosePath(parameters: [], pathType: .absolute, path:testPath) - let lastPointAndType = testPath.cgPath.pointsAndTypes.last! + _ = MoveTo(pathType: .absolute) + _ = ClosePath(pathType: .absolute) + guard let lastPointAndType = testPath.cgPath.pointsAndTypes.last else { + XCTFail() + return + } XCTAssert(lastPointAndType.1 == .closeSubpath, "Expected .closeSubpath, got \(lastPointAndType.1)") XCTAssert(lastPointAndType.0.x.isNaN == true && lastPointAndType.0.y.isNaN == true, "Expected NaN, NaN, got \(lastPointAndType.0)") } diff --git a/SwiftSVGTests/CoordinateLexerTests.swift b/SwiftSVGTests/CoordinateLexerTests.swift index 3ed6e2e..2b64ff8 100644 --- a/SwiftSVGTests/CoordinateLexerTests.swift +++ b/SwiftSVGTests/CoordinateLexerTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class IteratorTests: XCTestCase { diff --git a/SwiftSVGTests/CurveToTests.swift b/SwiftSVGTests/CurveToTests.swift index 237f3e7..1f7ea32 100644 --- a/SwiftSVGTests/CurveToTests.swift +++ b/SwiftSVGTests/CurveToTests.swift @@ -29,31 +29,43 @@ import XCTest +@testable +import SwiftSVG class CurveToTests: XCTestCase { func testAbsoluteCurveTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = CurveTo(parameters: [66, 37, 32, -18, 23, 98], pathType: .absolute, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = CurveTo(pathType: .absolute) let points = testPath.cgPath.points - XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") - XCTAssert(points[1].x == 66 && points[1].y == 37, "Expected 66, 37, got \(points[1])") - XCTAssert(points[2].x == 32 && points[2].y == -18, "Expected 32, -18, got \(points[2])") - XCTAssert(points[3].x == 23 && points[3].y == 98, "Expected 23, 98, got \(points[3])") - XCTAssert(points[3].x == testPath.currentPoint.x && points[3].y == testPath.currentPoint.y, "Expected {\(testPath.currentPoint)}, got \(points[3])") + print(points) + print(points.isEmpty) + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") + XCTAssert(points[1].x == 66 && points[1].y == 37, "Expected 66, 37, got \(points[1])") + XCTAssert(points[2].x == 32 && points[2].y == -18, "Expected 32, -18, got \(points[2])") + XCTAssert(points[3].x == 23 && points[3].y == 98, "Expected 23, 98, got \(points[3])") + XCTAssert(points[3].x == testPath.currentPoint.x && points[3].y == testPath.currentPoint.y, "Expected {\(testPath.currentPoint)}, got \(points[3])") + } } func testRelativeCurveTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = CurveTo(parameters: [66, 37, 32, -18, 23, 98], pathType: .relative, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = CurveTo(pathType: .relative) let points = testPath.cgPath.points - XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") - XCTAssert(points[1].x == 76 && points[1].y == 17, "Expected 76, 17, got \(points[1])") - XCTAssert(points[2].x == 42 && points[2].y == -38, "Expected 42, -38, got \(points[2])") - XCTAssert(points[3].x == 33 && points[3].y == 78, "Expected 33, 78, got \(points[3])") - XCTAssert(points[3].x == testPath.currentPoint.x && points[3].y == testPath.currentPoint.y, "Expected {\(testPath.currentPoint)}, got \(points[3])") + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") + XCTAssert(points[1].x == 76 && points[1].y == 17, "Expected 76, 17, got \(points[1])") + XCTAssert(points[2].x == 42 && points[2].y == -38, "Expected 42, -38, got \(points[2])") + XCTAssert(points[3].x == 33 && points[3].y == 78, "Expected 33, 78, got \(points[3])") + XCTAssert(points[3].x == testPath.currentPoint.x && points[3].y == testPath.currentPoint.y, "Expected {\(testPath.currentPoint)}, got \(points[3])") + } } } diff --git a/SwiftSVGTests/FillableTests.swift b/SwiftSVGTests/FillableTests.swift index 0788a69..50d3583 100644 --- a/SwiftSVGTests/FillableTests.swift +++ b/SwiftSVGTests/FillableTests.swift @@ -27,6 +27,8 @@ import XCTest +@testable +import SwiftSVG class FillableTests: XCTestCase { diff --git a/SwiftSVGTests/FloatingPointParseLengthStringTests.swift b/SwiftSVGTests/FloatingPointParseLengthStringTests.swift index af62e13..ef37101 100644 --- a/SwiftSVGTests/FloatingPointParseLengthStringTests.swift +++ b/SwiftSVGTests/FloatingPointParseLengthStringTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class FloatingPointParseLengthTests: XCTestCase { diff --git a/SwiftSVGTests/HorizontalLineToTests.swift b/SwiftSVGTests/HorizontalLineToTests.swift index 5968670..ef2e61e 100644 --- a/SwiftSVGTests/HorizontalLineToTests.swift +++ b/SwiftSVGTests/HorizontalLineToTests.swift @@ -29,23 +29,33 @@ import XCTest +@testable +import SwiftSVG class HorizontalLineToTests: XCTestCase { func testAbsoluteHorizontalLineTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = HorizontalLineTo(parameters: [-128], pathType: .absolute, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = HorizontalLineTo(pathType: .absolute) let points = testPath.cgPath.points - XCTAssert(points[1].x == -128 && points[1].y == -20, "Expected {-128, -20}, got \(points[1])") + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[1].x == -128 && points[1].y == -20, "Expected {-128, -20}, got \(points[1])") + } } func testRelativeHorizontalLineTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = HorizontalLineTo(parameters: [-128], pathType: .relative, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = HorizontalLineTo(pathType: .relative) let points = testPath.cgPath.points - XCTAssert(points[1].x == -118 && points[1].y == -20, "Expected {-118, -20}, got \(points[1])") + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[1].x == -118 && points[1].y == -20, "Expected {-118, -20}, got \(points[1])") + } } } diff --git a/SwiftSVGTests/IndentifiableTests.swift b/SwiftSVGTests/IndentifiableTests.swift index 2629248..5d27e3d 100644 --- a/SwiftSVGTests/IndentifiableTests.swift +++ b/SwiftSVGTests/IndentifiableTests.swift @@ -26,6 +26,8 @@ // THE SOFTWARE. import XCTest +@testable +import SwiftSVG class IndentifiableTests: XCTestCase { diff --git a/SwiftSVGTests/LineToTests.swift b/SwiftSVGTests/LineToTests.swift index 80977a5..7e6ecc9 100644 --- a/SwiftSVGTests/LineToTests.swift +++ b/SwiftSVGTests/LineToTests.swift @@ -29,25 +29,35 @@ import XCTest +@testable +import SwiftSVG class LineToTests: XCTestCase { func testAbsoluteLineTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = LineTo(parameters: [66, 37], pathType: .absolute, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = LineTo(pathType: .absolute) let points = testPath.cgPath.points - XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") - XCTAssert(points[1].x == 66 && points[1].y == 37, "Expected 66, 37, got \(points[1])") + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") + XCTAssert(points[1].x == 66 && points[1].y == 37, "Expected 66, 37, got \(points[1])") + } } func testRelativeLineTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = LineTo(parameters: [66, 37], pathType: .relative, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = LineTo(pathType: .relative) let points = testPath.cgPath.points - XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") - XCTAssert(points[1].x == 76 && points[1].y == 17, "Expected 76, 17, got \(points[1])") + if (points.isEmpty) { + XCTFail("Points aray is empty") + } else { + XCTAssert(points[0].x == 10 && points[0].y == -20, "Expected 10, -20, got \(points[0])") + XCTAssert(points[1].x == 76 && points[1].y == 17, "Expected 76, 17, got \(points[1])") + } } } diff --git a/SwiftSVGTests/MoveToTests.swift b/SwiftSVGTests/MoveToTests.swift index e3da817..4a7c1c1 100644 --- a/SwiftSVGTests/MoveToTests.swift +++ b/SwiftSVGTests/MoveToTests.swift @@ -29,46 +29,56 @@ import XCTest +@testable +import SwiftSVG class MoveToTests: XCTestCase { func testAbsoluteMoveTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [20, -30], pathType: .absolute, path:testPath) + _ = MoveTo(pathType: .absolute) XCTAssert(testPath.currentPoint.x == 20 && testPath.currentPoint.y == -30, "Expected {20, -30}, got \(testPath.currentPoint)") - - let firstPoint = testPath.cgPath.points[0] - XCTAssert(firstPoint.x == 20 && firstPoint.y == -30, "Expected {20, -30}, got \(firstPoint)") + let points = testPath.cgPath.points + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + let firstPoint = points[0] + XCTAssert(firstPoint.x == 20 && firstPoint.y == -30, "Expected {20, -30}, got \(firstPoint)") + } } func testRelativeMoveTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [20, -30], pathType: .absolute, path:testPath) - _ = LineTo(parameters: [55, -20], pathType: .absolute, path:testPath) - _ = MoveTo(parameters: [50, -10], pathType: .relative, path:testPath) + _ = MoveTo(pathType: .absolute) + _ = LineTo(pathType: .absolute) + _ = MoveTo(pathType: .relative) XCTAssert(testPath.currentPoint.x == 105 && testPath.currentPoint.y == -30, "Expected {105, -30}, got \(testPath.currentPoint)") } func testRelativeFirstMoveToTreatedAsAbsolute() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [50, 30], pathType: .relative, path: testPath, previousCommand: nil) + _ = MoveTo(pathType: .relative) XCTAssert(testPath.currentPoint.x == 50 && testPath.currentPoint.y == 30, "Expected {50, 30}, got \(testPath.currentPoint)") } func testMultipleMoveToCommands() { let testPath = UIBezierPath() - let moveTo1 = MoveTo(parameters: [10, 20], pathType: .relative, path: testPath) - let moveTo2 = MoveTo(parameters: [30, 40], pathType: .relative, path: testPath, previousCommand: moveTo1) - _ = MoveTo(parameters: [70, 80], pathType: .absolute, path: testPath, previousCommand: moveTo2) + _ = MoveTo(pathType: .relative) + _ = MoveTo(pathType: .relative) + _ = MoveTo(pathType: .absolute) let pointsAndTypes = testPath.cgPath.pointsAndTypes - XCTAssert(pointsAndTypes[0].1 == .moveToPoint, "Expected .moveToPoint, got \(pointsAndTypes[0].1)") - XCTAssert(pointsAndTypes[1].1 == .addLineToPoint, "Expected .addLineToPoint, got \(pointsAndTypes[1].1)") - XCTAssert(pointsAndTypes[2].1 == .addLineToPoint, "Expected .addLineToPoint, got \(pointsAndTypes[2].1)") - - XCTAssert(pointsAndTypes[0].0.x == 10 && pointsAndTypes[0].0.y == 20, "Expected {10, 20}, got \(pointsAndTypes[0].0)") - XCTAssert(pointsAndTypes[1].0.x == 40 && pointsAndTypes[1].0.y == 60, "Expected {40, 60}, got \(pointsAndTypes[1].0)") - XCTAssert(pointsAndTypes[2].0.x == 70 && pointsAndTypes[2].0.y == 80, "Expected {70, 80}, got \(pointsAndTypes[2].0)") + if (pointsAndTypes.isEmpty) { + XCTFail("PointsAndTypes array is empty") + } else { + XCTAssert(pointsAndTypes[0].1 == .moveToPoint, "Expected .moveToPoint, got \(pointsAndTypes[0].1)") + XCTAssert(pointsAndTypes[1].1 == .addLineToPoint, "Expected .addLineToPoint, got \(pointsAndTypes[1].1)") + XCTAssert(pointsAndTypes[2].1 == .addLineToPoint, "Expected .addLineToPoint, got \(pointsAndTypes[2].1)") + + XCTAssert(pointsAndTypes[0].0.x == 10 && pointsAndTypes[0].0.y == 20, "Expected {10, 20}, got \(pointsAndTypes[0].0)") + XCTAssert(pointsAndTypes[1].0.x == 40 && pointsAndTypes[1].0.y == 60, "Expected {40, 60}, got \(pointsAndTypes[1].0)") + XCTAssert(pointsAndTypes[2].0.x == 70 && pointsAndTypes[2].0.y == 80, "Expected {70, 80}, got \(pointsAndTypes[2].0)") + } } diff --git a/SwiftSVGTests/PathDLexerTests.swift b/SwiftSVGTests/PathDLexerTests.swift index 02f3939..186122e 100644 --- a/SwiftSVGTests/PathDLexerTests.swift +++ b/SwiftSVGTests/PathDLexerTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class PathDLexerTests: XCTestCase { diff --git a/SwiftSVGTests/PerformanceTests.swift b/SwiftSVGTests/PerformanceTests.swift index 9b28835..1772a6e 100644 --- a/SwiftSVGTests/PerformanceTests.swift +++ b/SwiftSVGTests/PerformanceTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class PerformanceTests: XCTestCase { diff --git a/SwiftSVGTests/SVGCircleTests.swift b/SwiftSVGTests/SVGCircleTests.swift index e785a2e..a854985 100644 --- a/SwiftSVGTests/SVGCircleTests.swift +++ b/SwiftSVGTests/SVGCircleTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGCircleTests: XCTestCase { diff --git a/SwiftSVGTests/SVGEllipseTests.swift b/SwiftSVGTests/SVGEllipseTests.swift index 91a8678..386e3bc 100644 --- a/SwiftSVGTests/SVGEllipseTests.swift +++ b/SwiftSVGTests/SVGEllipseTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGEllipseTests: XCTestCase { diff --git a/SwiftSVGTests/SVGGroupTests.swift b/SwiftSVGTests/SVGGroupTests.swift index 39d4ad0..2013ea3 100644 --- a/SwiftSVGTests/SVGGroupTests.swift +++ b/SwiftSVGTests/SVGGroupTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGGroupTests: XCTestCase { diff --git a/SwiftSVGTests/SVGLineTests.swift b/SwiftSVGTests/SVGLineTests.swift index ef2266e..5fcda3a 100644 --- a/SwiftSVGTests/SVGLineTests.swift +++ b/SwiftSVGTests/SVGLineTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGLineTests: XCTestCase { diff --git a/SwiftSVGTests/SVGPathTests.swift b/SwiftSVGTests/SVGPathTests.swift index 9326eee..2798dfa 100644 --- a/SwiftSVGTests/SVGPathTests.swift +++ b/SwiftSVGTests/SVGPathTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGPathTests: XCTestCase { diff --git a/SwiftSVGTests/SVGPolygonTests.swift b/SwiftSVGTests/SVGPolygonTests.swift index 026c318..6461638 100644 --- a/SwiftSVGTests/SVGPolygonTests.swift +++ b/SwiftSVGTests/SVGPolygonTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGPolygonTests: XCTestCase { diff --git a/SwiftSVGTests/SVGPolylineTests.swift b/SwiftSVGTests/SVGPolylineTests.swift index 2b90e9e..3964ba2 100644 --- a/SwiftSVGTests/SVGPolylineTests.swift +++ b/SwiftSVGTests/SVGPolylineTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGPolylineTests: XCTestCase { diff --git a/SwiftSVGTests/SVGRectangleTests.swift b/SwiftSVGTests/SVGRectangleTests.swift index 0811c2a..1ff1447 100644 --- a/SwiftSVGTests/SVGRectangleTests.swift +++ b/SwiftSVGTests/SVGRectangleTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGRectangleTests: XCTestCase { diff --git a/SwiftSVGTests/SVGRootElementTests.swift b/SwiftSVGTests/SVGRootElementTests.swift index aca8323..0cd7fc9 100644 --- a/SwiftSVGTests/SVGRootElementTests.swift +++ b/SwiftSVGTests/SVGRootElementTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class SVGRootElementTests: XCTestCase { diff --git a/SwiftSVGTests/ScalarFromByteArrayTests.swift b/SwiftSVGTests/ScalarFromByteArrayTests.swift index ed0a089..60e6439 100644 --- a/SwiftSVGTests/ScalarFromByteArrayTests.swift +++ b/SwiftSVGTests/ScalarFromByteArrayTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class ScalarFromByteArrayTests: XCTestCase { diff --git a/SwiftSVGTests/SmoothCurveToTests.swift b/SwiftSVGTests/SmoothCurveToTests.swift index fd46bd0..cfbc04a 100644 --- a/SwiftSVGTests/SmoothCurveToTests.swift +++ b/SwiftSVGTests/SmoothCurveToTests.swift @@ -29,21 +29,27 @@ import XCTest +@testable +import SwiftSVG class SmoothCurveToTests: XCTestCase { func testAbsoluteSmoothCurveTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - let curveTo = CurveTo(parameters: [78, -50, 37, 32, -18, 23], pathType: .absolute, path: testPath) - _ = SmoothCurveTo(parameters: [66, 37, 39, -101, -78, 65], pathType: .absolute, path: testPath, previousCommand: curveTo) + _ = MoveTo(pathType: .absolute) + _ = CurveTo(pathType: .absolute) + _ = SmoothCurveTo(pathType: .absolute) let pointsAndTypes = testPath.cgPath.pointsAndTypes - XCTAssert(pointsAndTypes.last!.1 == .addCurveToPoint, "Expected .addCurveToPoint, got \(pointsAndTypes.last!.1)") - - XCTAssert(pointsAndTypes[4].1 == .addCurveToPoint, "Expected .addCurveToPoint, got \(pointsAndTypes[4].1)") - //XCTAssert(pointsAndTypes[4].0.x == 66 && pointsAndTypes[4].0.y == 37, "Expected {66, 37}, got \(pointsAndTypes[4])") - //XCTAssert(pointsAndTypes[6].0.x == 39 && pointsAndTypes[6].0.y == -101, "Expected {39, -101}, got \(pointsAndTypes[6])") - //XCTAssert(pointsAndTypes[7].0.x == -78 && pointsAndTypes[7].0.y == 65, "Expected {-78, 65}, got \(pointsAndTypes[7])") + if (pointsAndTypes.isEmpty) { + XCTFail("PointsAndTypes array is empty") + } else { + XCTAssert(pointsAndTypes.last!.1 == .addCurveToPoint, "Expected .addCurveToPoint, got \(pointsAndTypes.last!.1)") + + XCTAssert(pointsAndTypes[4].1 == .addCurveToPoint, "Expected .addCurveToPoint, got \(pointsAndTypes[4].1)") + //XCTAssert(pointsAndTypes[4].0.x == 66 && pointsAndTypes[4].0.y == 37, "Expected {66, 37}, got \(pointsAndTypes[4])") + //XCTAssert(pointsAndTypes[6].0.x == 39 && pointsAndTypes[6].0.y == -101, "Expected {39, -101}, got \(pointsAndTypes[6])") + //XCTAssert(pointsAndTypes[7].0.x == -78 && pointsAndTypes[7].0.y == 65, "Expected {-78, 65}, got \(pointsAndTypes[7])") + } } } diff --git a/SwiftSVGTests/StackTests.swift b/SwiftSVGTests/StackTests.swift index afdcaef..02ac4c3 100644 --- a/SwiftSVGTests/StackTests.swift +++ b/SwiftSVGTests/StackTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class StackTests: XCTestCase { diff --git a/SwiftSVGTests/TestShapeElement.swift b/SwiftSVGTests/TestShapeElement.swift index c19d1fe..3e51535 100644 --- a/SwiftSVGTests/TestShapeElement.swift +++ b/SwiftSVGTests/TestShapeElement.swift @@ -25,7 +25,13 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -import UIKit +#if os(iOS) || os(tvOS) + import UIKit +#elseif os(OSX) + import AppKit +#endif +@testable +import SwiftSVG struct TestShapeElement: SVGShapeElement { static let elementName: String = "test" diff --git a/SwiftSVGTests/UIColorExtensionsTests.swift b/SwiftSVGTests/UIColorExtensionsTests.swift index b652024..5bec36a 100644 --- a/SwiftSVGTests/UIColorExtensionsTests.swift +++ b/SwiftSVGTests/UIColorExtensionsTests.swift @@ -29,6 +29,8 @@ import XCTest +@testable +import SwiftSVG class UIColorExtensionsTests: XCTestCase { @@ -42,61 +44,105 @@ class UIColorExtensionsTests: XCTestCase { } func testHexString() { - var testString = "#FFFF00" - var testColor = UIColor(hexString: testString) - var colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + var testColor: UIColor? + var testString: String + var colorArray: [CGFloat] + + testString = "#FFFF00" + testColor = UIColor(hexString: testString) + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + } else { + XCTFail("TestColor is nil") + } +// var colorArray = self.colorArray(testColor) +// XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") +// XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") +// XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") testString = "#FffF00" testColor = UIColor(hexString: testString) - colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + } else { + XCTFail("TestColor is nil") + } testString = "00fF00" testColor = UIColor(hexString: testString) - colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + } else { + XCTFail("TestColor is nil") + } } func testHexStringWithAlpha() { - var testString = "#fcab1def" - var testColor = UIColor(hexString: testString) - var colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 252 / 255, "Expected \(252 / 255), got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 171 / 255, "Expected \(171 / 255), got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 29 / 255, "Expected \(29 / 255), got \(colorArray[2])") - XCTAssertTrue(colorArray[3] == 239 / 255, "Expected \(239 / 255), got \(colorArray[2])") + var testString: String + var testColor: UIColor? + var colorArray: [CGFloat] + + testString = "#fcab1def" + testColor = UIColor(hexString: testString) + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 252 / 255, "Expected \(252 / 255), got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 171 / 255, "Expected \(171 / 255), got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 29 / 255, "Expected \(29 / 255), got \(colorArray[2])") + XCTAssertTrue(colorArray[3] == 239 / 255, "Expected \(239 / 255), got \(colorArray[2])") + } else { + XCTFail("TestColor is nil") + } testString = "a6bfc4d0" testColor = UIColor(hexString: testString) - colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 166 / 255, "Expected \(166 / 255), got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 191 / 255, "Expected \(191 / 255), got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 196 / 255, "Expected \(196 / 255), got \(colorArray[2])") - XCTAssertTrue(colorArray[3] == 208 / 255, "Expected \(208 / 255), got \(colorArray[2])") + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 166 / 255, "Expected \(166 / 255), got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 191 / 255, "Expected \(191 / 255), got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 196 / 255, "Expected \(196 / 255), got \(colorArray[2])") + XCTAssertTrue(colorArray[3] == 208 / 255, "Expected \(208 / 255), got \(colorArray[2])") + } else { + XCTFail("TestColor is nil") + } + } func testShortHexStrings() { - var testString = "#30f" - var testColor = UIColor(hexString: testString) - var colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 0.2, "Expected 0.2, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 1.0, "Expected 1.0, got \(colorArray[2])") + var testString: String + var testColor: UIColor? + var colorArray: [CGFloat] + testString = "#30f" + testColor = UIColor(hexString: testString) + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 0.2, "Expected 0.2, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 1.0, "Expected 1.0, got \(colorArray[2])") + } else { + XCTFail("TestColor is nil") + } testString = "f033" testColor = UIColor(hexString: testString) - colorArray = self.colorArray(testColor!) - XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 0.2, "Expected 0.2, got \(colorArray[2])") - XCTAssertTrue(colorArray[3] == 0.2, "Expected 0.2, got \(colorArray[3])") + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 1, "Expected 1, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 0.2, "Expected 0.2, got \(colorArray[2])") + XCTAssertTrue(colorArray[3] == 0.2, "Expected 0.2, got \(colorArray[3])") + } else { + XCTFail("TestColor is nil") + } } func testRGBString() { @@ -114,34 +160,40 @@ class UIColorExtensionsTests: XCTestCase { XCTAssert(false, "Named color [\(testString)] does not exist") return } - var colorArray = self.colorArray(testColor) + let colorArray = self.colorArray(testColor) XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") XCTAssertTrue(colorArray[1] == 1, "Expected 1, got \(colorArray[1])") XCTAssertTrue(colorArray[2] == 1, "Expected 1, got \(colorArray[2])") } func testClearColors() { - var testString = "none" - guard let testColor = UIColor(cssName: testString) else { - XCTAssert(false, "Named color [\(testString)] does not exist") - return + var testString: String + var testColor: UIColor? + var colorArray: [CGFloat] + + testString = "none" + testColor = UIColor(cssName: testString) + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + XCTAssertTrue(colorArray[3] == 0, "Expected 0, got \(colorArray[3])") + } else { + XCTFail("TestColor is nil") } - var colorArray = self.colorArray(testColor) - XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") - XCTAssertTrue(colorArray[3] == 0, "Expected 0, got \(colorArray[3])") testString = "transparent" - guard let testColor2 = UIColor(cssName: testString) else { - XCTAssert(false, "Named color [\(testString)] does not exist") - return + testColor = UIColor(cssName: testString) + if (testColor != nil) { + colorArray = self.colorArray(testColor!) + XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") + XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") + XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") + XCTAssertTrue(colorArray[3] == 0, "Expected 0, got \(colorArray[3])") + } else { + XCTFail("TestColor is nil") } - colorArray = self.colorArray(testColor2) - XCTAssertTrue(colorArray[0] == 0, "Expected 0, got \(colorArray[0])") - XCTAssertTrue(colorArray[1] == 0, "Expected 0, got \(colorArray[1])") - XCTAssertTrue(colorArray[2] == 0, "Expected 0, got \(colorArray[2])") - XCTAssertTrue(colorArray[3] == 0, "Expected 0, got \(colorArray[3])") } } diff --git a/SwiftSVGTests/VerticalLineToTests.swift b/SwiftSVGTests/VerticalLineToTests.swift index 1950ebb..21ed649 100644 --- a/SwiftSVGTests/VerticalLineToTests.swift +++ b/SwiftSVGTests/VerticalLineToTests.swift @@ -29,23 +29,33 @@ import XCTest +@testable +import SwiftSVG class VerticalLineToTests: XCTestCase { func testAbsoluteVerticalLineTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = VerticalLineTo(parameters: [-128], pathType: .absolute, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = VerticalLineTo(pathType: .absolute) let points = testPath.cgPath.points - XCTAssert(points[1].x == 10 && points[1].y == -128, "Expected {10, -128}, got \(points[1])") + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[1].x == 10 && points[1].y == -128, "Expected {10, -128}, got \(points[1])") + } } func testRelativeVerticalLineTo() { let testPath = UIBezierPath() - _ = MoveTo(parameters: [10, -20], pathType: .absolute, path: testPath) - _ = VerticalLineTo(parameters: [-128], pathType: .relative, path: testPath) + _ = MoveTo(pathType: .absolute) + _ = VerticalLineTo(pathType: .relative) let points = testPath.cgPath.points - XCTAssert(points[1].x == 10 && points[1].y == -148, "Expected {10, -148}, got \(points[1])") + if (points.isEmpty) { + XCTFail("Points array is empty") + } else { + XCTAssert(points[1].x == 10 && points[1].y == -148, "Expected {10, -148}, got \(points[1])") + } } }