From 8c5f72656261235c52c2493eb6db68ed47111695 Mon Sep 17 00:00:00 2001 From: Ryo Aoyama Date: Mon, 29 Jul 2019 03:53:54 +0900 Subject: [PATCH] Add test for xib element --- Carbon.xcodeproj/project.pbxproj | 16 ++++++++++ .../MockCustomXibCollectionViewCell.xib | 26 ++++++++++++++++ ...ockCustomXibCollectionViewReusableView.xib | 22 ++++++++++++++ Tests/Adapters/MockCustomXibTableViewCell.xib | 24 +++++++++++++++ ...MockCustomXibTableViewHeaderFooterView.xib | 24 +++++++++++++++ ...CollectionViewFlowLayoutAdapterTests.swift | 27 +++++++++++++---- Tests/Adapters/UITableViewAdapterTests.swift | 21 +++++++++---- Tests/TestTools.swift | 30 ++++++++++++------- 8 files changed, 168 insertions(+), 22 deletions(-) create mode 100644 Tests/Adapters/MockCustomXibCollectionViewCell.xib create mode 100644 Tests/Adapters/MockCustomXibCollectionViewReusableView.xib create mode 100644 Tests/Adapters/MockCustomXibTableViewCell.xib create mode 100644 Tests/Adapters/MockCustomXibTableViewHeaderFooterView.xib diff --git a/Carbon.xcodeproj/project.pbxproj b/Carbon.xcodeproj/project.pbxproj index 9b7169d..5922748 100644 --- a/Carbon.xcodeproj/project.pbxproj +++ b/Carbon.xcodeproj/project.pbxproj @@ -30,6 +30,10 @@ 6B6594BB21E2532100291AAF /* UITableViewComponentHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B6594A121E2532100291AAF /* UITableViewComponentHeaderFooterView.swift */; }; 6B6594BD21E2532100291AAF /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B6594A321E2532100291AAF /* Renderer.swift */; }; 6B6594C221E2599600291AAF /* DifferenceKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B6594C121E2599600291AAF /* DifferenceKit.framework */; }; + 6B6F25BF22EE201F009C3029 /* MockCustomXibTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6B6F25BE22EE201F009C3029 /* MockCustomXibTableViewCell.xib */; }; + 6B6F25C122EE234F009C3029 /* MockCustomXibCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6B6F25C022EE234F009C3029 /* MockCustomXibCollectionViewCell.xib */; }; + 6B6F25C322EE25A2009C3029 /* MockCustomXibTableViewHeaderFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6B6F25C222EE25A2009C3029 /* MockCustomXibTableViewHeaderFooterView.xib */; }; + 6B6F25C522EE267E009C3029 /* MockCustomXibCollectionViewReusableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6B6F25C422EE267E009C3029 /* MockCustomXibCollectionViewReusableView.xib */; }; 6B7ADEB121F783E3003803BE /* ComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B7ADEB021F783E3003803BE /* ComponentTests.swift */; }; 6B7ADEB321F783E3003803BE /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B65947A21E252E300291AAF /* Carbon.framework */; }; 6B7ADEBA21F78957003803BE /* TestTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B7ADEB921F78957003803BE /* TestTools.swift */; }; @@ -88,6 +92,10 @@ 6B6594A321E2532100291AAF /* Renderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Renderer.swift; sourceTree = ""; }; 6B6594BF21E2534B00291AAF /* Carbon.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carbon.xcconfig; sourceTree = ""; }; 6B6594C121E2599600291AAF /* DifferenceKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DifferenceKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B6F25BE22EE201F009C3029 /* MockCustomXibTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MockCustomXibTableViewCell.xib; sourceTree = ""; }; + 6B6F25C022EE234F009C3029 /* MockCustomXibCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MockCustomXibCollectionViewCell.xib; sourceTree = ""; }; + 6B6F25C222EE25A2009C3029 /* MockCustomXibTableViewHeaderFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MockCustomXibTableViewHeaderFooterView.xib; sourceTree = ""; }; + 6B6F25C422EE267E009C3029 /* MockCustomXibCollectionViewReusableView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MockCustomXibCollectionViewReusableView.xib; sourceTree = ""; }; 6B7ADEAE21F783E3003803BE /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6B7ADEB021F783E3003803BE /* ComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentTests.swift; sourceTree = ""; }; 6B7ADEB221F783E3003803BE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -255,6 +263,10 @@ children = ( 6B7ADECB21FA067E003803BE /* UITableViewAdapterTests.swift */, 6B7ADECD21FA1B32003803BE /* UICollectionViewFlowLayoutAdapterTests.swift */, + 6B6F25BE22EE201F009C3029 /* MockCustomXibTableViewCell.xib */, + 6B6F25C222EE25A2009C3029 /* MockCustomXibTableViewHeaderFooterView.xib */, + 6B6F25C022EE234F009C3029 /* MockCustomXibCollectionViewCell.xib */, + 6B6F25C422EE267E009C3029 /* MockCustomXibCollectionViewReusableView.xib */, ); path = Adapters; sourceTree = ""; @@ -387,6 +399,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6B6F25C122EE234F009C3029 /* MockCustomXibCollectionViewCell.xib in Resources */, + 6B6F25C522EE267E009C3029 /* MockCustomXibCollectionViewReusableView.xib in Resources */, + 6B6F25C322EE25A2009C3029 /* MockCustomXibTableViewHeaderFooterView.xib in Resources */, + 6B6F25BF22EE201F009C3029 /* MockCustomXibTableViewCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Tests/Adapters/MockCustomXibCollectionViewCell.xib b/Tests/Adapters/MockCustomXibCollectionViewCell.xib new file mode 100644 index 0000000..bf3172c --- /dev/null +++ b/Tests/Adapters/MockCustomXibCollectionViewCell.xib @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Adapters/MockCustomXibCollectionViewReusableView.xib b/Tests/Adapters/MockCustomXibCollectionViewReusableView.xib new file mode 100644 index 0000000..7559f37 --- /dev/null +++ b/Tests/Adapters/MockCustomXibCollectionViewReusableView.xib @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Adapters/MockCustomXibTableViewCell.xib b/Tests/Adapters/MockCustomXibTableViewCell.xib new file mode 100644 index 0000000..9c51351 --- /dev/null +++ b/Tests/Adapters/MockCustomXibTableViewCell.xib @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Adapters/MockCustomXibTableViewHeaderFooterView.xib b/Tests/Adapters/MockCustomXibTableViewHeaderFooterView.xib new file mode 100644 index 0000000..159fcdf --- /dev/null +++ b/Tests/Adapters/MockCustomXibTableViewHeaderFooterView.xib @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Adapters/UICollectionViewFlowLayoutAdapterTests.swift b/Tests/Adapters/UICollectionViewFlowLayoutAdapterTests.swift index d0d27e3..f2d0078 100644 --- a/Tests/Adapters/UICollectionViewFlowLayoutAdapterTests.swift +++ b/Tests/Adapters/UICollectionViewFlowLayoutAdapterTests.swift @@ -303,11 +303,14 @@ final class UICollectionViewFlowLayoutAdapterTests: XCTestCase { } } - adapter.cellClass = MockCustomCollectionViewCell1.self + adapter.cellRegistration = .init(class: MockCustomCollectionViewCell1.self) check(expectedClass: MockCustomCollectionViewCell1.self) - adapter.cellClass = MockCustomCollectionViewCell2.self + adapter.cellRegistration = .init(class: MockCustomCollectionViewCell2.self) check(expectedClass: MockCustomCollectionViewCell2.self) + + adapter.cellRegistration = .init(class: MockCustomXibCollectionViewCell.self) + check(expectedClass: MockCustomXibCollectionViewCell.self) } func testViewForHeaderFooter() { @@ -358,16 +361,28 @@ final class UICollectionViewFlowLayoutAdapterTests: XCTestCase { check(view: view, expectedClass: expectedClass) } - adapter.supplementaryViewClasses[UICollectionView.elementKindSectionHeader] = MockCustomCollectionViewReusableView1.self + adapter.supplementaryViewRegistrations[UICollectionView.elementKindSectionHeader] = .init(class: MockCustomCollectionViewReusableView1.self) checkHeader(expectedClass: MockCustomCollectionViewReusableView1.self) - adapter.supplementaryViewClasses[UICollectionView.elementKindSectionHeader] = MockCustomCollectionViewReusableView2.self + adapter.supplementaryViewRegistrations[UICollectionView.elementKindSectionHeader] = .init(class: MockCustomCollectionViewReusableView2.self) checkHeader(expectedClass: MockCustomCollectionViewReusableView2.self) - adapter.supplementaryViewClasses[UICollectionView.elementKindSectionFooter] = MockCustomCollectionViewReusableView1.self + adapter.supplementaryViewRegistrations[UICollectionView.elementKindSectionHeader] = .init( + class: MockCustomXibCollectionViewReusableView.self, + nib: UINib(for: MockCustomXibCollectionViewReusableView.self) + ) + checkHeader(expectedClass: MockCustomXibCollectionViewReusableView.self) + + adapter.supplementaryViewRegistrations[UICollectionView.elementKindSectionFooter] = .init(class: MockCustomCollectionViewReusableView1.self) checkFooter(expectedClass: MockCustomCollectionViewReusableView1.self) - adapter.supplementaryViewClasses[UICollectionView.elementKindSectionFooter] = MockCustomCollectionViewReusableView2.self + adapter.supplementaryViewRegistrations[UICollectionView.elementKindSectionFooter] = .init(class: MockCustomCollectionViewReusableView2.self) checkFooter(expectedClass: MockCustomCollectionViewReusableView2.self) + + adapter.supplementaryViewRegistrations[UICollectionView.elementKindSectionFooter] = .init( + class: MockCustomXibCollectionViewReusableView.self, + nib: UINib(for: MockCustomXibCollectionViewReusableView.self) + ) + checkFooter(expectedClass: MockCustomXibCollectionViewReusableView.self) } } diff --git a/Tests/Adapters/UITableViewAdapterTests.swift b/Tests/Adapters/UITableViewAdapterTests.swift index e64ea2f..4395adb 100644 --- a/Tests/Adapters/UITableViewAdapterTests.swift +++ b/Tests/Adapters/UITableViewAdapterTests.swift @@ -335,11 +335,14 @@ final class UITableViewAdapterTests: XCTestCase { } } - adapter.cellClass = MockCustomTableViewCell1.self + adapter.cellRegistration = .init(class: MockCustomTableViewCell1.self) check(expectedClass: MockCustomTableViewCell1.self) - adapter.cellClass = MockCustomTableViewCell2.self + adapter.cellRegistration = .init(class: MockCustomTableViewCell2.self) check(expectedClass: MockCustomTableViewCell2.self) + + adapter.cellRegistration = .init(class: MockCustomXibTableViewCell.self, nib: UINib(for: MockCustomXibTableViewCell.self)) + check(expectedClass: MockCustomXibTableViewCell.self) } func testViewForHeaderFooter() { @@ -379,16 +382,22 @@ final class UITableViewAdapterTests: XCTestCase { check(view: view, expectedClass: expectedClass) } - adapter.headerClass = MockCustomTableViewHeaderFooterView1.self + adapter.headerRegistration = .init(class: MockCustomTableViewHeaderFooterView1.self) checkHeader(expectedClass: MockCustomTableViewHeaderFooterView1.self) - adapter.headerClass = MockCustomTableViewHeaderFooterView2.self + adapter.headerRegistration = .init(class: MockCustomTableViewHeaderFooterView2.self) checkHeader(expectedClass: MockCustomTableViewHeaderFooterView2.self) - adapter.footerClass = MockCustomTableViewHeaderFooterView1.self + adapter.headerRegistration = .init(class: MockCustomXibTableViewHeaderFooterView.self, nib: UINib(for: MockCustomXibTableViewHeaderFooterView.self)) + checkHeader(expectedClass: MockCustomXibTableViewHeaderFooterView.self) + + adapter.footerRegistration = .init(class: MockCustomTableViewHeaderFooterView1.self) checkFooter(expectedClass: MockCustomTableViewHeaderFooterView1.self) - adapter.footerClass = MockCustomTableViewHeaderFooterView2.self + adapter.footerRegistration = .init(class: MockCustomTableViewHeaderFooterView2.self) checkFooter(expectedClass: MockCustomTableViewHeaderFooterView2.self) + + adapter.footerRegistration = .init(class: MockCustomXibTableViewHeaderFooterView.self, nib: UINib(for: MockCustomXibTableViewHeaderFooterView.self)) + checkFooter(expectedClass: MockCustomXibTableViewHeaderFooterView.self) } } diff --git a/Tests/TestTools.swift b/Tests/TestTools.swift index d4b65a1..07e0cae 100644 --- a/Tests/TestTools.swift +++ b/Tests/TestTools.swift @@ -385,42 +385,46 @@ final class MockScrollView: UIScrollView { final class MockCustomTableViewCell1: UITableViewCell, ComponentRenderable {} final class MockCustomTableViewCell2: UITableViewCell, ComponentRenderable {} +final class MockCustomXibTableViewCell: UITableViewCell, ComponentRenderable {} final class MockCustomTableViewHeaderFooterView1: UITableViewHeaderFooterView, ComponentRenderable {} final class MockCustomTableViewHeaderFooterView2: UITableViewHeaderFooterView, ComponentRenderable {} +final class MockCustomXibTableViewHeaderFooterView: UITableViewHeaderFooterView, ComponentRenderable {} final class MockCustomTableViewAdapter: UITableViewAdapter { - var cellClass: (UITableViewCell & ComponentRenderable).Type = MockCustomTableViewCell1.self - var headerClass: (UITableViewHeaderFooterView & ComponentRenderable).Type = MockCustomTableViewHeaderFooterView1.self - var footerClass: (UITableViewHeaderFooterView & ComponentRenderable).Type = MockCustomTableViewHeaderFooterView1.self + var cellRegistration = CellRegistration(class: MockCustomTableViewCell1.self) + var headerRegistration = ViewRegistration(class: MockCustomTableViewHeaderFooterView1.self) + var footerRegistration = ViewRegistration(class: MockCustomTableViewHeaderFooterView1.self) override func cellRegistration(tableView: UITableView, indexPath: IndexPath, node: CellNode) -> CellRegistration { - return CellRegistration(class: cellClass) + return cellRegistration } override func headerViewRegistration(tableView: UITableView, section: Int, node: ViewNode) -> ViewRegistration { - return ViewRegistration(class: headerClass) + return headerRegistration } override func footerViewRegistration(tableView: UITableView, section: Int, node: ViewNode) -> ViewRegistration { - return ViewRegistration(class: footerClass) + return footerRegistration } } final class MockCustomCollectionViewCell1: UICollectionViewCell, ComponentRenderable {} final class MockCustomCollectionViewCell2: UICollectionViewCell, ComponentRenderable {} +final class MockCustomXibCollectionViewCell: UICollectionViewCell, ComponentRenderable {} final class MockCustomCollectionViewReusableView1: UICollectionReusableView, ComponentRenderable {} final class MockCustomCollectionViewReusableView2: UICollectionReusableView, ComponentRenderable {} +final class MockCustomXibCollectionViewReusableView: UICollectionReusableView, ComponentRenderable {} final class MockCustomCollectionViewAdapter: UICollectionViewAdapter { - var cellClass: (UICollectionViewCell & ComponentRenderable).Type = MockCustomCollectionViewCell1.self - var supplementaryViewClasses: [String: (UICollectionReusableView & ComponentRenderable).Type] = [:] + var cellRegistration = CellRegistration(class: MockCustomCollectionViewCell1.self) + var supplementaryViewRegistrations: [String: ViewRegistration] = [:] override func cellRegistration(collectionView: UICollectionView, indexPath: IndexPath, node: CellNode) -> CellRegistration { - return CellRegistration(class: cellClass) + return cellRegistration } override func supplementaryViewRegistration(forElementKind kind: String, collectionView: UICollectionView, indexPath: IndexPath, node: ViewNode) -> ViewRegistration { - return ViewRegistration(class: supplementaryViewClasses[kind] ?? MockCustomCollectionViewReusableView1.self) + return supplementaryViewRegistrations[kind] ?? ViewRegistration(class: MockCustomCollectionViewReusableView1.self) } } @@ -487,3 +491,9 @@ extension XCTestCase { testing() } } + +extension UINib { + convenience init(for class: AnyClass) { + self.init(nibName: String(describing: `class`), bundle: Bundle(for: `class`)) + } +}