Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relaxes generic constraints in Presenters #35

Merged
merged 4 commits into from
Feb 3, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import Chatto
public protocol ViewModelBuilderProtocol {
typealias ModelT: MessageModelProtocol
typealias ViewModelT: MessageViewModelProtocol
func canCreateViewModel(fromModel model: Any) -> Bool
func createViewModel(model: ModelT) -> ViewModelT
}

Expand All @@ -40,7 +41,6 @@ public protocol BaseMessageInteractionHandlerProtocol {

public class BaseMessagePresenter<BubbleViewT, ViewModelBuilderT, InteractionHandlerT where
ViewModelBuilderT: ViewModelBuilderProtocol,
ViewModelBuilderT.ModelT: MessageModelProtocol,
ViewModelBuilderT.ViewModelT: MessageViewModelProtocol,
InteractionHandlerT: BaseMessageInteractionHandlerProtocol,
InteractionHandlerT.ViewModelT == ViewModelBuilderT.ViewModelT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import Foundation

public class PhotoMessagePresenter<ViewModelBuilderT, InteractionHandlerT where
ViewModelBuilderT: ViewModelBuilderProtocol,
ViewModelBuilderT.ModelT: PhotoMessageModelProtocol,
ViewModelBuilderT.ViewModelT: PhotoMessageViewModelProtocol,
InteractionHandlerT: BaseMessageInteractionHandlerProtocol,
InteractionHandlerT.ViewModelT == ViewModelBuilderT.ViewModelT>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import Chatto

public class PhotoMessagePresenterBuilder<ViewModelBuilderT, InteractionHandlerT where
ViewModelBuilderT: ViewModelBuilderProtocol,
ViewModelBuilderT.ModelT: PhotoMessageModelProtocol,
ViewModelBuilderT.ViewModelT: PhotoMessageViewModelProtocol,
InteractionHandlerT: BaseMessageInteractionHandlerProtocol,
InteractionHandlerT.ViewModelT == ViewModelBuilderT.ViewModelT
Expand All @@ -49,7 +48,7 @@ public class PhotoMessagePresenterBuilder<ViewModelBuilderT, InteractionHandlerT
public lazy var baseCellStyle: BaseMessageCollectionViewCellStyleProtocol = BaseMessageCollectionViewCellDefaultSyle()

public func canHandleChatItem(chatItem: ChatItemProtocol) -> Bool {
return chatItem is PhotoMessageModelProtocol ? true : false
return self.viewModelBuilder.canCreateViewModel(fromModel: chatItem)
}

public func createPresenterWithChatItem(chatItem: ChatItemProtocol) -> ChatItemPresenterProtocol {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,18 @@ public class PhotoMessageViewModel: PhotoMessageViewModelProtocol {
}
}

public class PhotoMessageViewModelDefaultBuilder: ViewModelBuilderProtocol {
public class PhotoMessageViewModelDefaultBuilder<ModelT: PhotoMessageModelProtocol>: ViewModelBuilderProtocol {
public init() { }

let messageViewModelBuilder = MessageViewModelDefaultBuilder()

public func createViewModel(model: PhotoMessageModel) -> PhotoMessageViewModel {
public func createViewModel(model: ModelT) -> PhotoMessageViewModel {
let messageViewModel = self.messageViewModelBuilder.createMessageViewModel(model)
let photoMessageViewModel = PhotoMessageViewModel(photoMessage: model, messageViewModel: messageViewModel)
return photoMessageViewModel
}

public func canCreateViewModel(fromModel model: Any) -> Bool {
return model is ModelT
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import UIKit

public class TextMessagePresenter<ViewModelBuilderT, InteractionHandlerT where
ViewModelBuilderT: ViewModelBuilderProtocol,
ViewModelBuilderT.ModelT: TextMessageModelProtocol,
ViewModelBuilderT.ViewModelT: TextMessageViewModelProtocol,
InteractionHandlerT: BaseMessageInteractionHandlerProtocol,
InteractionHandlerT.ViewModelT == ViewModelBuilderT.ViewModelT>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import Chatto

public class TextMessagePresenterBuilder<ViewModelBuilderT, InteractionHandlerT where
ViewModelBuilderT: ViewModelBuilderProtocol,
ViewModelBuilderT.ModelT: TextMessageModelProtocol,
ViewModelBuilderT.ViewModelT: TextMessageViewModelProtocol,
InteractionHandlerT: BaseMessageInteractionHandlerProtocol,
InteractionHandlerT.ViewModelT == ViewModelBuilderT.ViewModelT>
Expand Down Expand Up @@ -63,7 +62,7 @@ public class TextMessagePresenterBuilder<ViewModelBuilderT, InteractionHandlerT
public lazy var baseMessageStyle: BaseMessageCollectionViewCellStyleProtocol = BaseMessageCollectionViewCellDefaultSyle()

public func canHandleChatItem(chatItem: ChatItemProtocol) -> Bool {
return chatItem is TextMessageModelProtocol ? true : false
return self.viewModelBuilder.canCreateViewModel(fromModel: chatItem)
}

public func createPresenterWithChatItem(chatItem: ChatItemProtocol) -> ChatItemPresenterProtocol {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,19 @@ public class TextMessageViewModel: TextMessageViewModelProtocol {
}
}

public class TextMessageViewModelDefaultBuilder: ViewModelBuilderProtocol {
public class TextMessageViewModelDefaultBuilder<ModelT: TextMessageModelProtocol>: ViewModelBuilderProtocol {
public init() { }

let messageViewModelBuilder = MessageViewModelDefaultBuilder()

public func createViewModel(model: TextMessageModel) -> TextMessageViewModel {
public func createViewModel(model: ModelT) -> TextMessageViewModel {
let messageViewModel = self.messageViewModelBuilder.createMessageViewModel(model)
let textMessageViewModel = TextMessageViewModel(text: model.text, messageViewModel: messageViewModel)
return textMessageViewModel

}

public func canCreateViewModel(fromModel model: Any) -> Bool {
return model is ModelT
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ import Chatto
class BaseMessagePresenterTests: XCTestCase {

// BaseMessagePresenter is generic, let's use the photo one for instance
var presenter: PhotoMessagePresenter<PhotoMessageViewModelDefaultBuilder, PhotoMessageTestHandler>!
var presenter: PhotoMessagePresenter<PhotoMessageViewModelDefaultBuilder<PhotoMessageModel>, PhotoMessageTestHandler>!
let decorationAttributes = ChatItemDecorationAttributes(bottomMargin: 0, showsTail: false)
var interactionHandler: PhotoMessageTestHandler!
override func setUp() {
let viewModelBuilder = PhotoMessageViewModelDefaultBuilder()
let viewModelBuilder = PhotoMessageViewModelDefaultBuilder<PhotoMessageModel>()
let sizingCell = PhotoMessageCollectionViewCell.sizingCell()
let photoStyle = PhotoMessageCollectionViewCellDefaultStyle()
let baseStyle = BaseMessageCollectionViewCellDefaultSyle()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class PhotoMessagePresenterBuilderTests: XCTestCase {
func testThat_CreatesPresenter() {
let messageModel = MessageModel(uid: "uid", senderId: "senderId", type: "photo-message", isIncoming: true, date: NSDate(), status: .Success)
let photoMessageModel = PhotoMessageModel(messageModel: messageModel, imageSize: CGSize(width: 30, height: 30), image: UIImage())
let builder = PhotoMessagePresenterBuilder(viewModelBuilder: PhotoMessageViewModelDefaultBuilder(), interactionHandler: PhotoMessageTestHandler())
let builder = PhotoMessagePresenterBuilder(viewModelBuilder: PhotoMessageViewModelDefaultBuilder<PhotoMessageModel>(), interactionHandler: PhotoMessageTestHandler())
XCTAssertNotNil(builder.createPresenterWithChatItem(photoMessageModel))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ import XCTest

class PhotoMessagePresenterTests: XCTestCase, UICollectionViewDataSource {

var presenter: PhotoMessagePresenter<PhotoMessageViewModelDefaultBuilder, PhotoMessageTestHandler>!
var presenter: PhotoMessagePresenter<PhotoMessageViewModelDefaultBuilder<PhotoMessageModel>, PhotoMessageTestHandler>!
let decorationAttributes = ChatItemDecorationAttributes(bottomMargin: 0, showsTail: false)
let testImage = UIImage()
override func setUp() {
let viewModelBuilder = PhotoMessageViewModelDefaultBuilder()
let viewModelBuilder = PhotoMessageViewModelDefaultBuilder<PhotoMessageModel>()
let sizingCell = PhotoMessageCollectionViewCell.sizingCell()
let photoStyle = PhotoMessageCollectionViewCellDefaultStyle()
let baseStyle = BaseMessageCollectionViewCellDefaultSyle()
Expand All @@ -57,7 +57,7 @@ class PhotoMessagePresenterTests: XCTestCase, UICollectionViewDataSource {

func testThat_RegistersAndDequeuesCells() {
let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())
PhotoMessagePresenter<PhotoMessageViewModelDefaultBuilder, PhotoMessageTestHandler>.registerCells(collectionView)
PhotoMessagePresenter<PhotoMessageViewModelDefaultBuilder<PhotoMessageModel>, PhotoMessageTestHandler>.registerCells(collectionView)
collectionView.dataSource = self
collectionView.reloadData()
XCTAssertNotNil(self.presenter.dequeueCell(collectionView: collectionView, indexPath: NSIndexPath(forItem: 0, inSection: 0)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class TextMessagePresenterBuilderTests: XCTestCase {
func testThat_CreatesPresenter() {
let messageModel = MessageModel(uid: "uid", senderId: "senderId", type: "text-message", isIncoming: true, date: NSDate(), status: .Success)
let textMessageModel = TextMessageModel(messageModel: messageModel, text: "Some text")
let builder = TextMessagePresenterBuilder(viewModelBuilder: TextMessageViewModelDefaultBuilder(), interactionHandler: TextMessageTestHandler())
let builder = TextMessagePresenterBuilder(viewModelBuilder: TextMessageViewModelDefaultBuilder<TextMessageModel>(), interactionHandler: TextMessageTestHandler())
XCTAssertNotNil(builder.createPresenterWithChatItem(textMessageModel))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ import Chatto

class TextMessagePresenterTests: XCTestCase, UICollectionViewDataSource {

var presenter: TextMessagePresenter<TextMessageViewModelDefaultBuilder, TextMessageTestHandler>!
var presenter: TextMessagePresenter<TextMessageViewModelDefaultBuilder<TextMessageModel>, TextMessageTestHandler>!
let decorationAttributes = ChatItemDecorationAttributes(bottomMargin: 0, showsTail: false)
override func setUp() {
let viewModelBuilder = TextMessageViewModelDefaultBuilder()
let viewModelBuilder = TextMessageViewModelDefaultBuilder<TextMessageModel>()
let sizingCell = TextMessageCollectionViewCell.sizingCell()
let textStyle = TextMessageCollectionViewCellDefaultStyle()
let baseStyle = BaseMessageCollectionViewCellDefaultSyle()
Expand All @@ -43,7 +43,7 @@ class TextMessagePresenterTests: XCTestCase, UICollectionViewDataSource {
func testThat_RegistersAndDequeuesCells() {

let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())
TextMessagePresenter<TextMessageViewModelDefaultBuilder, TextMessageTestHandler>.registerCells(collectionView)
TextMessagePresenter<TextMessageViewModelDefaultBuilder<TextMessageModel>, TextMessageTestHandler>.registerCells(collectionView)
collectionView.dataSource = self
collectionView.reloadData()
XCTAssertNotNil(self.presenter.dequeueCell(collectionView: collectionView, indexPath: NSIndexPath(forItem: 0, inSection: 0)))
Expand Down
2 changes: 1 addition & 1 deletion ChattoApp/ChattoApp/DemoChatViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class DemoChatViewController: BaseChatViewController {
return [
TextMessageModel.chatItemType: [
TextMessagePresenterBuilder(
viewModelBuilder: TextMessageViewModelDefaultBuilder(),
viewModelBuilder: TextMessageViewModelDefaultBuilder<TextMessageModel>(),
interactionHandler: TextMessageHandler(baseHandler: self.baseMessageHandler)
)
],
Expand Down
4 changes: 4 additions & 0 deletions ChattoApp/ChattoApp/FakePhotoMessageViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,8 @@ public class FakePhotoMessageViewModelBuilder: ViewModelBuilderProtocol {
let photoMessageViewModel = FakePhotoMessageViewModel(photoMessage: model, messageViewModel: messageViewModel)
return photoMessageViewModel
}

public func canCreateViewModel(fromModel model: Any) -> Bool {
return model is PhotoMessageModel
}
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ override func createPresenterBuilders() -> [ChatItemType: [ChatItemPresenterBuil
return [
TextMessageModel.chatItemType: [
TextMessagePresenterBuilder(
viewModelBuilder: TextMessageViewModelDefaultBuilder(),
viewModelBuilder: TextMessageViewModelDefaultBuilder<TextMessageModel>(),
interactionHandler: TextMessageHandler(baseHandler: self.baseMessageHandler)
)
]
Expand Down