// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/dom/url_utils.h"

#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {

TEST(URLUtilsTest, GettersShouldReturnExpectedFormat) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));

  EXPECT_EQ("https://user:pass@google.com:99/foo;bar?q=a#ref",
            url_utils.href());
  EXPECT_EQ("https:", url_utils.protocol());
  EXPECT_EQ("google.com:99", url_utils.host());
  EXPECT_EQ("google.com", url_utils.hostname());
  EXPECT_EQ("99", url_utils.port());
  EXPECT_EQ("/foo;bar", url_utils.pathname());
  EXPECT_EQ("#ref", url_utils.hash());
  EXPECT_EQ("?q=a", url_utils.search());
}

TEST(URLUtilsTest, SetHref) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_href("http://www.youtube.com");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("http://www.youtube.com/", url_utils.href());
}

TEST(URLUtilsTest, SetProtocolShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_protocol("http");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("http://user:pass@google.com:99/foo;bar?q=a#ref", url_utils.href());
}

TEST(URLUtilsTest, SetHostShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_host("youtube.com");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@youtube.com:99/foo;bar?q=a#ref",
            url_utils.href());

  url_utils.set_host("google.com:100");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:100/foo;bar?q=a#ref",
            url_utils.href());
}

TEST(URLUtilsTest, SetHostnameShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_hostname("youtube.com");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@youtube.com:99/foo;bar?q=a#ref",
            url_utils.href());
}

TEST(URLUtilsTest, SetPortShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_port("100");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:100/foo;bar?q=a#ref",
            url_utils.href());
}

TEST(URLUtilsTest, SetPathnameShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_pathname("baz");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:99/baz?q=a#ref", url_utils.href());
}

TEST(URLUtilsTest, SetHashShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_hash("hash");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:99/foo;bar?q=a#hash",
            url_utils.href());

  url_utils.set_hash("#hash2");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:99/foo;bar?q=a#hash2",
            url_utils.href());
}

TEST(URLUtilsTest, SetSearchShouldWorkAsExpected) {
  URLUtils url_utils(GURL("https://user:pass@google.com:99/foo;bar?q=a#ref"));
  url_utils.set_search("b=c");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:99/foo;bar?b=c#ref",
            url_utils.href());

  url_utils.set_search("?d=e");
  EXPECT_TRUE(url_utils.url().is_valid());
  EXPECT_EQ("https://user:pass@google.com:99/foo;bar?d=e#ref",
            url_utils.href());
}

}  // namespace dom
}  // namespace cobalt
