From 4d4fbed64da9bdc0f9f9b3783fa47737da2b318b Mon Sep 17 00:00:00 2001 From: Igor Kashkuta Date: Thu, 14 Apr 2016 17:32:41 +0100 Subject: [PATCH] Add ability to disallow the beginning of text editing for ChatInputBar. --- .../Source/Input/ChatInputBar.swift | 6 +++ .../Tests/Input/ChatInputBarTests.swift | 38 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/ChattoAdditions/Source/Input/ChatInputBar.swift b/ChattoAdditions/Source/Input/ChatInputBar.swift index 2a346b6..805858c 100644 --- a/ChattoAdditions/Source/Input/ChatInputBar.swift +++ b/ChattoAdditions/Source/Input/ChatInputBar.swift @@ -25,6 +25,7 @@ import UIKit public protocol ChatInputBarDelegate: class { + func inputBarShouldBeginTextEditing(inputBar: ChatInputBar) -> Bool func inputBarDidBeginEditing(inputBar: ChatInputBar) func inputBarDidEndEditing(inputBar: ChatInputBar) func inputBarDidChangeText(inputBar: ChatInputBar) @@ -210,6 +211,11 @@ extension ChatInputBar { // Tabar // MARK: UITextViewDelegate extension ChatInputBar: UITextViewDelegate { + public func textViewShouldBeginEditing(textView: UITextView) -> Bool { + guard let sDelegate = self.delegate else { return true } + return sDelegate.inputBarShouldBeginTextEditing(self) + } + public func textViewDidEndEditing(textView: UITextView) { self.presenter?.onDidEndEditing() self.delegate?.inputBarDidEndEditing(self) diff --git a/ChattoAdditions/Tests/Input/ChatInputBarTests.swift b/ChattoAdditions/Tests/Input/ChatInputBarTests.swift index 805e9da..f45f4d9 100644 --- a/ChattoAdditions/Tests/Input/ChatInputBarTests.swift +++ b/ChattoAdditions/Tests/Input/ChatInputBarTests.swift @@ -49,6 +49,15 @@ class ChatInputBarTests: XCTestCase { return itemView } + private func simulateTapOnTextViewForDelegate(textViewDelegate: UITextViewDelegate) { + let dummyTextView = UITextView() + if let shouldBeginEditing = textViewDelegate.textViewShouldBeginEditing + where !shouldBeginEditing(dummyTextView) { + return + } + textViewDelegate.textViewDidBeginEditing?(dummyTextView) + } + func testThat_WhenInputTextChanged_BarEnablesSendButton() { self.bar.sendButton.enabled = false self.bar.inputText = "!" @@ -153,6 +162,28 @@ class ChatInputBarTests: XCTestCase { XCTAssertTrue(closureCalled) XCTAssertFalse(self.bar.sendButton.enabled) } + + func testThat_WhenTextViewGoingToBecomeEditable_ItBecomesEditableByDefault() { + self.setupPresenter() + self.simulateTapOnTextViewForDelegate(self.bar) + XCTAssertTrue(self.presenter.onDidBeginEditingCalled) + } + + func testThat_WhenTextViewGoingToBecomeEditableAndDelegateAllowsIt_ItWillBeEditable() { + self.setupDelegate() + self.delegate.inputBarShouldBeginTextEditingResult = true + self.simulateTapOnTextViewForDelegate(self.bar) + XCTAssertTrue(self.delegate.inputBarShouldBeginTextEditingCalled) + XCTAssertTrue(self.delegate.inputBarDidBeginEditingCalled) + } + + func testThat_WhenTextViewGoingToBecomeEditableAndDelegateDisallowsIt_ItWontBeEditable() { + self.setupDelegate() + self.delegate.inputBarShouldBeginTextEditingResult = false + self.simulateTapOnTextViewForDelegate(self.bar) + XCTAssertTrue(self.delegate.inputBarShouldBeginTextEditingCalled) + XCTAssertFalse(self.delegate.inputBarDidBeginEditingCalled) + } } class FakeChatInputBarPresenter: ChatInputBarPresenter { @@ -186,6 +217,13 @@ class FakeChatInputBarPresenter: ChatInputBarPresenter { } class FakeChatInputBarDelegate: ChatInputBarDelegate { + var inputBarShouldBeginTextEditingCalled = false + var inputBarShouldBeginTextEditingResult = true + func inputBarShouldBeginTextEditing(inputBar: ChatInputBar) -> Bool { + self.inputBarShouldBeginTextEditingCalled = true + return self.inputBarShouldBeginTextEditingResult + } + var inputBarDidBeginEditingCalled = false func inputBarDidBeginEditing(inputBar: ChatInputBar) { self.inputBarDidBeginEditingCalled = true