diff --git a/SwiftRichString.xcodeproj/project.pbxproj b/SwiftRichString.xcodeproj/project.pbxproj index 74feadf..286708d 100644 --- a/SwiftRichString.xcodeproj/project.pbxproj +++ b/SwiftRichString.xcodeproj/project.pbxproj @@ -239,9 +239,6 @@ 6489332820A0CA76000E691A /* FontInfoAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6489332420A0CA76000E691A /* FontInfoAttribute.swift */; }; 6489332920A0CA76000E691A /* FontInfoAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6489332420A0CA76000E691A /* FontInfoAttribute.swift */; }; 6489332A20A0CA76000E691A /* FontInfoAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6489332420A0CA76000E691A /* FontInfoAttribute.swift */; }; - 8933C78E1EB5B82C000D00A4 /* SwiftRichStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8933C7891EB5B82A000D00A4 /* SwiftRichStringTests.swift */; }; - 8933C78F1EB5B82C000D00A4 /* SwiftRichStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8933C7891EB5B82A000D00A4 /* SwiftRichStringTests.swift */; }; - 8933C7901EB5B82D000D00A4 /* SwiftRichStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8933C7891EB5B82A000D00A4 /* SwiftRichStringTests.swift */; }; D53F4E7B21F03E690085D26F /* DynamicText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53F4E7A21F03E690085D26F /* DynamicText.swift */; }; D53F4E7C21F03EEE0085D26F /* DynamicText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53F4E7A21F03E690085D26F /* DynamicText.swift */; }; D53F4E7D21F03EEF0085D26F /* DynamicText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53F4E7A21F03E690085D26F /* DynamicText.swift */; }; @@ -252,6 +249,10 @@ D53F4E8221F03F250085D26F /* DynamicText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53F4E7A21F03E690085D26F /* DynamicText.swift */; }; DD7502881C68FEDE006590AF /* SwiftRichString.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52D6DA0F1BF000BD002C0205 /* SwiftRichString.framework */; }; DD7502921C690C7A006590AF /* SwiftRichString.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52D6D9F01BEFFFBE002C0205 /* SwiftRichString.framework */; }; + F06E3FC02412994300D99B5B /* StyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06E3FBF2412994300D99B5B /* StyleTests.swift */; }; + F06E3FC12412994700D99B5B /* StyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06E3FBF2412994300D99B5B /* StyleTests.swift */; }; + F0A8C2BB24128C8200512946 /* FontDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0A8C2BA24128C8200512946 /* FontDataTests.swift */; }; + F0A8C2BD24128C8F00512946 /* FontDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0A8C2BA24128C8200512946 /* FontDataTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -382,12 +383,13 @@ 6489330F209DE87D000E691A /* SystemFonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemFonts.swift; sourceTree = ""; }; 64893316209DEAFF000E691A /* Style.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Style.swift; sourceTree = ""; }; 6489332420A0CA76000E691A /* FontInfoAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontInfoAttribute.swift; sourceTree = ""; }; - 8933C7891EB5B82A000D00A4 /* SwiftRichStringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftRichStringTests.swift; sourceTree = ""; }; AD2FAA261CD0B6D800659CF4 /* SwiftRichString.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SwiftRichString.plist; sourceTree = ""; }; AD2FAA281CD0B6E100659CF4 /* SwiftRichStringTests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SwiftRichStringTests.plist; sourceTree = ""; }; D53F4E7A21F03E690085D26F /* DynamicText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicText.swift; sourceTree = ""; }; DD75027A1C68FCFC006590AF /* SwiftRichString-macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftRichString-macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; DD75028D1C690C7A006590AF /* SwiftRichString-tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftRichString-tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + F06E3FBF2412994300D99B5B /* StyleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleTests.swift; sourceTree = ""; }; + F0A8C2BA24128C8200512946 /* FontDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontDataTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -665,7 +667,8 @@ 8933C7831EB5B7EB000D00A4 /* Tests */ = { isa = PBXGroup; children = ( - 8933C7891EB5B82A000D00A4 /* SwiftRichStringTests.swift */, + F0A8C2BA24128C8200512946 /* FontDataTests.swift */, + F06E3FBF2412994300D99B5B /* StyleTests.swift */, ); name = Tests; path = Tests/SwiftRichStringTests; @@ -1169,7 +1172,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8933C7901EB5B82D000D00A4 /* SwiftRichStringTests.swift in Sources */, + F0A8C2BB24128C8200512946 /* FontDataTests.swift in Sources */, + F06E3FC02412994300D99B5B /* StyleTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1425,7 +1429,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8933C78F1EB5B82C000D00A4 /* SwiftRichStringTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1433,7 +1436,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8933C78E1EB5B82C000D00A4 /* SwiftRichStringTests.swift in Sources */, + F0A8C2BD24128C8F00512946 /* FontDataTests.swift in Sources */, + F06E3FC12412994700D99B5B /* StyleTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 0e74b3e..d909966 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -2,5 +2,6 @@ import XCTest @testable import SwiftRichStringTests XCTMain([ - testCase(SwiftRichStringTests.allTests), + testCase(FontDataTests.allTests), + testCase(StyleTests.allTests), ]) diff --git a/Tests/SwiftRichStringTests/FontDataTests.swift b/Tests/SwiftRichStringTests/FontDataTests.swift new file mode 100644 index 0000000..b96c8c7 --- /dev/null +++ b/Tests/SwiftRichStringTests/FontDataTests.swift @@ -0,0 +1,76 @@ +// +// FontDataTests.swift +// SwiftRichString-iOS Tests +// +// Created by Rolandas Razma on 06/03/2020. +// Copyright © 2020 SwiftRichString. All rights reserved. +// + +import XCTest +@testable import SwiftRichString + +class FontDataTests: XCTestCase { + + private func fontAttributes(for fontData: FontData, attribute: UIFontDescriptor.AttributeName) -> T? { + let attributes: [NSAttributedString.Key: Any] = fontData.attributes(currentFont: UIFont.systemFont(ofSize: 12), size: 12) + XCTAssertFalse(attributes.isEmpty, "empty attributes") + + let font: UIFont? = attributes[.font] as? UIFont + XCTAssertNotNil(font, "font attribute missing") + + let fontAttributes: [UIFontDescriptor.AttributeName : Any]? = font?.fontDescriptor.fontAttributes + XCTAssertNotNil(fontAttributes, "font has no attributes") + + return fontAttributes?[attribute] as? T + } + + private func featureSettings(for fontData: FontData, featureIdentifier: T) -> [[UIFontDescriptor.FeatureKey: Any]]? { + let featureSettings: [[UIFontDescriptor.FeatureKey: Any]]? = self.fontAttributes(for: fontData, attribute: .featureSettings) + return featureSettings?.filter({ $0[.featureIdentifier] as? T == featureIdentifier }) + } + + func testNumberSpacingMonospaced() { + + var fontData = FontData() + fontData.numberSpacing = .monospaced + + let features: [[UIFontDescriptor.FeatureKey: Any]]? = self.featureSettings(for: fontData, featureIdentifier: kNumberSpacingType) + XCTAssertEqual(features?.count, 1, "expected to have 1 and only one feature for kNumberSpacingType") + XCTAssertEqual(features?.first?[.typeIdentifier] as? Int, kMonospacedNumbersSelector) + + } + + func testNumberSpacingProportional() { + + var fontData = FontData() + fontData.numberSpacing = .proportional + + let features: [[UIFontDescriptor.FeatureKey: Any]]? = self.featureSettings(for: fontData, featureIdentifier: kNumberSpacingType) + XCTAssertEqual(features?.count, 1, "expected to have 1 and only one feature for kNumberSpacingType") + XCTAssertEqual(features?.first?[.typeIdentifier] as? Int, kProportionalNumbersSelector) + + } + + func testKerning() { + + var fontData = FontData() + fontData.kerning = .point(99) + + let attributes: [NSAttributedString.Key: Any] = fontData.attributes(currentFont: UIFont.systemFont(ofSize: 12), size: 12) + XCTAssertFalse(attributes.isEmpty, "empty attributes") + + XCTAssertEqual(attributes[.kern] as? CGFloat, 99) + + } + +} + +extension FontDataTests { + + static var allTests = [ + ("testNumberSpacing", testNumberSpacingMonospaced), + ("testNumberSpacingProportional", testNumberSpacingProportional), + ("testKerning", testKerning) + ] + +} diff --git a/Tests/SwiftRichStringTests/StyleTests.swift b/Tests/SwiftRichStringTests/StyleTests.swift new file mode 100644 index 0000000..863300a --- /dev/null +++ b/Tests/SwiftRichStringTests/StyleTests.swift @@ -0,0 +1,90 @@ +// +// StyleTests.swift +// SwiftRichString-iOS Tests +// +// Created by Rolandas Razma on 06/03/2020. +// Copyright © 2020 SwiftRichString. All rights reserved. +// + +import XCTest +@testable import SwiftRichString + +class StyleTests: XCTestCase { + + func testAlignment() { + + XCTAssertEqual(Style({ $0.alignment = .left }).paragraph.alignment, NSTextAlignment.left) + XCTAssertEqual(Style({ $0.alignment = .center }).paragraph.alignment, NSTextAlignment.center) + XCTAssertEqual(Style({ $0.alignment = .right }).paragraph.alignment, NSTextAlignment.right) + XCTAssertEqual(Style({ $0.alignment = .justified }).paragraph.alignment, NSTextAlignment.justified) + XCTAssertEqual(Style({ $0.alignment = .natural }).paragraph.alignment, NSTextAlignment.natural) + + } + + func testBaselineOffset() { + XCTAssertEqual(Style({ $0.baselineOffset = -6 }).attributes[.baselineOffset] as? Int, -6) + XCTAssertEqual(Style({ $0.baselineOffset = 11 }).attributes[.baselineOffset] as? Int, 11) + } + + func testColor() { + XCTAssertEqual(Style({ $0.color = UIColor.red }).attributes[.foregroundColor] as? UIColor, UIColor.red) + XCTAssertEqual(Style({ $0.color = UIColor.blue }).attributes[.foregroundColor] as? UIColor, UIColor.blue) + } + + func testLineBreakMode() { + + XCTAssertEqual(Style({ $0.lineBreakMode = .byWordWrapping }).paragraph.lineBreakMode, NSLineBreakMode.byWordWrapping) + XCTAssertEqual(Style({ $0.lineBreakMode = .byCharWrapping }).paragraph.lineBreakMode, NSLineBreakMode.byCharWrapping) + XCTAssertEqual(Style({ $0.lineBreakMode = .byClipping }).paragraph.lineBreakMode, NSLineBreakMode.byClipping) + XCTAssertEqual(Style({ $0.lineBreakMode = .byTruncatingHead }).paragraph.lineBreakMode, NSLineBreakMode.byTruncatingHead) + XCTAssertEqual(Style({ $0.lineBreakMode = .byTruncatingTail }).paragraph.lineBreakMode, NSLineBreakMode.byTruncatingTail) + XCTAssertEqual(Style({ $0.lineBreakMode = .byTruncatingMiddle }).paragraph.lineBreakMode, NSLineBreakMode.byTruncatingMiddle) + + } + + func testMaximumLineHeight() { + XCTAssertEqual(Style({ $0.maximumLineHeight = -6 }).paragraph.maximumLineHeight, -6.0) + XCTAssertEqual(Style({ $0.maximumLineHeight = 11 }).paragraph.maximumLineHeight, 11.0) + } + + func testMinimumLineHeight() { + XCTAssertEqual(Style({ $0.minimumLineHeight = -6 }).paragraph.minimumLineHeight, -6.0) + XCTAssertEqual(Style({ $0.minimumLineHeight = 11 }).paragraph.minimumLineHeight, 11.0) + } + + func testLineSpacing() { + XCTAssertEqual(Style({ $0.lineSpacing = -6 }).paragraph.lineSpacing, -6.0) + XCTAssertEqual(Style({ $0.lineSpacing = 11 }).paragraph.lineSpacing, 11.0) + } + + func testUnderlineStyle() { + + XCTAssertEqual(Style({ $0.underline = (style: NSUnderlineStyle.single, color: nil) }).attributes[.underlineStyle] as? Int, NSUnderlineStyle.single.rawValue) + XCTAssertEqual(Style({ $0.underline = (style: NSUnderlineStyle.double, color: nil) }).attributes[.underlineStyle] as? Int, NSUnderlineStyle.double.rawValue) + + } + + func testUnderlineColor() { + + XCTAssertEqual(Style({ $0.underline = (style: nil, color: UIColor.red) }).attributes[.underlineColor] as? UIColor, UIColor.red) + XCTAssertEqual(Style({ $0.underline = (style: nil, color: UIColor.blue) }).attributes[.underlineColor] as? UIColor, UIColor.blue) + + } + +} + +extension StyleTests { + + static var allTests = [ + ("testAlignment", testAlignment), + ("testBaselineOffset", testBaselineOffset), + ("testColor", testColor), + ("testLineBreakMode", testLineBreakMode), + ("testMaximumLineHeight", testMaximumLineHeight), + ("testMinimumLineHeight", testMinimumLineHeight), + ("testLineSpacing", testLineSpacing), + ("testUnderlineStyle", testUnderlineStyle), + ("testUnderlineColor", testUnderlineColor) + ] + +} diff --git a/Tests/SwiftRichStringTests/SwiftRichStringTests.swift b/Tests/SwiftRichStringTests/SwiftRichStringTests.swift deleted file mode 100644 index 53c97c9..0000000 --- a/Tests/SwiftRichStringTests/SwiftRichStringTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// SwiftRichStringTests.swift -// SwiftRichString -// -// Created by Daniele Margutti on 05/05/2018. -// Copyright © 2018 SwiftRichString. All rights reserved. -// - -import Foundation -import XCTest -import SwiftRichString - -class SwiftRichStringTests: XCTestCase { - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - //// XCTAssertEqual(SwiftRichString().text, "Hello, World!") - } - - static var allTests = [ - ("testExample", testExample), - ] -}