Home | History | Annotate | Download | only in string_insert
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <string>
     11 
     12 // basic_string<charT,traits,Allocator>&
     13 //   insert(size_type pos1, const basic_string<charT,traits,Allocator>& str,
     14 //          size_type pos2, size_type n=npos);
     15 // the "=npos" was added in C++14
     16 
     17 #include <string>
     18 #include <stdexcept>
     19 #include <cassert>
     20 
     21 #include "test_macros.h"
     22 #include "min_allocator.h"
     23 
     24 template <class S>
     25 void
     26 test(S s, typename S::size_type pos1, S str, typename S::size_type pos2,
     27      typename S::size_type n, S expected)
     28 {
     29     const typename S::size_type old_size = s.size();
     30     S s0 = s;
     31     if (pos1 <= old_size && pos2 <= str.size())
     32     {
     33         s.insert(pos1, str, pos2, n);
     34         LIBCPP_ASSERT(s.__invariants());
     35         assert(s == expected);
     36     }
     37 #ifndef TEST_HAS_NO_EXCEPTIONS
     38     else
     39     {
     40         try
     41         {
     42             s.insert(pos1, str, pos2, n);
     43             assert(false);
     44         }
     45         catch (std::out_of_range&)
     46         {
     47             assert(pos1 > old_size || pos2 > str.size());
     48             assert(s == s0);
     49         }
     50     }
     51 #endif
     52 }
     53 
     54 template <class S>
     55 void
     56 test_npos(S s, typename S::size_type pos1, S str, typename S::size_type pos2, S expected)
     57 {
     58     const typename S::size_type old_size = s.size();
     59     S s0 = s;
     60     if (pos1 <= old_size && pos2 <= str.size())
     61     {
     62         s.insert(pos1, str, pos2);
     63         LIBCPP_ASSERT(s.__invariants());
     64         assert(s == expected);
     65     }
     66 #ifndef TEST_HAS_NO_EXCEPTIONS
     67     else
     68     {
     69         try
     70         {
     71             s.insert(pos1, str, pos2);
     72             assert(false);
     73         }
     74         catch (std::out_of_range&)
     75         {
     76             assert(pos1 > old_size || pos2 > str.size());
     77             assert(s == s0);
     78         }
     79     }
     80 #endif
     81 }
     82 
     83 
     84 template <class S>
     85 void test0()
     86 {
     87     test(S(""), 0, S(""), 0, 0, S(""));
     88     test(S(""), 0, S(""), 0, 1, S(""));
     89     test(S(""), 0, S(""), 1, 0, S("can't happen"));
     90     test(S(""), 0, S("12345"), 0, 0, S(""));
     91     test(S(""), 0, S("12345"), 0, 1, S("1"));
     92     test(S(""), 0, S("12345"), 0, 2, S("12"));
     93     test(S(""), 0, S("12345"), 0, 4, S("1234"));
     94     test(S(""), 0, S("12345"), 0, 5, S("12345"));
     95     test(S(""), 0, S("12345"), 0, 6, S("12345"));
     96     test(S(""), 0, S("12345"), 1, 0, S(""));
     97     test(S(""), 0, S("12345"), 1, 1, S("2"));
     98     test(S(""), 0, S("12345"), 1, 2, S("23"));
     99     test(S(""), 0, S("12345"), 1, 3, S("234"));
    100     test(S(""), 0, S("12345"), 1, 4, S("2345"));
    101     test(S(""), 0, S("12345"), 1, 5, S("2345"));
    102     test(S(""), 0, S("12345"), 2, 0, S(""));
    103     test(S(""), 0, S("12345"), 2, 1, S("3"));
    104     test(S(""), 0, S("12345"), 2, 2, S("34"));
    105     test(S(""), 0, S("12345"), 2, 3, S("345"));
    106     test(S(""), 0, S("12345"), 2, 4, S("345"));
    107     test(S(""), 0, S("12345"), 4, 0, S(""));
    108     test(S(""), 0, S("12345"), 4, 1, S("5"));
    109     test(S(""), 0, S("12345"), 4, 2, S("5"));
    110     test(S(""), 0, S("12345"), 5, 0, S(""));
    111     test(S(""), 0, S("12345"), 5, 1, S(""));
    112     test(S(""), 0, S("12345"), 6, 0, S("can't happen"));
    113     test(S(""), 0, S("1234567890"), 0, 0, S(""));
    114     test(S(""), 0, S("1234567890"), 0, 1, S("1"));
    115     test(S(""), 0, S("1234567890"), 0, 5, S("12345"));
    116     test(S(""), 0, S("1234567890"), 0, 9, S("123456789"));
    117     test(S(""), 0, S("1234567890"), 0, 10, S("1234567890"));
    118     test(S(""), 0, S("1234567890"), 0, 11, S("1234567890"));
    119     test(S(""), 0, S("1234567890"), 1, 0, S(""));
    120     test(S(""), 0, S("1234567890"), 1, 1, S("2"));
    121     test(S(""), 0, S("1234567890"), 1, 4, S("2345"));
    122     test(S(""), 0, S("1234567890"), 1, 8, S("23456789"));
    123     test(S(""), 0, S("1234567890"), 1, 9, S("234567890"));
    124     test(S(""), 0, S("1234567890"), 1, 10, S("234567890"));
    125     test(S(""), 0, S("1234567890"), 5, 0, S(""));
    126     test(S(""), 0, S("1234567890"), 5, 1, S("6"));
    127     test(S(""), 0, S("1234567890"), 5, 2, S("67"));
    128     test(S(""), 0, S("1234567890"), 5, 4, S("6789"));
    129     test(S(""), 0, S("1234567890"), 5, 5, S("67890"));
    130     test(S(""), 0, S("1234567890"), 5, 6, S("67890"));
    131     test(S(""), 0, S("1234567890"), 9, 0, S(""));
    132     test(S(""), 0, S("1234567890"), 9, 1, S("0"));
    133     test(S(""), 0, S("1234567890"), 9, 2, S("0"));
    134     test(S(""), 0, S("1234567890"), 10, 0, S(""));
    135     test(S(""), 0, S("1234567890"), 10, 1, S(""));
    136     test(S(""), 0, S("1234567890"), 11, 0, S("can't happen"));
    137 }
    138 
    139 template <class S>
    140 void test1()
    141 {
    142     test(S(""), 0, S("12345678901234567890"), 0, 0, S(""));
    143     test(S(""), 0, S("12345678901234567890"), 0, 1, S("1"));
    144     test(S(""), 0, S("12345678901234567890"), 0, 10, S("1234567890"));
    145     test(S(""), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
    146     test(S(""), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
    147     test(S(""), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
    148     test(S(""), 0, S("12345678901234567890"), 1, 0, S(""));
    149     test(S(""), 0, S("12345678901234567890"), 1, 1, S("2"));
    150     test(S(""), 0, S("12345678901234567890"), 1, 9, S("234567890"));
    151     test(S(""), 0, S("12345678901234567890"), 1, 18, S("234567890123456789"));
    152     test(S(""), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
    153     test(S(""), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
    154     test(S(""), 0, S("12345678901234567890"), 10, 0, S(""));
    155     test(S(""), 0, S("12345678901234567890"), 10, 1, S("1"));
    156     test(S(""), 0, S("12345678901234567890"), 10, 5, S("12345"));
    157     test(S(""), 0, S("12345678901234567890"), 10, 9, S("123456789"));
    158     test(S(""), 0, S("12345678901234567890"), 10, 10, S("1234567890"));
    159     test(S(""), 0, S("12345678901234567890"), 10, 11, S("1234567890"));
    160     test(S(""), 0, S("12345678901234567890"), 19, 0, S(""));
    161     test(S(""), 0, S("12345678901234567890"), 19, 1, S("0"));
    162     test(S(""), 0, S("12345678901234567890"), 19, 2, S("0"));
    163     test(S(""), 0, S("12345678901234567890"), 20, 0, S(""));
    164     test(S(""), 0, S("12345678901234567890"), 20, 1, S(""));
    165     test(S(""), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
    166     test(S(""), 1, S(""), 0, 0, S("can't happen"));
    167     test(S(""), 1, S(""), 0, 1, S("can't happen"));
    168     test(S(""), 1, S(""), 1, 0, S("can't happen"));
    169     test(S(""), 1, S("12345"), 0, 0, S("can't happen"));
    170     test(S(""), 1, S("12345"), 0, 1, S("can't happen"));
    171     test(S(""), 1, S("12345"), 0, 2, S("can't happen"));
    172     test(S(""), 1, S("12345"), 0, 4, S("can't happen"));
    173     test(S(""), 1, S("12345"), 0, 5, S("can't happen"));
    174     test(S(""), 1, S("12345"), 0, 6, S("can't happen"));
    175     test(S(""), 1, S("12345"), 1, 0, S("can't happen"));
    176     test(S(""), 1, S("12345"), 1, 1, S("can't happen"));
    177     test(S(""), 1, S("12345"), 1, 2, S("can't happen"));
    178     test(S(""), 1, S("12345"), 1, 3, S("can't happen"));
    179     test(S(""), 1, S("12345"), 1, 4, S("can't happen"));
    180     test(S(""), 1, S("12345"), 1, 5, S("can't happen"));
    181     test(S(""), 1, S("12345"), 2, 0, S("can't happen"));
    182     test(S(""), 1, S("12345"), 2, 1, S("can't happen"));
    183     test(S(""), 1, S("12345"), 2, 2, S("can't happen"));
    184     test(S(""), 1, S("12345"), 2, 3, S("can't happen"));
    185     test(S(""), 1, S("12345"), 2, 4, S("can't happen"));
    186     test(S(""), 1, S("12345"), 4, 0, S("can't happen"));
    187     test(S(""), 1, S("12345"), 4, 1, S("can't happen"));
    188     test(S(""), 1, S("12345"), 4, 2, S("can't happen"));
    189     test(S(""), 1, S("12345"), 5, 0, S("can't happen"));
    190     test(S(""), 1, S("12345"), 5, 1, S("can't happen"));
    191     test(S(""), 1, S("12345"), 6, 0, S("can't happen"));
    192 }
    193 
    194 template <class S>
    195 void test2()
    196 {
    197     test(S(""), 1, S("1234567890"), 0, 0, S("can't happen"));
    198     test(S(""), 1, S("1234567890"), 0, 1, S("can't happen"));
    199     test(S(""), 1, S("1234567890"), 0, 5, S("can't happen"));
    200     test(S(""), 1, S("1234567890"), 0, 9, S("can't happen"));
    201     test(S(""), 1, S("1234567890"), 0, 10, S("can't happen"));
    202     test(S(""), 1, S("1234567890"), 0, 11, S("can't happen"));
    203     test(S(""), 1, S("1234567890"), 1, 0, S("can't happen"));
    204     test(S(""), 1, S("1234567890"), 1, 1, S("can't happen"));
    205     test(S(""), 1, S("1234567890"), 1, 4, S("can't happen"));
    206     test(S(""), 1, S("1234567890"), 1, 8, S("can't happen"));
    207     test(S(""), 1, S("1234567890"), 1, 9, S("can't happen"));
    208     test(S(""), 1, S("1234567890"), 1, 10, S("can't happen"));
    209     test(S(""), 1, S("1234567890"), 5, 0, S("can't happen"));
    210     test(S(""), 1, S("1234567890"), 5, 1, S("can't happen"));
    211     test(S(""), 1, S("1234567890"), 5, 2, S("can't happen"));
    212     test(S(""), 1, S("1234567890"), 5, 4, S("can't happen"));
    213     test(S(""), 1, S("1234567890"), 5, 5, S("can't happen"));
    214     test(S(""), 1, S("1234567890"), 5, 6, S("can't happen"));
    215     test(S(""), 1, S("1234567890"), 9, 0, S("can't happen"));
    216     test(S(""), 1, S("1234567890"), 9, 1, S("can't happen"));
    217     test(S(""), 1, S("1234567890"), 9, 2, S("can't happen"));
    218     test(S(""), 1, S("1234567890"), 10, 0, S("can't happen"));
    219     test(S(""), 1, S("1234567890"), 10, 1, S("can't happen"));
    220     test(S(""), 1, S("1234567890"), 11, 0, S("can't happen"));
    221     test(S(""), 1, S("12345678901234567890"), 0, 0, S("can't happen"));
    222     test(S(""), 1, S("12345678901234567890"), 0, 1, S("can't happen"));
    223     test(S(""), 1, S("12345678901234567890"), 0, 10, S("can't happen"));
    224     test(S(""), 1, S("12345678901234567890"), 0, 19, S("can't happen"));
    225     test(S(""), 1, S("12345678901234567890"), 0, 20, S("can't happen"));
    226     test(S(""), 1, S("12345678901234567890"), 0, 21, S("can't happen"));
    227     test(S(""), 1, S("12345678901234567890"), 1, 0, S("can't happen"));
    228     test(S(""), 1, S("12345678901234567890"), 1, 1, S("can't happen"));
    229     test(S(""), 1, S("12345678901234567890"), 1, 9, S("can't happen"));
    230     test(S(""), 1, S("12345678901234567890"), 1, 18, S("can't happen"));
    231     test(S(""), 1, S("12345678901234567890"), 1, 19, S("can't happen"));
    232     test(S(""), 1, S("12345678901234567890"), 1, 20, S("can't happen"));
    233     test(S(""), 1, S("12345678901234567890"), 10, 0, S("can't happen"));
    234     test(S(""), 1, S("12345678901234567890"), 10, 1, S("can't happen"));
    235     test(S(""), 1, S("12345678901234567890"), 10, 5, S("can't happen"));
    236     test(S(""), 1, S("12345678901234567890"), 10, 9, S("can't happen"));
    237     test(S(""), 1, S("12345678901234567890"), 10, 10, S("can't happen"));
    238     test(S(""), 1, S("12345678901234567890"), 10, 11, S("can't happen"));
    239     test(S(""), 1, S("12345678901234567890"), 19, 0, S("can't happen"));
    240     test(S(""), 1, S("12345678901234567890"), 19, 1, S("can't happen"));
    241     test(S(""), 1, S("12345678901234567890"), 19, 2, S("can't happen"));
    242     test(S(""), 1, S("12345678901234567890"), 20, 0, S("can't happen"));
    243     test(S(""), 1, S("12345678901234567890"), 20, 1, S("can't happen"));
    244     test(S(""), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
    245     test(S("abcde"), 0, S(""), 0, 0, S("abcde"));
    246     test(S("abcde"), 0, S(""), 0, 1, S("abcde"));
    247 }
    248 
    249 template <class S>
    250 void test3()
    251 {
    252     test(S("abcde"), 0, S(""), 1, 0, S("can't happen"));
    253     test(S("abcde"), 0, S("12345"), 0, 0, S("abcde"));
    254     test(S("abcde"), 0, S("12345"), 0, 1, S("1abcde"));
    255     test(S("abcde"), 0, S("12345"), 0, 2, S("12abcde"));
    256     test(S("abcde"), 0, S("12345"), 0, 4, S("1234abcde"));
    257     test(S("abcde"), 0, S("12345"), 0, 5, S("12345abcde"));
    258     test(S("abcde"), 0, S("12345"), 0, 6, S("12345abcde"));
    259     test(S("abcde"), 0, S("12345"), 1, 0, S("abcde"));
    260     test(S("abcde"), 0, S("12345"), 1, 1, S("2abcde"));
    261     test(S("abcde"), 0, S("12345"), 1, 2, S("23abcde"));
    262     test(S("abcde"), 0, S("12345"), 1, 3, S("234abcde"));
    263     test(S("abcde"), 0, S("12345"), 1, 4, S("2345abcde"));
    264     test(S("abcde"), 0, S("12345"), 1, 5, S("2345abcde"));
    265     test(S("abcde"), 0, S("12345"), 2, 0, S("abcde"));
    266     test(S("abcde"), 0, S("12345"), 2, 1, S("3abcde"));
    267     test(S("abcde"), 0, S("12345"), 2, 2, S("34abcde"));
    268     test(S("abcde"), 0, S("12345"), 2, 3, S("345abcde"));
    269     test(S("abcde"), 0, S("12345"), 2, 4, S("345abcde"));
    270     test(S("abcde"), 0, S("12345"), 4, 0, S("abcde"));
    271     test(S("abcde"), 0, S("12345"), 4, 1, S("5abcde"));
    272     test(S("abcde"), 0, S("12345"), 4, 2, S("5abcde"));
    273     test(S("abcde"), 0, S("12345"), 5, 0, S("abcde"));
    274     test(S("abcde"), 0, S("12345"), 5, 1, S("abcde"));
    275     test(S("abcde"), 0, S("12345"), 6, 0, S("can't happen"));
    276     test(S("abcde"), 0, S("1234567890"), 0, 0, S("abcde"));
    277     test(S("abcde"), 0, S("1234567890"), 0, 1, S("1abcde"));
    278     test(S("abcde"), 0, S("1234567890"), 0, 5, S("12345abcde"));
    279     test(S("abcde"), 0, S("1234567890"), 0, 9, S("123456789abcde"));
    280     test(S("abcde"), 0, S("1234567890"), 0, 10, S("1234567890abcde"));
    281     test(S("abcde"), 0, S("1234567890"), 0, 11, S("1234567890abcde"));
    282     test(S("abcde"), 0, S("1234567890"), 1, 0, S("abcde"));
    283     test(S("abcde"), 0, S("1234567890"), 1, 1, S("2abcde"));
    284     test(S("abcde"), 0, S("1234567890"), 1, 4, S("2345abcde"));
    285     test(S("abcde"), 0, S("1234567890"), 1, 8, S("23456789abcde"));
    286     test(S("abcde"), 0, S("1234567890"), 1, 9, S("234567890abcde"));
    287     test(S("abcde"), 0, S("1234567890"), 1, 10, S("234567890abcde"));
    288     test(S("abcde"), 0, S("1234567890"), 5, 0, S("abcde"));
    289     test(S("abcde"), 0, S("1234567890"), 5, 1, S("6abcde"));
    290     test(S("abcde"), 0, S("1234567890"), 5, 2, S("67abcde"));
    291     test(S("abcde"), 0, S("1234567890"), 5, 4, S("6789abcde"));
    292     test(S("abcde"), 0, S("1234567890"), 5, 5, S("67890abcde"));
    293     test(S("abcde"), 0, S("1234567890"), 5, 6, S("67890abcde"));
    294     test(S("abcde"), 0, S("1234567890"), 9, 0, S("abcde"));
    295     test(S("abcde"), 0, S("1234567890"), 9, 1, S("0abcde"));
    296     test(S("abcde"), 0, S("1234567890"), 9, 2, S("0abcde"));
    297     test(S("abcde"), 0, S("1234567890"), 10, 0, S("abcde"));
    298     test(S("abcde"), 0, S("1234567890"), 10, 1, S("abcde"));
    299     test(S("abcde"), 0, S("1234567890"), 11, 0, S("can't happen"));
    300     test(S("abcde"), 0, S("12345678901234567890"), 0, 0, S("abcde"));
    301     test(S("abcde"), 0, S("12345678901234567890"), 0, 1, S("1abcde"));
    302 }
    303 
    304 template <class S>
    305 void test4()
    306 {
    307     test(S("abcde"), 0, S("12345678901234567890"), 0, 10, S("1234567890abcde"));
    308     test(S("abcde"), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcde"));
    309     test(S("abcde"), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcde"));
    310     test(S("abcde"), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcde"));
    311     test(S("abcde"), 0, S("12345678901234567890"), 1, 0, S("abcde"));
    312     test(S("abcde"), 0, S("12345678901234567890"), 1, 1, S("2abcde"));
    313     test(S("abcde"), 0, S("12345678901234567890"), 1, 9, S("234567890abcde"));
    314     test(S("abcde"), 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcde"));
    315     test(S("abcde"), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcde"));
    316     test(S("abcde"), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcde"));
    317     test(S("abcde"), 0, S("12345678901234567890"), 10, 0, S("abcde"));
    318     test(S("abcde"), 0, S("12345678901234567890"), 10, 1, S("1abcde"));
    319     test(S("abcde"), 0, S("12345678901234567890"), 10, 5, S("12345abcde"));
    320     test(S("abcde"), 0, S("12345678901234567890"), 10, 9, S("123456789abcde"));
    321     test(S("abcde"), 0, S("12345678901234567890"), 10, 10, S("1234567890abcde"));
    322     test(S("abcde"), 0, S("12345678901234567890"), 10, 11, S("1234567890abcde"));
    323     test(S("abcde"), 0, S("12345678901234567890"), 19, 0, S("abcde"));
    324     test(S("abcde"), 0, S("12345678901234567890"), 19, 1, S("0abcde"));
    325     test(S("abcde"), 0, S("12345678901234567890"), 19, 2, S("0abcde"));
    326     test(S("abcde"), 0, S("12345678901234567890"), 20, 0, S("abcde"));
    327     test(S("abcde"), 0, S("12345678901234567890"), 20, 1, S("abcde"));
    328     test(S("abcde"), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
    329     test(S("abcde"), 1, S(""), 0, 0, S("abcde"));
    330     test(S("abcde"), 1, S(""), 0, 1, S("abcde"));
    331     test(S("abcde"), 1, S(""), 1, 0, S("can't happen"));
    332     test(S("abcde"), 1, S("12345"), 0, 0, S("abcde"));
    333     test(S("abcde"), 1, S("12345"), 0, 1, S("a1bcde"));
    334     test(S("abcde"), 1, S("12345"), 0, 2, S("a12bcde"));
    335     test(S("abcde"), 1, S("12345"), 0, 4, S("a1234bcde"));
    336     test(S("abcde"), 1, S("12345"), 0, 5, S("a12345bcde"));
    337     test(S("abcde"), 1, S("12345"), 0, 6, S("a12345bcde"));
    338     test(S("abcde"), 1, S("12345"), 1, 0, S("abcde"));
    339     test(S("abcde"), 1, S("12345"), 1, 1, S("a2bcde"));
    340     test(S("abcde"), 1, S("12345"), 1, 2, S("a23bcde"));
    341     test(S("abcde"), 1, S("12345"), 1, 3, S("a234bcde"));
    342     test(S("abcde"), 1, S("12345"), 1, 4, S("a2345bcde"));
    343     test(S("abcde"), 1, S("12345"), 1, 5, S("a2345bcde"));
    344     test(S("abcde"), 1, S("12345"), 2, 0, S("abcde"));
    345     test(S("abcde"), 1, S("12345"), 2, 1, S("a3bcde"));
    346     test(S("abcde"), 1, S("12345"), 2, 2, S("a34bcde"));
    347     test(S("abcde"), 1, S("12345"), 2, 3, S("a345bcde"));
    348     test(S("abcde"), 1, S("12345"), 2, 4, S("a345bcde"));
    349     test(S("abcde"), 1, S("12345"), 4, 0, S("abcde"));
    350     test(S("abcde"), 1, S("12345"), 4, 1, S("a5bcde"));
    351     test(S("abcde"), 1, S("12345"), 4, 2, S("a5bcde"));
    352     test(S("abcde"), 1, S("12345"), 5, 0, S("abcde"));
    353     test(S("abcde"), 1, S("12345"), 5, 1, S("abcde"));
    354     test(S("abcde"), 1, S("12345"), 6, 0, S("can't happen"));
    355     test(S("abcde"), 1, S("1234567890"), 0, 0, S("abcde"));
    356     test(S("abcde"), 1, S("1234567890"), 0, 1, S("a1bcde"));
    357 }
    358 
    359 template <class S>
    360 void test5()
    361 {
    362     test(S("abcde"), 1, S("1234567890"), 0, 5, S("a12345bcde"));
    363     test(S("abcde"), 1, S("1234567890"), 0, 9, S("a123456789bcde"));
    364     test(S("abcde"), 1, S("1234567890"), 0, 10, S("a1234567890bcde"));
    365     test(S("abcde"), 1, S("1234567890"), 0, 11, S("a1234567890bcde"));
    366     test(S("abcde"), 1, S("1234567890"), 1, 0, S("abcde"));
    367     test(S("abcde"), 1, S("1234567890"), 1, 1, S("a2bcde"));
    368     test(S("abcde"), 1, S("1234567890"), 1, 4, S("a2345bcde"));
    369     test(S("abcde"), 1, S("1234567890"), 1, 8, S("a23456789bcde"));
    370     test(S("abcde"), 1, S("1234567890"), 1, 9, S("a234567890bcde"));
    371     test(S("abcde"), 1, S("1234567890"), 1, 10, S("a234567890bcde"));
    372     test(S("abcde"), 1, S("1234567890"), 5, 0, S("abcde"));
    373     test(S("abcde"), 1, S("1234567890"), 5, 1, S("a6bcde"));
    374     test(S("abcde"), 1, S("1234567890"), 5, 2, S("a67bcde"));
    375     test(S("abcde"), 1, S("1234567890"), 5, 4, S("a6789bcde"));
    376     test(S("abcde"), 1, S("1234567890"), 5, 5, S("a67890bcde"));
    377     test(S("abcde"), 1, S("1234567890"), 5, 6, S("a67890bcde"));
    378     test(S("abcde"), 1, S("1234567890"), 9, 0, S("abcde"));
    379     test(S("abcde"), 1, S("1234567890"), 9, 1, S("a0bcde"));
    380     test(S("abcde"), 1, S("1234567890"), 9, 2, S("a0bcde"));
    381     test(S("abcde"), 1, S("1234567890"), 10, 0, S("abcde"));
    382     test(S("abcde"), 1, S("1234567890"), 10, 1, S("abcde"));
    383     test(S("abcde"), 1, S("1234567890"), 11, 0, S("can't happen"));
    384     test(S("abcde"), 1, S("12345678901234567890"), 0, 0, S("abcde"));
    385     test(S("abcde"), 1, S("12345678901234567890"), 0, 1, S("a1bcde"));
    386     test(S("abcde"), 1, S("12345678901234567890"), 0, 10, S("a1234567890bcde"));
    387     test(S("abcde"), 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcde"));
    388     test(S("abcde"), 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcde"));
    389     test(S("abcde"), 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcde"));
    390     test(S("abcde"), 1, S("12345678901234567890"), 1, 0, S("abcde"));
    391     test(S("abcde"), 1, S("12345678901234567890"), 1, 1, S("a2bcde"));
    392     test(S("abcde"), 1, S("12345678901234567890"), 1, 9, S("a234567890bcde"));
    393     test(S("abcde"), 1, S("12345678901234567890"), 1, 18, S("a234567890123456789bcde"));
    394     test(S("abcde"), 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcde"));
    395     test(S("abcde"), 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcde"));
    396     test(S("abcde"), 1, S("12345678901234567890"), 10, 0, S("abcde"));
    397     test(S("abcde"), 1, S("12345678901234567890"), 10, 1, S("a1bcde"));
    398     test(S("abcde"), 1, S("12345678901234567890"), 10, 5, S("a12345bcde"));
    399     test(S("abcde"), 1, S("12345678901234567890"), 10, 9, S("a123456789bcde"));
    400     test(S("abcde"), 1, S("12345678901234567890"), 10, 10, S("a1234567890bcde"));
    401     test(S("abcde"), 1, S("12345678901234567890"), 10, 11, S("a1234567890bcde"));
    402     test(S("abcde"), 1, S("12345678901234567890"), 19, 0, S("abcde"));
    403     test(S("abcde"), 1, S("12345678901234567890"), 19, 1, S("a0bcde"));
    404     test(S("abcde"), 1, S("12345678901234567890"), 19, 2, S("a0bcde"));
    405     test(S("abcde"), 1, S("12345678901234567890"), 20, 0, S("abcde"));
    406     test(S("abcde"), 1, S("12345678901234567890"), 20, 1, S("abcde"));
    407     test(S("abcde"), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
    408     test(S("abcde"), 2, S(""), 0, 0, S("abcde"));
    409     test(S("abcde"), 2, S(""), 0, 1, S("abcde"));
    410     test(S("abcde"), 2, S(""), 1, 0, S("can't happen"));
    411     test(S("abcde"), 2, S("12345"), 0, 0, S("abcde"));
    412 }
    413 
    414 template <class S>
    415 void test6()
    416 {
    417     test(S("abcde"), 2, S("12345"), 0, 1, S("ab1cde"));
    418     test(S("abcde"), 2, S("12345"), 0, 2, S("ab12cde"));
    419     test(S("abcde"), 2, S("12345"), 0, 4, S("ab1234cde"));
    420     test(S("abcde"), 2, S("12345"), 0, 5, S("ab12345cde"));
    421     test(S("abcde"), 2, S("12345"), 0, 6, S("ab12345cde"));
    422     test(S("abcde"), 2, S("12345"), 1, 0, S("abcde"));
    423     test(S("abcde"), 2, S("12345"), 1, 1, S("ab2cde"));
    424     test(S("abcde"), 2, S("12345"), 1, 2, S("ab23cde"));
    425     test(S("abcde"), 2, S("12345"), 1, 3, S("ab234cde"));
    426     test(S("abcde"), 2, S("12345"), 1, 4, S("ab2345cde"));
    427     test(S("abcde"), 2, S("12345"), 1, 5, S("ab2345cde"));
    428     test(S("abcde"), 2, S("12345"), 2, 0, S("abcde"));
    429     test(S("abcde"), 2, S("12345"), 2, 1, S("ab3cde"));
    430     test(S("abcde"), 2, S("12345"), 2, 2, S("ab34cde"));
    431     test(S("abcde"), 2, S("12345"), 2, 3, S("ab345cde"));
    432     test(S("abcde"), 2, S("12345"), 2, 4, S("ab345cde"));
    433     test(S("abcde"), 2, S("12345"), 4, 0, S("abcde"));
    434     test(S("abcde"), 2, S("12345"), 4, 1, S("ab5cde"));
    435     test(S("abcde"), 2, S("12345"), 4, 2, S("ab5cde"));
    436     test(S("abcde"), 2, S("12345"), 5, 0, S("abcde"));
    437     test(S("abcde"), 2, S("12345"), 5, 1, S("abcde"));
    438     test(S("abcde"), 2, S("12345"), 6, 0, S("can't happen"));
    439     test(S("abcde"), 2, S("1234567890"), 0, 0, S("abcde"));
    440     test(S("abcde"), 2, S("1234567890"), 0, 1, S("ab1cde"));
    441     test(S("abcde"), 2, S("1234567890"), 0, 5, S("ab12345cde"));
    442     test(S("abcde"), 2, S("1234567890"), 0, 9, S("ab123456789cde"));
    443     test(S("abcde"), 2, S("1234567890"), 0, 10, S("ab1234567890cde"));
    444     test(S("abcde"), 2, S("1234567890"), 0, 11, S("ab1234567890cde"));
    445     test(S("abcde"), 2, S("1234567890"), 1, 0, S("abcde"));
    446     test(S("abcde"), 2, S("1234567890"), 1, 1, S("ab2cde"));
    447     test(S("abcde"), 2, S("1234567890"), 1, 4, S("ab2345cde"));
    448     test(S("abcde"), 2, S("1234567890"), 1, 8, S("ab23456789cde"));
    449     test(S("abcde"), 2, S("1234567890"), 1, 9, S("ab234567890cde"));
    450     test(S("abcde"), 2, S("1234567890"), 1, 10, S("ab234567890cde"));
    451     test(S("abcde"), 2, S("1234567890"), 5, 0, S("abcde"));
    452     test(S("abcde"), 2, S("1234567890"), 5, 1, S("ab6cde"));
    453     test(S("abcde"), 2, S("1234567890"), 5, 2, S("ab67cde"));
    454     test(S("abcde"), 2, S("1234567890"), 5, 4, S("ab6789cde"));
    455     test(S("abcde"), 2, S("1234567890"), 5, 5, S("ab67890cde"));
    456     test(S("abcde"), 2, S("1234567890"), 5, 6, S("ab67890cde"));
    457     test(S("abcde"), 2, S("1234567890"), 9, 0, S("abcde"));
    458     test(S("abcde"), 2, S("1234567890"), 9, 1, S("ab0cde"));
    459     test(S("abcde"), 2, S("1234567890"), 9, 2, S("ab0cde"));
    460     test(S("abcde"), 2, S("1234567890"), 10, 0, S("abcde"));
    461     test(S("abcde"), 2, S("1234567890"), 10, 1, S("abcde"));
    462     test(S("abcde"), 2, S("1234567890"), 11, 0, S("can't happen"));
    463     test(S("abcde"), 2, S("12345678901234567890"), 0, 0, S("abcde"));
    464     test(S("abcde"), 2, S("12345678901234567890"), 0, 1, S("ab1cde"));
    465     test(S("abcde"), 2, S("12345678901234567890"), 0, 10, S("ab1234567890cde"));
    466     test(S("abcde"), 2, S("12345678901234567890"), 0, 19, S("ab1234567890123456789cde"));
    467 }
    468 
    469 template <class S>
    470 void test7()
    471 {
    472     test(S("abcde"), 2, S("12345678901234567890"), 0, 20, S("ab12345678901234567890cde"));
    473     test(S("abcde"), 2, S("12345678901234567890"), 0, 21, S("ab12345678901234567890cde"));
    474     test(S("abcde"), 2, S("12345678901234567890"), 1, 0, S("abcde"));
    475     test(S("abcde"), 2, S("12345678901234567890"), 1, 1, S("ab2cde"));
    476     test(S("abcde"), 2, S("12345678901234567890"), 1, 9, S("ab234567890cde"));
    477     test(S("abcde"), 2, S("12345678901234567890"), 1, 18, S("ab234567890123456789cde"));
    478     test(S("abcde"), 2, S("12345678901234567890"), 1, 19, S("ab2345678901234567890cde"));
    479     test(S("abcde"), 2, S("12345678901234567890"), 1, 20, S("ab2345678901234567890cde"));
    480     test(S("abcde"), 2, S("12345678901234567890"), 10, 0, S("abcde"));
    481     test(S("abcde"), 2, S("12345678901234567890"), 10, 1, S("ab1cde"));
    482     test(S("abcde"), 2, S("12345678901234567890"), 10, 5, S("ab12345cde"));
    483     test(S("abcde"), 2, S("12345678901234567890"), 10, 9, S("ab123456789cde"));
    484     test(S("abcde"), 2, S("12345678901234567890"), 10, 10, S("ab1234567890cde"));
    485     test(S("abcde"), 2, S("12345678901234567890"), 10, 11, S("ab1234567890cde"));
    486     test(S("abcde"), 2, S("12345678901234567890"), 19, 0, S("abcde"));
    487     test(S("abcde"), 2, S("12345678901234567890"), 19, 1, S("ab0cde"));
    488     test(S("abcde"), 2, S("12345678901234567890"), 19, 2, S("ab0cde"));
    489     test(S("abcde"), 2, S("12345678901234567890"), 20, 0, S("abcde"));
    490     test(S("abcde"), 2, S("12345678901234567890"), 20, 1, S("abcde"));
    491     test(S("abcde"), 2, S("12345678901234567890"), 21, 0, S("can't happen"));
    492     test(S("abcde"), 4, S(""), 0, 0, S("abcde"));
    493     test(S("abcde"), 4, S(""), 0, 1, S("abcde"));
    494     test(S("abcde"), 4, S(""), 1, 0, S("can't happen"));
    495     test(S("abcde"), 4, S("12345"), 0, 0, S("abcde"));
    496     test(S("abcde"), 4, S("12345"), 0, 1, S("abcd1e"));
    497     test(S("abcde"), 4, S("12345"), 0, 2, S("abcd12e"));
    498     test(S("abcde"), 4, S("12345"), 0, 4, S("abcd1234e"));
    499     test(S("abcde"), 4, S("12345"), 0, 5, S("abcd12345e"));
    500     test(S("abcde"), 4, S("12345"), 0, 6, S("abcd12345e"));
    501     test(S("abcde"), 4, S("12345"), 1, 0, S("abcde"));
    502     test(S("abcde"), 4, S("12345"), 1, 1, S("abcd2e"));
    503     test(S("abcde"), 4, S("12345"), 1, 2, S("abcd23e"));
    504     test(S("abcde"), 4, S("12345"), 1, 3, S("abcd234e"));
    505     test(S("abcde"), 4, S("12345"), 1, 4, S("abcd2345e"));
    506     test(S("abcde"), 4, S("12345"), 1, 5, S("abcd2345e"));
    507     test(S("abcde"), 4, S("12345"), 2, 0, S("abcde"));
    508     test(S("abcde"), 4, S("12345"), 2, 1, S("abcd3e"));
    509     test(S("abcde"), 4, S("12345"), 2, 2, S("abcd34e"));
    510     test(S("abcde"), 4, S("12345"), 2, 3, S("abcd345e"));
    511     test(S("abcde"), 4, S("12345"), 2, 4, S("abcd345e"));
    512     test(S("abcde"), 4, S("12345"), 4, 0, S("abcde"));
    513     test(S("abcde"), 4, S("12345"), 4, 1, S("abcd5e"));
    514     test(S("abcde"), 4, S("12345"), 4, 2, S("abcd5e"));
    515     test(S("abcde"), 4, S("12345"), 5, 0, S("abcde"));
    516     test(S("abcde"), 4, S("12345"), 5, 1, S("abcde"));
    517     test(S("abcde"), 4, S("12345"), 6, 0, S("can't happen"));
    518     test(S("abcde"), 4, S("1234567890"), 0, 0, S("abcde"));
    519     test(S("abcde"), 4, S("1234567890"), 0, 1, S("abcd1e"));
    520     test(S("abcde"), 4, S("1234567890"), 0, 5, S("abcd12345e"));
    521     test(S("abcde"), 4, S("1234567890"), 0, 9, S("abcd123456789e"));
    522 }
    523 
    524 template <class S>
    525 void test8()
    526 {
    527     test(S("abcde"), 4, S("1234567890"), 0, 10, S("abcd1234567890e"));
    528     test(S("abcde"), 4, S("1234567890"), 0, 11, S("abcd1234567890e"));
    529     test(S("abcde"), 4, S("1234567890"), 1, 0, S("abcde"));
    530     test(S("abcde"), 4, S("1234567890"), 1, 1, S("abcd2e"));
    531     test(S("abcde"), 4, S("1234567890"), 1, 4, S("abcd2345e"));
    532     test(S("abcde"), 4, S("1234567890"), 1, 8, S("abcd23456789e"));
    533     test(S("abcde"), 4, S("1234567890"), 1, 9, S("abcd234567890e"));
    534     test(S("abcde"), 4, S("1234567890"), 1, 10, S("abcd234567890e"));
    535     test(S("abcde"), 4, S("1234567890"), 5, 0, S("abcde"));
    536     test(S("abcde"), 4, S("1234567890"), 5, 1, S("abcd6e"));
    537     test(S("abcde"), 4, S("1234567890"), 5, 2, S("abcd67e"));
    538     test(S("abcde"), 4, S("1234567890"), 5, 4, S("abcd6789e"));
    539     test(S("abcde"), 4, S("1234567890"), 5, 5, S("abcd67890e"));
    540     test(S("abcde"), 4, S("1234567890"), 5, 6, S("abcd67890e"));
    541     test(S("abcde"), 4, S("1234567890"), 9, 0, S("abcde"));
    542     test(S("abcde"), 4, S("1234567890"), 9, 1, S("abcd0e"));
    543     test(S("abcde"), 4, S("1234567890"), 9, 2, S("abcd0e"));
    544     test(S("abcde"), 4, S("1234567890"), 10, 0, S("abcde"));
    545     test(S("abcde"), 4, S("1234567890"), 10, 1, S("abcde"));
    546     test(S("abcde"), 4, S("1234567890"), 11, 0, S("can't happen"));
    547     test(S("abcde"), 4, S("12345678901234567890"), 0, 0, S("abcde"));
    548     test(S("abcde"), 4, S("12345678901234567890"), 0, 1, S("abcd1e"));
    549     test(S("abcde"), 4, S("12345678901234567890"), 0, 10, S("abcd1234567890e"));
    550     test(S("abcde"), 4, S("12345678901234567890"), 0, 19, S("abcd1234567890123456789e"));
    551     test(S("abcde"), 4, S("12345678901234567890"), 0, 20, S("abcd12345678901234567890e"));
    552     test(S("abcde"), 4, S("12345678901234567890"), 0, 21, S("abcd12345678901234567890e"));
    553     test(S("abcde"), 4, S("12345678901234567890"), 1, 0, S("abcde"));
    554     test(S("abcde"), 4, S("12345678901234567890"), 1, 1, S("abcd2e"));
    555     test(S("abcde"), 4, S("12345678901234567890"), 1, 9, S("abcd234567890e"));
    556     test(S("abcde"), 4, S("12345678901234567890"), 1, 18, S("abcd234567890123456789e"));
    557     test(S("abcde"), 4, S("12345678901234567890"), 1, 19, S("abcd2345678901234567890e"));
    558     test(S("abcde"), 4, S("12345678901234567890"), 1, 20, S("abcd2345678901234567890e"));
    559     test(S("abcde"), 4, S("12345678901234567890"), 10, 0, S("abcde"));
    560     test(S("abcde"), 4, S("12345678901234567890"), 10, 1, S("abcd1e"));
    561     test(S("abcde"), 4, S("12345678901234567890"), 10, 5, S("abcd12345e"));
    562     test(S("abcde"), 4, S("12345678901234567890"), 10, 9, S("abcd123456789e"));
    563     test(S("abcde"), 4, S("12345678901234567890"), 10, 10, S("abcd1234567890e"));
    564     test(S("abcde"), 4, S("12345678901234567890"), 10, 11, S("abcd1234567890e"));
    565     test(S("abcde"), 4, S("12345678901234567890"), 19, 0, S("abcde"));
    566     test(S("abcde"), 4, S("12345678901234567890"), 19, 1, S("abcd0e"));
    567     test(S("abcde"), 4, S("12345678901234567890"), 19, 2, S("abcd0e"));
    568     test(S("abcde"), 4, S("12345678901234567890"), 20, 0, S("abcde"));
    569     test(S("abcde"), 4, S("12345678901234567890"), 20, 1, S("abcde"));
    570     test(S("abcde"), 4, S("12345678901234567890"), 21, 0, S("can't happen"));
    571     test(S("abcde"), 5, S(""), 0, 0, S("abcde"));
    572     test(S("abcde"), 5, S(""), 0, 1, S("abcde"));
    573     test(S("abcde"), 5, S(""), 1, 0, S("can't happen"));
    574     test(S("abcde"), 5, S("12345"), 0, 0, S("abcde"));
    575     test(S("abcde"), 5, S("12345"), 0, 1, S("abcde1"));
    576     test(S("abcde"), 5, S("12345"), 0, 2, S("abcde12"));
    577 }
    578 
    579 template <class S>
    580 void test9()
    581 {
    582     test(S("abcde"), 5, S("12345"), 0, 4, S("abcde1234"));
    583     test(S("abcde"), 5, S("12345"), 0, 5, S("abcde12345"));
    584     test(S("abcde"), 5, S("12345"), 0, 6, S("abcde12345"));
    585     test(S("abcde"), 5, S("12345"), 1, 0, S("abcde"));
    586     test(S("abcde"), 5, S("12345"), 1, 1, S("abcde2"));
    587     test(S("abcde"), 5, S("12345"), 1, 2, S("abcde23"));
    588     test(S("abcde"), 5, S("12345"), 1, 3, S("abcde234"));
    589     test(S("abcde"), 5, S("12345"), 1, 4, S("abcde2345"));
    590     test(S("abcde"), 5, S("12345"), 1, 5, S("abcde2345"));
    591     test(S("abcde"), 5, S("12345"), 2, 0, S("abcde"));
    592     test(S("abcde"), 5, S("12345"), 2, 1, S("abcde3"));
    593     test(S("abcde"), 5, S("12345"), 2, 2, S("abcde34"));
    594     test(S("abcde"), 5, S("12345"), 2, 3, S("abcde345"));
    595     test(S("abcde"), 5, S("12345"), 2, 4, S("abcde345"));
    596     test(S("abcde"), 5, S("12345"), 4, 0, S("abcde"));
    597     test(S("abcde"), 5, S("12345"), 4, 1, S("abcde5"));
    598     test(S("abcde"), 5, S("12345"), 4, 2, S("abcde5"));
    599     test(S("abcde"), 5, S("12345"), 5, 0, S("abcde"));
    600     test(S("abcde"), 5, S("12345"), 5, 1, S("abcde"));
    601     test(S("abcde"), 5, S("12345"), 6, 0, S("can't happen"));
    602     test(S("abcde"), 5, S("1234567890"), 0, 0, S("abcde"));
    603     test(S("abcde"), 5, S("1234567890"), 0, 1, S("abcde1"));
    604     test(S("abcde"), 5, S("1234567890"), 0, 5, S("abcde12345"));
    605     test(S("abcde"), 5, S("1234567890"), 0, 9, S("abcde123456789"));
    606     test(S("abcde"), 5, S("1234567890"), 0, 10, S("abcde1234567890"));
    607     test(S("abcde"), 5, S("1234567890"), 0, 11, S("abcde1234567890"));
    608     test(S("abcde"), 5, S("1234567890"), 1, 0, S("abcde"));
    609     test(S("abcde"), 5, S("1234567890"), 1, 1, S("abcde2"));
    610     test(S("abcde"), 5, S("1234567890"), 1, 4, S("abcde2345"));
    611     test(S("abcde"), 5, S("1234567890"), 1, 8, S("abcde23456789"));
    612     test(S("abcde"), 5, S("1234567890"), 1, 9, S("abcde234567890"));
    613     test(S("abcde"), 5, S("1234567890"), 1, 10, S("abcde234567890"));
    614     test(S("abcde"), 5, S("1234567890"), 5, 0, S("abcde"));
    615     test(S("abcde"), 5, S("1234567890"), 5, 1, S("abcde6"));
    616     test(S("abcde"), 5, S("1234567890"), 5, 2, S("abcde67"));
    617     test(S("abcde"), 5, S("1234567890"), 5, 4, S("abcde6789"));
    618     test(S("abcde"), 5, S("1234567890"), 5, 5, S("abcde67890"));
    619     test(S("abcde"), 5, S("1234567890"), 5, 6, S("abcde67890"));
    620     test(S("abcde"), 5, S("1234567890"), 9, 0, S("abcde"));
    621     test(S("abcde"), 5, S("1234567890"), 9, 1, S("abcde0"));
    622     test(S("abcde"), 5, S("1234567890"), 9, 2, S("abcde0"));
    623     test(S("abcde"), 5, S("1234567890"), 10, 0, S("abcde"));
    624     test(S("abcde"), 5, S("1234567890"), 10, 1, S("abcde"));
    625     test(S("abcde"), 5, S("1234567890"), 11, 0, S("can't happen"));
    626     test(S("abcde"), 5, S("12345678901234567890"), 0, 0, S("abcde"));
    627     test(S("abcde"), 5, S("12345678901234567890"), 0, 1, S("abcde1"));
    628     test(S("abcde"), 5, S("12345678901234567890"), 0, 10, S("abcde1234567890"));
    629     test(S("abcde"), 5, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789"));
    630     test(S("abcde"), 5, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890"));
    631     test(S("abcde"), 5, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890"));
    632 }
    633 
    634 template <class S>
    635 void test10()
    636 {
    637     test(S("abcde"), 5, S("12345678901234567890"), 1, 0, S("abcde"));
    638     test(S("abcde"), 5, S("12345678901234567890"), 1, 1, S("abcde2"));
    639     test(S("abcde"), 5, S("12345678901234567890"), 1, 9, S("abcde234567890"));
    640     test(S("abcde"), 5, S("12345678901234567890"), 1, 18, S("abcde234567890123456789"));
    641     test(S("abcde"), 5, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890"));
    642     test(S("abcde"), 5, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890"));
    643     test(S("abcde"), 5, S("12345678901234567890"), 10, 0, S("abcde"));
    644     test(S("abcde"), 5, S("12345678901234567890"), 10, 1, S("abcde1"));
    645     test(S("abcde"), 5, S("12345678901234567890"), 10, 5, S("abcde12345"));
    646     test(S("abcde"), 5, S("12345678901234567890"), 10, 9, S("abcde123456789"));
    647     test(S("abcde"), 5, S("12345678901234567890"), 10, 10, S("abcde1234567890"));
    648     test(S("abcde"), 5, S("12345678901234567890"), 10, 11, S("abcde1234567890"));
    649     test(S("abcde"), 5, S("12345678901234567890"), 19, 0, S("abcde"));
    650     test(S("abcde"), 5, S("12345678901234567890"), 19, 1, S("abcde0"));
    651     test(S("abcde"), 5, S("12345678901234567890"), 19, 2, S("abcde0"));
    652     test(S("abcde"), 5, S("12345678901234567890"), 20, 0, S("abcde"));
    653     test(S("abcde"), 5, S("12345678901234567890"), 20, 1, S("abcde"));
    654     test(S("abcde"), 5, S("12345678901234567890"), 21, 0, S("can't happen"));
    655     test(S("abcde"), 6, S(""), 0, 0, S("can't happen"));
    656     test(S("abcde"), 6, S(""), 0, 1, S("can't happen"));
    657     test(S("abcde"), 6, S(""), 1, 0, S("can't happen"));
    658     test(S("abcde"), 6, S("12345"), 0, 0, S("can't happen"));
    659     test(S("abcde"), 6, S("12345"), 0, 1, S("can't happen"));
    660     test(S("abcde"), 6, S("12345"), 0, 2, S("can't happen"));
    661     test(S("abcde"), 6, S("12345"), 0, 4, S("can't happen"));
    662     test(S("abcde"), 6, S("12345"), 0, 5, S("can't happen"));
    663     test(S("abcde"), 6, S("12345"), 0, 6, S("can't happen"));
    664     test(S("abcde"), 6, S("12345"), 1, 0, S("can't happen"));
    665     test(S("abcde"), 6, S("12345"), 1, 1, S("can't happen"));
    666     test(S("abcde"), 6, S("12345"), 1, 2, S("can't happen"));
    667     test(S("abcde"), 6, S("12345"), 1, 3, S("can't happen"));
    668     test(S("abcde"), 6, S("12345"), 1, 4, S("can't happen"));
    669     test(S("abcde"), 6, S("12345"), 1, 5, S("can't happen"));
    670     test(S("abcde"), 6, S("12345"), 2, 0, S("can't happen"));
    671     test(S("abcde"), 6, S("12345"), 2, 1, S("can't happen"));
    672     test(S("abcde"), 6, S("12345"), 2, 2, S("can't happen"));
    673     test(S("abcde"), 6, S("12345"), 2, 3, S("can't happen"));
    674     test(S("abcde"), 6, S("12345"), 2, 4, S("can't happen"));
    675     test(S("abcde"), 6, S("12345"), 4, 0, S("can't happen"));
    676     test(S("abcde"), 6, S("12345"), 4, 1, S("can't happen"));
    677     test(S("abcde"), 6, S("12345"), 4, 2, S("can't happen"));
    678     test(S("abcde"), 6, S("12345"), 5, 0, S("can't happen"));
    679     test(S("abcde"), 6, S("12345"), 5, 1, S("can't happen"));
    680     test(S("abcde"), 6, S("12345"), 6, 0, S("can't happen"));
    681     test(S("abcde"), 6, S("1234567890"), 0, 0, S("can't happen"));
    682     test(S("abcde"), 6, S("1234567890"), 0, 1, S("can't happen"));
    683     test(S("abcde"), 6, S("1234567890"), 0, 5, S("can't happen"));
    684     test(S("abcde"), 6, S("1234567890"), 0, 9, S("can't happen"));
    685     test(S("abcde"), 6, S("1234567890"), 0, 10, S("can't happen"));
    686     test(S("abcde"), 6, S("1234567890"), 0, 11, S("can't happen"));
    687 }
    688 
    689 template <class S>
    690 void test11()
    691 {
    692     test(S("abcde"), 6, S("1234567890"), 1, 0, S("can't happen"));
    693     test(S("abcde"), 6, S("1234567890"), 1, 1, S("can't happen"));
    694     test(S("abcde"), 6, S("1234567890"), 1, 4, S("can't happen"));
    695     test(S("abcde"), 6, S("1234567890"), 1, 8, S("can't happen"));
    696     test(S("abcde"), 6, S("1234567890"), 1, 9, S("can't happen"));
    697     test(S("abcde"), 6, S("1234567890"), 1, 10, S("can't happen"));
    698     test(S("abcde"), 6, S("1234567890"), 5, 0, S("can't happen"));
    699     test(S("abcde"), 6, S("1234567890"), 5, 1, S("can't happen"));
    700     test(S("abcde"), 6, S("1234567890"), 5, 2, S("can't happen"));
    701     test(S("abcde"), 6, S("1234567890"), 5, 4, S("can't happen"));
    702     test(S("abcde"), 6, S("1234567890"), 5, 5, S("can't happen"));
    703     test(S("abcde"), 6, S("1234567890"), 5, 6, S("can't happen"));
    704     test(S("abcde"), 6, S("1234567890"), 9, 0, S("can't happen"));
    705     test(S("abcde"), 6, S("1234567890"), 9, 1, S("can't happen"));
    706     test(S("abcde"), 6, S("1234567890"), 9, 2, S("can't happen"));
    707     test(S("abcde"), 6, S("1234567890"), 10, 0, S("can't happen"));
    708     test(S("abcde"), 6, S("1234567890"), 10, 1, S("can't happen"));
    709     test(S("abcde"), 6, S("1234567890"), 11, 0, S("can't happen"));
    710     test(S("abcde"), 6, S("12345678901234567890"), 0, 0, S("can't happen"));
    711     test(S("abcde"), 6, S("12345678901234567890"), 0, 1, S("can't happen"));
    712     test(S("abcde"), 6, S("12345678901234567890"), 0, 10, S("can't happen"));
    713     test(S("abcde"), 6, S("12345678901234567890"), 0, 19, S("can't happen"));
    714     test(S("abcde"), 6, S("12345678901234567890"), 0, 20, S("can't happen"));
    715     test(S("abcde"), 6, S("12345678901234567890"), 0, 21, S("can't happen"));
    716     test(S("abcde"), 6, S("12345678901234567890"), 1, 0, S("can't happen"));
    717     test(S("abcde"), 6, S("12345678901234567890"), 1, 1, S("can't happen"));
    718     test(S("abcde"), 6, S("12345678901234567890"), 1, 9, S("can't happen"));
    719     test(S("abcde"), 6, S("12345678901234567890"), 1, 18, S("can't happen"));
    720     test(S("abcde"), 6, S("12345678901234567890"), 1, 19, S("can't happen"));
    721     test(S("abcde"), 6, S("12345678901234567890"), 1, 20, S("can't happen"));
    722     test(S("abcde"), 6, S("12345678901234567890"), 10, 0, S("can't happen"));
    723     test(S("abcde"), 6, S("12345678901234567890"), 10, 1, S("can't happen"));
    724     test(S("abcde"), 6, S("12345678901234567890"), 10, 5, S("can't happen"));
    725     test(S("abcde"), 6, S("12345678901234567890"), 10, 9, S("can't happen"));
    726     test(S("abcde"), 6, S("12345678901234567890"), 10, 10, S("can't happen"));
    727     test(S("abcde"), 6, S("12345678901234567890"), 10, 11, S("can't happen"));
    728     test(S("abcde"), 6, S("12345678901234567890"), 19, 0, S("can't happen"));
    729     test(S("abcde"), 6, S("12345678901234567890"), 19, 1, S("can't happen"));
    730     test(S("abcde"), 6, S("12345678901234567890"), 19, 2, S("can't happen"));
    731     test(S("abcde"), 6, S("12345678901234567890"), 20, 0, S("can't happen"));
    732     test(S("abcde"), 6, S("12345678901234567890"), 20, 1, S("can't happen"));
    733     test(S("abcde"), 6, S("12345678901234567890"), 21, 0, S("can't happen"));
    734     test(S("abcdefghij"), 0, S(""), 0, 0, S("abcdefghij"));
    735     test(S("abcdefghij"), 0, S(""), 0, 1, S("abcdefghij"));
    736     test(S("abcdefghij"), 0, S(""), 1, 0, S("can't happen"));
    737     test(S("abcdefghij"), 0, S("12345"), 0, 0, S("abcdefghij"));
    738     test(S("abcdefghij"), 0, S("12345"), 0, 1, S("1abcdefghij"));
    739     test(S("abcdefghij"), 0, S("12345"), 0, 2, S("12abcdefghij"));
    740     test(S("abcdefghij"), 0, S("12345"), 0, 4, S("1234abcdefghij"));
    741     test(S("abcdefghij"), 0, S("12345"), 0, 5, S("12345abcdefghij"));
    742 }
    743 
    744 template <class S>
    745 void test12()
    746 {
    747     test(S("abcdefghij"), 0, S("12345"), 0, 6, S("12345abcdefghij"));
    748     test(S("abcdefghij"), 0, S("12345"), 1, 0, S("abcdefghij"));
    749     test(S("abcdefghij"), 0, S("12345"), 1, 1, S("2abcdefghij"));
    750     test(S("abcdefghij"), 0, S("12345"), 1, 2, S("23abcdefghij"));
    751     test(S("abcdefghij"), 0, S("12345"), 1, 3, S("234abcdefghij"));
    752     test(S("abcdefghij"), 0, S("12345"), 1, 4, S("2345abcdefghij"));
    753     test(S("abcdefghij"), 0, S("12345"), 1, 5, S("2345abcdefghij"));
    754     test(S("abcdefghij"), 0, S("12345"), 2, 0, S("abcdefghij"));
    755     test(S("abcdefghij"), 0, S("12345"), 2, 1, S("3abcdefghij"));
    756     test(S("abcdefghij"), 0, S("12345"), 2, 2, S("34abcdefghij"));
    757     test(S("abcdefghij"), 0, S("12345"), 2, 3, S("345abcdefghij"));
    758     test(S("abcdefghij"), 0, S("12345"), 2, 4, S("345abcdefghij"));
    759     test(S("abcdefghij"), 0, S("12345"), 4, 0, S("abcdefghij"));
    760     test(S("abcdefghij"), 0, S("12345"), 4, 1, S("5abcdefghij"));
    761     test(S("abcdefghij"), 0, S("12345"), 4, 2, S("5abcdefghij"));
    762     test(S("abcdefghij"), 0, S("12345"), 5, 0, S("abcdefghij"));
    763     test(S("abcdefghij"), 0, S("12345"), 5, 1, S("abcdefghij"));
    764     test(S("abcdefghij"), 0, S("12345"), 6, 0, S("can't happen"));
    765     test(S("abcdefghij"), 0, S("1234567890"), 0, 0, S("abcdefghij"));
    766     test(S("abcdefghij"), 0, S("1234567890"), 0, 1, S("1abcdefghij"));
    767     test(S("abcdefghij"), 0, S("1234567890"), 0, 5, S("12345abcdefghij"));
    768     test(S("abcdefghij"), 0, S("1234567890"), 0, 9, S("123456789abcdefghij"));
    769     test(S("abcdefghij"), 0, S("1234567890"), 0, 10, S("1234567890abcdefghij"));
    770     test(S("abcdefghij"), 0, S("1234567890"), 0, 11, S("1234567890abcdefghij"));
    771     test(S("abcdefghij"), 0, S("1234567890"), 1, 0, S("abcdefghij"));
    772     test(S("abcdefghij"), 0, S("1234567890"), 1, 1, S("2abcdefghij"));
    773     test(S("abcdefghij"), 0, S("1234567890"), 1, 4, S("2345abcdefghij"));
    774     test(S("abcdefghij"), 0, S("1234567890"), 1, 8, S("23456789abcdefghij"));
    775     test(S("abcdefghij"), 0, S("1234567890"), 1, 9, S("234567890abcdefghij"));
    776     test(S("abcdefghij"), 0, S("1234567890"), 1, 10, S("234567890abcdefghij"));
    777     test(S("abcdefghij"), 0, S("1234567890"), 5, 0, S("abcdefghij"));
    778     test(S("abcdefghij"), 0, S("1234567890"), 5, 1, S("6abcdefghij"));
    779     test(S("abcdefghij"), 0, S("1234567890"), 5, 2, S("67abcdefghij"));
    780     test(S("abcdefghij"), 0, S("1234567890"), 5, 4, S("6789abcdefghij"));
    781     test(S("abcdefghij"), 0, S("1234567890"), 5, 5, S("67890abcdefghij"));
    782     test(S("abcdefghij"), 0, S("1234567890"), 5, 6, S("67890abcdefghij"));
    783     test(S("abcdefghij"), 0, S("1234567890"), 9, 0, S("abcdefghij"));
    784     test(S("abcdefghij"), 0, S("1234567890"), 9, 1, S("0abcdefghij"));
    785     test(S("abcdefghij"), 0, S("1234567890"), 9, 2, S("0abcdefghij"));
    786     test(S("abcdefghij"), 0, S("1234567890"), 10, 0, S("abcdefghij"));
    787     test(S("abcdefghij"), 0, S("1234567890"), 10, 1, S("abcdefghij"));
    788     test(S("abcdefghij"), 0, S("1234567890"), 11, 0, S("can't happen"));
    789     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
    790     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 1, S("1abcdefghij"));
    791     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 10, S("1234567890abcdefghij"));
    792     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcdefghij"));
    793     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcdefghij"));
    794     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcdefghij"));
    795     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
    796     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 1, S("2abcdefghij"));
    797 }
    798 
    799 template <class S>
    800 void test13()
    801 {
    802     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 9, S("234567890abcdefghij"));
    803     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcdefghij"));
    804     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcdefghij"));
    805     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcdefghij"));
    806     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
    807     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 1, S("1abcdefghij"));
    808     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 5, S("12345abcdefghij"));
    809     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 9, S("123456789abcdefghij"));
    810     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 10, S("1234567890abcdefghij"));
    811     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 11, S("1234567890abcdefghij"));
    812     test(S("abcdefghij"), 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
    813     test(S("abcdefghij"), 0, S("12345678901234567890"), 19, 1, S("0abcdefghij"));
    814     test(S("abcdefghij"), 0, S("12345678901234567890"), 19, 2, S("0abcdefghij"));
    815     test(S("abcdefghij"), 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
    816     test(S("abcdefghij"), 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
    817     test(S("abcdefghij"), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
    818     test(S("abcdefghij"), 1, S(""), 0, 0, S("abcdefghij"));
    819     test(S("abcdefghij"), 1, S(""), 0, 1, S("abcdefghij"));
    820     test(S("abcdefghij"), 1, S(""), 1, 0, S("can't happen"));
    821     test(S("abcdefghij"), 1, S("12345"), 0, 0, S("abcdefghij"));
    822     test(S("abcdefghij"), 1, S("12345"), 0, 1, S("a1bcdefghij"));
    823     test(S("abcdefghij"), 1, S("12345"), 0, 2, S("a12bcdefghij"));
    824     test(S("abcdefghij"), 1, S("12345"), 0, 4, S("a1234bcdefghij"));
    825     test(S("abcdefghij"), 1, S("12345"), 0, 5, S("a12345bcdefghij"));
    826     test(S("abcdefghij"), 1, S("12345"), 0, 6, S("a12345bcdefghij"));
    827     test(S("abcdefghij"), 1, S("12345"), 1, 0, S("abcdefghij"));
    828     test(S("abcdefghij"), 1, S("12345"), 1, 1, S("a2bcdefghij"));
    829     test(S("abcdefghij"), 1, S("12345"), 1, 2, S("a23bcdefghij"));
    830     test(S("abcdefghij"), 1, S("12345"), 1, 3, S("a234bcdefghij"));
    831     test(S("abcdefghij"), 1, S("12345"), 1, 4, S("a2345bcdefghij"));
    832     test(S("abcdefghij"), 1, S("12345"), 1, 5, S("a2345bcdefghij"));
    833     test(S("abcdefghij"), 1, S("12345"), 2, 0, S("abcdefghij"));
    834     test(S("abcdefghij"), 1, S("12345"), 2, 1, S("a3bcdefghij"));
    835     test(S("abcdefghij"), 1, S("12345"), 2, 2, S("a34bcdefghij"));
    836     test(S("abcdefghij"), 1, S("12345"), 2, 3, S("a345bcdefghij"));
    837     test(S("abcdefghij"), 1, S("12345"), 2, 4, S("a345bcdefghij"));
    838     test(S("abcdefghij"), 1, S("12345"), 4, 0, S("abcdefghij"));
    839     test(S("abcdefghij"), 1, S("12345"), 4, 1, S("a5bcdefghij"));
    840     test(S("abcdefghij"), 1, S("12345"), 4, 2, S("a5bcdefghij"));
    841     test(S("abcdefghij"), 1, S("12345"), 5, 0, S("abcdefghij"));
    842     test(S("abcdefghij"), 1, S("12345"), 5, 1, S("abcdefghij"));
    843     test(S("abcdefghij"), 1, S("12345"), 6, 0, S("can't happen"));
    844     test(S("abcdefghij"), 1, S("1234567890"), 0, 0, S("abcdefghij"));
    845     test(S("abcdefghij"), 1, S("1234567890"), 0, 1, S("a1bcdefghij"));
    846     test(S("abcdefghij"), 1, S("1234567890"), 0, 5, S("a12345bcdefghij"));
    847     test(S("abcdefghij"), 1, S("1234567890"), 0, 9, S("a123456789bcdefghij"));
    848     test(S("abcdefghij"), 1, S("1234567890"), 0, 10, S("a1234567890bcdefghij"));
    849     test(S("abcdefghij"), 1, S("1234567890"), 0, 11, S("a1234567890bcdefghij"));
    850     test(S("abcdefghij"), 1, S("1234567890"), 1, 0, S("abcdefghij"));
    851     test(S("abcdefghij"), 1, S("1234567890"), 1, 1, S("a2bcdefghij"));
    852 }
    853 
    854 template <class S>
    855 void test14()
    856 {
    857     test(S("abcdefghij"), 1, S("1234567890"), 1, 4, S("a2345bcdefghij"));
    858     test(S("abcdefghij"), 1, S("1234567890"), 1, 8, S("a23456789bcdefghij"));
    859     test(S("abcdefghij"), 1, S("1234567890"), 1, 9, S("a234567890bcdefghij"));
    860     test(S("abcdefghij"), 1, S("1234567890"), 1, 10, S("a234567890bcdefghij"));
    861     test(S("abcdefghij"), 1, S("1234567890"), 5, 0, S("abcdefghij"));
    862     test(S("abcdefghij"), 1, S("1234567890"), 5, 1, S("a6bcdefghij"));
    863     test(S("abcdefghij"), 1, S("1234567890"), 5, 2, S("a67bcdefghij"));
    864     test(S("abcdefghij"), 1, S("1234567890"), 5, 4, S("a6789bcdefghij"));
    865     test(S("abcdefghij"), 1, S("1234567890"), 5, 5, S("a67890bcdefghij"));
    866     test(S("abcdefghij"), 1, S("1234567890"), 5, 6, S("a67890bcdefghij"));
    867     test(S("abcdefghij"), 1, S("1234567890"), 9, 0, S("abcdefghij"));
    868     test(S("abcdefghij"), 1, S("1234567890"), 9, 1, S("a0bcdefghij"));
    869     test(S("abcdefghij"), 1, S("1234567890"), 9, 2, S("a0bcdefghij"));
    870     test(S("abcdefghij"), 1, S("1234567890"), 10, 0, S("abcdefghij"));
    871     test(S("abcdefghij"), 1, S("1234567890"), 10, 1, S("abcdefghij"));
    872     test(S("abcdefghij"), 1, S("1234567890"), 11, 0, S("can't happen"));
    873     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 0, S("abcdefghij"));
    874     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 1, S("a1bcdefghij"));
    875     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 10, S("a1234567890bcdefghij"));
    876     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcdefghij"));
    877     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcdefghij"));
    878     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcdefghij"));
    879     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 0, S("abcdefghij"));
    880     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 1, S("a2bcdefghij"));
    881     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 9, S("a234567890bcdefghij"));
    882     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 18, S("a234567890123456789bcdefghij"));
    883     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcdefghij"));
    884     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcdefghij"));
    885     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 0, S("abcdefghij"));
    886     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 1, S("a1bcdefghij"));
    887     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 5, S("a12345bcdefghij"));
    888     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 9, S("a123456789bcdefghij"));
    889     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 10, S("a1234567890bcdefghij"));
    890     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 11, S("a1234567890bcdefghij"));
    891     test(S("abcdefghij"), 1, S("12345678901234567890"), 19, 0, S("abcdefghij"));
    892     test(S("abcdefghij"), 1, S("12345678901234567890"), 19, 1, S("a0bcdefghij"));
    893     test(S("abcdefghij"), 1, S("12345678901234567890"), 19, 2, S("a0bcdefghij"));
    894     test(S("abcdefghij"), 1, S("12345678901234567890"), 20, 0, S("abcdefghij"));
    895     test(S("abcdefghij"), 1, S("12345678901234567890"), 20, 1, S("abcdefghij"));
    896     test(S("abcdefghij"), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
    897     test(S("abcdefghij"), 5, S(""), 0, 0, S("abcdefghij"));
    898     test(S("abcdefghij"), 5, S(""), 0, 1, S("abcdefghij"));
    899     test(S("abcdefghij"), 5, S(""), 1, 0, S("can't happen"));
    900     test(S("abcdefghij"), 5, S("12345"), 0, 0, S("abcdefghij"));
    901     test(S("abcdefghij"), 5, S("12345"), 0, 1, S("abcde1fghij"));
    902     test(S("abcdefghij"), 5, S("12345"), 0, 2, S("abcde12fghij"));
    903     test(S("abcdefghij"), 5, S("12345"), 0, 4, S("abcde1234fghij"));
    904     test(S("abcdefghij"), 5, S("12345"), 0, 5, S("abcde12345fghij"));
    905     test(S("abcdefghij"), 5, S("12345"), 0, 6, S("abcde12345fghij"));
    906     test(S("abcdefghij"), 5, S("12345"), 1, 0, S("abcdefghij"));
    907 }
    908 
    909 template <class S>
    910 void test15()
    911 {
    912     test(S("abcdefghij"), 5, S("12345"), 1, 1, S("abcde2fghij"));
    913     test(S("abcdefghij"), 5, S("12345"), 1, 2, S("abcde23fghij"));
    914     test(S("abcdefghij"), 5, S("12345"), 1, 3, S("abcde234fghij"));
    915     test(S("abcdefghij"), 5, S("12345"), 1, 4, S("abcde2345fghij"));
    916     test(S("abcdefghij"), 5, S("12345"), 1, 5, S("abcde2345fghij"));
    917     test(S("abcdefghij"), 5, S("12345"), 2, 0, S("abcdefghij"));
    918     test(S("abcdefghij"), 5, S("12345"), 2, 1, S("abcde3fghij"));
    919     test(S("abcdefghij"), 5, S("12345"), 2, 2, S("abcde34fghij"));
    920     test(S("abcdefghij"), 5, S("12345"), 2, 3, S("abcde345fghij"));
    921     test(S("abcdefghij"), 5, S("12345"), 2, 4, S("abcde345fghij"));
    922     test(S("abcdefghij"), 5, S("12345"), 4, 0, S("abcdefghij"));
    923     test(S("abcdefghij"), 5, S("12345"), 4, 1, S("abcde5fghij"));
    924     test(S("abcdefghij"), 5, S("12345"), 4, 2, S("abcde5fghij"));
    925     test(S("abcdefghij"), 5, S("12345"), 5, 0, S("abcdefghij"));
    926     test(S("abcdefghij"), 5, S("12345"), 5, 1, S("abcdefghij"));
    927     test(S("abcdefghij"), 5, S("12345"), 6, 0, S("can't happen"));
    928     test(S("abcdefghij"), 5, S("1234567890"), 0, 0, S("abcdefghij"));
    929     test(S("abcdefghij"), 5, S("1234567890"), 0, 1, S("abcde1fghij"));
    930     test(S("abcdefghij"), 5, S("1234567890"), 0, 5, S("abcde12345fghij"));
    931     test(S("abcdefghij"), 5, S("1234567890"), 0, 9, S("abcde123456789fghij"));
    932     test(S("abcdefghij"), 5, S("1234567890"), 0, 10, S("abcde1234567890fghij"));
    933     test(S("abcdefghij"), 5, S("1234567890"), 0, 11, S("abcde1234567890fghij"));
    934     test(S("abcdefghij"), 5, S("1234567890"), 1, 0, S("abcdefghij"));
    935     test(S("abcdefghij"), 5, S("1234567890"), 1, 1, S("abcde2fghij"));
    936     test(S("abcdefghij"), 5, S("1234567890"), 1, 4, S("abcde2345fghij"));
    937     test(S("abcdefghij"), 5, S("1234567890"), 1, 8, S("abcde23456789fghij"));
    938     test(S("abcdefghij"), 5, S("1234567890"), 1, 9, S("abcde234567890fghij"));
    939     test(S("abcdefghij"), 5, S("1234567890"), 1, 10, S("abcde234567890fghij"));
    940     test(S("abcdefghij"), 5, S("1234567890"), 5, 0, S("abcdefghij"));
    941     test(S("abcdefghij"), 5, S("1234567890"), 5, 1, S("abcde6fghij"));
    942     test(S("abcdefghij"), 5, S("1234567890"), 5, 2, S("abcde67fghij"));
    943     test(S("abcdefghij"), 5, S("1234567890"), 5, 4, S("abcde6789fghij"));
    944     test(S("abcdefghij"), 5, S("1234567890"), 5, 5, S("abcde67890fghij"));
    945     test(S("abcdefghij"), 5, S("1234567890"), 5, 6, S("abcde67890fghij"));
    946     test(S("abcdefghij"), 5, S("1234567890"), 9, 0, S("abcdefghij"));
    947     test(S("abcdefghij"), 5, S("1234567890"), 9, 1, S("abcde0fghij"));
    948     test(S("abcdefghij"), 5, S("1234567890"), 9, 2, S("abcde0fghij"));
    949     test(S("abcdefghij"), 5, S("1234567890"), 10, 0, S("abcdefghij"));
    950     test(S("abcdefghij"), 5, S("1234567890"), 10, 1, S("abcdefghij"));
    951     test(S("abcdefghij"), 5, S("1234567890"), 11, 0, S("can't happen"));
    952     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 0, S("abcdefghij"));
    953     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 1, S("abcde1fghij"));
    954     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 10, S("abcde1234567890fghij"));
    955     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789fghij"));
    956     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890fghij"));
    957     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890fghij"));
    958     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 0, S("abcdefghij"));
    959     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 1, S("abcde2fghij"));
    960     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 9, S("abcde234567890fghij"));
    961     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 18, S("abcde234567890123456789fghij"));
    962 }
    963 
    964 template <class S>
    965 void test16()
    966 {
    967     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890fghij"));
    968     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890fghij"));
    969     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 0, S("abcdefghij"));
    970     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 1, S("abcde1fghij"));
    971     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 5, S("abcde12345fghij"));
    972     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 9, S("abcde123456789fghij"));
    973     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 10, S("abcde1234567890fghij"));
    974     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 11, S("abcde1234567890fghij"));
    975     test(S("abcdefghij"), 5, S("12345678901234567890"), 19, 0, S("abcdefghij"));
    976     test(S("abcdefghij"), 5, S("12345678901234567890"), 19, 1, S("abcde0fghij"));
    977     test(S("abcdefghij"), 5, S("12345678901234567890"), 19, 2, S("abcde0fghij"));
    978     test(S("abcdefghij"), 5, S("12345678901234567890"), 20, 0, S("abcdefghij"));
    979     test(S("abcdefghij"), 5, S("12345678901234567890"), 20, 1, S("abcdefghij"));
    980     test(S("abcdefghij"), 5, S("12345678901234567890"), 21, 0, S("can't happen"));
    981     test(S("abcdefghij"), 9, S(""), 0, 0, S("abcdefghij"));
    982     test(S("abcdefghij"), 9, S(""), 0, 1, S("abcdefghij"));
    983     test(S("abcdefghij"), 9, S(""), 1, 0, S("can't happen"));
    984     test(S("abcdefghij"), 9, S("12345"), 0, 0, S("abcdefghij"));
    985     test(S("abcdefghij"), 9, S("12345"), 0, 1, S("abcdefghi1j"));
    986     test(S("abcdefghij"), 9, S("12345"), 0, 2, S("abcdefghi12j"));
    987     test(S("abcdefghij"), 9, S("12345"), 0, 4, S("abcdefghi1234j"));
    988     test(S("abcdefghij"), 9, S("12345"), 0, 5, S("abcdefghi12345j"));
    989     test(S("abcdefghij"), 9, S("12345"), 0, 6, S("abcdefghi12345j"));
    990     test(S("abcdefghij"), 9, S("12345"), 1, 0, S("abcdefghij"));
    991     test(S("abcdefghij"), 9, S("12345"), 1, 1, S("abcdefghi2j"));
    992     test(S("abcdefghij"), 9, S("12345"), 1, 2, S("abcdefghi23j"));
    993     test(S("abcdefghij"), 9, S("12345"), 1, 3, S("abcdefghi234j"));
    994     test(S("abcdefghij"), 9, S("12345"), 1, 4, S("abcdefghi2345j"));
    995     test(S("abcdefghij"), 9, S("12345"), 1, 5, S("abcdefghi2345j"));
    996     test(S("abcdefghij"), 9, S("12345"), 2, 0, S("abcdefghij"));
    997     test(S("abcdefghij"), 9, S("12345"), 2, 1, S("abcdefghi3j"));
    998     test(S("abcdefghij"), 9, S("12345"), 2, 2, S("abcdefghi34j"));
    999     test(S("abcdefghij"), 9, S("12345"), 2, 3, S("abcdefghi345j"));
   1000     test(S("abcdefghij"), 9, S("12345"), 2, 4, S("abcdefghi345j"));
   1001     test(S("abcdefghij"), 9, S("12345"), 4, 0, S("abcdefghij"));
   1002     test(S("abcdefghij"), 9, S("12345"), 4, 1, S("abcdefghi5j"));
   1003     test(S("abcdefghij"), 9, S("12345"), 4, 2, S("abcdefghi5j"));
   1004     test(S("abcdefghij"), 9, S("12345"), 5, 0, S("abcdefghij"));
   1005     test(S("abcdefghij"), 9, S("12345"), 5, 1, S("abcdefghij"));
   1006     test(S("abcdefghij"), 9, S("12345"), 6, 0, S("can't happen"));
   1007     test(S("abcdefghij"), 9, S("1234567890"), 0, 0, S("abcdefghij"));
   1008     test(S("abcdefghij"), 9, S("1234567890"), 0, 1, S("abcdefghi1j"));
   1009     test(S("abcdefghij"), 9, S("1234567890"), 0, 5, S("abcdefghi12345j"));
   1010     test(S("abcdefghij"), 9, S("1234567890"), 0, 9, S("abcdefghi123456789j"));
   1011     test(S("abcdefghij"), 9, S("1234567890"), 0, 10, S("abcdefghi1234567890j"));
   1012     test(S("abcdefghij"), 9, S("1234567890"), 0, 11, S("abcdefghi1234567890j"));
   1013     test(S("abcdefghij"), 9, S("1234567890"), 1, 0, S("abcdefghij"));
   1014     test(S("abcdefghij"), 9, S("1234567890"), 1, 1, S("abcdefghi2j"));
   1015     test(S("abcdefghij"), 9, S("1234567890"), 1, 4, S("abcdefghi2345j"));
   1016     test(S("abcdefghij"), 9, S("1234567890"), 1, 8, S("abcdefghi23456789j"));
   1017 }
   1018 
   1019 template <class S>
   1020 void test17()
   1021 {
   1022     test(S("abcdefghij"), 9, S("1234567890"), 1, 9, S("abcdefghi234567890j"));
   1023     test(S("abcdefghij"), 9, S("1234567890"), 1, 10, S("abcdefghi234567890j"));
   1024     test(S("abcdefghij"), 9, S("1234567890"), 5, 0, S("abcdefghij"));
   1025     test(S("abcdefghij"), 9, S("1234567890"), 5, 1, S("abcdefghi6j"));
   1026     test(S("abcdefghij"), 9, S("1234567890"), 5, 2, S("abcdefghi67j"));
   1027     test(S("abcdefghij"), 9, S("1234567890"), 5, 4, S("abcdefghi6789j"));
   1028     test(S("abcdefghij"), 9, S("1234567890"), 5, 5, S("abcdefghi67890j"));
   1029     test(S("abcdefghij"), 9, S("1234567890"), 5, 6, S("abcdefghi67890j"));
   1030     test(S("abcdefghij"), 9, S("1234567890"), 9, 0, S("abcdefghij"));
   1031     test(S("abcdefghij"), 9, S("1234567890"), 9, 1, S("abcdefghi0j"));
   1032     test(S("abcdefghij"), 9, S("1234567890"), 9, 2, S("abcdefghi0j"));
   1033     test(S("abcdefghij"), 9, S("1234567890"), 10, 0, S("abcdefghij"));
   1034     test(S("abcdefghij"), 9, S("1234567890"), 10, 1, S("abcdefghij"));
   1035     test(S("abcdefghij"), 9, S("1234567890"), 11, 0, S("can't happen"));
   1036     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 0, S("abcdefghij"));
   1037     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 1, S("abcdefghi1j"));
   1038     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 10, S("abcdefghi1234567890j"));
   1039     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 19, S("abcdefghi1234567890123456789j"));
   1040     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 20, S("abcdefghi12345678901234567890j"));
   1041     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 21, S("abcdefghi12345678901234567890j"));
   1042     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 0, S("abcdefghij"));
   1043     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 1, S("abcdefghi2j"));
   1044     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 9, S("abcdefghi234567890j"));
   1045     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 18, S("abcdefghi234567890123456789j"));
   1046     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 19, S("abcdefghi2345678901234567890j"));
   1047     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 20, S("abcdefghi2345678901234567890j"));
   1048     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 0, S("abcdefghij"));
   1049     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 1, S("abcdefghi1j"));
   1050     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 5, S("abcdefghi12345j"));
   1051     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 9, S("abcdefghi123456789j"));
   1052     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 10, S("abcdefghi1234567890j"));
   1053     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 11, S("abcdefghi1234567890j"));
   1054     test(S("abcdefghij"), 9, S("12345678901234567890"), 19, 0, S("abcdefghij"));
   1055     test(S("abcdefghij"), 9, S("12345678901234567890"), 19, 1, S("abcdefghi0j"));
   1056     test(S("abcdefghij"), 9, S("12345678901234567890"), 19, 2, S("abcdefghi0j"));
   1057     test(S("abcdefghij"), 9, S("12345678901234567890"), 20, 0, S("abcdefghij"));
   1058     test(S("abcdefghij"), 9, S("12345678901234567890"), 20, 1, S("abcdefghij"));
   1059     test(S("abcdefghij"), 9, S("12345678901234567890"), 21, 0, S("can't happen"));
   1060     test(S("abcdefghij"), 10, S(""), 0, 0, S("abcdefghij"));
   1061     test(S("abcdefghij"), 10, S(""), 0, 1, S("abcdefghij"));
   1062     test(S("abcdefghij"), 10, S(""), 1, 0, S("can't happen"));
   1063     test(S("abcdefghij"), 10, S("12345"), 0, 0, S("abcdefghij"));
   1064     test(S("abcdefghij"), 10, S("12345"), 0, 1, S("abcdefghij1"));
   1065     test(S("abcdefghij"), 10, S("12345"), 0, 2, S("abcdefghij12"));
   1066     test(S("abcdefghij"), 10, S("12345"), 0, 4, S("abcdefghij1234"));
   1067     test(S("abcdefghij"), 10, S("12345"), 0, 5, S("abcdefghij12345"));
   1068     test(S("abcdefghij"), 10, S("12345"), 0, 6, S("abcdefghij12345"));
   1069     test(S("abcdefghij"), 10, S("12345"), 1, 0, S("abcdefghij"));
   1070     test(S("abcdefghij"), 10, S("12345"), 1, 1, S("abcdefghij2"));
   1071     test(S("abcdefghij"), 10, S("12345"), 1, 2, S("abcdefghij23"));
   1072 }
   1073 
   1074 template <class S>
   1075 void test18()
   1076 {
   1077     test(S("abcdefghij"), 10, S("12345"), 1, 3, S("abcdefghij234"));
   1078     test(S("abcdefghij"), 10, S("12345"), 1, 4, S("abcdefghij2345"));
   1079     test(S("abcdefghij"), 10, S("12345"), 1, 5, S("abcdefghij2345"));
   1080     test(S("abcdefghij"), 10, S("12345"), 2, 0, S("abcdefghij"));
   1081     test(S("abcdefghij"), 10, S("12345"), 2, 1, S("abcdefghij3"));
   1082     test(S("abcdefghij"), 10, S("12345"), 2, 2, S("abcdefghij34"));
   1083     test(S("abcdefghij"), 10, S("12345"), 2, 3, S("abcdefghij345"));
   1084     test(S("abcdefghij"), 10, S("12345"), 2, 4, S("abcdefghij345"));
   1085     test(S("abcdefghij"), 10, S("12345"), 4, 0, S("abcdefghij"));
   1086     test(S("abcdefghij"), 10, S("12345"), 4, 1, S("abcdefghij5"));
   1087     test(S("abcdefghij"), 10, S("12345"), 4, 2, S("abcdefghij5"));
   1088     test(S("abcdefghij"), 10, S("12345"), 5, 0, S("abcdefghij"));
   1089     test(S("abcdefghij"), 10, S("12345"), 5, 1, S("abcdefghij"));
   1090     test(S("abcdefghij"), 10, S("12345"), 6, 0, S("can't happen"));
   1091     test(S("abcdefghij"), 10, S("1234567890"), 0, 0, S("abcdefghij"));
   1092     test(S("abcdefghij"), 10, S("1234567890"), 0, 1, S("abcdefghij1"));
   1093     test(S("abcdefghij"), 10, S("1234567890"), 0, 5, S("abcdefghij12345"));
   1094     test(S("abcdefghij"), 10, S("1234567890"), 0, 9, S("abcdefghij123456789"));
   1095     test(S("abcdefghij"), 10, S("1234567890"), 0, 10, S("abcdefghij1234567890"));
   1096     test(S("abcdefghij"), 10, S("1234567890"), 0, 11, S("abcdefghij1234567890"));
   1097     test(S("abcdefghij"), 10, S("1234567890"), 1, 0, S("abcdefghij"));
   1098     test(S("abcdefghij"), 10, S("1234567890"), 1, 1, S("abcdefghij2"));
   1099     test(S("abcdefghij"), 10, S("1234567890"), 1, 4, S("abcdefghij2345"));
   1100     test(S("abcdefghij"), 10, S("1234567890"), 1, 8, S("abcdefghij23456789"));
   1101     test(S("abcdefghij"), 10, S("1234567890"), 1, 9, S("abcdefghij234567890"));
   1102     test(S("abcdefghij"), 10, S("1234567890"), 1, 10, S("abcdefghij234567890"));
   1103     test(S("abcdefghij"), 10, S("1234567890"), 5, 0, S("abcdefghij"));
   1104     test(S("abcdefghij"), 10, S("1234567890"), 5, 1, S("abcdefghij6"));
   1105     test(S("abcdefghij"), 10, S("1234567890"), 5, 2, S("abcdefghij67"));
   1106     test(S("abcdefghij"), 10, S("1234567890"), 5, 4, S("abcdefghij6789"));
   1107     test(S("abcdefghij"), 10, S("1234567890"), 5, 5, S("abcdefghij67890"));
   1108     test(S("abcdefghij"), 10, S("1234567890"), 5, 6, S("abcdefghij67890"));
   1109     test(S("abcdefghij"), 10, S("1234567890"), 9, 0, S("abcdefghij"));
   1110     test(S("abcdefghij"), 10, S("1234567890"), 9, 1, S("abcdefghij0"));
   1111     test(S("abcdefghij"), 10, S("1234567890"), 9, 2, S("abcdefghij0"));
   1112     test(S("abcdefghij"), 10, S("1234567890"), 10, 0, S("abcdefghij"));
   1113     test(S("abcdefghij"), 10, S("1234567890"), 10, 1, S("abcdefghij"));
   1114     test(S("abcdefghij"), 10, S("1234567890"), 11, 0, S("can't happen"));
   1115     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 0, S("abcdefghij"));
   1116     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 1, S("abcdefghij1"));
   1117     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890"));
   1118     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789"));
   1119     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890"));
   1120     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890"));
   1121     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 0, S("abcdefghij"));
   1122     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 1, S("abcdefghij2"));
   1123     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 9, S("abcdefghij234567890"));
   1124     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789"));
   1125     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890"));
   1126     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890"));
   1127 }
   1128 
   1129 template <class S>
   1130 void test19()
   1131 {
   1132     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 0, S("abcdefghij"));
   1133     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 1, S("abcdefghij1"));
   1134     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 5, S("abcdefghij12345"));
   1135     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 9, S("abcdefghij123456789"));
   1136     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890"));
   1137     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890"));
   1138     test(S("abcdefghij"), 10, S("12345678901234567890"), 19, 0, S("abcdefghij"));
   1139     test(S("abcdefghij"), 10, S("12345678901234567890"), 19, 1, S("abcdefghij0"));
   1140     test(S("abcdefghij"), 10, S("12345678901234567890"), 19, 2, S("abcdefghij0"));
   1141     test(S("abcdefghij"), 10, S("12345678901234567890"), 20, 0, S("abcdefghij"));
   1142     test(S("abcdefghij"), 10, S("12345678901234567890"), 20, 1, S("abcdefghij"));
   1143     test(S("abcdefghij"), 10, S("12345678901234567890"), 21, 0, S("can't happen"));
   1144     test(S("abcdefghij"), 11, S(""), 0, 0, S("can't happen"));
   1145     test(S("abcdefghij"), 11, S(""), 0, 1, S("can't happen"));
   1146     test(S("abcdefghij"), 11, S(""), 1, 0, S("can't happen"));
   1147     test(S("abcdefghij"), 11, S("12345"), 0, 0, S("can't happen"));
   1148     test(S("abcdefghij"), 11, S("12345"), 0, 1, S("can't happen"));
   1149     test(S("abcdefghij"), 11, S("12345"), 0, 2, S("can't happen"));
   1150     test(S("abcdefghij"), 11, S("12345"), 0, 4, S("can't happen"));
   1151     test(S("abcdefghij"), 11, S("12345"), 0, 5, S("can't happen"));
   1152     test(S("abcdefghij"), 11, S("12345"), 0, 6, S("can't happen"));
   1153     test(S("abcdefghij"), 11, S("12345"), 1, 0, S("can't happen"));
   1154     test(S("abcdefghij"), 11, S("12345"), 1, 1, S("can't happen"));
   1155     test(S("abcdefghij"), 11, S("12345"), 1, 2, S("can't happen"));
   1156     test(S("abcdefghij"), 11, S("12345"), 1, 3, S("can't happen"));
   1157     test(S("abcdefghij"), 11, S("12345"), 1, 4, S("can't happen"));
   1158     test(S("abcdefghij"), 11, S("12345"), 1, 5, S("can't happen"));
   1159     test(S("abcdefghij"), 11, S("12345"), 2, 0, S("can't happen"));
   1160     test(S("abcdefghij"), 11, S("12345"), 2, 1, S("can't happen"));
   1161     test(S("abcdefghij"), 11, S("12345"), 2, 2, S("can't happen"));
   1162     test(S("abcdefghij"), 11, S("12345"), 2, 3, S("can't happen"));
   1163     test(S("abcdefghij"), 11, S("12345"), 2, 4, S("can't happen"));
   1164     test(S("abcdefghij"), 11, S("12345"), 4, 0, S("can't happen"));
   1165     test(S("abcdefghij"), 11, S("12345"), 4, 1, S("can't happen"));
   1166     test(S("abcdefghij"), 11, S("12345"), 4, 2, S("can't happen"));
   1167     test(S("abcdefghij"), 11, S("12345"), 5, 0, S("can't happen"));
   1168     test(S("abcdefghij"), 11, S("12345"), 5, 1, S("can't happen"));
   1169     test(S("abcdefghij"), 11, S("12345"), 6, 0, S("can't happen"));
   1170     test(S("abcdefghij"), 11, S("1234567890"), 0, 0, S("can't happen"));
   1171     test(S("abcdefghij"), 11, S("1234567890"), 0, 1, S("can't happen"));
   1172     test(S("abcdefghij"), 11, S("1234567890"), 0, 5, S("can't happen"));
   1173     test(S("abcdefghij"), 11, S("1234567890"), 0, 9, S("can't happen"));
   1174     test(S("abcdefghij"), 11, S("1234567890"), 0, 10, S("can't happen"));
   1175     test(S("abcdefghij"), 11, S("1234567890"), 0, 11, S("can't happen"));
   1176     test(S("abcdefghij"), 11, S("1234567890"), 1, 0, S("can't happen"));
   1177     test(S("abcdefghij"), 11, S("1234567890"), 1, 1, S("can't happen"));
   1178     test(S("abcdefghij"), 11, S("1234567890"), 1, 4, S("can't happen"));
   1179     test(S("abcdefghij"), 11, S("1234567890"), 1, 8, S("can't happen"));
   1180     test(S("abcdefghij"), 11, S("1234567890"), 1, 9, S("can't happen"));
   1181     test(S("abcdefghij"), 11, S("1234567890"), 1, 10, S("can't happen"));
   1182 }
   1183 
   1184 template <class S>
   1185 void test20()
   1186 {
   1187     test(S("abcdefghij"), 11, S("1234567890"), 5, 0, S("can't happen"));
   1188     test(S("abcdefghij"), 11, S("1234567890"), 5, 1, S("can't happen"));
   1189     test(S("abcdefghij"), 11, S("1234567890"), 5, 2, S("can't happen"));
   1190     test(S("abcdefghij"), 11, S("1234567890"), 5, 4, S("can't happen"));
   1191     test(S("abcdefghij"), 11, S("1234567890"), 5, 5, S("can't happen"));
   1192     test(S("abcdefghij"), 11, S("1234567890"), 5, 6, S("can't happen"));
   1193     test(S("abcdefghij"), 11, S("1234567890"), 9, 0, S("can't happen"));
   1194     test(S("abcdefghij"), 11, S("1234567890"), 9, 1, S("can't happen"));
   1195     test(S("abcdefghij"), 11, S("1234567890"), 9, 2, S("can't happen"));
   1196     test(S("abcdefghij"), 11, S("1234567890"), 10, 0, S("can't happen"));
   1197     test(S("abcdefghij"), 11, S("1234567890"), 10, 1, S("can't happen"));
   1198     test(S("abcdefghij"), 11, S("1234567890"), 11, 0, S("can't happen"));
   1199     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 0, S("can't happen"));
   1200     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 1, S("can't happen"));
   1201     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 10, S("can't happen"));
   1202     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 19, S("can't happen"));
   1203     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 20, S("can't happen"));
   1204     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 21, S("can't happen"));
   1205     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 0, S("can't happen"));
   1206     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 1, S("can't happen"));
   1207     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 9, S("can't happen"));
   1208     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 18, S("can't happen"));
   1209     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 19, S("can't happen"));
   1210     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 20, S("can't happen"));
   1211     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 0, S("can't happen"));
   1212     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 1, S("can't happen"));
   1213     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 5, S("can't happen"));
   1214     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 9, S("can't happen"));
   1215     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 10, S("can't happen"));
   1216     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 11, S("can't happen"));
   1217     test(S("abcdefghij"), 11, S("12345678901234567890"), 19, 0, S("can't happen"));
   1218     test(S("abcdefghij"), 11, S("12345678901234567890"), 19, 1, S("can't happen"));
   1219     test(S("abcdefghij"), 11, S("12345678901234567890"), 19, 2, S("can't happen"));
   1220     test(S("abcdefghij"), 11, S("12345678901234567890"), 20, 0, S("can't happen"));
   1221     test(S("abcdefghij"), 11, S("12345678901234567890"), 20, 1, S("can't happen"));
   1222     test(S("abcdefghij"), 11, S("12345678901234567890"), 21, 0, S("can't happen"));
   1223     test(S("abcdefghijklmnopqrst"), 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
   1224     test(S("abcdefghijklmnopqrst"), 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
   1225     test(S("abcdefghijklmnopqrst"), 0, S(""), 1, 0, S("can't happen"));
   1226     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
   1227     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 1, S("1abcdefghijklmnopqrst"));
   1228     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 2, S("12abcdefghijklmnopqrst"));
   1229     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 4, S("1234abcdefghijklmnopqrst"));
   1230     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 5, S("12345abcdefghijklmnopqrst"));
   1231     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 6, S("12345abcdefghijklmnopqrst"));
   1232     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
   1233     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 1, S("2abcdefghijklmnopqrst"));
   1234     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 2, S("23abcdefghijklmnopqrst"));
   1235     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 3, S("234abcdefghijklmnopqrst"));
   1236     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 4, S("2345abcdefghijklmnopqrst"));
   1237 }
   1238 
   1239 template <class S>
   1240 void test21()
   1241 {
   1242     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 5, S("2345abcdefghijklmnopqrst"));
   1243     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
   1244     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 1, S("3abcdefghijklmnopqrst"));
   1245     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 2, S("34abcdefghijklmnopqrst"));
   1246     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 3, S("345abcdefghijklmnopqrst"));
   1247     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 4, S("345abcdefghijklmnopqrst"));
   1248     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
   1249     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 4, 1, S("5abcdefghijklmnopqrst"));
   1250     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 4, 2, S("5abcdefghijklmnopqrst"));
   1251     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
   1252     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
   1253     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 6, 0, S("can't happen"));
   1254     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1255     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 1, S("1abcdefghijklmnopqrst"));
   1256     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 5, S("12345abcdefghijklmnopqrst"));
   1257     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 9, S("123456789abcdefghijklmnopqrst"));
   1258     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 10, S("1234567890abcdefghijklmnopqrst"));
   1259     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 11, S("1234567890abcdefghijklmnopqrst"));
   1260     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1261     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 1, S("2abcdefghijklmnopqrst"));
   1262     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 4, S("2345abcdefghijklmnopqrst"));
   1263     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 8, S("23456789abcdefghijklmnopqrst"));
   1264     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 9, S("234567890abcdefghijklmnopqrst"));
   1265     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 10, S("234567890abcdefghijklmnopqrst"));
   1266     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
   1267     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 1, S("6abcdefghijklmnopqrst"));
   1268     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 2, S("67abcdefghijklmnopqrst"));
   1269     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 4, S("6789abcdefghijklmnopqrst"));
   1270     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 5, S("67890abcdefghijklmnopqrst"));
   1271     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 6, S("67890abcdefghijklmnopqrst"));
   1272     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
   1273     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 9, 1, S("0abcdefghijklmnopqrst"));
   1274     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 9, 2, S("0abcdefghijklmnopqrst"));
   1275     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1276     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
   1277     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 11, 0, S("can't happen"));
   1278     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1279     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 1, S("1abcdefghijklmnopqrst"));
   1280     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 10, S("1234567890abcdefghijklmnopqrst"));
   1281     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcdefghijklmnopqrst"));
   1282     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcdefghijklmnopqrst"));
   1283     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcdefghijklmnopqrst"));
   1284     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1285     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 1, S("2abcdefghijklmnopqrst"));
   1286     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 9, S("234567890abcdefghijklmnopqrst"));
   1287     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcdefghijklmnopqrst"));
   1288     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcdefghijklmnopqrst"));
   1289     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcdefghijklmnopqrst"));
   1290     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1291     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 1, S("1abcdefghijklmnopqrst"));
   1292 }
   1293 
   1294 template <class S>
   1295 void test22()
   1296 {
   1297     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 5, S("12345abcdefghijklmnopqrst"));
   1298     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 9, S("123456789abcdefghijklmnopqrst"));
   1299     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 10, S("1234567890abcdefghijklmnopqrst"));
   1300     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 11, S("1234567890abcdefghijklmnopqrst"));
   1301     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
   1302     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 19, 1, S("0abcdefghijklmnopqrst"));
   1303     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 19, 2, S("0abcdefghijklmnopqrst"));
   1304     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
   1305     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
   1306     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
   1307     test(S("abcdefghijklmnopqrst"), 1, S(""), 0, 0, S("abcdefghijklmnopqrst"));
   1308     test(S("abcdefghijklmnopqrst"), 1, S(""), 0, 1, S("abcdefghijklmnopqrst"));
   1309     test(S("abcdefghijklmnopqrst"), 1, S(""), 1, 0, S("can't happen"));
   1310     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
   1311     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 1, S("a1bcdefghijklmnopqrst"));
   1312     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 2, S("a12bcdefghijklmnopqrst"));
   1313     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 4, S("a1234bcdefghijklmnopqrst"));
   1314     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 5, S("a12345bcdefghijklmnopqrst"));
   1315     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 6, S("a12345bcdefghijklmnopqrst"));
   1316     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
   1317     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 1, S("a2bcdefghijklmnopqrst"));
   1318     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 2, S("a23bcdefghijklmnopqrst"));
   1319     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 3, S("a234bcdefghijklmnopqrst"));
   1320     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 4, S("a2345bcdefghijklmnopqrst"));
   1321     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 5, S("a2345bcdefghijklmnopqrst"));
   1322     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
   1323     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 1, S("a3bcdefghijklmnopqrst"));
   1324     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 2, S("a34bcdefghijklmnopqrst"));
   1325     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 3, S("a345bcdefghijklmnopqrst"));
   1326     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 4, S("a345bcdefghijklmnopqrst"));
   1327     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
   1328     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 4, 1, S("a5bcdefghijklmnopqrst"));
   1329     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 4, 2, S("a5bcdefghijklmnopqrst"));
   1330     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
   1331     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
   1332     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 6, 0, S("can't happen"));
   1333     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1334     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 1, S("a1bcdefghijklmnopqrst"));
   1335     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 5, S("a12345bcdefghijklmnopqrst"));
   1336     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 9, S("a123456789bcdefghijklmnopqrst"));
   1337     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 10, S("a1234567890bcdefghijklmnopqrst"));
   1338     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 11, S("a1234567890bcdefghijklmnopqrst"));
   1339     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1340     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 1, S("a2bcdefghijklmnopqrst"));
   1341     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 4, S("a2345bcdefghijklmnopqrst"));
   1342     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 8, S("a23456789bcdefghijklmnopqrst"));
   1343     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 9, S("a234567890bcdefghijklmnopqrst"));
   1344     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 10, S("a234567890bcdefghijklmnopqrst"));
   1345     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
   1346     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 1, S("a6bcdefghijklmnopqrst"));
   1347 }
   1348 
   1349 template <class S>
   1350 void test23()
   1351 {
   1352     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 2, S("a67bcdefghijklmnopqrst"));
   1353     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 4, S("a6789bcdefghijklmnopqrst"));
   1354     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 5, S("a67890bcdefghijklmnopqrst"));
   1355     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 6, S("a67890bcdefghijklmnopqrst"));
   1356     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
   1357     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 9, 1, S("a0bcdefghijklmnopqrst"));
   1358     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 9, 2, S("a0bcdefghijklmnopqrst"));
   1359     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1360     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
   1361     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 11, 0, S("can't happen"));
   1362     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1363     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 1, S("a1bcdefghijklmnopqrst"));
   1364     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 10, S("a1234567890bcdefghijklmnopqrst"));
   1365     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcdefghijklmnopqrst"));
   1366     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcdefghijklmnopqrst"));
   1367     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcdefghijklmnopqrst"));
   1368     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1369     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 1, S("a2bcdefghijklmnopqrst"));
   1370     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 9, S("a234567890bcdefghijklmnopqrst"));
   1371     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 18, S("a234567890123456789bcdefghijklmnopqrst"));
   1372     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcdefghijklmnopqrst"));
   1373     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcdefghijklmnopqrst"));
   1374     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1375     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 1, S("a1bcdefghijklmnopqrst"));
   1376     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 5, S("a12345bcdefghijklmnopqrst"));
   1377     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 9, S("a123456789bcdefghijklmnopqrst"));
   1378     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 10, S("a1234567890bcdefghijklmnopqrst"));
   1379     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 11, S("a1234567890bcdefghijklmnopqrst"));
   1380     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
   1381     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 19, 1, S("a0bcdefghijklmnopqrst"));
   1382     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 19, 2, S("a0bcdefghijklmnopqrst"));
   1383     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
   1384     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
   1385     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
   1386     test(S("abcdefghijklmnopqrst"), 10, S(""), 0, 0, S("abcdefghijklmnopqrst"));
   1387     test(S("abcdefghijklmnopqrst"), 10, S(""), 0, 1, S("abcdefghijklmnopqrst"));
   1388     test(S("abcdefghijklmnopqrst"), 10, S(""), 1, 0, S("can't happen"));
   1389     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
   1390     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 1, S("abcdefghij1klmnopqrst"));
   1391     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 2, S("abcdefghij12klmnopqrst"));
   1392     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 4, S("abcdefghij1234klmnopqrst"));
   1393     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 5, S("abcdefghij12345klmnopqrst"));
   1394     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 6, S("abcdefghij12345klmnopqrst"));
   1395     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
   1396     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 1, S("abcdefghij2klmnopqrst"));
   1397     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 2, S("abcdefghij23klmnopqrst"));
   1398     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 3, S("abcdefghij234klmnopqrst"));
   1399     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 4, S("abcdefghij2345klmnopqrst"));
   1400     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 5, S("abcdefghij2345klmnopqrst"));
   1401     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
   1402 }
   1403 
   1404 template <class S>
   1405 void test24()
   1406 {
   1407     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 1, S("abcdefghij3klmnopqrst"));
   1408     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 2, S("abcdefghij34klmnopqrst"));
   1409     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 3, S("abcdefghij345klmnopqrst"));
   1410     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 4, S("abcdefghij345klmnopqrst"));
   1411     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
   1412     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 4, 1, S("abcdefghij5klmnopqrst"));
   1413     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 4, 2, S("abcdefghij5klmnopqrst"));
   1414     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
   1415     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
   1416     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 6, 0, S("can't happen"));
   1417     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1418     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 1, S("abcdefghij1klmnopqrst"));
   1419     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 5, S("abcdefghij12345klmnopqrst"));
   1420     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 9, S("abcdefghij123456789klmnopqrst"));
   1421     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 10, S("abcdefghij1234567890klmnopqrst"));
   1422     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 11, S("abcdefghij1234567890klmnopqrst"));
   1423     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1424     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 1, S("abcdefghij2klmnopqrst"));
   1425     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 4, S("abcdefghij2345klmnopqrst"));
   1426     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 8, S("abcdefghij23456789klmnopqrst"));
   1427     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 9, S("abcdefghij234567890klmnopqrst"));
   1428     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 10, S("abcdefghij234567890klmnopqrst"));
   1429     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
   1430     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 1, S("abcdefghij6klmnopqrst"));
   1431     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 2, S("abcdefghij67klmnopqrst"));
   1432     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 4, S("abcdefghij6789klmnopqrst"));
   1433     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 5, S("abcdefghij67890klmnopqrst"));
   1434     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 6, S("abcdefghij67890klmnopqrst"));
   1435     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
   1436     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 9, 1, S("abcdefghij0klmnopqrst"));
   1437     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 9, 2, S("abcdefghij0klmnopqrst"));
   1438     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1439     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
   1440     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 11, 0, S("can't happen"));
   1441     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1442     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 1, S("abcdefghij1klmnopqrst"));
   1443     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890klmnopqrst"));
   1444     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789klmnopqrst"));
   1445     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890klmnopqrst"));
   1446     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890klmnopqrst"));
   1447     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1448     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 1, S("abcdefghij2klmnopqrst"));
   1449     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 9, S("abcdefghij234567890klmnopqrst"));
   1450     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789klmnopqrst"));
   1451     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890klmnopqrst"));
   1452     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890klmnopqrst"));
   1453     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1454     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 1, S("abcdefghij1klmnopqrst"));
   1455     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 5, S("abcdefghij12345klmnopqrst"));
   1456     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 9, S("abcdefghij123456789klmnopqrst"));
   1457 }
   1458 
   1459 template <class S>
   1460 void test25()
   1461 {
   1462     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890klmnopqrst"));
   1463     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890klmnopqrst"));
   1464     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
   1465     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 19, 1, S("abcdefghij0klmnopqrst"));
   1466     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 19, 2, S("abcdefghij0klmnopqrst"));
   1467     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
   1468     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
   1469     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 21, 0, S("can't happen"));
   1470     test(S("abcdefghijklmnopqrst"), 19, S(""), 0, 0, S("abcdefghijklmnopqrst"));
   1471     test(S("abcdefghijklmnopqrst"), 19, S(""), 0, 1, S("abcdefghijklmnopqrst"));
   1472     test(S("abcdefghijklmnopqrst"), 19, S(""), 1, 0, S("can't happen"));
   1473     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
   1474     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 1, S("abcdefghijklmnopqrs1t"));
   1475     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 2, S("abcdefghijklmnopqrs12t"));
   1476     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 4, S("abcdefghijklmnopqrs1234t"));
   1477     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 5, S("abcdefghijklmnopqrs12345t"));
   1478     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 6, S("abcdefghijklmnopqrs12345t"));
   1479     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
   1480     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 1, S("abcdefghijklmnopqrs2t"));
   1481     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 2, S("abcdefghijklmnopqrs23t"));
   1482     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 3, S("abcdefghijklmnopqrs234t"));
   1483     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 4, S("abcdefghijklmnopqrs2345t"));
   1484     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 5, S("abcdefghijklmnopqrs2345t"));
   1485     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
   1486     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 1, S("abcdefghijklmnopqrs3t"));
   1487     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 2, S("abcdefghijklmnopqrs34t"));
   1488     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 3, S("abcdefghijklmnopqrs345t"));
   1489     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 4, S("abcdefghijklmnopqrs345t"));
   1490     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
   1491     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 4, 1, S("abcdefghijklmnopqrs5t"));
   1492     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 4, 2, S("abcdefghijklmnopqrs5t"));
   1493     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
   1494     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
   1495     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 6, 0, S("can't happen"));
   1496     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1497     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 1, S("abcdefghijklmnopqrs1t"));
   1498     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 5, S("abcdefghijklmnopqrs12345t"));
   1499     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 9, S("abcdefghijklmnopqrs123456789t"));
   1500     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890t"));
   1501     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 11, S("abcdefghijklmnopqrs1234567890t"));
   1502     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1503     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 1, S("abcdefghijklmnopqrs2t"));
   1504     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 4, S("abcdefghijklmnopqrs2345t"));
   1505     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 8, S("abcdefghijklmnopqrs23456789t"));
   1506     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 9, S("abcdefghijklmnopqrs234567890t"));
   1507     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 10, S("abcdefghijklmnopqrs234567890t"));
   1508     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
   1509     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 1, S("abcdefghijklmnopqrs6t"));
   1510     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 2, S("abcdefghijklmnopqrs67t"));
   1511     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 4, S("abcdefghijklmnopqrs6789t"));
   1512 }
   1513 
   1514 template <class S>
   1515 void test26()
   1516 {
   1517     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 5, S("abcdefghijklmnopqrs67890t"));
   1518     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 6, S("abcdefghijklmnopqrs67890t"));
   1519     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
   1520     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 9, 1, S("abcdefghijklmnopqrs0t"));
   1521     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 9, 2, S("abcdefghijklmnopqrs0t"));
   1522     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1523     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
   1524     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 11, 0, S("can't happen"));
   1525     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1526     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrs1t"));
   1527     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890t"));
   1528     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrs1234567890123456789t"));
   1529     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrs12345678901234567890t"));
   1530     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrs12345678901234567890t"));
   1531     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1532     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrs2t"));
   1533     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrs234567890t"));
   1534     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrs234567890123456789t"));
   1535     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrs2345678901234567890t"));
   1536     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrs2345678901234567890t"));
   1537     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1538     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrs1t"));
   1539     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrs12345t"));
   1540     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrs123456789t"));
   1541     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrs1234567890t"));
   1542     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrs1234567890t"));
   1543     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
   1544     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrs0t"));
   1545     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrs0t"));
   1546     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
   1547     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
   1548     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 21, 0, S("can't happen"));
   1549     test(S("abcdefghijklmnopqrst"), 20, S(""), 0, 0, S("abcdefghijklmnopqrst"));
   1550     test(S("abcdefghijklmnopqrst"), 20, S(""), 0, 1, S("abcdefghijklmnopqrst"));
   1551     test(S("abcdefghijklmnopqrst"), 20, S(""), 1, 0, S("can't happen"));
   1552     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
   1553     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 1, S("abcdefghijklmnopqrst1"));
   1554     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 2, S("abcdefghijklmnopqrst12"));
   1555     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 4, S("abcdefghijklmnopqrst1234"));
   1556     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 5, S("abcdefghijklmnopqrst12345"));
   1557     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 6, S("abcdefghijklmnopqrst12345"));
   1558     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
   1559     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 1, S("abcdefghijklmnopqrst2"));
   1560     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 2, S("abcdefghijklmnopqrst23"));
   1561     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 3, S("abcdefghijklmnopqrst234"));
   1562     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 4, S("abcdefghijklmnopqrst2345"));
   1563     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 5, S("abcdefghijklmnopqrst2345"));
   1564     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
   1565     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 1, S("abcdefghijklmnopqrst3"));
   1566     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 2, S("abcdefghijklmnopqrst34"));
   1567 }
   1568 
   1569 template <class S>
   1570 void test27()
   1571 {
   1572     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 3, S("abcdefghijklmnopqrst345"));
   1573     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 4, S("abcdefghijklmnopqrst345"));
   1574     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
   1575     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 4, 1, S("abcdefghijklmnopqrst5"));
   1576     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 4, 2, S("abcdefghijklmnopqrst5"));
   1577     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
   1578     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
   1579     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 6, 0, S("can't happen"));
   1580     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1581     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
   1582     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 5, S("abcdefghijklmnopqrst12345"));
   1583     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 9, S("abcdefghijklmnopqrst123456789"));
   1584     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
   1585     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 11, S("abcdefghijklmnopqrst1234567890"));
   1586     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1587     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
   1588     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 4, S("abcdefghijklmnopqrst2345"));
   1589     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 8, S("abcdefghijklmnopqrst23456789"));
   1590     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
   1591     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 10, S("abcdefghijklmnopqrst234567890"));
   1592     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
   1593     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 1, S("abcdefghijklmnopqrst6"));
   1594     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 2, S("abcdefghijklmnopqrst67"));
   1595     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 4, S("abcdefghijklmnopqrst6789"));
   1596     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 5, S("abcdefghijklmnopqrst67890"));
   1597     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 6, S("abcdefghijklmnopqrst67890"));
   1598     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
   1599     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 9, 1, S("abcdefghijklmnopqrst0"));
   1600     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 9, 2, S("abcdefghijklmnopqrst0"));
   1601     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1602     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
   1603     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 11, 0, S("can't happen"));
   1604     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
   1605     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
   1606     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
   1607     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrst1234567890123456789"));
   1608     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrst12345678901234567890"));
   1609     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrst12345678901234567890"));
   1610     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
   1611     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
   1612     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
   1613     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrst234567890123456789"));
   1614     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrst2345678901234567890"));
   1615     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrst2345678901234567890"));
   1616     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
   1617     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrst1"));
   1618     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrst12345"));
   1619     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrst123456789"));
   1620     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrst1234567890"));
   1621     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrst1234567890"));
   1622 }
   1623 
   1624 template <class S>
   1625 void test28()
   1626 {
   1627     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
   1628     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrst0"));
   1629     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrst0"));
   1630     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
   1631     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
   1632     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 21, 0, S("can't happen"));
   1633     test(S("abcdefghijklmnopqrst"), 21, S(""), 0, 0, S("can't happen"));
   1634     test(S("abcdefghijklmnopqrst"), 21, S(""), 0, 1, S("can't happen"));
   1635     test(S("abcdefghijklmnopqrst"), 21, S(""), 1, 0, S("can't happen"));
   1636     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 0, S("can't happen"));
   1637     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 1, S("can't happen"));
   1638     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 2, S("can't happen"));
   1639     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 4, S("can't happen"));
   1640     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 5, S("can't happen"));
   1641     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 6, S("can't happen"));
   1642     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 0, S("can't happen"));
   1643     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 1, S("can't happen"));
   1644     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 2, S("can't happen"));
   1645     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 3, S("can't happen"));
   1646     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 4, S("can't happen"));
   1647     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 5, S("can't happen"));
   1648     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 0, S("can't happen"));
   1649     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 1, S("can't happen"));
   1650     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 2, S("can't happen"));
   1651     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 3, S("can't happen"));
   1652     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 4, S("can't happen"));
   1653     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 4, 0, S("can't happen"));
   1654     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 4, 1, S("can't happen"));
   1655     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 4, 2, S("can't happen"));
   1656     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 5, 0, S("can't happen"));
   1657     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 5, 1, S("can't happen"));
   1658     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 6, 0, S("can't happen"));
   1659     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 0, S("can't happen"));
   1660     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 1, S("can't happen"));
   1661     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 5, S("can't happen"));
   1662     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 9, S("can't happen"));
   1663     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 10, S("can't happen"));
   1664     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 11, S("can't happen"));
   1665     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 0, S("can't happen"));
   1666     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 1, S("can't happen"));
   1667     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 4, S("can't happen"));
   1668     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 8, S("can't happen"));
   1669     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 9, S("can't happen"));
   1670     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 10, S("can't happen"));
   1671     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 0, S("can't happen"));
   1672     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 1, S("can't happen"));
   1673     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 2, S("can't happen"));
   1674     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 4, S("can't happen"));
   1675     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 5, S("can't happen"));
   1676     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 6, S("can't happen"));
   1677 }
   1678 
   1679 template <class S>
   1680 void test29()
   1681 {
   1682     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 9, 0, S("can't happen"));
   1683     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 9, 1, S("can't happen"));
   1684     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 9, 2, S("can't happen"));
   1685     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 10, 0, S("can't happen"));
   1686     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 10, 1, S("can't happen"));
   1687     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 11, 0, S("can't happen"));
   1688     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 0, S("can't happen"));
   1689     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 1, S("can't happen"));
   1690     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 10, S("can't happen"));
   1691     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 19, S("can't happen"));
   1692     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 20, S("can't happen"));
   1693     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 21, S("can't happen"));
   1694     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 0, S("can't happen"));
   1695     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 1, S("can't happen"));
   1696     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 9, S("can't happen"));
   1697     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 18, S("can't happen"));
   1698     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 19, S("can't happen"));
   1699     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 20, S("can't happen"));
   1700     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 0, S("can't happen"));
   1701     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 1, S("can't happen"));
   1702     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 5, S("can't happen"));
   1703     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 9, S("can't happen"));
   1704     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 10, S("can't happen"));
   1705     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 11, S("can't happen"));
   1706     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 19, 0, S("can't happen"));
   1707     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 19, 1, S("can't happen"));
   1708     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 19, 2, S("can't happen"));
   1709     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 20, 0, S("can't happen"));
   1710     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 20, 1, S("can't happen"));
   1711     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 21, 0, S("can't happen"));
   1712 }
   1713 
   1714 template <class S>
   1715 void test30()
   1716 {
   1717     test_npos(S(""), 0, S("12345678901234567890"),  0, S("12345678901234567890"));
   1718     test_npos(S(""), 0, S("12345678901234567890"),  1, S( "2345678901234567890"));
   1719     test_npos(S(""), 0, S("12345678901234567890"),  2, S(  "345678901234567890"));
   1720     test_npos(S(""), 0, S("12345678901234567890"),  3, S(   "45678901234567890"));
   1721     test_npos(S(""), 0, S("12345678901234567890"),  5, S(     "678901234567890"));
   1722     test_npos(S(""), 0, S("12345678901234567890"), 10, S(          "1234567890"));
   1723     test_npos(S(""), 0, S("12345678901234567890"), 21, S("can't happen"));
   1724     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, S("abcdefghij12345klmnopqrst"));
   1725     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, S("abcdefghij2345klmnopqrst"));
   1726     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 3, S("abcdefghij45klmnopqrst"));
   1727     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 5, S("abcdefghijklmnopqrst"));
   1728     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 6, S("can't happen"));
   1729 }
   1730 
   1731 int main()
   1732 {
   1733     {
   1734     typedef std::string S;
   1735     test0<S>();
   1736     test1<S>();
   1737     test2<S>();
   1738     test3<S>();
   1739     test4<S>();
   1740     test5<S>();
   1741     test6<S>();
   1742     test7<S>();
   1743     test8<S>();
   1744     test9<S>();
   1745     test10<S>();
   1746     test11<S>();
   1747     test12<S>();
   1748     test13<S>();
   1749     test14<S>();
   1750     test15<S>();
   1751     test16<S>();
   1752     test17<S>();
   1753     test18<S>();
   1754     test19<S>();
   1755     test20<S>();
   1756     test21<S>();
   1757     test22<S>();
   1758     test23<S>();
   1759     test24<S>();
   1760     test25<S>();
   1761     test26<S>();
   1762     test27<S>();
   1763     test28<S>();
   1764     test29<S>();
   1765     test30<S>();
   1766     }
   1767 #if TEST_STD_VER >= 11
   1768     {
   1769     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
   1770     test0<S>();
   1771     test1<S>();
   1772     test2<S>();
   1773     test3<S>();
   1774     test4<S>();
   1775     test5<S>();
   1776     test6<S>();
   1777     test7<S>();
   1778     test8<S>();
   1779     test9<S>();
   1780     test10<S>();
   1781     test11<S>();
   1782     test12<S>();
   1783     test13<S>();
   1784     test14<S>();
   1785     test15<S>();
   1786     test16<S>();
   1787     test17<S>();
   1788     test18<S>();
   1789     test19<S>();
   1790     test20<S>();
   1791     test21<S>();
   1792     test22<S>();
   1793     test23<S>();
   1794     test24<S>();
   1795     test25<S>();
   1796     test26<S>();
   1797     test27<S>();
   1798     test28<S>();
   1799     test29<S>();
   1800     test30<S>();
   1801     }
   1802 #endif
   1803 }
   1804