// Copyright 2017 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.

#include <memory>

#import <ChromeWebView/ChromeWebView.h>
#import <EarlGrey/EarlGrey.h>
#import <XCTest/XCTest.h>

#include "base/strings/sys_string_conversions.h"
#import "ios/web_view/shell/shell_view_controller.h"
#import "ios/web_view/shell/test/earl_grey/web_view_shell_matchers.h"
#import "ios/web_view/test/web_view_test_util.h"
#include "net/test/embedded_test_server/embedded_test_server.h"

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

namespace {

// Returns current web view for root view controller.
CWVWebView* GetCurrentWebView() {
  ShellViewController* view_controller = static_cast<ShellViewController*>([[
      [[UIApplication sharedApplication] delegate] window] rootViewController]);
  return view_controller.webView;
}

// Waits for the current web view to contain |text|. If the condition is not met
// within a timeout, a GREYAssert is induced.
void WaitForWebViewContainingText(NSString* text) {
  GREYAssert(ios_web_view::test::WaitForWebViewContainingTextOrTimeout(
                 GetCurrentWebView(), text),
             @"Failed waiting for web view containing %@", text);
}

}  // namespace

// Test fixture for the web view shell tests.
@interface ShellTestCase : XCTestCase {
  std::unique_ptr<net::test_server::EmbeddedTestServer> _testServer;
}

@end

@implementation ShellTestCase

// Overrides |testInvocations| to skip all tests if a system alert view is
// shown, since this isn't a case a user would encounter (i.e. they would
// dismiss the alert first).
+ (NSArray*)testInvocations {
  // TODO(crbug.com/654085): Simply skipping all tests isn't the best way to
  // handle this, it would be better to have something that is more obvious
  // on the bots that this is wrong, without making it look like test flake.
  NSError* error = nil;
  [[EarlGrey selectElementWithMatcher:grey_systemAlertViewShown()]
      assertWithMatcher:grey_nil()
                  error:&error];
  if (error != nil) {
    NSLog(@"System alert view is present, so skipping all tests!");
    return @[];
  }
  return [super testInvocations];
}

- (void)setUp {
  [super setUp];

  _testServer = std::make_unique<net::EmbeddedTestServer>(
      net::test_server::EmbeddedTestServer::TYPE_HTTP);
  _testServer->ServeFilesFromSourceDirectory(
      base::FilePath(FILE_PATH_LITERAL("ios/testing/data/http_server_files/")));
  XCTAssertTrue(_testServer->Start());
}

// Tests loading simple HTML page and verifies that page contains expected text.
// TODO(crbug.com/733452): Enable this test.
- (void)testLoadingURL {
  std::string URLSpec = _testServer->GetURL("/destination.html").spec();

  [[EarlGrey selectElementWithMatcher:ios_web_view::AddressField()]
      performAction:grey_typeText(base::SysUTF8ToNSString(URLSpec))];

  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Go")]
      performAction:grey_tap()];

  WaitForWebViewContainingText(@"You've arrived");
}

@end
