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

#include <tuple>

#include "base/strings/stringprintf.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/web_ui_mocha_browser_test.h"
#include "components/contextual_tasks/public/features.h"
#include "components/history_clusters/core/features.h"
#include "components/omnibox/browser/aim_eligibility_service.h"
#include "components/search/ntp_features.h"
#include "content/public/test/browser_test.h"

class NewTabPageBrowserTest : public WebUIMochaBrowserTest {
 protected:
  NewTabPageBrowserTest() {
    set_test_loader_host(chrome::kChromeUINewTabPageHost);
    scoped_feature_list_.InitWithFeatures(
        /*enabled_features=*/{},
        /*disabled_features=*/{omnibox::kAimServerEligibilityEnabled,
                               ntp_realbox::kNtpRealboxNext,
                               contextual_tasks::kContextualTasksContext});
  }

 private:
  base::test::ScopedFeatureList scoped_feature_list_;
};

class NewTabPageNextBrowserTest : public WebUIMochaBrowserTest {
 protected:
  NewTabPageNextBrowserTest() {
    set_test_loader_host(chrome::kChromeUINewTabPageHost);
    scoped_feature_list_.InitWithFeatures(
        /*enabled_features=*/{omnibox::kAimServerEligibilityEnabled,
                              ntp_realbox::kNtpRealboxNext},
        /*disabled_features=*/{});
  }

 private:
  base::test::ScopedFeatureList scoped_feature_list_;
};

using NewTabPageTest = NewTabPageBrowserTest;

