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

#import "components/shared_highlighting/ios/parsing_utils.h"

#import <CoreGraphics/CoreGraphics.h>

#import "base/values.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/platform_test.h"

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

typedef PlatformTest ParsingUtilsTest;

namespace shared_highlighting {

// Tests the ParseRect utility function.
TEST_F(ParsingUtilsTest, ParseRect) {
  CGRect expected_rect = CGRectMake(1, 2, 3, 4);
  base::Value::Dict rect_dict;
  rect_dict.Set("x", expected_rect.origin.x);
  rect_dict.Set("y", expected_rect.origin.y);
  rect_dict.Set("width", expected_rect.size.width);
  rect_dict.Set("height", expected_rect.size.height);

  absl::optional<CGRect> opt_rect = ParseRect(&rect_dict);
  ASSERT_TRUE(opt_rect.has_value());
  EXPECT_TRUE(CGRectEqualToRect(expected_rect, opt_rect.value()));

  // Invalid values.
  EXPECT_FALSE(ParseRect(nil).has_value());
  base::Value::Dict empty_dict;
  EXPECT_FALSE(ParseRect(&empty_dict).has_value());

  base::Value::Dict copied_dict = rect_dict.Clone();
  copied_dict.Remove("x");
  EXPECT_FALSE(ParseRect(&copied_dict).has_value());

  copied_dict = rect_dict.Clone();
  copied_dict.Remove("y");
  EXPECT_FALSE(ParseRect(&copied_dict).has_value());

  copied_dict = rect_dict.Clone();
  copied_dict.Remove("width");
  EXPECT_FALSE(ParseRect(&copied_dict).has_value());

  copied_dict = rect_dict.Clone();
  copied_dict.Remove("height");
  EXPECT_FALSE(ParseRect(&copied_dict).has_value());
}

// Tests for the ParseURL utility function.
TEST_F(ParsingUtilsTest, ParseURL) {
  EXPECT_FALSE(ParseURL(nil).has_value());

  std::string empty_str = "";
  EXPECT_FALSE(ParseURL(&empty_str).has_value());

  std::string invalid_url_str = "abcd";
  EXPECT_FALSE(ParseURL(&invalid_url_str).has_value());

  std::string valid_url_str = "https://www.example.com/";
  absl::optional<GURL> valid_url = ParseURL(&valid_url_str);
  EXPECT_TRUE(valid_url.has_value());
  EXPECT_EQ(GURL(valid_url_str).spec(), valid_url.value().spec());
}

}  // namespace shared_highlighting
