From fdd74a650c67806a9a79a67931696e89c7116fc9 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 22:00:35 +0300 Subject: [PATCH] bugfixes, add tests --- .../UserInterfaceState.xcuserstate | Bin 11845 -> 13297 bytes Tablet/TableDirector.swift | 2 +- Tablet/TableRowBuilder.swift | 8 ++-- Tablet/Tablet.swift | 10 +++-- .../UserInterfaceState.xcuserstate | Bin 18529 -> 19700 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 +++ Tests/TabletTests.swift | 35 ++++++++++++++++++ 7 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 61503527ed7e5d5a56f640e7fdb99dd40b175b24..ecbfcfa52cfb59b6b4790f319dde0bc8d66c6cb0 100644 GIT binary patch delta 7873 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 i*e!L--AcFG9qO* : RowBuilder { // MARK: Triggers - public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]? = nil) -> AnyObject? { + public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { if let action = actions[actionType.key] { - return action.invoke(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) + return action.invoke(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex, userInfo: userInfo)) } return nil } @@ -144,14 +144,14 @@ public class TableConfigurableRowBuilder AnyObject? { + public override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { switch actionType { case .configure: (cell as? C)?.configureWithItem(items[itemIndex]) default: break } - return super.invokeAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex) + return super.invokeAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex, userInfo: userInfo) } } diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 0e71508..3a4eaa0 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -57,13 +57,15 @@ public class ActionData { public let item: I public let itemIndex: Int public let indexPath: NSIndexPath - - init(cell: C?, indexPath: NSIndexPath, item: I, itemIndex: Int) { - + public let userInfo: [NSObject: AnyObject]? + + init(cell: C?, indexPath: NSIndexPath, item: I, itemIndex: Int, userInfo: [NSObject: AnyObject]?) { + self.cell = cell self.indexPath = indexPath self.item = item self.itemIndex = itemIndex + self.userInfo = userInfo } } @@ -91,7 +93,7 @@ public class Action { public func invoke() { - NSNotificationCenter.defaultCenter().postNotificationName(TabletNotifications.CellAction, object: self) + NSNotificationCenter.defaultCenter().postNotificationName(TabletNotifications.CellAction, object: self, userInfo: userInfo) } } diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 1d9a3e24c33e7440457d607808e545d54d4c0346..7e3b1326adbf6b56264f62b9ab1300b2ff92c527 100644 GIT binary patch literal 19700 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 literal 18529 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 oe`WrK{44oC + + diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift index a578fcd..4d5c7b9 100644 --- a/Tests/TabletTests.swift +++ b/Tests/TabletTests.swift @@ -39,6 +39,9 @@ struct TestData { struct TestTableViewCellOptions { static let ReusableIdentifier: String = "ReusableIdentifier" + static let CellAction: String = "CellAction" + static let CellActionUserInfoKey: String = "CellActionUserInfoKey" + static let CellActionUserInfoValue: String = "CellActionUserInfoValue" static let EstimatedHeight: Float = 255 } @@ -57,6 +60,10 @@ class TestTableViewCell: UITableViewCell, ConfigurableCell { func configureWithItem(item: Item) { textLabel?.text = item.title } + + func raiseAction() { + Action(key: TestTableViewCellOptions.CellAction, sender: self, userInfo: [TestTableViewCellOptions.CellActionUserInfoKey: TestTableViewCellOptions.CellActionUserInfoValue]).invoke() + } } class TabletTests: XCTestCase { @@ -134,6 +141,7 @@ class TabletTests: XCTestCase { testController.view.hidden = false testController.tableDirector += section + testController.tableView.reloadData() XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == 1, "Table view should have certain number of rows in a section") @@ -154,12 +162,39 @@ class TabletTests: XCTestCase { testController.view.hidden = false testController.tableDirector += section + testController.tableView.reloadData() XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == 1, "Table view should have certain number of rows in a section") XCTAssertTrue(testController.tableView.delegate?.tableView?(testController.tableView, viewForHeaderInSection: 0) == sectionHeaderView) XCTAssertTrue(testController.tableView.delegate?.tableView?(testController.tableView, viewForFooterInSection: 0) == sectionFooterView) + } + + func testRowBuilderCustomActionInvokedAndSentUserInfo() { + + let expectation = expectationWithDescription("cell action") + + let row = TableConfigurableRowBuilder(items: [TestData(title: "title")]) + .action(TestTableViewCellOptions.CellAction) { data -> Void in + + XCTAssertNotNil(data.cell, "Action data should have a cell") + XCTAssertNotNil(data.userInfo, "Action data should have a user info dictionary") + XCTAssertTrue(data.userInfo?[TestTableViewCellOptions.CellActionUserInfoKey] as? String == TestTableViewCellOptions.CellActionUserInfoValue, "UserInfo should have correct value for key") + + expectation.fulfill() + } + + testController.view.hidden = false + testController.tableDirector += row + testController.tableView.reloadData() + let cell = testController.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as? TestTableViewCell + + XCTAssertNotNil(cell, "Cell should exists and should be TestTableViewCell") + + cell?.raiseAction() + + waitForExpectationsWithTimeout(1.0, handler: nil) } } \ No newline at end of file