IN_PROC_BROWSER_TEST_F(NewTabPageTest, MetricsUtils) {
  RunTest("new_tab_page/metrics_utils_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, VoiceSearchOverlay) {
  RunTest("new_tab_page/voice_search_overlay_test.js", "mocha.run()");
}

using NewTabPageNextTest = NewTabPageNextBrowserTest;

IN_PROC_BROWSER_TEST_F(NewTabPageNextTest, Realbox) {
  RunTest("new_tab_page/realbox_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, RealboxLens) {
  RunTest("new_tab_page/searchbox_lens_button_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, RealboxSearchbox) {
  RunTest("new_tab_page/searchbox_ntp_test.js",
          "runMochaSuite('SearchboxTest');");
}

// TODO(crbug.com/40933410):  Re-enable once no longer fails.
IN_PROC_BROWSER_TEST_F(NewTabPageTest, DISABLED_LensForm) {
  RunTest("new_tab_page/lens_form_test.js", "mocha.run()");
}

// TODO(crbug.com/40902230): Test is flaky across platforms.
IN_PROC_BROWSER_TEST_F(NewTabPageTest, DISABLED_LensUploadDialog) {
  RunTest("new_tab_page/lens_upload_dialog_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, Logo) {
  RunTest("new_tab_page/logo_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, DoodleShareDialog) {
  RunTest("new_tab_page/doodle_share_dialog_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, BackgroundManager) {
  RunTest("new_tab_page/background_manager_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, BackgroundImage) {
  RunTest("new_tab_page/background_image_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, MiddleSlotPromo) {
  RunTest("new_tab_page/middle_slot_promo_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ImageProcessor) {
  RunTest("new_tab_page/image_processor_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, Transparency) {
  RunTest("new_tab_page/transparency_test.js", "mocha.run()");
}

// TODO(crbug.com/545788432): Flaky on Linux.
#if BUILDFLAG(IS_LINUX)
#define MAYBE_Composebox DISABLED_Composebox
#else
#define MAYBE_Composebox Composebox
#endif
IN_PROC_BROWSER_TEST_F(NewTabPageTest, MAYBE_Composebox) {
  RunTest("new_tab_page/composebox/composebox_test.js",
          "runMochaSuite('NewTabPageComposeboxTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxResizeObserver) {
  RunTest("new_tab_page/composebox/composebox_test.js",
          "runMochaSuite('NewTabPageComposeboxResizeObserverTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxSubmit) {
  RunTest("new_tab_page/composebox/composebox_submit_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxAutocompleteDropdown) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('NewTabPageComposeboxAutocompleteDropdownTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest,
                       ComposeboxAutocompleteKeyboardNavigation) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('"
          "NewTabPageComposeboxAutocompleteKeyboardNavigationTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxAutocompleteMatchRemoval) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('NewTabPageComposeboxAutocompleteMatchRemovalTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxAutocompleteSmartCompose) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('NewTabPageComposeboxAutocompleteSmartComposeTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxAutocompleteQuerying) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('NewTabPageComposeboxAutocompleteQueryingTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, CrComposeboxAutocompleteContextTest) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('CrComposeboxAutocompleteContextTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxAutocompleteVoiceSearch) {
  RunTest("new_tab_page/composebox/composebox_autocomplete_test.js",
          "runMochaSuite('NewTabPageComposeboxAutocompleteVoiceSearchTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxContextMenu) {
  RunTest("new_tab_page/composebox/composebox_context_menu_test.js",
          "runMochaSuite('NewTabPageComposeboxContextMenuTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxUploadFileTest) {
  RunTest("new_tab_page/composebox/composebox_upload_test.js",
          "runMochaSuite('NewTabPageComposeboxUploadFileTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxUploadPasteTest) {
  RunTest("new_tab_page/composebox/composebox_upload_test.js",
          "runMochaSuite('NewTabPageComposeboxUploadPasteTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxUploadToolModeTest) {
  RunTest("new_tab_page/composebox/composebox_upload_test.js",
          "runMochaSuite('NewTabPageComposeboxUploadToolModeTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ComposeboxUploadContextTest) {
  RunTest("new_tab_page/composebox/composebox_upload_test.js",
          "runMochaSuite('NewTabPageComposeboxUploadContextTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, CrComposeboxUploadContextTest) {
  RunTest("new_tab_page/composebox/composebox_upload_test.js",
          "runMochaSuite('CrComposeboxUploadContextTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ThreadsRail) {
  RunTest("new_tab_page/composebox/threads_rail_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageTest, ActionChips) {
  RunTest("new_tab_page/action_chips/action_chips_test.js", "mocha.run()");
}


using NewTabPageNtpPromoTest = NewTabPageBrowserTest;

IN_PROC_BROWSER_TEST_F(NewTabPageNtpPromoTest, IndividualPromosTest) {
  RunTest("new_tab_page/ntp_promo/individual_promos_test.js", "mocha.run()");
}

using NewTabPageModulesTest = NewTabPageBrowserTest;

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, ModuleWrapper) {
  RunTest("new_tab_page/modules/module_wrapper_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, ModulesV2) {
  RunTest("new_tab_page/modules/modules_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, ModuleHeaderV2) {
  RunTest("new_tab_page/modules/module_header_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, ModuleDescriptor) {
  RunTest("new_tab_page/modules/module_descriptor_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, ModuleRegistry) {
  RunTest("new_tab_page/modules/module_registry_test.js", "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, InfoDialog) {
  RunTest("new_tab_page/modules/info_dialog_test.js", "mocha.run()");
}

#if !defined(OFFICIAL_BUILD)
// The dummy module is not available in official builds.
IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, DummyModule) {
  RunTest("new_tab_page/modules/dummy/module_test.js", "mocha.run()");
}
#endif  // !defined(OFFICIAL_BUILD)

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, Calendar) {
  RunTest("new_tab_page/modules/calendar/calendar_test.js",
          "runMochaSuite('NewTabPageModulesCalendarTest general')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, CalendarMetrics) {
  RunTest("new_tab_page/modules/calendar/calendar_test.js",
          "runMochaSuite('NewTabPageModulesCalendarTest metrics')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, CalendarEvent) {
  RunTest("new_tab_page/modules/calendar/calendar_event_test.js",
          "runMochaSuite('NewTabPageModulesCalendarEventTest general')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, CalendarEventMetrics) {
  RunTest("new_tab_page/modules/calendar/calendar_event_test.js",
          "runMochaSuite('NewTabPageModulesCalendarEventTest metrics')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, GoogleCalendarModule) {
  RunTest("new_tab_page/modules/calendar/google_calendar_module_test.js",
          "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, OutlookCalendarModule) {
  RunTest("new_tab_page/modules/calendar/outlook_calendar_module_test.js",
          "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, DriveModuleV2) {
  RunTest("new_tab_page/modules/file_suggestion/drive_module_test.js",
          "mocha.run()");
}

// TODO(crbug.com/534399662): Flaky on Windows.
#if BUILDFLAG(IS_WIN)
#define MAYBE_FileSuggestion DISABLED_FileSuggestion
#else
#define MAYBE_FileSuggestion FileSuggestion
#endif
IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, MAYBE_FileSuggestion) {
  RunTest("new_tab_page/modules/file_suggestion/file_suggestion_test.js",
          "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, MicrosoftFilesModule) {
  RunTest("new_tab_page/modules/file_suggestion/microsoft_files_module_test.js",
          "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, MicrosoftAuthModule) {
  RunTest("new_tab_page/modules/authentication/microsoft_auth_module_test.js",
          "mocha.run()");
}

IN_PROC_BROWSER_TEST_F(NewTabPageModulesTest, TabGroupsModule) {
  RunTest("new_tab_page/modules/tab_groups/module_test.js", "mocha.run()");
}

using NewTabPageAppTest = NewTabPageBrowserTest;

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, Misc) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest Misc')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, OgbThemingRemoveScrim) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest OgbThemingRemoveScrim')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, OgbScrim) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest OgbScrim')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, Theming) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest Theming')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, Promo) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest Promo')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, Clicks) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest Clicks')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, V2Modules) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest V2Modules')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, CounterfactualModules) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest CounterfactualModules')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, CustomizeChromeSidePanel) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest CustomizeChromeSidePanel')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, LensUploadDialog) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest LensUploadDialog')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, Composebox) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest Composebox')");
}

class NewTabPageAppComposeboxInvariantTest
    : public NewTabPageBrowserTest,
      public testing::WithParamInterface<std::tuple<const char*, bool>> {
 public:
  const char* GetVariant() const { return std::get<0>(GetParam()); }
  bool GetAnimationEnabled() const { return std::get<1>(GetParam()); }
};

IN_PROC_BROWSER_TEST_P(NewTabPageAppComposeboxInvariantTest, InvariantChecks) {
  RunTest("new_tab_page/app_test.js",
          base::StringPrintf("runMochaSuite('NewTabPageAppTest "
                             "ComposeboxInvariantChecks_%s_%s')",
                             GetVariant(),
                             GetAnimationEnabled() ? "AnimationEnabled"
                                                   : "AnimationDisabled"));
}

INSTANTIATE_TEST_SUITE_P(
    All,
    NewTabPageAppComposeboxInvariantTest,
    testing::Combine(testing::Values("Control",
                                     "energy-effect-original",
                                     "energy-effect-darker-shadow",
                                     "pre-energy-effect-with-border",
                                     "energy-effect-fusebox"),
                     testing::Bool()));

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, ComposeEntryPoint) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest ComposeEntryPoint')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, RealboxNext) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest RealboxNext')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, ActionChips) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest ActionChips')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, ThreadsRail) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest ThreadsRail')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, ReducedMotion) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppReducedMotionTest')");
}

// TODO(crbug.com/428156129): Re-enable test
IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, DISABLED_WallpaperSearch) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest WallpaperSearch')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, MicrosoftAuth) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest MicrosoftAuth')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, NewTabFooter) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest NewTabFooter')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, AutoRemovalToast) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest AutoRemovalToast')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, VoiceSearchCoherence) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest VoiceSearchCoherence')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, VoiceSearchAndSpeechRecognition) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest VoiceSearchAndSpeechRecognition')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, ContextMenuAnimation) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppContextMenuAnimationTest')");
}

IN_PROC_BROWSER_TEST_F(NewTabPageAppTest, EnergyEffectVariant) {
  RunTest("new_tab_page/app_test.js",
          "runMochaSuite('NewTabPageAppTest EnergyEffectVariant')");
}

class NewTabPageModulesMostRelevantTabResumptionModuleTest
    : public NewTabPageBrowserTest {
 protected:
  NewTabPageModulesMostRelevantTabResumptionModuleTest() {
    scoped_feature_list_.InitWithFeatures(
        /*enabled_features=*/{ntp_features::
                                  kNtpMostRelevantTabResumptionModule},
        /*disabled_features=*/{});
  }

 private:
  base::test::ScopedFeatureList scoped_feature_list_;
};

IN_PROC_BROWSER_TEST_F(NewTabPageModulesMostRelevantTabResumptionModuleTest,
                       Core) {
  RunTest("new_tab_page/modules/most_relevant_tab_resumption/module_test.js",
          "runMochaSuite('NewTabPageModulesMostRelevantTabResumptionModuleTest "
          "Core')");
}
