mirror of
https://github.com/boostorg/url.git
synced 2026-01-20 17:12:16 +00:00
517 lines
17 KiB
C++
517 lines
17 KiB
C++
//
|
|
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
// Official repository: https://github.com/CPPAlliance/url
|
|
//
|
|
|
|
// Test that header file is self-contained.
|
|
#include <boost/url/params.hpp>
|
|
|
|
#include <boost/url/static_pool.hpp>
|
|
#include <boost/url/url.hpp>
|
|
#include "test_suite.hpp"
|
|
|
|
namespace boost {
|
|
namespace urls {
|
|
|
|
class params_test
|
|
{
|
|
public:
|
|
using pool_t = static_pool<4096>;
|
|
pool_t pa;
|
|
|
|
void
|
|
testMembers()
|
|
{
|
|
// operator=
|
|
// assign(initializer_list)
|
|
// assign(FwdIt, FwdIt)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?x#f").value();
|
|
u.params(pa.allocator()) = {
|
|
{ "k1", "1", true },
|
|
{ "k2", "2", true },
|
|
{ "k3", "", true },
|
|
{ "k4", "", false },
|
|
{ "k5", "55555", true } };
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k1=1&k2=2&k3=&k4&k5=55555");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k1=1&k2=2&k3=&k4&k5=55555#f");
|
|
}
|
|
{
|
|
url u = parse_uri_reference("/?x#f").value();
|
|
u.params(pa.allocator()) = {};
|
|
BOOST_TEST(u.encoded_query() == "");
|
|
BOOST_TEST(u.encoded_url() == "/#f");
|
|
}
|
|
}
|
|
|
|
void
|
|
testElements()
|
|
{
|
|
// at(std::size_t)
|
|
// operator[std::size_t]
|
|
// front
|
|
// back
|
|
{
|
|
url u = parse_uri_reference(
|
|
"?k0=0&k1=1&k2=&k3&k4=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(p.at(0).key == "k0");
|
|
BOOST_TEST(p.at(0).value == "0");
|
|
BOOST_TEST(p.at(0).has_value);
|
|
BOOST_TEST(p.at(2).key == "k2");
|
|
BOOST_TEST(p.at(2).value == "");
|
|
BOOST_TEST(p.at(2).has_value);
|
|
BOOST_TEST(p.at(3).key == "k3");
|
|
BOOST_TEST(p.at(3).has_value == false);
|
|
BOOST_TEST_THROWS(
|
|
p.at(5), std::out_of_range);
|
|
|
|
BOOST_TEST(p.front().key == "k0");
|
|
BOOST_TEST(p.front().value == "0");
|
|
BOOST_TEST(p.front().has_value);
|
|
|
|
BOOST_TEST(p.back().key == "k4");
|
|
BOOST_TEST(p.back().value == "4444");
|
|
BOOST_TEST(p.back().has_value);
|
|
}
|
|
|
|
// at(string_view)
|
|
// at(Key)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"?k0=0&k1=1&k2=&k3&k4=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(p.at("k0") == "0");
|
|
BOOST_TEST(p.at("k1") == "1");
|
|
BOOST_TEST(p.at("k2") == "");
|
|
BOOST_TEST_THROWS(p.at("k3") == "0",
|
|
std::out_of_range);
|
|
BOOST_TEST(p.at("k4") == "4444");
|
|
BOOST_TEST_THROWS(p.at("k5"),
|
|
std::out_of_range);
|
|
}
|
|
}
|
|
|
|
void
|
|
testCapacity()
|
|
{
|
|
// empty
|
|
// size
|
|
{
|
|
url u = parse_uri_reference(
|
|
"?k0=0&k1=1&k2=&k3&k4=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(! p.empty());
|
|
BOOST_TEST(p.size() == 5);
|
|
}
|
|
{
|
|
url u;
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(p.empty());
|
|
BOOST_TEST(p.size() == 0);
|
|
}
|
|
}
|
|
|
|
void
|
|
testModifiers()
|
|
{
|
|
// clear
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k1=1&k2=&k3&k4=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
p.clear();
|
|
BOOST_TEST(u.encoded_query() == "");
|
|
BOOST_TEST(u.encoded_url() == "/#f");
|
|
}
|
|
|
|
// insert(iterator, value_type)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k2=#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.insert(p.begin() + 1,
|
|
{"k1", "1", true});
|
|
BOOST_TEST(it == p.begin() + 1);
|
|
BOOST_TEST((*it).key == "k1");
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=#f");
|
|
}
|
|
|
|
// insert(iterator, initializer-list)
|
|
// insert(iterator, FwdIt, FwdIt)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k3#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.insert(p.begin() + 1,{
|
|
{"k1", "1", true},
|
|
{"k2", "", true}});
|
|
BOOST_TEST(it == p.begin() + 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3#f");
|
|
}
|
|
|
|
// replace(iterator, value_type)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k1=1&k3#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.replace(
|
|
p.end() - 1,
|
|
{"k2", "", true});
|
|
BOOST_TEST(it == p.end() - 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=#f");
|
|
}
|
|
|
|
// replace(iterator, iterator, FwdIt, FwdIt)
|
|
// replace(iterator, iterator, initializer_list)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k1=1&k2=&k3&k4=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.replace(
|
|
p.begin() + 1, p.begin() + 3, {
|
|
{"a","aa",true},
|
|
{"b","bbb",true},
|
|
{"c","ccccc",true}});
|
|
BOOST_TEST(it == p.begin() + 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&a=aa&b=bbb&c=ccccc&k3&k4=4444");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&a=aa&b=bbb&c=ccccc&k3&k4=4444#f");
|
|
}
|
|
|
|
// remove_value(iterator)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k%31=1&k2=#f").value();
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(p.at(1).key == "k1");
|
|
auto it = p.remove_value(p.begin() + 1);
|
|
BOOST_TEST(u.encoded_query() == "k0=0&k%31&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k%31&k2=#f");
|
|
}
|
|
|
|
// replace_value(iterator, string_view)
|
|
// replace_value(iterator, Value)
|
|
{
|
|
// VFALCO TODO
|
|
}
|
|
|
|
// emplace_at(iterator, string_view, string_view)
|
|
// emplace_at(iterator, Key, Value)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k%31=1&k2=#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.emplace_at(
|
|
p.begin() + 1,
|
|
"k1", "1");
|
|
BOOST_TEST(it == p.begin() + 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=#f");
|
|
}
|
|
|
|
// emplace_at(iterator, string_view)
|
|
// emplace_at(iterator, Key)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k1=1&k2=&k3#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.emplace_at(
|
|
p.begin() + 2,
|
|
"hello_world");
|
|
BOOST_TEST(it == p.begin() + 2);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&hello_world&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&hello_world&k3#f");
|
|
}
|
|
|
|
// emplace_before(iterator, string_view, string_view)
|
|
// emplace_before(iterator, Key, Value)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k2=&k3#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.emplace_before(
|
|
p.begin() + 1, "k1", "1");
|
|
BOOST_TEST(it == p.begin() + 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3#f");
|
|
}
|
|
|
|
// emplace_before(iterator, string_view)
|
|
// emplace_before(iterator, Key)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k2=&k3#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.emplace_before(
|
|
p.begin() + 1, "k1");
|
|
BOOST_TEST(it == p.begin() + 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1&k2=&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1&k2=&k3#f");
|
|
}
|
|
|
|
// erase(iterator)
|
|
// erase(iterator, iterator)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?k0=0&k1=1&k2=&k3&k4=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
p.erase(p.begin() + 2);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k3&k4=4444");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k3&k4=4444#f");
|
|
p.erase(
|
|
p.begin() + 1, p.begin() + 3);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k4=4444");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k4=4444#f");
|
|
}
|
|
|
|
// erase(string_view)
|
|
// erase(Key)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?a=1&%62=2&c=3&c=4&c=5&d=6&e=7&d=8&f=9#f").value();
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(p.erase("c") == 3);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"a=1&%62=2&d=6&e=7&d=8&f=9");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?a=1&%62=2&d=6&e=7&d=8&f=9#f");
|
|
BOOST_TEST(p.erase("b") == 1);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"a=1&d=6&e=7&d=8&f=9");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?a=1&d=6&e=7&d=8&f=9#f");
|
|
BOOST_TEST(p.erase("d") == 2);
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"a=1&e=7&f=9");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?a=1&e=7&f=9#f");
|
|
BOOST_TEST(p.erase("g") == 0);
|
|
}
|
|
|
|
// emplace_back(Key, Value)
|
|
// emplace_back(Key)
|
|
{
|
|
url u = parse_uri_reference("/#f").value();
|
|
params p = u.params(pa.allocator());
|
|
p.emplace_back("k0", "0");
|
|
BOOST_TEST(u.encoded_query() == "k0=0");
|
|
BOOST_TEST(u.encoded_url() == "/?k0=0#f");
|
|
BOOST_TEST(u.encoded_params().size() == 1);
|
|
p.emplace_back("k1", "1");
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1#f");
|
|
BOOST_TEST(u.encoded_params().size() == 2);
|
|
p.emplace_back("k2", "");
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=#f");
|
|
BOOST_TEST(u.encoded_params().size() == 3);
|
|
p.emplace_back("k3");
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3#f");
|
|
BOOST_TEST(u.encoded_params().size() == 4);
|
|
p.emplace_back("", "4444");
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3&=4444");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3&=4444#f");
|
|
BOOST_TEST(u.encoded_params().size() == 5);
|
|
}
|
|
|
|
// push_back(value_type)
|
|
// pop_back()
|
|
{
|
|
url u = parse_uri_reference("/#f").value();
|
|
params p = u.params(pa.allocator());
|
|
|
|
p.push_back({"k0", "0", true});
|
|
BOOST_TEST(u.encoded_query() == "k0=0");
|
|
BOOST_TEST(u.encoded_url() == "/?k0=0#f");
|
|
BOOST_TEST(u.encoded_params().size() == 1);
|
|
|
|
p.push_back({"k1", "1", true});
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1#f");
|
|
BOOST_TEST(u.encoded_params().size() == 2);
|
|
|
|
p.push_back({"k2", "", true});
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=#f");
|
|
BOOST_TEST(u.encoded_params().size() == 3);
|
|
|
|
p.push_back({"k3", "", false});
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3#f");
|
|
BOOST_TEST(u.encoded_params().size() == 4);
|
|
|
|
p.push_back({"", "4444", true});
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3&=4444");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3&=4444#f");
|
|
BOOST_TEST(u.encoded_params().size() == 5);
|
|
|
|
p.pop_back();
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=&k3");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=&k3#f");
|
|
BOOST_TEST(u.encoded_params().size() == 4);
|
|
|
|
p.pop_back();
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1&k2=");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1&k2=#f");
|
|
BOOST_TEST(u.encoded_params().size() == 3);
|
|
|
|
p.pop_back();
|
|
BOOST_TEST(u.encoded_query() ==
|
|
"k0=0&k1=1");
|
|
BOOST_TEST(u.encoded_url() ==
|
|
"/?k0=0&k1=1#f");
|
|
BOOST_TEST(u.encoded_params().size() == 2);
|
|
|
|
p.pop_back();
|
|
BOOST_TEST(u.encoded_query() == "k0=0");
|
|
BOOST_TEST(u.encoded_url() == "/?k0=0#f");
|
|
BOOST_TEST(u.encoded_params().size() == 1);
|
|
|
|
p.pop_back();
|
|
BOOST_TEST(u.encoded_query() == "");
|
|
BOOST_TEST(u.encoded_url() == "/#f");
|
|
BOOST_TEST(u.encoded_params().size() == 0);
|
|
}
|
|
}
|
|
|
|
void
|
|
testLookup()
|
|
{
|
|
// count(string_view)
|
|
// count(Key)
|
|
// find(string_view)
|
|
// find(Key)
|
|
// find(iterator, string_view)
|
|
// find(iterator, Key)
|
|
// contains(string_view)
|
|
// contains(Key)
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?a=1&%62=2&c=3&c=4&c=5&d=6&e=7&d=8&f=9#f").value();
|
|
params p = u.params(pa.allocator());
|
|
BOOST_TEST(p.count("a") == 1);
|
|
BOOST_TEST(p.count("b") == 1);
|
|
BOOST_TEST(p.count("c") == 3);
|
|
BOOST_TEST(p.count("d") == 2);
|
|
BOOST_TEST(p.count("e") == 1);
|
|
BOOST_TEST(p.count("f") == 1);
|
|
BOOST_TEST(p.count("g") == 0);
|
|
|
|
BOOST_TEST(p.find("b") == p.begin() + 1);
|
|
BOOST_TEST(p.find(p.begin() + 6, "d") ==
|
|
p.begin() + 7);
|
|
|
|
BOOST_TEST(p.contains("a"));
|
|
BOOST_TEST(p.contains("b"));
|
|
BOOST_TEST(p.contains("c"));
|
|
BOOST_TEST(p.contains("d"));
|
|
BOOST_TEST(p.contains("e"));
|
|
BOOST_TEST(p.contains("f"));
|
|
BOOST_TEST(! p.contains("g"));
|
|
}
|
|
}
|
|
|
|
void
|
|
testIterators()
|
|
{
|
|
url u = parse_uri_reference(
|
|
"/?a=1&bb=22&ccc=333&dddd=4444#f").value();
|
|
params p = u.params(pa.allocator());
|
|
auto it = p.begin();
|
|
BOOST_TEST((*it).key == "a");
|
|
BOOST_TEST((*++it).key == "bb");
|
|
BOOST_TEST((*it++).key == "bb");
|
|
BOOST_TEST((*it).key == "ccc");
|
|
BOOST_TEST((*--it).key == "bb");
|
|
BOOST_TEST((*it--).key == "bb");
|
|
BOOST_TEST((*it).key == "a");
|
|
auto it2 = p.end();
|
|
BOOST_TEST(it == p.begin());
|
|
BOOST_TEST(it != it2);
|
|
BOOST_TEST((*(it += 1)).key == "bb");
|
|
BOOST_TEST((*(it + 1)).value == "333");
|
|
BOOST_TEST((*(1 + it)).value == "333");
|
|
BOOST_TEST((*it).value == "22");
|
|
BOOST_TEST((*(it2 -= 1)).value == "4444");
|
|
BOOST_TEST((*(it2 - 1)).value == "333");
|
|
BOOST_TEST((*it2).value == "4444");
|
|
BOOST_TEST(it2 - it == 2);
|
|
BOOST_TEST(it[1].value == "333");
|
|
|
|
BOOST_TEST(it < it2);
|
|
BOOST_TEST(it <= it2);
|
|
BOOST_TEST(it2 > it);
|
|
BOOST_TEST(it2 >= it);
|
|
}
|
|
|
|
void
|
|
run()
|
|
{
|
|
testMembers();
|
|
testElements();
|
|
testCapacity();
|
|
testModifiers();
|
|
testLookup();
|
|
testIterators();
|
|
}
|
|
};
|
|
|
|
TEST_SUITE(
|
|
params_test,
|
|
"boost.url.params");
|
|
|
|
} // urls
|
|
} // boost
|