// // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) // Copyright (c) 2022 Alan de Freitas (alandefreitas@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 #include #include #include "test_suite.hpp" namespace boost { namespace urls { class params_encoded_view_test { public: void testMembers() { // operator=(params_encoded_view const&) { url_view u1; url_view u2; params_encoded_view p1 = u1.encoded_params(); params_encoded_view p2 = u2.encoded_params(); p2 = p1; BOOST_TEST_EQ(p1.begin(), p2.begin()); } } void testElements() { // at(string_view) // at(Key) { url_view u = parse_uri_reference( "?k0=0&k1=1&k2=&k3&k4=4444#f").value(); params_encoded_view p = u.encoded_params(); BOOST_TEST_EQ(p.at("k0"), "0"); BOOST_TEST_EQ(p.at("k1"), "1"); BOOST_TEST_EQ(p.at("k2"), ""); BOOST_TEST_THROWS(p.at("k3") == "0", std::out_of_range); BOOST_TEST_EQ(p.at("k4"), "4444"); BOOST_TEST_THROWS(p.at("k5"), std::out_of_range); } } void testCapacity() { // empty // size { url_view u = parse_uri_reference( "?k0=0&k1=1&k2=&k3&k4=4444#f").value(); params_encoded_view p = u.encoded_params(); BOOST_TEST(! p.empty()); BOOST_TEST_EQ(p.size(), 5u); } { url_view u; params_encoded_view p = u.encoded_params(); BOOST_TEST(p.empty()); BOOST_TEST_EQ(p.size(), 0u); } } 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_view 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_encoded_view p = u.encoded_params(); BOOST_TEST_EQ(p.count("a"), 1u); BOOST_TEST_EQ(p.count("%62"), 1u); // pct-encoded BOOST_TEST_EQ(p.count("c"), 3u); BOOST_TEST_EQ(p.count("d"), 2u); BOOST_TEST_EQ(p.count("e"), 1u); BOOST_TEST_EQ(p.count("f"), 1u); BOOST_TEST_EQ(p.count("g"), 0u); BOOST_TEST(p.find("%62") == std::next(p.begin())); BOOST_TEST(p.find( std::next(p.begin(), 6), "d") == std::next(p.begin(), 7)); BOOST_TEST(p.contains("a")); BOOST_TEST(p.contains("b")); BOOST_TEST(p.contains("%62")); 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() { // operator++ // operator++(int) { url_view u = parse_uri_reference( "/?a=1&bb=22&ccc=333&dddd=4444#f").value(); params_encoded_view p = u.encoded_params(); auto it = p.begin(); BOOST_TEST_EQ((*it).key, "a"); BOOST_TEST_EQ((*++it).key, "bb"); BOOST_TEST_EQ((*it++).key, "bb"); BOOST_TEST_EQ((*it).key, "ccc"); auto it2 = p.end(); BOOST_TEST_EQ(it2, p.end()); BOOST_TEST_NE(it, it2); } // operator* { url_view u = parse_uri_reference( "/?&x&y=&z=3#f").value(); params_encoded_view p = u.encoded_params(); BOOST_TEST_EQ(p.size(), 4u); auto it = p.begin(); { auto v = *it++; BOOST_TEST_EQ(v.key, ""); BOOST_TEST_EQ(v.value, ""); BOOST_TEST_EQ(v.has_value, false); } { auto v = *it++; BOOST_TEST_EQ(v.key, "x"); BOOST_TEST_EQ(v.value, ""); BOOST_TEST_EQ(v.has_value, false); } { auto v = *it++; BOOST_TEST_EQ(v.key, "y"); BOOST_TEST_EQ(v.value, ""); BOOST_TEST_EQ(v.has_value, true); } { auto v = *it++; BOOST_TEST_EQ(v.key, "z"); BOOST_TEST_EQ(v.value, "3"); BOOST_TEST_EQ(v.has_value, true); } } } void testEncoding() { // parse_query_params(string_view) { params_view u = parse_query_params( "a=1&b=2+2&c=%61%70%70%6c%65").value().decoded(); BOOST_TEST_EQ(u.at("b"), "2 2"); BOOST_TEST_EQ(u.at("c"), "apple"); BOOST_TEST_THROWS(parse_query_params("#a").value(), std::exception); } } void testRange() { // issue 129 // empty range iterates once { url_view u = parse_uri( "http://example.com/index.htm").value(); auto const r = u.encoded_params(); BOOST_TEST( r.begin() == r.end()); } } void run() { testMembers(); testElements(); testCapacity(); testLookup(); testIterators(); testEncoding(); testRange(); } }; TEST_SUITE( params_encoded_view_test, "boost.url.params_encoded_view"); } // urls } // boost