LCOV - code coverage report
Current view: top level - tests - catch_parametrized_value_list.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 682 682
Test Date: 2026-11-09 21:32:01 Functions: 100.0 % 2 2
Legend: Lines: hit not hit

            Line data    Source code
       1              : // Copyright (c) 2011-2026  Made to Order Software Corp.  All Rights Reserved
       2              : //
       3              : // https://snapwebsites.org/project/edhttp
       4              : // contact@m2osw.com
       5              : //
       6              : // This program is free software: you can redistribute it and/or modify
       7              : // it under the terms of the GNU General Public License as published by
       8              : // the Free Software Foundation, either version 3 of the License, or
       9              : // (at your option) any later version.
      10              : //
      11              : // This program is distributed in the hope that it will be useful,
      12              : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13              : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14              : // GNU General Public License for more details.
      15              : //
      16              : // You should have received a copy of the GNU General Public License
      17              : // along with this program.  If not, see <https://www.gnu.org/licenses/>.
      18              : 
      19              : /** \file
      20              :  * \brief Verify the parametrized_value_list class.
      21              :  *
      22              :  * This file implements tests to verify that the parametrized_value_list
      23              :  * class functions as expected.
      24              :  */
      25              : 
      26              : // header begin tested
      27              : //
      28              : #include    "edhttp/parametrized_value_list.h"
      29              : 
      30              : 
      31              : // self
      32              : //
      33              : #include    "catch_main.h"
      34              : 
      35              : 
      36              : // edhttp
      37              : //
      38              : #include    "edhttp/exception.h"
      39              : #include    "edhttp/utils.h"
      40              : 
      41              : 
      42              : 
      43           31 : CATCH_TEST_CASE("parametrized_value_list", "[string]")
      44              : {
      45           31 :     CATCH_START_SECTION("parametrized_value_list: verify object, except parts")
      46              :     {
      47            3 :         edhttp::parametrized_value_list locale("en");
      48              : 
      49              :         // no error occurred
      50              :         //
      51            1 :         CATCH_REQUIRE(locale.error_messages().empty());
      52              : 
      53              :         // original string does not change
      54              :         //
      55            1 :         CATCH_REQUIRE(locale.get_string() == "en");
      56              : 
      57              :         // get_level() with correct and wrong names
      58              :         //
      59            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::DEFAULT_LEVEL()));
      60            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
      61              : 
      62              :         // convert back to a string
      63              :         //
      64            1 :         CATCH_REQUIRE(locale.to_string() == "en");
      65            1 :     }
      66           32 :     CATCH_END_SECTION()
      67              : 
      68           31 :     CATCH_START_SECTION("parametrized_value_list: verify parts")
      69              :     {
      70            3 :         edhttp::parametrized_value_list locale("en");
      71              : 
      72              :         // make sure the result is 1 part
      73              :         //
      74            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
      75            1 :         CATCH_REQUIRE(p.size() == 1);
      76              : 
      77              :         // also get the constant version
      78              :         //
      79            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
      80            1 :         CATCH_REQUIRE(pc.size() == 1);
      81              : 
      82              :         // now verify that the part is correct
      83              :         //
      84            1 :         CATCH_REQUIRE(p[0].get_name() == "en");
      85            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
      86            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
      87            1 :         std::int64_t i(123);
      88            3 :         CATCH_REQUIRE_FALSE(p[0].get_parameter_as_integer("test", i));
      89            1 :         CATCH_REQUIRE(i == 123);
      90            1 :         CATCH_REQUIRE(p[0].to_string() == "en");
      91            1 :     }
      92           32 :     CATCH_END_SECTION()
      93              : 
      94           31 :     CATCH_START_SECTION("parametrized_value_list: verify weights top functions")
      95              :     {
      96            3 :         edhttp::parametrized_value_list locale("en-US,en;q=0.8,fr-FR;q= 0.5,fr;q =0.3", true);
      97              : //std::cerr << "--- errors? \"" << locale.error_messages() << "\"...\n";
      98              : 
      99              :         // no error occurred
     100              :         //
     101            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     102              : 
     103              :         // original string does not change
     104              :         //
     105            1 :         CATCH_REQUIRE(locale.get_string() == "en-US,en;q=0.8,fr-FR;q= 0.5,fr;q =0.3");
     106              : 
     107              :         // get_level() with correct and wrong names
     108              :         //
     109            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en-US"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     110            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"),    0.8f));
     111            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr-FR"), 0.5f));
     112            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"),    0.3f));
     113              : 
     114              :         // convert back to a string
     115              :         //
     116            1 :         CATCH_REQUIRE(locale.to_string() == "en-US, en; q=0.8, fr-FR; q=0.5, fr; q=0.3");
     117            1 :     }
     118           32 :     CATCH_END_SECTION()
     119              : 
     120           31 :     CATCH_START_SECTION("parametrized_value_list: verify weight parts")
     121              :     {
     122            3 :         edhttp::parametrized_value_list locale("en-US,en;q=\"0.8\",fr-FR;q=0.5,fr;q=0.3");
     123              : 
     124              :         // make sure the result is 4 parts
     125              :         //
     126            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     127            1 :         CATCH_REQUIRE(p.size() == 4);
     128              : 
     129              :         // also get the constant version
     130              :         //
     131            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
     132            1 :         CATCH_REQUIRE(pc.size() == 4);
     133              : 
     134              :         // now verify that the parts are correct
     135              :         //
     136            1 :         CATCH_REQUIRE(p[0].get_name() == "en-US");
     137            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     138            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     139            1 :         CATCH_REQUIRE(p[0].to_string() == "en-US");
     140              : 
     141            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     142            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), 0.8f));
     143            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     144            1 :         CATCH_REQUIRE(p[1].to_string() == "en; q=0.8");
     145              : 
     146            1 :         CATCH_REQUIRE(p[2].get_name() == "fr-FR");
     147            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), 0.5f));
     148            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     149            1 :         CATCH_REQUIRE(p[2].to_string() == "fr-FR; q=0.5");
     150              : 
     151            1 :         CATCH_REQUIRE(p[3].get_name() == "fr");
     152            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[3].get_level(), 0.3f));
     153            3 :         CATCH_REQUIRE(p[3].get_parameter("test") == "");
     154            1 :         CATCH_REQUIRE(p[3].to_string() == "fr; q=0.3");
     155              : 
     156            1 :         CATCH_REQUIRE(pc[0].get_name() == "en-US");
     157            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     158            3 :         CATCH_REQUIRE(pc[0].get_parameter("test") == "");
     159            1 :         CATCH_REQUIRE(pc[0].to_string() == "en-US");
     160              : 
     161            1 :         CATCH_REQUIRE(pc[1].get_name() == "en");
     162            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[1].get_level(), 0.8f));
     163            3 :         CATCH_REQUIRE(pc[1].get_parameter("test") == "");
     164            1 :         CATCH_REQUIRE(pc[1].to_string() == "en; q=0.8");
     165              : 
     166            1 :         CATCH_REQUIRE(pc[2].get_name() == "fr-FR");
     167            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[2].get_level(), 0.5f));
     168            3 :         CATCH_REQUIRE(pc[2].get_parameter("test") == "");
     169            1 :         CATCH_REQUIRE(pc[2].to_string() == "fr-FR; q=0.5");
     170              : 
     171            1 :         CATCH_REQUIRE(pc[3].get_name() == "fr");
     172            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[3].get_level(), 0.3f));
     173            3 :         CATCH_REQUIRE(pc[3].get_parameter("test") == "");
     174            1 :         CATCH_REQUIRE(pc[3].to_string() == "fr; q=0.3");
     175            1 :     }
     176           32 :     CATCH_END_SECTION()
     177              : 
     178           31 :     CATCH_START_SECTION("parametrized_value_list: sort has no effect if weights are equal")
     179              :     {
     180            3 :         edhttp::parametrized_value_list locale("en-US,en;q=0.8, fr-FR ; q = \"0.5\" ,fr;q=0.3");
     181              : 
     182            1 :         locale.sort_by_level();
     183              : 
     184              :         // make sure the result is 3 parts
     185              :         //
     186            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     187            1 :         CATCH_REQUIRE(p.size() == 4);
     188              : 
     189              :         // now verify that the parts are correct
     190              :         //
     191            1 :         CATCH_REQUIRE(p[0].get_name() == "en-US");
     192            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     193            1 :         CATCH_REQUIRE(p[2].get_name() == "fr-FR");
     194            1 :         CATCH_REQUIRE(p[3].get_name() == "fr");
     195            1 :     }
     196           32 :     CATCH_END_SECTION()
     197              : 
     198           31 :     CATCH_START_SECTION("parametrized_value_list: verify object")
     199              :     {
     200            3 :         edhttp::parametrized_value_list locale("de, en, fr");
     201              : 
     202              :         // no error occurred
     203              :         //
     204            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     205              : 
     206              :         // original string does not change
     207              :         //
     208            1 :         CATCH_REQUIRE(locale.get_string() == "de, en, fr");
     209              : 
     210              :         // get_level() with correct and wrong names
     211              :         //
     212            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     213            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     214            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     215            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     216              : 
     217              :         // convert back to a string
     218              :         //
     219            1 :         CATCH_REQUIRE(locale.to_string() == "de, en, fr");
     220            1 :     }
     221           32 :     CATCH_END_SECTION()
     222              : 
     223           31 :     CATCH_START_SECTION("parametrized_value_list: verify part")
     224              :     {
     225            3 :         edhttp::parametrized_value_list locale("de, en, fr");
     226              : 
     227              :         // make sure the result is 3 parts
     228              :         //
     229            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     230            1 :         CATCH_REQUIRE(p.size() == 3);
     231              : 
     232              :         // also get the constant version
     233              :         //
     234            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
     235            1 :         CATCH_REQUIRE(pc.size() == 3);
     236              : 
     237              :         // now verify that the parts are correct
     238              :         //
     239            1 :         CATCH_REQUIRE(p[0].get_name() == "de");
     240            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     241            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     242            1 :         CATCH_REQUIRE(p[0].to_string() == "de");
     243              : 
     244            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     245            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     246            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     247            1 :         CATCH_REQUIRE(p[1].to_string() == "en");
     248              : 
     249            1 :         CATCH_REQUIRE(p[2].get_name() == "fr");
     250            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     251            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     252            1 :         CATCH_REQUIRE(p[2].to_string() == "fr");
     253              : 
     254            1 :         CATCH_REQUIRE(pc[0].get_name() == "de");
     255            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     256            3 :         CATCH_REQUIRE(pc[0].get_parameter("test") == "");
     257            1 :         CATCH_REQUIRE(pc[0].to_string() == "de");
     258              : 
     259            1 :         CATCH_REQUIRE(pc[1].get_name() == "en");
     260            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     261            3 :         CATCH_REQUIRE(pc[1].get_parameter("test") == "");
     262            1 :         CATCH_REQUIRE(pc[1].to_string() == "en");
     263              : 
     264            1 :         CATCH_REQUIRE(pc[2].get_name() == "fr");
     265            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     266            3 :         CATCH_REQUIRE(pc[2].get_parameter("test") == "");
     267            1 :         CATCH_REQUIRE(pc[2].to_string() == "fr");
     268            1 :     }
     269           32 :     CATCH_END_SECTION()
     270              : 
     271           31 :     CATCH_START_SECTION("parametrized_value_list: sort has no effect if weights are equal")
     272              :     {
     273            3 :         edhttp::parametrized_value_list locale("de, en, fr");
     274              : 
     275            1 :         locale.sort_by_level();
     276              : 
     277              :         // make sure the result is 3 parts
     278              :         //
     279            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     280            1 :         CATCH_REQUIRE(p.size() == 3);
     281              : 
     282              :         // now verify that the parts are correct
     283              :         //
     284            1 :         CATCH_REQUIRE(p[0].get_name() == "de");
     285            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     286            1 :         CATCH_REQUIRE(p[2].get_name() == "fr");
     287            1 :     }
     288           32 :     CATCH_END_SECTION()
     289              : 
     290           31 :     CATCH_START_SECTION("parametrized_value_list: verify object")
     291              :     {
     292            3 :         edhttp::parametrized_value_list locale("fr, za, en");
     293              : 
     294              :         // no error occurred
     295              :         //
     296            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     297              : 
     298              :         // original string does not change
     299              :         //
     300            1 :         CATCH_REQUIRE(locale.get_string() == "fr, za, en");
     301              : 
     302              :         // get_level() with correct and wrong names
     303              :         //
     304            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     305            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("za"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     306            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     307            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     308              : 
     309              :         // convert back to a string
     310              :         //
     311            1 :         CATCH_REQUIRE(locale.to_string() == "fr, za, en");
     312            1 :     }
     313           32 :     CATCH_END_SECTION()
     314              : 
     315           31 :     CATCH_START_SECTION("parametrized_value_list: verify part")
     316              :     {
     317            3 :         edhttp::parametrized_value_list locale("fr, za, en");
     318              : 
     319              :         // make sure the result is 3 parts
     320              :         //
     321            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     322            1 :         CATCH_REQUIRE(p.size() == 3);
     323              : 
     324              :         // also get the constant version
     325              :         //
     326            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
     327            1 :         CATCH_REQUIRE(pc.size() == 3);
     328              : 
     329              :         // now verify that the parts are correct
     330              :         //
     331            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     332            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     333            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     334            1 :         CATCH_REQUIRE(p[0].to_string() == "fr");
     335              : 
     336            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     337            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     338            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     339            1 :         CATCH_REQUIRE(p[1].to_string() == "za");
     340              : 
     341            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     342            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     343            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     344            1 :         CATCH_REQUIRE(p[2].to_string() == "en");
     345              : 
     346            1 :         CATCH_REQUIRE(pc[0].get_name() == "fr");
     347            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     348            3 :         CATCH_REQUIRE(pc[0].get_parameter("test") == "");
     349            1 :         CATCH_REQUIRE(pc[0].to_string() == "fr");
     350              : 
     351            1 :         CATCH_REQUIRE(pc[1].get_name() == "za");
     352            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     353            3 :         CATCH_REQUIRE(pc[1].get_parameter("test") == "");
     354            1 :         CATCH_REQUIRE(pc[1].to_string() == "za");
     355              : 
     356            1 :         CATCH_REQUIRE(pc[2].get_name() == "en");
     357            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     358            3 :         CATCH_REQUIRE(pc[2].get_parameter("test") == "");
     359            1 :         CATCH_REQUIRE(pc[2].to_string() == "en");
     360            1 :     }
     361           32 :     CATCH_END_SECTION()
     362              : 
     363           31 :     CATCH_START_SECTION("parametrized_value_list: sort has no effect if weights are equal")
     364              :     {
     365            3 :         edhttp::parametrized_value_list locale("fr, za, en");
     366              : 
     367            1 :         locale.sort_by_level();
     368              : 
     369              :         // make sure the result is 3 parts
     370              :         //
     371            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     372            1 :         CATCH_REQUIRE(p.size() == 3);
     373              : 
     374              :         // now verify that the parts are correct
     375              :         //
     376            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     377            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     378            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     379            1 :     }
     380           32 :     CATCH_END_SECTION()
     381              : 
     382           31 :     CATCH_START_SECTION("parametrized_value_list: verify object")
     383              :     {
     384            3 :         edhttp::parametrized_value_list locale("fr;q=0, za; q=0.6,en; q=0.4");
     385              : 
     386              :         // no error occurred
     387              :         //
     388            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     389              : 
     390              :         // original string does not change
     391              :         //
     392            1 :         CATCH_REQUIRE(locale.get_string() == "fr;q=0, za; q=0.6,en; q=0.4");
     393              : 
     394              :         // get_level() with correct and wrong names
     395              :         //
     396            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), 0.0f));
     397            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("za"), 0.6f));
     398            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), 0.4f));
     399            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     400              : 
     401              :         // convert back to a string
     402              :         //
     403            1 :         CATCH_REQUIRE(locale.to_string() == "fr; q=0, za; q=0.6, en; q=0.4");
     404            1 :     }
     405           32 :     CATCH_END_SECTION()
     406              : 
     407           31 :     CATCH_START_SECTION("parametrized_value_list: verify part after copy in non-const and in const")
     408              :     {
     409            3 :         edhttp::parametrized_value_list locale("fr;q=0, za; q=0.6,en; q=0.4");
     410              : 
     411              :         // make sure the result is 3 parts
     412              :         //
     413            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     414            1 :         CATCH_REQUIRE(p.size() == 3);
     415              : 
     416              :         // also get the constant version
     417              :         //
     418            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
     419            1 :         CATCH_REQUIRE(pc.size() == 3);
     420              : 
     421              :         // now verify that the parts are correct
     422              :         //
     423            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     424            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), 0.0f));
     425            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     426            1 :         CATCH_REQUIRE(p[0].to_string() == "fr; q=0");
     427              : 
     428            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     429            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), 0.6f));
     430            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     431            1 :         CATCH_REQUIRE(p[1].to_string() == "za; q=0.6");
     432              : 
     433            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     434            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), 0.4f));
     435            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     436            1 :         CATCH_REQUIRE(p[2].to_string() == "en; q=0.4");
     437              : 
     438            1 :         CATCH_REQUIRE(pc[0].get_name() == "fr");
     439            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[0].get_level(), 0.0f));
     440            3 :         CATCH_REQUIRE(pc[0].get_parameter("test") == "");
     441            1 :         CATCH_REQUIRE(pc[0].to_string() == "fr; q=0");
     442              : 
     443            1 :         CATCH_REQUIRE(pc[1].get_name() == "za");
     444            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[1].get_level(), 0.6f));
     445            3 :         CATCH_REQUIRE(pc[1].get_parameter("test") == "");
     446            1 :         CATCH_REQUIRE(pc[1].to_string() == "za; q=0.6");
     447              : 
     448            1 :         CATCH_REQUIRE(pc[2].get_name() == "en");
     449            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[2].get_level(), 0.4f));
     450            3 :         CATCH_REQUIRE(pc[2].get_parameter("test") == "");
     451            1 :         CATCH_REQUIRE(pc[2].to_string() == "en; q=0.4");
     452            1 :     }
     453           32 :     CATCH_END_SECTION()
     454              : 
     455           31 :     CATCH_START_SECTION("parametrized_value_list: sort by level (weight)")
     456              :     {
     457            3 :         edhttp::parametrized_value_list locale("fr;q=0, za; q=0.6,en; q=0.4");
     458              : 
     459            1 :         locale.sort_by_level();
     460              : 
     461              :         // make sure the result is 3 parts
     462              :         //
     463            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     464            1 :         CATCH_REQUIRE(p.size() == 3);
     465              : 
     466              :         // now verify that the parts are sorted by level
     467              :         //    "fr; q=0, za; q=0.6, en; q=0.4"
     468              :         //
     469            1 :         CATCH_REQUIRE(p[0].get_name() == "za");
     470            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     471            1 :         CATCH_REQUIRE(p[2].get_name() == "fr");
     472              : 
     473              :         // convert back to a string in the new order and with spaces
     474              :         //
     475            1 :         CATCH_REQUIRE(locale.to_string() == "za; q=0.6, en; q=0.4, fr; q=0");
     476            1 :     }
     477           32 :     CATCH_END_SECTION()
     478              : 
     479           31 :     CATCH_START_SECTION("parametrized_value_list: verify object")
     480              :     {
     481            3 :         edhttp::parametrized_value_list locale("  fr;  q=0,  za;  q=0.6,  en;  q=0.4  ");
     482              : 
     483              :         // no error occurred
     484              :         //
     485            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     486              : 
     487              :         // original string does not change
     488              :         //
     489            1 :         CATCH_REQUIRE(locale.get_string() == "  fr;  q=0,  za;  q=0.6,  en;  q=0.4  ");
     490              : 
     491              :         // get_level() with correct and wrong names
     492              :         //
     493            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), 0.0f));
     494            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("za"), 0.6f));
     495            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), 0.4f));
     496            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), -1.0f));
     497              : 
     498              :         // convert back to a string
     499              :         //
     500            1 :         CATCH_REQUIRE(locale.to_string() == "fr; q=0, za; q=0.6, en; q=0.4");
     501            1 :     }
     502           32 :     CATCH_END_SECTION()
     503              : 
     504           31 :     CATCH_START_SECTION("parametrized_value_list: verify part")
     505              :     {
     506            3 :         edhttp::parametrized_value_list locale("  fr;  q=0,  za;  q=0.6,  en;  q=0.4  ");
     507              : 
     508              :         // make sure the result is 3 parts
     509              :         //
     510            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     511            1 :         CATCH_REQUIRE(p.size() == 3);
     512              : 
     513              :         // also get the constant version
     514              :         //
     515            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
     516            1 :         CATCH_REQUIRE(pc.size() == 3);
     517              : 
     518              :         // now verify that the parts are correct
     519              :         //
     520            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     521            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), 0.0f));
     522            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     523            1 :         CATCH_REQUIRE(p[0].to_string() == "fr; q=0");
     524              : 
     525            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     526            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), 0.6f));
     527            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     528            1 :         CATCH_REQUIRE(p[1].to_string() == "za; q=0.6");
     529              : 
     530            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     531            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), 0.4f));
     532            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     533            1 :         CATCH_REQUIRE(p[2].to_string() == "en; q=0.4");
     534              : 
     535            1 :         CATCH_REQUIRE(pc[0].get_name() == "fr");
     536            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[0].get_level(), 0.0f));
     537            3 :         CATCH_REQUIRE(pc[0].get_parameter("test") == "");
     538            1 :         CATCH_REQUIRE(pc[0].to_string() == "fr; q=0");
     539              : 
     540            1 :         CATCH_REQUIRE(pc[1].get_name() == "za");
     541            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[1].get_level(), 0.6f));
     542            3 :         CATCH_REQUIRE(pc[1].get_parameter("test") == "");
     543            1 :         CATCH_REQUIRE(pc[1].to_string() == "za; q=0.6");
     544              : 
     545            1 :         CATCH_REQUIRE(pc[2].get_name() == "en");
     546            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[2].get_level(), 0.4f));
     547            3 :         CATCH_REQUIRE(pc[2].get_parameter("test") == "");
     548            1 :         CATCH_REQUIRE(pc[2].to_string() == "en; q=0.4");
     549            1 :     }
     550           32 :     CATCH_END_SECTION()
     551              : 
     552           31 :     CATCH_START_SECTION("parametrized_value_list: sort by level (weight)")
     553              :     {
     554            3 :         edhttp::parametrized_value_list locale("  fr;  q=0,  za;  q=0.6,  en;  q=0.4  ");
     555              : 
     556            1 :         locale.sort_by_level();
     557              : 
     558              :         // make sure the result is 3 parts
     559              :         //
     560            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     561            1 :         CATCH_REQUIRE(p.size() == 3);
     562              : 
     563              :         // now verify that the parts are sorted by level
     564              :         //
     565            1 :         CATCH_REQUIRE(p[0].get_name() == "za");
     566            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     567            1 :         CATCH_REQUIRE(p[2].get_name() == "fr");
     568            1 :     }
     569           32 :     CATCH_END_SECTION()
     570              : 
     571           31 :     CATCH_START_SECTION("parametrized_value_list: verify object")
     572              :     {
     573            3 :         edhttp::parametrized_value_list locale("  fr;  q=0,  za,  en;  q=0.4  ,es;q=1.0");
     574              : 
     575              :         // no error occurred
     576              :         //
     577            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     578              : 
     579              :         // original string does not change
     580              :         //
     581            1 :         CATCH_REQUIRE(locale.get_string() == "  fr;  q=0,  za,  en;  q=0.4  ,es;q=1.0");
     582              : 
     583              :         // get_level() with correct and wrong names
     584              :         //
     585            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), 0.0f));
     586            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("za"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     587            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), 0.4f));
     588            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), 1.0f));
     589            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), -1.0f));
     590              : 
     591              :         // convert back to a string
     592              :         //
     593            1 :         CATCH_REQUIRE(locale.to_string() == "fr; q=0, za, en; q=0.4, es; q=1.0");
     594            1 :     }
     595           32 :     CATCH_END_SECTION()
     596              : 
     597           31 :     CATCH_START_SECTION("parametrized_value_list: verify part")
     598              :     {
     599            3 :         edhttp::parametrized_value_list locale("  fr;  q=0,  za,  en;  q=0.4  ,es;q=1.0");
     600              : 
     601              :         // make sure the result is 3 parts
     602              :         //
     603            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     604            1 :         CATCH_REQUIRE(p.size() == 4);
     605              : 
     606              :         // also get the constant version
     607              :         //
     608            1 :         edhttp::parametrized_value::vector_t const & pc(locale.get_parts());
     609            1 :         CATCH_REQUIRE(pc.size() == 4);
     610              : 
     611              :         // now verify that the parts are correct
     612              :         //
     613            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     614            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), 0.0f));
     615            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     616            1 :         CATCH_REQUIRE(p[0].to_string() == "fr; q=0");
     617              : 
     618            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     619            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     620            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     621            1 :         CATCH_REQUIRE(p[1].to_string() == "za");
     622              : 
     623            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     624            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), 0.4f));
     625            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     626            1 :         CATCH_REQUIRE(p[2].to_string() == "en; q=0.4");
     627              : 
     628            1 :         CATCH_REQUIRE(p[3].get_name() == "es");
     629            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[3].get_level(), 1.0f));
     630            3 :         CATCH_REQUIRE(p[3].get_parameter("test") == "");
     631            1 :         CATCH_REQUIRE(p[3].to_string() == "es; q=1.0");
     632              : 
     633            1 :         CATCH_REQUIRE(pc[0].get_name() == "fr");
     634            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[0].get_level(), 0.0f));
     635            3 :         CATCH_REQUIRE(pc[0].get_parameter("test") == "");
     636            1 :         CATCH_REQUIRE(pc[0].to_string() == "fr; q=0");
     637              : 
     638            1 :         CATCH_REQUIRE(pc[1].get_name() == "za");
     639            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     640            3 :         CATCH_REQUIRE(pc[1].get_parameter("test") == "");
     641            1 :         CATCH_REQUIRE(pc[1].to_string() == "za");
     642              : 
     643            1 :         CATCH_REQUIRE(pc[2].get_name() == "en");
     644            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(pc[2].get_level(), 0.4f));
     645            3 :         CATCH_REQUIRE(pc[2].get_parameter("test") == "");
     646            1 :         CATCH_REQUIRE(pc[2].to_string() == "en; q=0.4");
     647              : 
     648            1 :         CATCH_REQUIRE(p[3].get_name() == "es");
     649            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[3].get_level(), 1.0f));
     650            3 :         CATCH_REQUIRE(p[3].get_parameter("test") == "");
     651            1 :         CATCH_REQUIRE(p[3].to_string() == "es; q=1.0");
     652            1 :     }
     653           32 :     CATCH_END_SECTION()
     654              : 
     655           31 :     CATCH_START_SECTION("parametrized_value_list: sort by level (weight)")
     656              :     {
     657            3 :         edhttp::parametrized_value_list locale("  fr;  q=0,  za,  en;  q=0.4  ,es;q=1.0");
     658              : 
     659            1 :         locale.sort_by_level();
     660              : 
     661              :         // make sure the result is 3 parts
     662              :         //
     663            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     664            1 :         CATCH_REQUIRE(p.size() == 4);
     665              : 
     666              :         // now verify that the parts are sorted by level
     667              :         //
     668            1 :         CATCH_REQUIRE(p[0].get_name() == "za");
     669            1 :         CATCH_REQUIRE(p[1].get_name() == "es");
     670            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     671            1 :         CATCH_REQUIRE(p[3].get_name() == "fr");
     672            1 :     }
     673           32 :     CATCH_END_SECTION()
     674              : 
     675           31 :     CATCH_START_SECTION("parametrized_value_list: verify object")
     676              :     {
     677            3 :         edhttp::parametrized_value_list locale("de");
     678              : 
     679              :         // no error occurred
     680              :         //
     681            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     682              : 
     683              :         // original string does not change
     684              :         //
     685            1 :         CATCH_REQUIRE(locale.get_string() == "de");
     686              : 
     687              :         // get_level() with correct and wrong names
     688              :         //
     689            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     690            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     691            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     692            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     693              : 
     694              :         // convert back to a string
     695              :         //
     696            1 :         CATCH_REQUIRE(locale.to_string() == "de");
     697              : 
     698              :         // make sure the result is 1 part
     699              :         //
     700            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     701            1 :         CATCH_REQUIRE(p.size() == 1);
     702              : 
     703              :         // now verify that the parts are correct
     704              :         //
     705            1 :         CATCH_REQUIRE(p[0].get_name() == "de");
     706            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     707            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     708            1 :         CATCH_REQUIRE(p[0].to_string() == "de");
     709            1 :     }
     710           32 :     CATCH_END_SECTION()
     711              : 
     712           31 :     CATCH_START_SECTION("parametrized_value_list: add \"en\"")
     713              :     {
     714            3 :         edhttp::parametrized_value_list locale("de");
     715              : 
     716              :         // the parse is expected to work (return true)
     717              :         //
     718            3 :         CATCH_REQUIRE(locale.parse("en"));
     719              : 
     720              :         // no error occurred
     721              :         //
     722            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     723              : 
     724              :         // original string does not change
     725              :         //
     726            1 :         CATCH_REQUIRE(locale.get_string() == "de,en");
     727              : 
     728              :         // get_level() with correct and wrong names
     729              :         //
     730            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     731            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     732            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     733            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     734              : 
     735              :         // convert back to a string
     736              :         //
     737            1 :         CATCH_REQUIRE(locale.to_string() == "de, en");
     738              : 
     739              :         // make sure the result is 2 parts
     740              :         //
     741            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     742            1 :         CATCH_REQUIRE(p.size() == 2);
     743              : 
     744              :         // now verify that the parts are correct
     745              :         //
     746            1 :         CATCH_REQUIRE(p[0].get_name() == "de");
     747            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     748            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     749            1 :         CATCH_REQUIRE(p[0].to_string() == "de");
     750              : 
     751            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     752            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     753            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     754            1 :         CATCH_REQUIRE(p[1].to_string() == "en");
     755            1 :     }
     756           32 :     CATCH_END_SECTION()
     757              : 
     758           31 :     CATCH_START_SECTION("parametrized_value_list: add \"en\" and then \"fr\"")
     759              :     {
     760            3 :         edhttp::parametrized_value_list locale("de");
     761              : 
     762              :         // the parse is expected to work (return true)
     763              :         //
     764            3 :         CATCH_REQUIRE(locale.parse("en"));
     765            3 :         CATCH_REQUIRE(locale.parse("fr"));
     766              : 
     767              :         // no error occurred
     768              :         //
     769            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     770              : 
     771              :         // original string does not change
     772              :         //
     773            1 :         CATCH_REQUIRE(locale.get_string() == "de,en,fr");
     774              : 
     775              :         // get_level() with correct and wrong names
     776              :         //
     777            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     778            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     779            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     780            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     781              : 
     782              :         // convert back to a string
     783              :         //
     784            1 :         CATCH_REQUIRE(locale.to_string() == "de, en, fr");
     785              : 
     786              :         // make sure the result is 3 parts
     787              :         //
     788            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     789            1 :         CATCH_REQUIRE(p.size() == 3);
     790              : 
     791              :         // now verify that the parts are correct
     792              :         //
     793            1 :         CATCH_REQUIRE(p[0].get_name() == "de");
     794            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     795            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     796            1 :         CATCH_REQUIRE(p[0].to_string() == "de");
     797              : 
     798            1 :         CATCH_REQUIRE(p[1].get_name() == "en");
     799            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     800            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     801            1 :         CATCH_REQUIRE(p[1].to_string() == "en");
     802              : 
     803            1 :         CATCH_REQUIRE(p[2].get_name() == "fr");
     804            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     805            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     806            1 :         CATCH_REQUIRE(p[2].to_string() == "fr");
     807            1 :     }
     808           32 :     CATCH_END_SECTION()
     809              : 
     810           31 :     CATCH_START_SECTION("parametrized_value_list: replace with \"mo\"")
     811              :     {
     812            3 :         edhttp::parametrized_value_list locale("de");
     813              : 
     814              :         // the parser is expected to work (return true)
     815              :         //
     816            3 :         CATCH_REQUIRE(locale.parse("  mo  ", true, true));
     817              : 
     818              :         // no error occurred
     819              :         //
     820            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     821              : 
     822              :         // original string does not change
     823              :         //
     824            1 :         CATCH_REQUIRE(locale.get_string() == "  mo  ");
     825              : 
     826              :         // get_level() with correct and wrong names
     827              :         //
     828            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("mo"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     829            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     830            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     831            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     832              : 
     833              :         // convert back to a string
     834              :         //
     835            1 :         CATCH_REQUIRE(locale.to_string() == "mo");
     836              : 
     837              :         // make sure the result is 1 part
     838              :         //
     839            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     840            1 :         CATCH_REQUIRE(p.size() == 1);
     841              : 
     842              :         // now verify that the parts are correct
     843              :         //
     844            1 :         CATCH_REQUIRE(p[0].get_name() == "mo");
     845            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     846            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     847            1 :         CATCH_REQUIRE(p[0].to_string() == "mo");
     848            1 :     }
     849           32 :     CATCH_END_SECTION()
     850              : 
     851           31 :     CATCH_START_SECTION("parametrized_value_list: set parameters with a value")
     852              :     {
     853            3 :         edhttp::parametrized_value_list locale("de=123");
     854            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     855            1 :         CATCH_REQUIRE(locale.get_string() == "de=123");
     856            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("mo"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     857            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     858            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     859            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     860            1 :         CATCH_REQUIRE(locale.to_string() == "de=123");
     861              : 
     862            3 :         bool reset(locale.parse("  mo  =  \"555\"  ", false, true));
     863            1 :         CATCH_REQUIRE(reset);
     864            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     865            1 :         CATCH_REQUIRE(locale.get_string() == "  mo  =  \"555\"  ");
     866            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("mo"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     867            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     868            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     869            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     870            1 :         CATCH_REQUIRE(locale.to_string() == "mo=555");
     871              : 
     872            3 :         CATCH_REQUIRE(locale.parse("  en  =  \"  555  \"  ", false, true));
     873            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     874            1 :         CATCH_REQUIRE(locale.get_string() == "  en  =  \"  555  \"  ");
     875            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("mo"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     876            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     877            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     878            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     879            1 :         CATCH_REQUIRE(locale.to_string() == "en=\"  555  \"");
     880              : 
     881            3 :         CATCH_REQUIRE(locale.parse("  es  =  555  ", false, true));
     882            1 :         CATCH_REQUIRE(locale.error_messages().empty());
     883            1 :         CATCH_REQUIRE(locale.get_string() == "  es  =  555  ");
     884            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("mo"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     885            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("en"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     886            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("de"), edhttp::parametrized_value::UNDEFINED_LEVEL()));
     887            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("es"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     888            1 :         CATCH_REQUIRE(locale.to_string() == "es=555");
     889            1 :     }
     890           32 :     CATCH_END_SECTION()
     891              : 
     892           31 :     CATCH_START_SECTION("parametrized_value_list: verify multiple parts")
     893              :     {
     894            3 :         edhttp::parametrized_value_list locale("fr;q=0;r=3.2;z=fancy, za; q = 0.6 ; h = \"angry\" ; object = \"color of the wand\",en; f=0.4");
     895              : 
     896              :         // make sure the result is 3 parts
     897              :         //
     898            1 :         edhttp::parametrized_value::vector_t const & p(locale.get_parts());
     899            1 :         CATCH_REQUIRE(p.size() == 3);
     900              : 
     901              :         // now verify that the parts are correct
     902              :         //
     903            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     904            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     905            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), 0.0f));
     906            3 :         CATCH_REQUIRE(p[0].get_parameter("r") == "3.2");
     907            3 :         CATCH_REQUIRE(p[0].get_parameter("z") == "fancy");
     908            1 :         double d(-1.0);
     909            3 :         CATCH_REQUIRE_FALSE(p[0].get_parameter_as_floating_point("z", d));
     910            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(d, -1.0));
     911            3 :         CATCH_REQUIRE_FALSE(p[0].get_parameter_as_floating_point("unknown", d));
     912            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(d, -1.0));
     913            1 :         CATCH_REQUIRE(p[0].to_string() == "fr; q=0; r=3.2; z=fancy");
     914              : 
     915            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     916            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     917            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), 0.6f));
     918            3 :         CATCH_REQUIRE(p[1].get_parameter("h") == "angry");
     919            3 :         CATCH_REQUIRE(p[1].get_parameter("object") == "color of the wand");
     920            1 :         CATCH_REQUIRE(p[1].to_string() == "za; h=angry; object=\"color of the wand\"; q=0.6");
     921              : 
     922            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     923            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     924            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     925            3 :         CATCH_REQUIRE(p[2].get_parameter("f") == "0.4");
     926            1 :         CATCH_REQUIRE(p[2].to_string() == "en; f=0.4");
     927            1 :     }
     928           32 :     CATCH_END_SECTION()
     929              : 
     930           31 :     CATCH_START_SECTION("parametrized_value_list: verify other quotation requirements")
     931              :     {
     932            3 :         edhttp::parametrized_value_list locale("fr=francais;q=0;r=3.2;z=\"c'est necessaire\",,, za=\"South Africa\"; q = 0.6 ; h = \"angry\" ; object = \"color of the wand\",en; f=0.4; cute=\"girls \\\"are\\\" dancing\"");
     933              : 
     934              :         // make sure the result is 3 parts
     935              :         //
     936            1 :         edhttp::parametrized_value::vector_t & p(locale.get_parts());
     937            1 :         CATCH_REQUIRE(p.size() == 3);
     938              : 
     939            1 :         double d(-1.0);
     940              : 
     941              :         // now verify that the parts are correct
     942              :         //
     943            1 :         CATCH_REQUIRE(p[0].get_name() == "fr");
     944            1 :         CATCH_REQUIRE(p[0].get_value() == "francais");
     945            3 :         CATCH_REQUIRE(p[0].get_parameter("test") == "");
     946            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), 0.0f));
     947            1 :         p[0].set_level(0.5f);
     948            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[0].get_level(), 0.5f));
     949            3 :         CATCH_REQUIRE(p[0].get_parameter("r") == "3.2");
     950            3 :         CATCH_REQUIRE(p[0].get_parameter_as_floating_point("r", d));
     951            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(d, 3.2));
     952            3 :         CATCH_REQUIRE(p[0].get_parameter("z") == "c'est necessaire");
     953            1 :         CATCH_REQUIRE(p[0].to_string() == "fr=francais; q=0; r=3.2; z=\"c'est necessaire\"");
     954              : 
     955            1 :         CATCH_REQUIRE(p[1].get_name() == "za");
     956            1 :         CATCH_REQUIRE(p[1].get_value() == "South Africa");
     957            3 :         CATCH_REQUIRE(p[1].get_parameter("test") == "");
     958            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[1].get_level(), 0.6f));
     959            3 :         CATCH_REQUIRE(p[1].get_parameter_as_floating_point("q", d));
     960            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(d, 0.6));
     961            3 :         CATCH_REQUIRE(p[1].get_parameter("h") == "angry");
     962            3 :         CATCH_REQUIRE(p[1].get_parameter("object") == "color of the wand");
     963            1 :         CATCH_REQUIRE(p[1].to_string() == "za=\"South Africa\"; h=angry; object=\"color of the wand\"; q=0.6");
     964              : 
     965            1 :         CATCH_REQUIRE(p[2].get_name() == "en");
     966            3 :         CATCH_REQUIRE(p[2].get_parameter("test") == "");
     967            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(p[2].get_level(), edhttp::parametrized_value::DEFAULT_LEVEL()));
     968            3 :         CATCH_REQUIRE(p[2].get_parameter("f") == "0.4");
     969            3 :         CATCH_REQUIRE(p[2].get_parameter_as_floating_point("f", d));
     970            1 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(d, 0.4));
     971            3 :         CATCH_REQUIRE(p[2].get_parameter("cute") == "girls \"are\" dancing");
     972            1 :         CATCH_REQUIRE(p[2].to_string() == "en; cute=\"girls \\\"are\\\" dancing\"; f=0.4");
     973              : 
     974              :         //std::int64_t value(-1);
     975              :         //CATCH_REQUIRE(p->has_parameter("q"));
     976              :         //CATCH_REQUIRE(p->get_parameter("q") == "joke");
     977              :         //CATCH_REQUIRE_FALSE(p->get_parameter_as_integer("q", value));
     978              :         //CATCH_REQUIRE(value == -1);
     979            1 :     }
     980           32 :     CATCH_END_SECTION()
     981              : 
     982           31 :     CATCH_START_SECTION("parametrized_value_list: negative quality is not accepted as such (ignored)")
     983              :     {
     984            1 :         edhttp::parametrized_value_list locale;
     985              : 
     986            3 :         CATCH_REQUIRE(locale.parse("fr-FR;q=-1.0"));
     987              : 
     988            1 :         CATCH_REQUIRE(locale.error_messages() == "");
     989            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr-FR"), edhttp::parametrized_value::DEFAULT_LEVEL()));
     990            1 :     }
     991           32 :     CATCH_END_SECTION()
     992              : 
     993           31 :     CATCH_START_SECTION("parametrized_value_list: quality must be a valid floating point (ignored)")
     994              :     {
     995            1 :         edhttp::parametrized_value_list locale;
     996              : 
     997            3 :         CATCH_REQUIRE(locale.parse("fr-FR;q=joke"));
     998              : 
     999            1 :         CATCH_REQUIRE(locale.error_messages() == "");
    1000            3 :         CATCH_REQUIRE(SNAP_CATCH2_NAMESPACE::nearly_equal(locale.get_level("fr-FR"), edhttp::parametrized_value::DEFAULT_LEVEL()));
    1001              : 
    1002            3 :         edhttp::parametrized_value * p(locale.get_part("fr-FR"));
    1003            1 :         std::int64_t value(-1);
    1004            3 :         CATCH_REQUIRE(p->has_parameter("q"));
    1005            3 :         CATCH_REQUIRE(p->get_parameter("q") == "joke");
    1006            3 :         CATCH_REQUIRE_FALSE(p->get_parameter_as_integer("q", value));
    1007            1 :         CATCH_REQUIRE(value == -1);
    1008              : 
    1009            3 :         p = locale.get_part("en-AU");
    1010            1 :         CATCH_REQUIRE(p == nullptr);
    1011            1 :     }
    1012           32 :     CATCH_END_SECTION()
    1013              : 
    1014           31 :     CATCH_START_SECTION("parametrized_value_list: retrieve an integer")
    1015              :     {
    1016            1 :         edhttp::parametrized_value_list alt_svc;
    1017              : 
    1018            3 :         CATCH_REQUIRE(alt_svc.parse("h3=\":443\"; ma=86400"));
    1019              : 
    1020            1 :         CATCH_REQUIRE(alt_svc.error_messages() == "");
    1021            3 :         edhttp::parametrized_value * p(alt_svc.get_part("h3"));
    1022            1 :         CATCH_REQUIRE(p != nullptr);
    1023            1 :         CATCH_REQUIRE(p->get_name() == "h3");
    1024            1 :         CATCH_REQUIRE(p->get_value() == ":443");
    1025            3 :         CATCH_REQUIRE(p->get_parameter("ma") == "86400");
    1026            1 :         std::int64_t value(-1);
    1027            3 :         CATCH_REQUIRE(p->has_parameter("ma"));
    1028            3 :         CATCH_REQUIRE(p->get_parameter_as_integer("ma", value));
    1029            1 :         CATCH_REQUIRE(value == 86400);
    1030            3 :         CATCH_REQUIRE_FALSE(p->has_parameter("persist"));
    1031            1 :     }
    1032           32 :     CATCH_END_SECTION()
    1033              : 
    1034           31 :     CATCH_START_SECTION("parametrized_value_list: use a name with a %XX character")
    1035              :     {
    1036            1 :         edhttp::parametrized_value_list alt_svc;
    1037              : 
    1038            3 :         CATCH_REQUIRE(alt_svc.parse("%5Bh3%5D=\":443\"; ma=86400"));
    1039              : 
    1040            1 :         CATCH_REQUIRE(alt_svc.error_messages() == "");
    1041            3 :         edhttp::parametrized_value * p(alt_svc.get_part("%5Bh3%5D"));
    1042            1 :         CATCH_REQUIRE(p != nullptr);
    1043            1 :         CATCH_REQUIRE(p->get_name() == "%5Bh3%5D");
    1044            1 :         std::string decoded_name;
    1045            1 :         CATCH_REQUIRE(edhttp::decode_percents(p->get_name(), decoded_name)); // for an alt-svc, decoding %XX is expected
    1046            1 :         CATCH_REQUIRE(decoded_name == "[h3]");
    1047            1 :         CATCH_REQUIRE(p->get_value() == ":443");
    1048            3 :         CATCH_REQUIRE(p->get_parameter("ma") == "86400");
    1049            1 :         std::int64_t value(-1);
    1050            3 :         CATCH_REQUIRE(p->has_parameter("ma"));
    1051            3 :         CATCH_REQUIRE(p->get_parameter_as_integer("ma", value));
    1052            1 :         CATCH_REQUIRE(value == 86400);
    1053            3 :         CATCH_REQUIRE_FALSE(p->has_parameter("persist"));
    1054            1 :     }
    1055           32 :     CATCH_END_SECTION()
    1056           31 : }
    1057              : 
    1058              : 
    1059            8 : CATCH_TEST_CASE("invalid_parametrized_value_list", "[invalid][string]")
    1060              : {
    1061              :     //CATCH_START_SECTION("invalid_parametrized_value_list: main name too long")
    1062              :     //{
    1063              :     //    edhttp::parametrized_value_list locale;
    1064              :     //
    1065              :     //    CATCH_REQUIRE_FALSE(locale.parse("deutsch_ist_zu-schwierig"));
    1066              :     //
    1067              :     //    CATCH_REQUIRE(locale.error_messages() == "part name is empty or too long (limit is '8-8' characters).\n");
    1068              :     //}
    1069              :     //CATCH_END_SECTION()
    1070              : 
    1071              :     //CATCH_START_SECTION("invalid_parametrized_value_list: sub-name too long")
    1072              :     //{
    1073              :     //    edhttp::parametrized_value_list locale;
    1074              :     //
    1075              :     //    CATCH_REQUIRE_FALSE(locale.parse("deutsch-ist_zu_schwierig"));
    1076              :     //
    1077              :     //    CATCH_REQUIRE(locale.error_messages() == "part sub-name is empty or too long (limit is '8-8' characters).\n");
    1078              :     //}
    1079              :     //CATCH_END_SECTION()
    1080              : 
    1081              :     //CATCH_START_SECTION("invalid_parametrized_value_list: too many dashes in part name")
    1082              :     //{
    1083              :     //    edhttp::parametrized_value_list locale;
    1084              :     //
    1085              :     //    CATCH_REQUIRE_FALSE(locale.parse("deutsch-ist-zu-schwierig"));
    1086              :     //
    1087              :     //    CATCH_REQUIRE(locale.error_messages() == "part name cannot include more than one '-'.\n");
    1088              :     //}
    1089              :     //CATCH_END_SECTION()
    1090              : 
    1091            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: spurious data")
    1092              :     {
    1093            1 :         edhttp::parametrized_value_list locale;
    1094              : 
    1095            3 :         CATCH_REQUIRE_FALSE(locale.parse("fr-FR;joke=\"it is\" not", true));
    1096              : 
    1097            1 :         CATCH_REQUIRE(locale.error_messages() == "item's parameters must be separated by semicolon.\n");
    1098            1 :     }
    1099            9 :     CATCH_END_SECTION()
    1100              : 
    1101            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: expected value separator (,) or EOS")
    1102              :     {
    1103            1 :         edhttp::parametrized_value_list locale;
    1104              : 
    1105              :         // TODO: the space should not be require to get the error?
    1106              :         //       except that the `|` character is allowed in tokens
    1107              :         //
    1108              :         //CATCH_REQUIRE_FALSE(locale.parse("fr-FR|"));
    1109              :         //CATCH_REQUIRE(locale.error_messages() == "item not ended properly.\n");
    1110              : 
    1111            3 :         CATCH_REQUIRE_FALSE(locale.parse("fr-FR |"));
    1112            1 :         CATCH_REQUIRE(locale.error_messages() == "item not ended properly.\n");
    1113            1 :     }
    1114            9 :     CATCH_END_SECTION()
    1115              : 
    1116            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: missing closing quote")
    1117              :     {
    1118            1 :         edhttp::parametrized_value_list locale;
    1119              : 
    1120            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3=\":443"));
    1121              : 
    1122            1 :         CATCH_REQUIRE(locale.error_messages() == "closing quote missing.\n");
    1123            1 :     }
    1124            9 :     CATCH_END_SECTION()
    1125              : 
    1126            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: quoted string ends with a backslash and not closing quote")
    1127              :     {
    1128            1 :         edhttp::parametrized_value_list locale;
    1129              : 
    1130            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3=\":443\\"));
    1131              : 
    1132            1 :         CATCH_REQUIRE(locale.error_messages() == "unexpected standalone backslash at the end of a quoted string.\n");
    1133            1 :     }
    1134            9 :     CATCH_END_SECTION()
    1135              : 
    1136            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: quoted string ends with a backslash and not closing quote")
    1137              :     {
    1138            1 :         edhttp::parametrized_value_list locale;
    1139              : 
    1140            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3?=\":443\""));
    1141              : 
    1142            1 :         CATCH_REQUIRE(locale.error_messages() == "a parameter name must be a valid HTTP token.\n"
    1143              :                                                  "unexpected token, skipping to next item.\n");
    1144            1 :     }
    1145            9 :     CATCH_END_SECTION()
    1146              : 
    1147            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: quoted string ends with a backslash and not closing quote")
    1148              :     {
    1149            1 :         edhttp::parametrized_value_list locale;
    1150              : 
    1151            3 :         CATCH_REQUIRE_FALSE(locale.parse("\":443\""));
    1152              : 
    1153            1 :         CATCH_REQUIRE(locale.error_messages() == "unexpected token, skipping to next item.\n");
    1154            1 :     }
    1155            9 :     CATCH_END_SECTION()
    1156              : 
    1157            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: invalid / unexpected tokens")
    1158              :     {
    1159            1 :         edhttp::parametrized_value_list locale;
    1160              : 
    1161            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3 = [token]"));
    1162            1 :         CATCH_REQUIRE(locale.error_messages() == "a parameter name must be a valid HTTP token.\n");
    1163              : 
    1164            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3 = ; missing = value"));
    1165            1 :         CATCH_REQUIRE(locale.error_messages() == "unexpected token (59) after the = sign.\n"
    1166              :                                                  "unexpected token, skipping to next item.\n");
    1167              : 
    1168            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3 = 123; color = [token]"));
    1169            1 :         CATCH_REQUIRE(locale.error_messages() == "a parameter name must be a valid HTTP token.\n"
    1170              :                                                  "unexpected token after the = sign to assign a parameter's value.\n");
    1171              : 
    1172            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3 = 123;; color = blue"));
    1173            1 :         CATCH_REQUIRE(locale.error_messages() == "unexpected token in an item list of parameters.\n"
    1174              :                                                  "unexpected token, skipping to next item.\n");
    1175              : 
    1176            3 :         CATCH_REQUIRE_FALSE(locale.parse("h3 = 123; color += 0x550022"));
    1177            1 :         CATCH_REQUIRE(locale.error_messages() == "item parameter \"color\" must be assigned a value.\n");
    1178            1 :     }
    1179            9 :     CATCH_END_SECTION()
    1180              : 
    1181            8 :     CATCH_START_SECTION("invalid_parametrized_value_list: quoted string with obs-text characters")
    1182              :     {
    1183            1 :         edhttp::parametrized_value_list locale;
    1184              : 
    1185           32 :         for(int i(0x01); i <= 0x1F; ++i)
    1186              :         {
    1187           31 :             if(i == '\t')
    1188              :             {
    1189            1 :                 continue;
    1190              :             }
    1191           90 :             std::string header("h3=\"example.com:44");
    1192           30 :             header += static_cast<char>(i);
    1193           30 :             header += '"';
    1194           30 :             CATCH_REQUIRE_FALSE(locale.parse(header));
    1195              : 
    1196           30 :             CATCH_REQUIRE(locale.error_messages() == "invalid character in quoted string.\n");
    1197           30 :         }
    1198              : 
    1199              :         {
    1200            3 :             std::string header("h3=\"example.com:44");
    1201            1 :             header += static_cast<char>(0x7F);
    1202            1 :             header += '"';
    1203            1 :             CATCH_REQUIRE_FALSE(locale.parse(header));
    1204              : 
    1205            1 :             CATCH_REQUIRE(locale.error_messages() == "invalid character in quoted string.\n");
    1206            1 :         }
    1207              : 
    1208          129 :         for(int i(0x80); i <= 0xFF; ++i)
    1209              :         {
    1210          384 :             std::string header("h3=\"example.com:44");
    1211          128 :             header += static_cast<char>(i);
    1212          128 :             header += '"';
    1213          128 :             CATCH_REQUIRE_FALSE(locale.parse(header));
    1214              : 
    1215          128 :             CATCH_REQUIRE(locale.error_messages() == "invalid character in quoted string.\n");
    1216          128 :         }
    1217            1 :     }
    1218            9 :     CATCH_END_SECTION()
    1219            8 : }
    1220              : 
    1221              : 
    1222              : //CATCH_TEST_CASE("invalid_parametrized_value", "[invalid][string]")
    1223              : //{
    1224              : //    CATCH_START_SECTION("invalid_parametrized_value: part value includes ' and \"")
    1225              : //    {
    1226              : //        edhttp::parametrized_value p("invalid");
    1227              : //        CATCH_REQUIRE(p.get_name() == "invalid");
    1228              : //        CATCH_REQUIRE(p.get_value().empty());
    1229              : //        p.set_value("c'est pas \"possible\"");
    1230              : //        CATCH_REQUIRE(p.get_value() == "c'est pas \"possible\"");
    1231              : //        CATCH_REQUIRE_THROWS_MATCHES(
    1232              : //                  p.to_string()
    1233              : //                , edhttp::unquotable_string
    1234              : //                , Catch::Matchers::ExceptionMessage(
    1235              : //                          "edhttp_exception: string [c'est pas \"possible\"] includes single and double quotes."));
    1236              : //    }
    1237              : //    CATCH_END_SECTION()
    1238              : //
    1239              : //    CATCH_START_SECTION("invalid_parametrized_value: part value includes \" and '")
    1240              : //    {
    1241              : //        edhttp::parametrized_value p("invalid");
    1242              : //        CATCH_REQUIRE(p.get_name() == "invalid");
    1243              : //        CATCH_REQUIRE(p.get_value().empty());
    1244              : //        p.set_value("\"c'est pas possible\"");
    1245              : //        CATCH_REQUIRE(p.get_value() == "\"c'est pas possible\"");
    1246              : //        CATCH_REQUIRE_THROWS_MATCHES(
    1247              : //                  p.to_string()
    1248              : //                , edhttp::unquotable_string
    1249              : //                , Catch::Matchers::ExceptionMessage(
    1250              : //                          "edhttp_exception: string [\"c'est pas possible\"] includes single and double quotes."));
    1251              : //    }
    1252              : //    CATCH_END_SECTION()
    1253              : //}
    1254              : 
    1255              : 
    1256              : 
    1257              : // vim: ts=4 sw=4 et
        

Generated by: LCOV version 2.0-1

Snap C++ | List of projects | List of versions