// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/popup_menu/overflow_menu/ui/overflow_menu_metrics.h"

#import <Foundation/Foundation.h>

#import "ios/chrome/browser/popup_menu/overflow_menu/public/overflow_menu_constants.h"
#import "ios/chrome/browser/popup_menu/overflow_menu/ui/ui_swift.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"

namespace {

OverflowMenuDestination* CreateOverflowMenuDestination(
    overflow_menu::Destination destination) {
  OverflowMenuDestination* result =
      [[OverflowMenuDestination alloc] initWithName:@"Foobar"
                                         symbolName:@""
                                       systemSymbol:YES
                                   monochromeSymbol:NO
                            accessibilityIdentifier:@"Foobar"
                                 enterpriseDisabled:NO
                                displayNewLabelIcon:NO
                                            handler:^{
                                                // Do nothing
                                            }];

  result.destination = static_cast<NSInteger>(destination);

  return result;
}

OverflowMenuAction* CreateOverflowMenuAction(
    overflow_menu::ActionType actionType) {
  OverflowMenuAction* result =
      [[OverflowMenuAction alloc] initWithName:@"Foobar"
                                    symbolName:@""
                                  systemSymbol:YES
                              monochromeSymbol:NO
                       accessibilityIdentifier:@"Foobar"
                            enterpriseDisabled:NO
                           displayNewLabelIcon:NO
                                       handler:^{
                                           // Do nothing
                                       }];

  result.actionType = static_cast<NSInteger>(actionType);

  return result;
}

}  // namespace

class OverflowMenuMetricsTest : public PlatformTest {};

// Test various combinations of inputs for ItemWasInitiallyVisible
TEST_F(OverflowMenuMetricsTest, ItemWasInitiallyVisible) {
  // Test happy path.
  EXPECT_TRUE(ItemWasInitiallyVisible(0, @[ @0, @1, @2, @3 ], 2));
  EXPECT_TRUE(ItemWasInitiallyVisible(1, @[ @0, @1, @2, @3 ], 2));
  EXPECT_FALSE(ItemWasInitiallyVisible(2, @[ @0, @1, @2, @3 ], 2));
  EXPECT_FALSE(ItemWasInitiallyVisible(3, @[ @0, @1, @2, @3 ], 2));

  // Test with array length less than numVisibleItems.
  EXPECT_TRUE(ItemWasInitiallyVisible(0, @[ @0, @1, @2, @3 ], 9));
  EXPECT_TRUE(ItemWasInitiallyVisible(1, @[ @0, @1, @2, @3 ], 9));
  EXPECT_TRUE(ItemWasInitiallyVisible(2, @[ @0, @1, @2, @3 ], 9));
  EXPECT_TRUE(ItemWasInitiallyVisible(3, @[ @0, @1, @2, @3 ], 9));
}

// Test that DestinationWasInitiallyVisible works correctly.
TEST_F(OverflowMenuMetricsTest, DestinationWasInitiallyVisible) {
  NSArray<OverflowMenuDestination*>* destinations = @[
    CreateOverflowMenuDestination(overflow_menu::Destination::Bookmarks),
    CreateOverflowMenuDestination(overflow_menu::Destination::History),
    CreateOverflowMenuDestination(overflow_menu::Destination::ReadingList),
  ];

  EXPECT_TRUE(DestinationWasInitiallyVisible(
      overflow_menu::Destination::Bookmarks, destinations, 2));
  EXPECT_TRUE(DestinationWasInitiallyVisible(
      overflow_menu::Destination::History, destinations, 2));
  EXPECT_FALSE(DestinationWasInitiallyVisible(
      overflow_menu::Destination::ReadingList, destinations, 2));
}

// Test that ActionWasInitiallyVisible works correctly.
TEST_F(OverflowMenuMetricsTest, ActionWasInitiallyVisible) {
  NSArray<OverflowMenuAction*>* actions = @[
    CreateOverflowMenuAction(overflow_menu::ActionType::Translate),
    CreateOverflowMenuAction(overflow_menu::ActionType::Bookmark),
    CreateOverflowMenuAction(overflow_menu::ActionType::ReadingList),
  ];

  EXPECT_TRUE(ActionWasInitiallyVisible(overflow_menu::ActionType::Translate,
                                        actions, 2));
  EXPECT_TRUE(ActionWasInitiallyVisible(overflow_menu::ActionType::Bookmark,
                                        actions, 2));
  EXPECT_FALSE(ActionWasInitiallyVisible(overflow_menu::ActionType::ReadingList,
                                         actions, 2));
}
