blob: fae6ee70f33b0b1dfc69d6f627764d1f42bfe7af [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/translate/translate_infobar_delegate_observer_bridge.h"
#include <memory>
#include "components/translate/core/browser/mock_translate_infobar_delegate.h"
#include "testing/gtest_mac.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using translate::testing::MockTranslateInfoBarDelegate;
using translate::testing::MockTranslateInfoBarDelegateFactory;
@interface TestTranslateInfoBarDelegateObserver
: NSObject <TranslateInfobarDelegateObserving>
@property(nonatomic) BOOL onTranslateStepChangedCalled;
@property(nonatomic) translate::TranslateStep translateStep;
@property(nonatomic) translate::TranslateErrors::Type errorType;
@property(nonatomic) BOOL onDidDismissWithoutInteractionCalled;
@end
@implementation TestTranslateInfoBarDelegateObserver
#pragma mark - TranslateInfobarDelegateObserving
- (void)translateInfoBarDelegate:(translate::TranslateInfoBarDelegate*)delegate
didChangeTranslateStep:(translate::TranslateStep)step
withErrorType:(translate::TranslateErrors::Type)errorType {
self.onTranslateStepChangedCalled = YES;
self.translateStep = step;
self.errorType = errorType;
}
- (BOOL)translateInfoBarDelegateDidDismissWithoutInteraction:
(translate::TranslateInfoBarDelegate*)delegate {
self.onDidDismissWithoutInteractionCalled = YES;
return YES;
}
@end
class TranslateInfobarDelegateObserverBridgeTest : public PlatformTest {
protected:
TranslateInfobarDelegateObserverBridgeTest()
: delegate_factory_("fr", "en"),
observer_([[TestTranslateInfoBarDelegateObserver alloc] init]) {
// Make sure the observer bridge sets up itself as an observer.
EXPECT_CALL(*GetDelegate(), SetObserver(_)).Times(1);
observer_bridge_ = std::make_unique<TranslateInfobarDelegateObserverBridge>(
delegate_factory_.GetMockTranslateInfoBarDelegate(), observer_);
}
~TranslateInfobarDelegateObserverBridgeTest() override {
// Make sure the observer bridge removes itself as an observer.
EXPECT_CALL(*GetDelegate(), SetObserver(nullptr)).Times(1);
}
MockTranslateInfoBarDelegate* GetDelegate() {
return delegate_factory_.GetMockTranslateInfoBarDelegate();
}
translate::TranslateInfoBarDelegate::Observer* GetObserverBridge() {
return observer_bridge_.get();
}
TestTranslateInfoBarDelegateObserver* GetDelegateObserver() {
return observer_;
}
private:
MockTranslateInfoBarDelegateFactory delegate_factory_;
TestTranslateInfoBarDelegateObserver* observer_;
std::unique_ptr<TranslateInfobarDelegateObserverBridge> observer_bridge_;
DISALLOW_COPY_AND_ASSIGN(TranslateInfobarDelegateObserverBridgeTest);
};
// Tests that |OnTranslateStepChanged| call is forwarded by the observer bridge.
TEST_F(TranslateInfobarDelegateObserverBridgeTest, OnTranslateStepChanged) {
ASSERT_FALSE(GetDelegateObserver().onTranslateStepChangedCalled);
GetObserverBridge()->OnTranslateStepChanged(
translate::TranslateStep::TRANSLATE_STEP_TRANSLATE_ERROR,
translate::TranslateErrors::Type::BAD_ORIGIN);
EXPECT_TRUE(GetDelegateObserver().onTranslateStepChangedCalled);
EXPECT_EQ(GetDelegateObserver().translateStep,
translate::TranslateStep::TRANSLATE_STEP_TRANSLATE_ERROR);
EXPECT_EQ(GetDelegateObserver().errorType,
translate::TranslateErrors::Type::BAD_ORIGIN);
}
// Tests that |IsDeclinedByUser| call is forwarded by the observer bridge.
TEST_F(TranslateInfobarDelegateObserverBridgeTest,
DidDismissWithoutInteraction) {
ASSERT_FALSE(GetDelegateObserver().onDidDismissWithoutInteractionCalled);
GetObserverBridge()->IsDeclinedByUser();
EXPECT_TRUE(GetDelegateObserver().onDidDismissWithoutInteractionCalled);
}