// Copyright 2021 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 "common/platform/api/quiche_url_utils.h"

#include <set>
#include <string>

#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
#include "common/platform/api/quiche_test.h"

namespace quiche {
namespace {

void ValidateExpansion(
    const std::string& uri_template,
    const absl::flat_hash_map<std::string, std::string>& parameters,
    const std::string& expected_expansion,
    const absl::flat_hash_set<std::string>& expected_vars_found) {
  absl::flat_hash_set<std::string> vars_found;
  std::string target;
  ASSERT_TRUE(
      ExpandURITemplate(uri_template, parameters, &target, &vars_found));
  EXPECT_EQ(expected_expansion, target);
  EXPECT_EQ(vars_found, expected_vars_found);
}

TEST(QuicheUrlUtilsTest, Basic) {
  ValidateExpansion("/{foo}/{bar}/", {{"foo", "123"}, {"bar", "456"}},
                    "/123/456/", {"foo", "bar"});
}

TEST(QuicheUrlUtilsTest, ExtraParameter) {
  ValidateExpansion("/{foo}/{bar}/{baz}/", {{"foo", "123"}, {"bar", "456"}},
                    "/123/456/{baz}/", {"foo", "bar"});
}

TEST(QuicheUrlUtilsTest, MissingParameter) {
  ValidateExpansion("/{foo}/{baz}/", {{"foo", "123"}, {"bar", "456"}},
                    "/123/{baz}/", {"foo"});
}

TEST(QuicheUrlUtilsTest, RepeatedParameter) {
  ValidateExpansion("/{foo}/{bar}/{foo}/", {{"foo", "123"}, {"bar", "456"}},
                    "/123/456/123/", {"foo", "bar"});
}

TEST(QuicheUrlUtilsTest, URLEncoding) {
  ValidateExpansion("/{foo}/{bar}/", {{"foo", "123"}, {"bar", ":"}},
                    "/123/%3A/", {"foo", "bar"});
}

}  // namespace
}  // namespace quiche
