chromium/ios/web/annotations/text_inttest.mm

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

#import <Foundation/Foundation.h>

#import "base/apple/foundation_util.h"
#import "base/strings/sys_string_conversions.h"
#import "base/test/scoped_feature_list.h"
#import "ios/web/common/features.h"
#import "ios/web/public/test/javascript_test.h"
#import "ios/web/public/test/js_test_util.h"

namespace web {

// Test fixture for annotation js.
class AnnotationJsTest : public JavascriptTest {
 public:
  AnnotationJsTest() = default;
  AnnotationJsTest(const AnnotationJsTest&) = delete;
  AnnotationJsTest& operator=(const AnnotationJsTest&) = delete;

 protected:
  void SetUp() override {
    JavascriptTest::SetUp();

    scoped_feature_list_.InitWithFeatures(
        /*enabled_features=*/{features::kEnableViewportIntents},
        /*disabled_features=*/{});

    AddGCrWebScript();
    AddCommonScript();
    AddMessageScript();
    AddUserScript(@"text_tests");

    // Start with empty web page.
    ASSERT_TRUE(LoadHtml(@"<html><head></head><body></body></html>"));
  }

  // Executes `test_entry` ("gcrWebStubName.jsTestSuiteEntryPoint" ) in the
  // script and outputs the result to `std::cerr`. If all js suite tests are OK
  // the unittest succeeds.
  void TestJavascriptStub(const char* test_entry) {
    NSString* entryPoint =
        [NSString stringWithFormat:@"__gCrWeb.%s();", test_entry];
    id suite_result = test::ExecuteJavaScript(web_view(), entryPoint);
    ASSERT_TRUE(suite_result);
    NSArray<NSDictionary*>* result_array =
        base::apple::ObjCCast<NSArray<NSDictionary*>>(suite_result);
    ASSERT_TRUE(result_array);
    size_t ok = 0;
    for (NSDictionary* result in result_array) {
      ASSERT_TRUE(result);
      if ([result[@"result"] isEqualToString:@"OK"]) {
        std::cerr << "[      OK  ]  "
                  << base::SysNSStringToUTF8(result[@"name"]) << std::endl;
        ok++;
      } else if ([result[@"result"] isEqualToString:@"LOG"]) {
        std::cerr << "[          ]  "
                  << base::SysNSStringToUTF8(result[@"error"]) << std::endl;
        ok++;
      } else {
        std::cerr << "[  FAILED  ]  "
                  << base::SysNSStringToUTF8(result[@"name"]) << " : "
                  << base::SysNSStringToUTF8(result[@"error"]) << std::endl;
      }
    }
    EXPECT_EQ(ok, result_array.count);
  }

  base::test::ScopedFeatureList scoped_feature_list_;
};

TEST_F(AnnotationJsTest, All) {
  TestJavascriptStub("textTests.testAll");
}

}  // namespace web