// 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/ui/badges/badge_constants.h"
#import "ios/showcase/badges/sc_badge_constants.h"
#import "ios/showcase/test/showcase_eg_utils.h"
#import "ios/showcase/test/showcase_test_case.h"
#import "ios/testing/earl_grey/earl_grey_test.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace {
using ::showcase_utils::Open;
using ::showcase_utils::Close;
}

// Tests for Badges.
@interface SCBadgeTestCase : ShowcaseTestCase
@end

@implementation SCBadgeTestCase

- (void)setUp {
  [super setUp];
  Open(@"Badge View");
}

- (void)tearDown {
  Close();
  [super tearDown];
}

// Tests that the passwords badge and incognito badge are displayed.
- (void)testBadgesVisible {
  [[EarlGrey
      selectElementWithMatcher:
          grey_allOf(grey_accessibilityID(
                         kBadgeButtonSavePasswordAccessibilityIdentifier),
                     grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];

  // Tap on button to show the accepted badge.
  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                          kSCShowAcceptedDisplayedBadgeButton)]
      performAction:grey_tap()];

  [[EarlGrey
      selectElementWithMatcher:
          grey_allOf(
              grey_accessibilityID(
                  kBadgeButtonSavePasswordAcceptedAccessibilityIdentifier),
              grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeButtonIncognitoAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];
}

// Tests that the overflow badge presents and that the popup menu is presented
// when it is tapped.
- (void)testOverflowBadge {
  // Tap on button to show the overflow badge.
  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                          kSCShowOverflowDisplayedBadgeButton)]
      performAction:grey_tap()];

  // Assert that overflow badge and the unread indicator is shown and tap on it.
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeButtonOverflowAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeUnreadIndicatorAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];
  [[EarlGrey
      selectElementWithMatcher:grey_accessibilityID(
                                   kBadgeButtonOverflowAccessibilityIdentifier)]
      performAction:grey_tap()];

  // Assert that the badge overflow popup menu is being presented.
  [[EarlGrey
      selectElementWithMatcher:
          grey_allOf(grey_accessibilityID(
                         kBadgePopupMenuTableViewAccessibilityIdentifier),
                     grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];

  // Dismiss popup menu by tapping outside of the menu. Tapping the displayed
  // badge is sufficient here. Assert that the unread indicator is not there
  // anymore.
  [[EarlGrey
      selectElementWithMatcher:grey_accessibilityID(
                                   kBadgeButtonOverflowAccessibilityIdentifier)]
      performAction:grey_tap()];
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeUnreadIndicatorAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_notVisible()];
}

// Tests that the overflow badge presents the new popup menu when enabled.
- (void)testOverflowBadgeWithNewPopupUI {
  // Tap on the switch to enable new popup UI.
  [[EarlGrey selectElementWithMatcher:grey_switchWithOnState(NO)]
      performAction:grey_turnSwitchOn(YES)];
  // Tap on button to show the overflow badge.
  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                          kSCShowOverflowDisplayedBadgeButton)]
      performAction:grey_tap()];

  // Assert that overflow badge and the unread indicator is shown and tap on it.
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeButtonOverflowAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeUnreadIndicatorAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];
  [[EarlGrey
      selectElementWithMatcher:grey_accessibilityID(
                                   kBadgeButtonOverflowAccessibilityIdentifier)]
      performAction:grey_tap()];

  // Assert that the legacy badge overflow popup menu is NOT being presented.
  [[EarlGrey
      selectElementWithMatcher:
          grey_allOf(grey_accessibilityID(
                         kBadgePopupMenuTableViewAccessibilityIdentifier),
                     grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_nil()];

  // Assert that the new badge overflow popup menu is being presented.
  [[EarlGrey selectElementWithMatcher:grey_allOf(grey_text(@"Save password"),
                                                 grey_interactable(), nil)]
      assertWithMatcher:grey_sufficientlyVisible()];

  // Dismiss popup menu by tapping outside of the menu. Tapping the displayed
  // badge is sufficient here. Assert that the unread indicator is not there
  // anymore.
  [[EarlGrey
      selectElementWithMatcher:grey_accessibilityID(
                                   kBadgeButtonOverflowAccessibilityIdentifier)]
      performAction:grey_tap()];
  [[EarlGrey selectElementWithMatcher:grey_allOf(grey_text(@"Save password"),
                                                 grey_interactable(), nil)]
      assertWithMatcher:grey_notVisible()];
  [[EarlGrey selectElementWithMatcher:
                 grey_allOf(grey_accessibilityID(
                                kBadgeUnreadIndicatorAccessibilityIdentifier),
                            grey_sufficientlyVisible(), nil)]
      assertWithMatcher:grey_notVisible()];
}

@end
