11e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//===----------------------------------------------------------------------===//
21e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//
31e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//                     The LLVM Compiler Infrastructure
41e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//
51e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
61e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// Source Licenses. See LICENSE.TXT for details.
71e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//
81e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//===----------------------------------------------------------------------===//
91e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
101e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// <string_view>
111e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
121e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// constexpr int compare(size_type pos1, size_type n1, const charT* s) const;
131e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
141e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include <string_view>
151e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include <cassert>
161e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
171e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include "test_macros.h"
181e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include "constexpr_char_traits.hpp"
191e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
201e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowint sign ( int x ) { return x > 0 ? 1 : ( x < 0 ? -1 : 0 ); }
211e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
221e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowtemplate<typename CharT>
231e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowvoid test1 ( std::basic_string_view<CharT> sv1,
241e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow             size_t pos1, size_t n1, const CharT *s, int expected ) {
2515362334f6582752c667e7670186227d839f92d2Marshall Clow#ifdef TEST_HAS_NO_EXCEPTIONS
2615362334f6582752c667e7670186227d839f92d2Marshall Clow    if (pos1 <= sv1.size())
2715362334f6582752c667e7670186227d839f92d2Marshall Clow        assert(sign(sv1.compare(pos1, n1, s)) == sign(expected));
2815362334f6582752c667e7670186227d839f92d2Marshall Clow#else
291e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    try {
301e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(sign(sv1.compare(pos1, n1, s)) == sign(expected));
311e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(pos1 <= sv1.size());
321e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
331e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    catch (const std::out_of_range&) {
341e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(pos1 > sv1.size());
351e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
3615362334f6582752c667e7670186227d839f92d2Marshall Clow#endif
371e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
381e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
391e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowtemplate<typename CharT>
401e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowvoid
411e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowtest( const CharT *s1, size_t pos1, size_t n1, const CharT *s2, int expected)
421e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
431e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typedef std::basic_string_view<CharT> string_view_t;
441e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    string_view_t sv1 ( s1 );
451e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test1 ( sv1, pos1, n1, s2, expected );
461e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
471e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
481e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowvoid test0()
491e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
501e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "", 0);
511e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "abcde", -5);
521e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "abcdefghij", -10);
531e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "abcdefghijklmnopqrst", -20);
541e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 1, "", 0);
551e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 1, "abcde", -5);
561e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 1, "abcdefghij", -10);
571e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 1, "abcdefghijklmnopqrst", -20);
581e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 1, 0, "", 0);
591e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 1, 0, "abcde", 0);
601e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 1, 0, "abcdefghij", 0);
611e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 1, 0, "abcdefghijklmnopqrst", 0);
621e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 0, "", 0);
631e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 0, "abcde", -5);
641e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 0, "abcdefghij", -10);
651e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 0, "abcdefghijklmnopqrst", -20);
661e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 1, "", 1);
671e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 1, "abcde", -4);
681e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 1, "abcdefghij", -9);
691e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 1, "abcdefghijklmnopqrst", -19);
701e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 2, "", 2);
711e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 2, "abcde", -3);
721e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 2, "abcdefghij", -8);
731e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 2, "abcdefghijklmnopqrst", -18);
741e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 4, "", 4);
751e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 4, "abcde", -1);
761e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 4, "abcdefghij", -6);
771e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 4, "abcdefghijklmnopqrst", -16);
781e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 5, "", 5);
791e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 5, "abcde", 0);
801e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 5, "abcdefghij", -5);
811e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 5, "abcdefghijklmnopqrst", -15);
821e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6, "", 5);
831e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6, "abcde", 0);
841e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6, "abcdefghij", -5);
851e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6, "abcdefghijklmnopqrst", -15);
861e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 0, "", 0);
871e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 0, "abcde", -5);
881e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 0, "abcdefghij", -10);
891e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 0, "abcdefghijklmnopqrst", -20);
901e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 1, "", 1);
911e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 1, "abcde", 1);
921e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 1, "abcdefghij", 1);
931e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 1, "abcdefghijklmnopqrst", 1);
941e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 2, "", 2);
951e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 2, "abcde", 1);
961e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 2, "abcdefghij", 1);
971e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 2, "abcdefghijklmnopqrst", 1);
981e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 3, "", 3);
991e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 3, "abcde", 1);
1001e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 3, "abcdefghij", 1);
1011e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 3, "abcdefghijklmnopqrst", 1);
1021e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 4, "", 4);
1031e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 4, "abcde", 1);
1041e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 4, "abcdefghij", 1);
1051e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 4, "abcdefghijklmnopqrst", 1);
1061e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 5, "", 4);
1071e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 5, "abcde", 1);
1081e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 5, "abcdefghij", 1);
1091e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 1, 5, "abcdefghijklmnopqrst", 1);
1101e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 0, "", 0);
1111e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 0, "abcde", -5);
1121e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 0, "abcdefghij", -10);
1131e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 0, "abcdefghijklmnopqrst", -20);
1141e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 1, "", 1);
1151e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 1, "abcde", 2);
1161e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 1, "abcdefghij", 2);
1171e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 1, "abcdefghijklmnopqrst", 2);
1181e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 2, "", 2);
1191e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 2, "abcde", 2);
1201e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 2, "abcdefghij", 2);
1211e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 2, "abcdefghijklmnopqrst", 2);
1221e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 3, "", 3);
1231e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 3, "abcde", 2);
1241e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 3, "abcdefghij", 2);
1251e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 3, "abcdefghijklmnopqrst", 2);
1261e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 4, "", 3);
1271e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 4, "abcde", 2);
1281e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 4, "abcdefghij", 2);
1291e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 2, 4, "abcdefghijklmnopqrst", 2);
1301e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 0, "", 0);
1311e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 0, "abcde", -5);
1321e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 0, "abcdefghij", -10);
1331e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 0, "abcdefghijklmnopqrst", -20);
1341e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 1, "", 1);
1351e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 1, "abcde", 4);
1361e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 1, "abcdefghij", 4);
1371e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 1, "abcdefghijklmnopqrst", 4);
1381e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 2, "", 1);
1391e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 2, "abcde", 4);
1401e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 2, "abcdefghij", 4);
1411e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 4, 2, "abcdefghijklmnopqrst", 4);
1421e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 0, "", 0);
1431e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 0, "abcde", -5);
1441e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 0, "abcdefghij", -10);
1451e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 0, "abcdefghijklmnopqrst", -20);
1461e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 1, "", 0);
1471e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 1, "abcde", -5);
1481e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 1, "abcdefghij", -10);
1491e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 5, 1, "abcdefghijklmnopqrst", -20);
1501e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
1511e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
1521e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowvoid test1()
1531e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
1541e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 6, 0, "", 0);
1551e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 6, 0, "abcde", 0);
1561e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 6, 0, "abcdefghij", 0);
1571e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 6, 0, "abcdefghijklmnopqrst", 0);
1581e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 0, "", 0);
1591e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 0, "abcde", -5);
1601e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 0, "abcdefghij", -10);
1611e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", -20);
1621e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 1, "", 1);
1631e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 1, "abcde", -4);
1641e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 1, "abcdefghij", -9);
1651e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", -19);
1661e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 5, "", 5);
1671e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 5, "abcde", 0);
1681e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 5, "abcdefghij", -5);
1691e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", -15);
1701e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 9, "", 9);
1711e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 9, "abcde", 4);
1721e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 9, "abcdefghij", -1);
1731e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", -11);
1741e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 10, "", 10);
1751e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 10, "abcde", 5);
1761e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 10, "abcdefghij", 0);
1771e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", -10);
1781e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 11, "", 10);
1791e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 11, "abcde", 5);
1801e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 11, "abcdefghij", 0);
1811e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", -10);
1821e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 0, "", 0);
1831e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 0, "abcde", -5);
1841e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 0, "abcdefghij", -10);
1851e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", -20);
1861e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 1, "", 1);
1871e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 1, "abcde", 1);
1881e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 1, "abcdefghij", 1);
1891e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 1);
1901e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 4, "", 4);
1911e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 4, "abcde", 1);
1921e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 4, "abcdefghij", 1);
1931e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 1);
1941e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 8, "", 8);
1951e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 8, "abcde", 1);
1961e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 8, "abcdefghij", 1);
1971e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 1);
1981e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 9, "", 9);
1991e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 9, "abcde", 1);
2001e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 9, "abcdefghij", 1);
2011e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 1);
2021e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 10, "", 9);
2031e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 10, "abcde", 1);
2041e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 10, "abcdefghij", 1);
2051e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 1);
2061e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 0, "", 0);
2071e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 0, "abcde", -5);
2081e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 0, "abcdefghij", -10);
2091e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", -20);
2101e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 1, "", 1);
2111e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 1, "abcde", 5);
2121e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 1, "abcdefghij", 5);
2131e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 5);
2141e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 2, "", 2);
2151e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 2, "abcde", 5);
2161e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 2, "abcdefghij", 5);
2171e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 5);
2181e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 4, "", 4);
2191e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 4, "abcde", 5);
2201e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 4, "abcdefghij", 5);
2211e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 5);
2221e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 5, "", 5);
2231e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 5, "abcde", 5);
2241e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 5, "abcdefghij", 5);
2251e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 5);
2261e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 6, "", 5);
2271e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 6, "abcde", 5);
2281e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 6, "abcdefghij", 5);
2291e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 5);
2301e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 0, "", 0);
2311e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 0, "abcde", -5);
2321e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 0, "abcdefghij", -10);
2331e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", -20);
2341e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 1, "", 1);
2351e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 1, "abcde", 9);
2361e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 1, "abcdefghij", 9);
2371e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 9);
2381e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 2, "", 1);
2391e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 2, "abcde", 9);
2401e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 2, "abcdefghij", 9);
2411e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 9);
2421e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 0, "", 0);
2431e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 0, "abcde", -5);
2441e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 0, "abcdefghij", -10);
2451e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", -20);
2461e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 1, "", 0);
2471e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 1, "abcde", -5);
2481e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 1, "abcdefghij", -10);
2491e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", -20);
2501e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 11, 0, "", 0);
2511e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 11, 0, "abcde", 0);
2521e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 11, 0, "abcdefghij", 0);
2531e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 0);
2541e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
2551e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
2561e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowvoid test2()
2571e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
2581e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 0, "", 0);
2591e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 0, "abcde", -5);
2601e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", -10);
2611e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", -20);
2621e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 1, "", 1);
2631e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 1, "abcde", -4);
2641e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", -9);
2651e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", -19);
2661e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 10, "", 10);
2671e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 10, "abcde", 5);
2681e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 0);
2691e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", -10);
2701e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 19, "", 19);
2711e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 19, "abcde", 14);
2721e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 9);
2731e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", -1);
2741e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 20, "", 20);
2751e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 20, "abcde", 15);
2761e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 10);
2771e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 0);
2781e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 21, "", 20);
2791e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 21, "abcde", 15);
2801e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 10);
2811e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 0);
2821e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 0, "", 0);
2831e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 0, "abcde", -5);
2841e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", -10);
2851e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", -20);
2861e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 1, "", 1);
2871e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 1, "abcde", 1);
2881e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 1);
2891e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 1);
2901e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 9, "", 9);
2911e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 9, "abcde", 1);
2921e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 1);
2931e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 1);
2941e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 18, "", 18);
2951e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 18, "abcde", 1);
2961e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 1);
2971e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 1);
2981e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 19, "", 19);
2991e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 19, "abcde", 1);
3001e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 1);
3011e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 1);
3021e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 20, "", 19);
3031e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 20, "abcde", 1);
3041e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 1);
3051e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 1);
3061e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 0, "", 0);
3071e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 0, "abcde", -5);
3081e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", -10);
3091e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", -20);
3101e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 1, "", 1);
3111e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 1, "abcde", 10);
3121e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 10);
3131e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 10);
3141e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 5, "", 5);
3151e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 5, "abcde", 10);
3161e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 10);
3171e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 10);
3181e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 9, "", 9);
3191e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 9, "abcde", 10);
3201e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 10);
3211e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 10);
3221e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 10, "", 10);
3231e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 10, "abcde", 10);
3241e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 10);
3251e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 10);
3261e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 11, "", 10);
3271e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 11, "abcde", 10);
3281e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 10);
3291e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 10);
3301e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 0, "", 0);
3311e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 0, "abcde", -5);
3321e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", -10);
3331e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", -20);
3341e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 1, "", 1);
3351e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 1, "abcde", 19);
3361e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 19);
3371e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 19);
3381e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 2, "", 1);
3391e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 2, "abcde", 19);
3401e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 19);
3411e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 19);
3421e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 0, "", 0);
3431e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 0, "abcde", -5);
3441e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", -10);
3451e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", -20);
3461e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 1, "", 0);
3471e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 1, "abcde", -5);
3481e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", -10);
3491e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", -20);
3501e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 21, 0, "", 0);
3511e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 21, 0, "abcde", 0);
3521e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 0);
3531e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 0);
3541e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
3551e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
3561e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
3571e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowint main()
3581e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
3591e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test0();
3601e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test1();
3611e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test2();
3621e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
3631e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
3641e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "", 0);
3651e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "abcde", -5);
3661e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "abcdefghij", -10);
3671e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("", 0, 0, "abcdefghijklmnopqrst", -20);
3681e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 2, "", 5);
3691e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6,"abcde", 0);
3701e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6, "abcdefghij", -5);
3711e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcde", 0, 6, "abcdefghijklmnopqrst", -15);
3721e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 3, 3, "", 10);
3731e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 3, 3,"abcde", 5);
3741e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 3, 3, "def", 0);
3751e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghij", 0, 4, "abcdefghijklmnopqrst", -10);
3761e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 5, 5, "", 20);
3771e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 8, "abcde", 15);
3781e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test("abcdefghijklmnopqrst", 0, 12, "abcdefghij", 10);
379eae7e51a7dbde2ac882725973c341400169d93c4Stephan T. Lavavej    test("abcdefghijklmnopqrst", 0, static_cast<size_t>(-1), "abcdefghijklmnopqrst", 0);
3801e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
3811e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
3821e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
3831e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"", 0, 0, L"", 0);
3841e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"", 0, 0, L"abcde", -5);
3851e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"", 0, 0, L"abcdefghij", -10);
3861e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"", 0, 0, L"abcdefghijklmnopqrst", -20);
3871e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcde", 0, 2, L"", 5);
3881e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcde", 0, 6, L"abcde", 0);
3891e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcde", 0, 6, L"abcdefghij", -5);
3901e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcde", 0, 6, L"abcdefghijklmnopqrst", -15);
3911e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghij", 3, 3, L"", 10);
3921e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghij", 3, 3, L"abcde", 5);
3931e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghij", 3, 3, L"def", 0);
3941e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghij", 0, 4, L"abcdefghijklmnopqrst", -10);
3951e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghijklmnopqrst", 5, 5, L"", 20);
3961e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghijklmnopqrst", 0, 8, L"abcde", 15);
3971e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(L"abcdefghijklmnopqrst", 0, 12, L"abcdefghij", 10);
398eae7e51a7dbde2ac882725973c341400169d93c4Stephan T. Lavavej    test(L"abcdefghijklmnopqrst", 0, static_cast<size_t>(-1), L"abcdefghijklmnopqrst", 0);
3991e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
4001e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
4011e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#if TEST_STD_VER >= 11
4021e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
4031e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"", 0, 0, U"", 0);
4041e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"", 0, 0, U"abcde", -5);
4051e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"", 0, 0, U"abcdefghij", -10);
4061e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"", 0, 0, U"abcdefghijklmnopqrst", -20);
4071e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcde", 0, 2, U"", 5);
4081e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcde", 0, 6, U"abcde", 0);
4091e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcde", 0, 6, U"abcdefghij", -5);
4101e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcde", 0, 6, U"abcdefghijklmnopqrst", -15);
4111e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghij", 3, 3, U"", 10);
4121e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghij", 3, 3, U"abcde", 5);
4131e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghij", 3, 3, U"def", 0);
4141e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghij", 0, 4, U"abcdefghijklmnopqrst", -10);
4151e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghijklmnopqrst", 5, 5, U"", 20);
4161e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghijklmnopqrst", 0, 8, U"abcde", 15);
4171e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(U"abcdefghijklmnopqrst", 0, 12, U"abcdefghij", 10);
418eae7e51a7dbde2ac882725973c341400169d93c4Stephan T. Lavavej    test(U"abcdefghijklmnopqrst", 0, static_cast<size_t>(-1), U"abcdefghijklmnopqrst", 0);
4191e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
4201e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
4211e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
4221e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"", 0, 0, u"", 0);
4231e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"", 0, 0, u"abcde", -5);
4241e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"", 0, 0, u"abcdefghij", -10);
4251e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"", 0, 0, u"abcdefghijklmnopqrst", -20);
4261e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcde", 0, 2, u"", 5);
4271e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcde", 0, 6, u"abcde", 0);
4281e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcde", 0, 6, u"abcdefghij", -5);
4291e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcde", 0, 6, u"abcdefghijklmnopqrst", -15);
4301e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghij", 3, 3, u"", 10);
4311e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghij", 3, 3, u"abcde", 5);
4321e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghij", 3, 3, u"def", 0);
4331e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghij", 0, 4, u"abcdefghijklmnopqrst", -10);
4341e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghijklmnopqrst", 5, 5, u"", 20);
4351e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghijklmnopqrst", 0, 8, u"abcde", 15);
4361e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u"abcdefghijklmnopqrst", 0, 12, u"abcdefghij", 10);
437eae7e51a7dbde2ac882725973c341400169d93c4Stephan T. Lavavej    test(u"abcdefghijklmnopqrst", 0, static_cast<size_t>(-1), u"abcdefghijklmnopqrst", 0);
4381e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
4391e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#endif
4401e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
4411e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#if TEST_STD_VER > 11
4421e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
4431e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typedef std::basic_string_view<char, constexpr_char_traits<char>> SV;
4441e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    constexpr SV  sv1;
4451e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    constexpr SV  sv2 { "abcde", 5 };
4461e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    static_assert ( sv1.compare(0, 0, "") == 0, "" );
4471e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    static_assert ( sv1.compare(0, 0, "abcde") == -1, "" );
4481e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    static_assert ( sv2.compare(0, 2, "") == 1, "" );
4491e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    static_assert ( sv2.compare(0, 6, "abcde") == 0, "" );
4501e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
4511e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#endif
4521e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
453