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