diff options
Diffstat (limited to 'libcxx/test/strings/basic.string/string.ops/string::compare')
6 files changed, 7913 insertions, 0 deletions
diff --git a/libcxx/test/strings/basic.string/string.ops/string::compare/pointer.pass.cpp b/libcxx/test/strings/basic.string/string.ops/string::compare/pointer.pass.cpp new file mode 100644 index 00000000000..709478d4870 --- /dev/null +++ b/libcxx/test/strings/basic.string/string.ops/string::compare/pointer.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int compare(const charT *s) const; + +#include <string> +#include <cassert> + +int sign(int x) +{ + if (x == 0) + return 0; + if (x < 0) + return -1; + return 1; +} + +template <class S> +void +test(const S& s, const typename S::value_type* str, int x) +{ + assert(sign(s.compare(str)) == sign(x)); +} + +typedef std::string S; + +int main() +{ + test(S(""), "", 0); + test(S(""), "abcde", -5); + test(S(""), "abcdefghij", -10); + test(S(""), "abcdefghijklmnopqrst", -20); + test(S("abcde"), "", 5); + test(S("abcde"), "abcde", 0); + test(S("abcde"), "abcdefghij", -5); + test(S("abcde"), "abcdefghijklmnopqrst", -15); + test(S("abcdefghij"), "", 10); + test(S("abcdefghij"), "abcde", 5); + test(S("abcdefghij"), "abcdefghij", 0); + test(S("abcdefghij"), "abcdefghijklmnopqrst", -10); + test(S("abcdefghijklmnopqrst"), "", 20); + test(S("abcdefghijklmnopqrst"), "abcde", 15); + test(S("abcdefghijklmnopqrst"), "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), "abcdefghijklmnopqrst", 0); +} diff --git a/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_pointer.pass.cpp b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_pointer.pass.cpp new file mode 100644 index 00000000000..11894dc9827 --- /dev/null +++ b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_pointer.pass.cpp @@ -0,0 +1,358 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int compare(size_type pos, size_type n1, const charT *s) const; + +#include <string> +#include <stdexcept> +#include <cassert> + +int sign(int x) +{ + if (x == 0) + return 0; + if (x < 0) + return -1; + return 1; +} + +template <class S> +void +test(const S& s, typename S::size_type pos1, typename S::size_type n1, + const typename S::value_type* str, int x) +{ + try + { + assert(sign(s.compare(pos1, n1, str)) == sign(x)); + assert(pos1 <= s.size()); + } + catch (std::out_of_range&) + { + assert(pos1 > s.size()); + } +} + +typedef std::string S; + +void test0() +{ + test(S(""), 0, 0, "", 0); + test(S(""), 0, 0, "abcde", -5); + test(S(""), 0, 0, "abcdefghij", -10); + test(S(""), 0, 0, "abcdefghijklmnopqrst", -20); + test(S(""), 0, 1, "", 0); + test(S(""), 0, 1, "abcde", -5); + test(S(""), 0, 1, "abcdefghij", -10); + test(S(""), 0, 1, "abcdefghijklmnopqrst", -20); + test(S(""), 1, 0, "", 0); + test(S(""), 1, 0, "abcde", 0); + test(S(""), 1, 0, "abcdefghij", 0); + test(S(""), 1, 0, "abcdefghijklmnopqrst", 0); + test(S("abcde"), 0, 0, "", 0); + test(S("abcde"), 0, 0, "abcde", -5); + test(S("abcde"), 0, 0, "abcdefghij", -10); + test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", -20); + test(S("abcde"), 0, 1, "", 1); + test(S("abcde"), 0, 1, "abcde", -4); + test(S("abcde"), 0, 1, "abcdefghij", -9); + test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", -19); + test(S("abcde"), 0, 2, "", 2); + test(S("abcde"), 0, 2, "abcde", -3); + test(S("abcde"), 0, 2, "abcdefghij", -8); + test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", -18); + test(S("abcde"), 0, 4, "", 4); + test(S("abcde"), 0, 4, "abcde", -1); + test(S("abcde"), 0, 4, "abcdefghij", -6); + test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", -16); + test(S("abcde"), 0, 5, "", 5); + test(S("abcde"), 0, 5, "abcde", 0); + test(S("abcde"), 0, 5, "abcdefghij", -5); + test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", -15); + test(S("abcde"), 0, 6, "", 5); + test(S("abcde"), 0, 6, "abcde", 0); + test(S("abcde"), 0, 6, "abcdefghij", -5); + test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", -15); + test(S("abcde"), 1, 0, "", 0); + test(S("abcde"), 1, 0, "abcde", -5); + test(S("abcde"), 1, 0, "abcdefghij", -10); + test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", -20); + test(S("abcde"), 1, 1, "", 1); + test(S("abcde"), 1, 1, "abcde", 1); + test(S("abcde"), 1, 1, "abcdefghij", 1); + test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 1); + test(S("abcde"), 1, 2, "", 2); + test(S("abcde"), 1, 2, "abcde", 1); + test(S("abcde"), 1, 2, "abcdefghij", 1); + test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 1); + test(S("abcde"), 1, 3, "", 3); + test(S("abcde"), 1, 3, "abcde", 1); + test(S("abcde"), 1, 3, "abcdefghij", 1); + test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 1); + test(S("abcde"), 1, 4, "", 4); + test(S("abcde"), 1, 4, "abcde", 1); + test(S("abcde"), 1, 4, "abcdefghij", 1); + test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 1); + test(S("abcde"), 1, 5, "", 4); + test(S("abcde"), 1, 5, "abcde", 1); + test(S("abcde"), 1, 5, "abcdefghij", 1); + test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 1); + test(S("abcde"), 2, 0, "", 0); + test(S("abcde"), 2, 0, "abcde", -5); + test(S("abcde"), 2, 0, "abcdefghij", -10); + test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", -20); + test(S("abcde"), 2, 1, "", 1); + test(S("abcde"), 2, 1, "abcde", 2); + test(S("abcde"), 2, 1, "abcdefghij", 2); + test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 2); + test(S("abcde"), 2, 2, "", 2); + test(S("abcde"), 2, 2, "abcde", 2); + test(S("abcde"), 2, 2, "abcdefghij", 2); + test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 2); + test(S("abcde"), 2, 3, "", 3); + test(S("abcde"), 2, 3, "abcde", 2); + test(S("abcde"), 2, 3, "abcdefghij", 2); + test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 2); + test(S("abcde"), 2, 4, "", 3); + test(S("abcde"), 2, 4, "abcde", 2); + test(S("abcde"), 2, 4, "abcdefghij", 2); + test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 2); + test(S("abcde"), 4, 0, "", 0); + test(S("abcde"), 4, 0, "abcde", -5); + test(S("abcde"), 4, 0, "abcdefghij", -10); + test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", -20); + test(S("abcde"), 4, 1, "", 1); + test(S("abcde"), 4, 1, "abcde", 4); + test(S("abcde"), 4, 1, "abcdefghij", 4); + test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 4); + test(S("abcde"), 4, 2, "", 1); + test(S("abcde"), 4, 2, "abcde", 4); + test(S("abcde"), 4, 2, "abcdefghij", 4); + test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 4); + test(S("abcde"), 5, 0, "", 0); + test(S("abcde"), 5, 0, "abcde", -5); + test(S("abcde"), 5, 0, "abcdefghij", -10); + test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", -20); + test(S("abcde"), 5, 1, "", 0); + test(S("abcde"), 5, 1, "abcde", -5); + test(S("abcde"), 5, 1, "abcdefghij", -10); + test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", -20); +} + +void test1() +{ + test(S("abcde"), 6, 0, "", 0); + test(S("abcde"), 6, 0, "abcde", 0); + test(S("abcde"), 6, 0, "abcdefghij", 0); + test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 0); + test(S("abcdefghij"), 0, 0, "", 0); + test(S("abcdefghij"), 0, 0, "abcde", -5); + test(S("abcdefghij"), 0, 0, "abcdefghij", -10); + test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghij"), 0, 1, "", 1); + test(S("abcdefghij"), 0, 1, "abcde", -4); + test(S("abcdefghij"), 0, 1, "abcdefghij", -9); + test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", -19); + test(S("abcdefghij"), 0, 5, "", 5); + test(S("abcdefghij"), 0, 5, "abcde", 0); + test(S("abcdefghij"), 0, 5, "abcdefghij", -5); + test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", -15); + test(S("abcdefghij"), 0, 9, "", 9); + test(S("abcdefghij"), 0, 9, "abcde", 4); + test(S("abcdefghij"), 0, 9, "abcdefghij", -1); + test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", -11); + test(S("abcdefghij"), 0, 10, "", 10); + test(S("abcdefghij"), 0, 10, "abcde", 5); + test(S("abcdefghij"), 0, 10, "abcdefghij", 0); + test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", -10); + test(S("abcdefghij"), 0, 11, "", 10); + test(S("abcdefghij"), 0, 11, "abcde", 5); + test(S("abcdefghij"), 0, 11, "abcdefghij", 0); + test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", -10); + test(S("abcdefghij"), 1, 0, "", 0); + test(S("abcdefghij"), 1, 0, "abcde", -5); + test(S("abcdefghij"), 1, 0, "abcdefghij", -10); + test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghij"), 1, 1, "", 1); + test(S("abcdefghij"), 1, 1, "abcde", 1); + test(S("abcdefghij"), 1, 1, "abcdefghij", 1); + test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 1); + test(S("abcdefghij"), 1, 4, "", 4); + test(S("abcdefghij"), 1, 4, "abcde", 1); + test(S("abcdefghij"), 1, 4, "abcdefghij", 1); + test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 1); + test(S("abcdefghij"), 1, 8, "", 8); + test(S("abcdefghij"), 1, 8, "abcde", 1); + test(S("abcdefghij"), 1, 8, "abcdefghij", 1); + test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 1); + test(S("abcdefghij"), 1, 9, "", 9); + test(S("abcdefghij"), 1, 9, "abcde", 1); + test(S("abcdefghij"), 1, 9, "abcdefghij", 1); + test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 1); + test(S("abcdefghij"), 1, 10, "", 9); + test(S("abcdefghij"), 1, 10, "abcde", 1); + test(S("abcdefghij"), 1, 10, "abcdefghij", 1); + test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 1); + test(S("abcdefghij"), 5, 0, "", 0); + test(S("abcdefghij"), 5, 0, "abcde", -5); + test(S("abcdefghij"), 5, 0, "abcdefghij", -10); + test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghij"), 5, 1, "", 1); + test(S("abcdefghij"), 5, 1, "abcde", 5); + test(S("abcdefghij"), 5, 1, "abcdefghij", 5); + test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 5); + test(S("abcdefghij"), 5, 2, "", 2); + test(S("abcdefghij"), 5, 2, "abcde", 5); + test(S("abcdefghij"), 5, 2, "abcdefghij", 5); + test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 5); + test(S("abcdefghij"), 5, 4, "", 4); + test(S("abcdefghij"), 5, 4, "abcde", 5); + test(S("abcdefghij"), 5, 4, "abcdefghij", 5); + test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 5); + test(S("abcdefghij"), 5, 5, "", 5); + test(S("abcdefghij"), 5, 5, "abcde", 5); + test(S("abcdefghij"), 5, 5, "abcdefghij", 5); + test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 5); + test(S("abcdefghij"), 5, 6, "", 5); + test(S("abcdefghij"), 5, 6, "abcde", 5); + test(S("abcdefghij"), 5, 6, "abcdefghij", 5); + test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 5); + test(S("abcdefghij"), 9, 0, "", 0); + test(S("abcdefghij"), 9, 0, "abcde", -5); + test(S("abcdefghij"), 9, 0, "abcdefghij", -10); + test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghij"), 9, 1, "", 1); + test(S("abcdefghij"), 9, 1, "abcde", 9); + test(S("abcdefghij"), 9, 1, "abcdefghij", 9); + test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 9); + test(S("abcdefghij"), 9, 2, "", 1); + test(S("abcdefghij"), 9, 2, "abcde", 9); + test(S("abcdefghij"), 9, 2, "abcdefghij", 9); + test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 9); + test(S("abcdefghij"), 10, 0, "", 0); + test(S("abcdefghij"), 10, 0, "abcde", -5); + test(S("abcdefghij"), 10, 0, "abcdefghij", -10); + test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghij"), 10, 1, "", 0); + test(S("abcdefghij"), 10, 1, "abcde", -5); + test(S("abcdefghij"), 10, 1, "abcdefghij", -10); + test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", -20); + test(S("abcdefghij"), 11, 0, "", 0); + test(S("abcdefghij"), 11, 0, "abcde", 0); + test(S("abcdefghij"), 11, 0, "abcdefghij", 0); + test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 0); +} + +void test2() +{ + test(S("abcdefghijklmnopqrst"), 0, 0, "", 0); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", -5); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", -10); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghijklmnopqrst"), 0, 1, "", 1); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", -4); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", -9); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", -19); + test(S("abcdefghijklmnopqrst"), 0, 10, "", 10); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 5); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 0); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", -10); + test(S("abcdefghijklmnopqrst"), 0, 19, "", 19); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 14); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 9); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", -1); + test(S("abcdefghijklmnopqrst"), 0, 20, "", 20); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 15); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 0); + test(S("abcdefghijklmnopqrst"), 0, 21, "", 20); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 15); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "", 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", -5); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", -10); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghijklmnopqrst"), 1, 1, "", 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "", 9); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "", 18); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "", 19); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "", 19); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 1); + test(S("abcdefghijklmnopqrst"), 10, 0, "", 0); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", -5); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", -10); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghijklmnopqrst"), 10, 1, "", 1); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "", 5); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "", 9); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "", 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "", 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 10); + test(S("abcdefghijklmnopqrst"), 19, 0, "", 0); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", -5); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", -10); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghijklmnopqrst"), 19, 1, "", 1); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "", 1); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 19); + test(S("abcdefghijklmnopqrst"), 20, 0, "", 0); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", -5); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", -10); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", -20); + test(S("abcdefghijklmnopqrst"), 20, 1, "", 0); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", -5); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", -10); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", -20); + test(S("abcdefghijklmnopqrst"), 21, 0, "", 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 0); +} + +int main() +{ + test0(); + test1(); + test2(); +} diff --git a/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_pointer_size.pass.cpp b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_pointer_size.pass.cpp new file mode 100644 index 00000000000..1a30a9ee3a7 --- /dev/null +++ b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_pointer_size.pass.cpp @@ -0,0 +1,1291 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int compare(size_type pos, size_type n1, const charT *s, size_type n2) const; + +#include <string> +#include <stdexcept> +#include <cassert> + +int sign(int x) +{ + if (x == 0) + return 0; + if (x < 0) + return -1; + return 1; +} + +template <class S> +void +test(const S& s, typename S::size_type pos, typename S::size_type n1, + const typename S::value_type* str, typename S::size_type n2, int x) +{ + try + { + assert(sign(s.compare(pos, n1, str, n2)) == sign(x)); + assert(pos <= s.size()); + } + catch (std::out_of_range&) + { + assert(pos > s.size()); + } +} + +typedef std::string S; + +void test0() +{ + test(S(""), 0, 0, "", 0, 0); + test(S(""), 0, 0, "abcde", 0, 0); + test(S(""), 0, 0, "abcde", 1, -1); + test(S(""), 0, 0, "abcde", 2, -2); + test(S(""), 0, 0, "abcde", 4, -4); + test(S(""), 0, 0, "abcde", 5, -5); + test(S(""), 0, 0, "abcdefghij", 0, 0); + test(S(""), 0, 0, "abcdefghij", 1, -1); + test(S(""), 0, 0, "abcdefghij", 5, -5); + test(S(""), 0, 0, "abcdefghij", 9, -9); + test(S(""), 0, 0, "abcdefghij", 10, -10); + test(S(""), 0, 0, "abcdefghijklmnopqrst", 0, 0); + test(S(""), 0, 0, "abcdefghijklmnopqrst", 1, -1); + test(S(""), 0, 0, "abcdefghijklmnopqrst", 10, -10); + test(S(""), 0, 0, "abcdefghijklmnopqrst", 19, -19); + test(S(""), 0, 0, "abcdefghijklmnopqrst", 20, -20); + test(S(""), 0, 1, "", 0, 0); + test(S(""), 0, 1, "abcde", 0, 0); + test(S(""), 0, 1, "abcde", 1, -1); + test(S(""), 0, 1, "abcde", 2, -2); + test(S(""), 0, 1, "abcde", 4, -4); + test(S(""), 0, 1, "abcde", 5, -5); + test(S(""), 0, 1, "abcdefghij", 0, 0); + test(S(""), 0, 1, "abcdefghij", 1, -1); + test(S(""), 0, 1, "abcdefghij", 5, -5); + test(S(""), 0, 1, "abcdefghij", 9, -9); + test(S(""), 0, 1, "abcdefghij", 10, -10); + test(S(""), 0, 1, "abcdefghijklmnopqrst", 0, 0); + test(S(""), 0, 1, "abcdefghijklmnopqrst", 1, -1); + test(S(""), 0, 1, "abcdefghijklmnopqrst", 10, -10); + test(S(""), 0, 1, "abcdefghijklmnopqrst", 19, -19); + test(S(""), 0, 1, "abcdefghijklmnopqrst", 20, -20); + test(S(""), 1, 0, "", 0, 0); + test(S(""), 1, 0, "abcde", 0, 0); + test(S(""), 1, 0, "abcde", 1, 0); + test(S(""), 1, 0, "abcde", 2, 0); + test(S(""), 1, 0, "abcde", 4, 0); + test(S(""), 1, 0, "abcde", 5, 0); + test(S(""), 1, 0, "abcdefghij", 0, 0); + test(S(""), 1, 0, "abcdefghij", 1, 0); + test(S(""), 1, 0, "abcdefghij", 5, 0); + test(S(""), 1, 0, "abcdefghij", 9, 0); + test(S(""), 1, 0, "abcdefghij", 10, 0); + test(S(""), 1, 0, "abcdefghijklmnopqrst", 0, 0); + test(S(""), 1, 0, "abcdefghijklmnopqrst", 1, 0); + test(S(""), 1, 0, "abcdefghijklmnopqrst", 10, 0); + test(S(""), 1, 0, "abcdefghijklmnopqrst", 19, 0); + test(S(""), 1, 0, "abcdefghijklmnopqrst", 20, 0); + test(S("abcde"), 0, 0, "", 0, 0); + test(S("abcde"), 0, 0, "abcde", 0, 0); + test(S("abcde"), 0, 0, "abcde", 1, -1); + test(S("abcde"), 0, 0, "abcde", 2, -2); + test(S("abcde"), 0, 0, "abcde", 4, -4); + test(S("abcde"), 0, 0, "abcde", 5, -5); + test(S("abcde"), 0, 0, "abcdefghij", 0, 0); + test(S("abcde"), 0, 0, "abcdefghij", 1, -1); + test(S("abcde"), 0, 0, "abcdefghij", 5, -5); + test(S("abcde"), 0, 0, "abcdefghij", 9, -9); + test(S("abcde"), 0, 0, "abcdefghij", 10, -10); + test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcde"), 0, 1, "", 0, 1); + test(S("abcde"), 0, 1, "abcde", 0, 1); + test(S("abcde"), 0, 1, "abcde", 1, 0); + test(S("abcde"), 0, 1, "abcde", 2, -1); + test(S("abcde"), 0, 1, "abcde", 4, -3); + test(S("abcde"), 0, 1, "abcde", 5, -4); + test(S("abcde"), 0, 1, "abcdefghij", 0, 1); + test(S("abcde"), 0, 1, "abcdefghij", 1, 0); + test(S("abcde"), 0, 1, "abcdefghij", 5, -4); + test(S("abcde"), 0, 1, "abcdefghij", 9, -8); + test(S("abcde"), 0, 1, "abcdefghij", 10, -9); + test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 1, 0); + test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 10, -9); + test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 19, -18); + test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 20, -19); + test(S("abcde"), 0, 2, "", 0, 2); + test(S("abcde"), 0, 2, "abcde", 0, 2); + test(S("abcde"), 0, 2, "abcde", 1, 1); + test(S("abcde"), 0, 2, "abcde", 2, 0); + test(S("abcde"), 0, 2, "abcde", 4, -2); + test(S("abcde"), 0, 2, "abcde", 5, -3); + test(S("abcde"), 0, 2, "abcdefghij", 0, 2); + test(S("abcde"), 0, 2, "abcdefghij", 1, 1); + test(S("abcde"), 0, 2, "abcdefghij", 5, -3); + test(S("abcde"), 0, 2, "abcdefghij", 9, -7); + test(S("abcde"), 0, 2, "abcdefghij", 10, -8); + test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 0, 2); + test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 1, 1); + test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 10, -8); + test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 19, -17); + test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 20, -18); + test(S("abcde"), 0, 4, "", 0, 4); + test(S("abcde"), 0, 4, "abcde", 0, 4); + test(S("abcde"), 0, 4, "abcde", 1, 3); + test(S("abcde"), 0, 4, "abcde", 2, 2); +} + +void test1() +{ + test(S("abcde"), 0, 4, "abcde", 4, 0); + test(S("abcde"), 0, 4, "abcde", 5, -1); + test(S("abcde"), 0, 4, "abcdefghij", 0, 4); + test(S("abcde"), 0, 4, "abcdefghij", 1, 3); + test(S("abcde"), 0, 4, "abcdefghij", 5, -1); + test(S("abcde"), 0, 4, "abcdefghij", 9, -5); + test(S("abcde"), 0, 4, "abcdefghij", 10, -6); + test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 0, 4); + test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 1, 3); + test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 10, -6); + test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 19, -15); + test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 20, -16); + test(S("abcde"), 0, 5, "", 0, 5); + test(S("abcde"), 0, 5, "abcde", 0, 5); + test(S("abcde"), 0, 5, "abcde", 1, 4); + test(S("abcde"), 0, 5, "abcde", 2, 3); + test(S("abcde"), 0, 5, "abcde", 4, 1); + test(S("abcde"), 0, 5, "abcde", 5, 0); + test(S("abcde"), 0, 5, "abcdefghij", 0, 5); + test(S("abcde"), 0, 5, "abcdefghij", 1, 4); + test(S("abcde"), 0, 5, "abcdefghij", 5, 0); + test(S("abcde"), 0, 5, "abcdefghij", 9, -4); + test(S("abcde"), 0, 5, "abcdefghij", 10, -5); + test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 0, 5); + test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 1, 4); + test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 10, -5); + test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 19, -14); + test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 20, -15); + test(S("abcde"), 0, 6, "", 0, 5); + test(S("abcde"), 0, 6, "abcde", 0, 5); + test(S("abcde"), 0, 6, "abcde", 1, 4); + test(S("abcde"), 0, 6, "abcde", 2, 3); + test(S("abcde"), 0, 6, "abcde", 4, 1); + test(S("abcde"), 0, 6, "abcde", 5, 0); + test(S("abcde"), 0, 6, "abcdefghij", 0, 5); + test(S("abcde"), 0, 6, "abcdefghij", 1, 4); + test(S("abcde"), 0, 6, "abcdefghij", 5, 0); + test(S("abcde"), 0, 6, "abcdefghij", 9, -4); + test(S("abcde"), 0, 6, "abcdefghij", 10, -5); + test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 0, 5); + test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 1, 4); + test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 10, -5); + test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 19, -14); + test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 20, -15); + test(S("abcde"), 1, 0, "", 0, 0); + test(S("abcde"), 1, 0, "abcde", 0, 0); + test(S("abcde"), 1, 0, "abcde", 1, -1); + test(S("abcde"), 1, 0, "abcde", 2, -2); + test(S("abcde"), 1, 0, "abcde", 4, -4); + test(S("abcde"), 1, 0, "abcde", 5, -5); + test(S("abcde"), 1, 0, "abcdefghij", 0, 0); + test(S("abcde"), 1, 0, "abcdefghij", 1, -1); + test(S("abcde"), 1, 0, "abcdefghij", 5, -5); + test(S("abcde"), 1, 0, "abcdefghij", 9, -9); + test(S("abcde"), 1, 0, "abcdefghij", 10, -10); + test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcde"), 1, 1, "", 0, 1); + test(S("abcde"), 1, 1, "abcde", 0, 1); + test(S("abcde"), 1, 1, "abcde", 1, 1); + test(S("abcde"), 1, 1, "abcde", 2, 1); + test(S("abcde"), 1, 1, "abcde", 4, 1); + test(S("abcde"), 1, 1, "abcde", 5, 1); + test(S("abcde"), 1, 1, "abcdefghij", 0, 1); + test(S("abcde"), 1, 1, "abcdefghij", 1, 1); + test(S("abcde"), 1, 1, "abcdefghij", 5, 1); + test(S("abcde"), 1, 1, "abcdefghij", 9, 1); + test(S("abcde"), 1, 1, "abcdefghij", 10, 1); + test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 1, 1); + test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 10, 1); + test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 19, 1); + test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 20, 1); + test(S("abcde"), 1, 2, "", 0, 2); + test(S("abcde"), 1, 2, "abcde", 0, 2); + test(S("abcde"), 1, 2, "abcde", 1, 1); + test(S("abcde"), 1, 2, "abcde", 2, 1); + test(S("abcde"), 1, 2, "abcde", 4, 1); + test(S("abcde"), 1, 2, "abcde", 5, 1); + test(S("abcde"), 1, 2, "abcdefghij", 0, 2); + test(S("abcde"), 1, 2, "abcdefghij", 1, 1); + test(S("abcde"), 1, 2, "abcdefghij", 5, 1); + test(S("abcde"), 1, 2, "abcdefghij", 9, 1); + test(S("abcde"), 1, 2, "abcdefghij", 10, 1); + test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 0, 2); + test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 1, 1); + test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 10, 1); + test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 19, 1); + test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 20, 1); + test(S("abcde"), 1, 3, "", 0, 3); + test(S("abcde"), 1, 3, "abcde", 0, 3); + test(S("abcde"), 1, 3, "abcde", 1, 1); + test(S("abcde"), 1, 3, "abcde", 2, 1); + test(S("abcde"), 1, 3, "abcde", 4, 1); + test(S("abcde"), 1, 3, "abcde", 5, 1); + test(S("abcde"), 1, 3, "abcdefghij", 0, 3); + test(S("abcde"), 1, 3, "abcdefghij", 1, 1); +} + +void test2() +{ + test(S("abcde"), 1, 3, "abcdefghij", 5, 1); + test(S("abcde"), 1, 3, "abcdefghij", 9, 1); + test(S("abcde"), 1, 3, "abcdefghij", 10, 1); + test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 0, 3); + test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 1, 1); + test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 10, 1); + test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 19, 1); + test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 20, 1); + test(S("abcde"), 1, 4, "", 0, 4); + test(S("abcde"), 1, 4, "abcde", 0, 4); + test(S("abcde"), 1, 4, "abcde", 1, 1); + test(S("abcde"), 1, 4, "abcde", 2, 1); + test(S("abcde"), 1, 4, "abcde", 4, 1); + test(S("abcde"), 1, 4, "abcde", 5, 1); + test(S("abcde"), 1, 4, "abcdefghij", 0, 4); + test(S("abcde"), 1, 4, "abcdefghij", 1, 1); + test(S("abcde"), 1, 4, "abcdefghij", 5, 1); + test(S("abcde"), 1, 4, "abcdefghij", 9, 1); + test(S("abcde"), 1, 4, "abcdefghij", 10, 1); + test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 0, 4); + test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 1, 1); + test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 10, 1); + test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 19, 1); + test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 20, 1); + test(S("abcde"), 1, 5, "", 0, 4); + test(S("abcde"), 1, 5, "abcde", 0, 4); + test(S("abcde"), 1, 5, "abcde", 1, 1); + test(S("abcde"), 1, 5, "abcde", 2, 1); + test(S("abcde"), 1, 5, "abcde", 4, 1); + test(S("abcde"), 1, 5, "abcde", 5, 1); + test(S("abcde"), 1, 5, "abcdefghij", 0, 4); + test(S("abcde"), 1, 5, "abcdefghij", 1, 1); + test(S("abcde"), 1, 5, "abcdefghij", 5, 1); + test(S("abcde"), 1, 5, "abcdefghij", 9, 1); + test(S("abcde"), 1, 5, "abcdefghij", 10, 1); + test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 0, 4); + test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 1, 1); + test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 10, 1); + test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 19, 1); + test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 20, 1); + test(S("abcde"), 2, 0, "", 0, 0); + test(S("abcde"), 2, 0, "abcde", 0, 0); + test(S("abcde"), 2, 0, "abcde", 1, -1); + test(S("abcde"), 2, 0, "abcde", 2, -2); + test(S("abcde"), 2, 0, "abcde", 4, -4); + test(S("abcde"), 2, 0, "abcde", 5, -5); + test(S("abcde"), 2, 0, "abcdefghij", 0, 0); + test(S("abcde"), 2, 0, "abcdefghij", 1, -1); + test(S("abcde"), 2, 0, "abcdefghij", 5, -5); + test(S("abcde"), 2, 0, "abcdefghij", 9, -9); + test(S("abcde"), 2, 0, "abcdefghij", 10, -10); + test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcde"), 2, 1, "", 0, 1); + test(S("abcde"), 2, 1, "abcde", 0, 1); + test(S("abcde"), 2, 1, "abcde", 1, 2); + test(S("abcde"), 2, 1, "abcde", 2, 2); + test(S("abcde"), 2, 1, "abcde", 4, 2); + test(S("abcde"), 2, 1, "abcde", 5, 2); + test(S("abcde"), 2, 1, "abcdefghij", 0, 1); + test(S("abcde"), 2, 1, "abcdefghij", 1, 2); + test(S("abcde"), 2, 1, "abcdefghij", 5, 2); + test(S("abcde"), 2, 1, "abcdefghij", 9, 2); + test(S("abcde"), 2, 1, "abcdefghij", 10, 2); + test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 1, 2); + test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 10, 2); + test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 19, 2); + test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 20, 2); + test(S("abcde"), 2, 2, "", 0, 2); + test(S("abcde"), 2, 2, "abcde", 0, 2); + test(S("abcde"), 2, 2, "abcde", 1, 2); + test(S("abcde"), 2, 2, "abcde", 2, 2); + test(S("abcde"), 2, 2, "abcde", 4, 2); + test(S("abcde"), 2, 2, "abcde", 5, 2); + test(S("abcde"), 2, 2, "abcdefghij", 0, 2); + test(S("abcde"), 2, 2, "abcdefghij", 1, 2); + test(S("abcde"), 2, 2, "abcdefghij", 5, 2); + test(S("abcde"), 2, 2, "abcdefghij", 9, 2); + test(S("abcde"), 2, 2, "abcdefghij", 10, 2); + test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 0, 2); + test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 1, 2); + test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 10, 2); + test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 19, 2); + test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 20, 2); + test(S("abcde"), 2, 3, "", 0, 3); + test(S("abcde"), 2, 3, "abcde", 0, 3); + test(S("abcde"), 2, 3, "abcde", 1, 2); + test(S("abcde"), 2, 3, "abcde", 2, 2); + test(S("abcde"), 2, 3, "abcde", 4, 2); + test(S("abcde"), 2, 3, "abcde", 5, 2); + test(S("abcde"), 2, 3, "abcdefghij", 0, 3); + test(S("abcde"), 2, 3, "abcdefghij", 1, 2); + test(S("abcde"), 2, 3, "abcdefghij", 5, 2); + test(S("abcde"), 2, 3, "abcdefghij", 9, 2); + test(S("abcde"), 2, 3, "abcdefghij", 10, 2); + test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 0, 3); +} + +void test3() +{ + test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 1, 2); + test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 10, 2); + test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 19, 2); + test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 20, 2); + test(S("abcde"), 2, 4, "", 0, 3); + test(S("abcde"), 2, 4, "abcde", 0, 3); + test(S("abcde"), 2, 4, "abcde", 1, 2); + test(S("abcde"), 2, 4, "abcde", 2, 2); + test(S("abcde"), 2, 4, "abcde", 4, 2); + test(S("abcde"), 2, 4, "abcde", 5, 2); + test(S("abcde"), 2, 4, "abcdefghij", 0, 3); + test(S("abcde"), 2, 4, "abcdefghij", 1, 2); + test(S("abcde"), 2, 4, "abcdefghij", 5, 2); + test(S("abcde"), 2, 4, "abcdefghij", 9, 2); + test(S("abcde"), 2, 4, "abcdefghij", 10, 2); + test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 0, 3); + test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 1, 2); + test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 10, 2); + test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 19, 2); + test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 20, 2); + test(S("abcde"), 4, 0, "", 0, 0); + test(S("abcde"), 4, 0, "abcde", 0, 0); + test(S("abcde"), 4, 0, "abcde", 1, -1); + test(S("abcde"), 4, 0, "abcde", 2, -2); + test(S("abcde"), 4, 0, "abcde", 4, -4); + test(S("abcde"), 4, 0, "abcde", 5, -5); + test(S("abcde"), 4, 0, "abcdefghij", 0, 0); + test(S("abcde"), 4, 0, "abcdefghij", 1, -1); + test(S("abcde"), 4, 0, "abcdefghij", 5, -5); + test(S("abcde"), 4, 0, "abcdefghij", 9, -9); + test(S("abcde"), 4, 0, "abcdefghij", 10, -10); + test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcde"), 4, 1, "", 0, 1); + test(S("abcde"), 4, 1, "abcde", 0, 1); + test(S("abcde"), 4, 1, "abcde", 1, 4); + test(S("abcde"), 4, 1, "abcde", 2, 4); + test(S("abcde"), 4, 1, "abcde", 4, 4); + test(S("abcde"), 4, 1, "abcde", 5, 4); + test(S("abcde"), 4, 1, "abcdefghij", 0, 1); + test(S("abcde"), 4, 1, "abcdefghij", 1, 4); + test(S("abcde"), 4, 1, "abcdefghij", 5, 4); + test(S("abcde"), 4, 1, "abcdefghij", 9, 4); + test(S("abcde"), 4, 1, "abcdefghij", 10, 4); + test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 1, 4); + test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 10, 4); + test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 19, 4); + test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 20, 4); + test(S("abcde"), 4, 2, "", 0, 1); + test(S("abcde"), 4, 2, "abcde", 0, 1); + test(S("abcde"), 4, 2, "abcde", 1, 4); + test(S("abcde"), 4, 2, "abcde", 2, 4); + test(S("abcde"), 4, 2, "abcde", 4, 4); + test(S("abcde"), 4, 2, "abcde", 5, 4); + test(S("abcde"), 4, 2, "abcdefghij", 0, 1); + test(S("abcde"), 4, 2, "abcdefghij", 1, 4); + test(S("abcde"), 4, 2, "abcdefghij", 5, 4); + test(S("abcde"), 4, 2, "abcdefghij", 9, 4); + test(S("abcde"), 4, 2, "abcdefghij", 10, 4); + test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 0, 1); + test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 1, 4); + test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 10, 4); + test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 19, 4); + test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 20, 4); + test(S("abcde"), 5, 0, "", 0, 0); + test(S("abcde"), 5, 0, "abcde", 0, 0); + test(S("abcde"), 5, 0, "abcde", 1, -1); + test(S("abcde"), 5, 0, "abcde", 2, -2); + test(S("abcde"), 5, 0, "abcde", 4, -4); + test(S("abcde"), 5, 0, "abcde", 5, -5); + test(S("abcde"), 5, 0, "abcdefghij", 0, 0); + test(S("abcde"), 5, 0, "abcdefghij", 1, -1); + test(S("abcde"), 5, 0, "abcdefghij", 5, -5); + test(S("abcde"), 5, 0, "abcdefghij", 9, -9); + test(S("abcde"), 5, 0, "abcdefghij", 10, -10); + test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcde"), 5, 1, "", 0, 0); + test(S("abcde"), 5, 1, "abcde", 0, 0); + test(S("abcde"), 5, 1, "abcde", 1, -1); + test(S("abcde"), 5, 1, "abcde", 2, -2); + test(S("abcde"), 5, 1, "abcde", 4, -4); + test(S("abcde"), 5, 1, "abcde", 5, -5); + test(S("abcde"), 5, 1, "abcdefghij", 0, 0); + test(S("abcde"), 5, 1, "abcdefghij", 1, -1); + test(S("abcde"), 5, 1, "abcdefghij", 5, -5); + test(S("abcde"), 5, 1, "abcdefghij", 9, -9); + test(S("abcde"), 5, 1, "abcdefghij", 10, -10); + test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 1, -1); + test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 10, -10); + test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 19, -19); + test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 20, -20); +} + +void test4() +{ + test(S("abcde"), 6, 0, "", 0, 0); + test(S("abcde"), 6, 0, "abcde", 0, 0); + test(S("abcde"), 6, 0, "abcde", 1, 0); + test(S("abcde"), 6, 0, "abcde", 2, 0); + test(S("abcde"), 6, 0, "abcde", 4, 0); + test(S("abcde"), 6, 0, "abcde", 5, 0); + test(S("abcde"), 6, 0, "abcdefghij", 0, 0); + test(S("abcde"), 6, 0, "abcdefghij", 1, 0); + test(S("abcde"), 6, 0, "abcdefghij", 5, 0); + test(S("abcde"), 6, 0, "abcdefghij", 9, 0); + test(S("abcde"), 6, 0, "abcdefghij", 10, 0); + test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 1, 0); + test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 10, 0); + test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 19, 0); + test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 20, 0); + test(S("abcdefghij"), 0, 0, "", 0, 0); + test(S("abcdefghij"), 0, 0, "abcde", 0, 0); + test(S("abcdefghij"), 0, 0, "abcde", 1, -1); + test(S("abcdefghij"), 0, 0, "abcde", 2, -2); + test(S("abcdefghij"), 0, 0, "abcde", 4, -4); + test(S("abcdefghij"), 0, 0, "abcde", 5, -5); + test(S("abcdefghij"), 0, 0, "abcdefghij", 0, 0); + test(S("abcdefghij"), 0, 0, "abcdefghij", 1, -1); + test(S("abcdefghij"), 0, 0, "abcdefghij", 5, -5); + test(S("abcdefghij"), 0, 0, "abcdefghij", 9, -9); + test(S("abcdefghij"), 0, 0, "abcdefghij", 10, -10); + test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghij"), 0, 1, "", 0, 1); + test(S("abcdefghij"), 0, 1, "abcde", 0, 1); + test(S("abcdefghij"), 0, 1, "abcde", 1, 0); + test(S("abcdefghij"), 0, 1, "abcde", 2, -1); + test(S("abcdefghij"), 0, 1, "abcde", 4, -3); + test(S("abcdefghij"), 0, 1, "abcde", 5, -4); + test(S("abcdefghij"), 0, 1, "abcdefghij", 0, 1); + test(S("abcdefghij"), 0, 1, "abcdefghij", 1, 0); + test(S("abcdefghij"), 0, 1, "abcdefghij", 5, -4); + test(S("abcdefghij"), 0, 1, "abcdefghij", 9, -8); + test(S("abcdefghij"), 0, 1, "abcdefghij", 10, -9); + test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 1, 0); + test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 10, -9); + test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 19, -18); + test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 20, -19); + test(S("abcdefghij"), 0, 5, "", 0, 5); + test(S("abcdefghij"), 0, 5, "abcde", 0, 5); + test(S("abcdefghij"), 0, 5, "abcde", 1, 4); + test(S("abcdefghij"), 0, 5, "abcde", 2, 3); + test(S("abcdefghij"), 0, 5, "abcde", 4, 1); + test(S("abcdefghij"), 0, 5, "abcde", 5, 0); + test(S("abcdefghij"), 0, 5, "abcdefghij", 0, 5); + test(S("abcdefghij"), 0, 5, "abcdefghij", 1, 4); + test(S("abcdefghij"), 0, 5, "abcdefghij", 5, 0); + test(S("abcdefghij"), 0, 5, "abcdefghij", 9, -4); + test(S("abcdefghij"), 0, 5, "abcdefghij", 10, -5); + test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 0, 5); + test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 1, 4); + test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 10, -5); + test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 19, -14); + test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 20, -15); + test(S("abcdefghij"), 0, 9, "", 0, 9); + test(S("abcdefghij"), 0, 9, "abcde", 0, 9); + test(S("abcdefghij"), 0, 9, "abcde", 1, 8); + test(S("abcdefghij"), 0, 9, "abcde", 2, 7); + test(S("abcdefghij"), 0, 9, "abcde", 4, 5); + test(S("abcdefghij"), 0, 9, "abcde", 5, 4); + test(S("abcdefghij"), 0, 9, "abcdefghij", 0, 9); + test(S("abcdefghij"), 0, 9, "abcdefghij", 1, 8); + test(S("abcdefghij"), 0, 9, "abcdefghij", 5, 4); + test(S("abcdefghij"), 0, 9, "abcdefghij", 9, 0); + test(S("abcdefghij"), 0, 9, "abcdefghij", 10, -1); + test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 0, 9); + test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 1, 8); + test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 10, -1); + test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 19, -10); + test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 20, -11); + test(S("abcdefghij"), 0, 10, "", 0, 10); + test(S("abcdefghij"), 0, 10, "abcde", 0, 10); + test(S("abcdefghij"), 0, 10, "abcde", 1, 9); + test(S("abcdefghij"), 0, 10, "abcde", 2, 8); + test(S("abcdefghij"), 0, 10, "abcde", 4, 6); + test(S("abcdefghij"), 0, 10, "abcde", 5, 5); + test(S("abcdefghij"), 0, 10, "abcdefghij", 0, 10); + test(S("abcdefghij"), 0, 10, "abcdefghij", 1, 9); + test(S("abcdefghij"), 0, 10, "abcdefghij", 5, 5); + test(S("abcdefghij"), 0, 10, "abcdefghij", 9, 1); + test(S("abcdefghij"), 0, 10, "abcdefghij", 10, 0); + test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 0, 10); + test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 1, 9); + test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 10, 0); + test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 19, -9); + test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 20, -10); + test(S("abcdefghij"), 0, 11, "", 0, 10); + test(S("abcdefghij"), 0, 11, "abcde", 0, 10); + test(S("abcdefghij"), 0, 11, "abcde", 1, 9); + test(S("abcdefghij"), 0, 11, "abcde", 2, 8); +} + +void test5() +{ + test(S("abcdefghij"), 0, 11, "abcde", 4, 6); + test(S("abcdefghij"), 0, 11, "abcde", 5, 5); + test(S("abcdefghij"), 0, 11, "abcdefghij", 0, 10); + test(S("abcdefghij"), 0, 11, "abcdefghij", 1, 9); + test(S("abcdefghij"), 0, 11, "abcdefghij", 5, 5); + test(S("abcdefghij"), 0, 11, "abcdefghij", 9, 1); + test(S("abcdefghij"), 0, 11, "abcdefghij", 10, 0); + test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 0, 10); + test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 1, 9); + test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 10, 0); + test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 19, -9); + test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 20, -10); + test(S("abcdefghij"), 1, 0, "", 0, 0); + test(S("abcdefghij"), 1, 0, "abcde", 0, 0); + test(S("abcdefghij"), 1, 0, "abcde", 1, -1); + test(S("abcdefghij"), 1, 0, "abcde", 2, -2); + test(S("abcdefghij"), 1, 0, "abcde", 4, -4); + test(S("abcdefghij"), 1, 0, "abcde", 5, -5); + test(S("abcdefghij"), 1, 0, "abcdefghij", 0, 0); + test(S("abcdefghij"), 1, 0, "abcdefghij", 1, -1); + test(S("abcdefghij"), 1, 0, "abcdefghij", 5, -5); + test(S("abcdefghij"), 1, 0, "abcdefghij", 9, -9); + test(S("abcdefghij"), 1, 0, "abcdefghij", 10, -10); + test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghij"), 1, 1, "", 0, 1); + test(S("abcdefghij"), 1, 1, "abcde", 0, 1); + test(S("abcdefghij"), 1, 1, "abcde", 1, 1); + test(S("abcdefghij"), 1, 1, "abcde", 2, 1); + test(S("abcdefghij"), 1, 1, "abcde", 4, 1); + test(S("abcdefghij"), 1, 1, "abcde", 5, 1); + test(S("abcdefghij"), 1, 1, "abcdefghij", 0, 1); + test(S("abcdefghij"), 1, 1, "abcdefghij", 1, 1); + test(S("abcdefghij"), 1, 1, "abcdefghij", 5, 1); + test(S("abcdefghij"), 1, 1, "abcdefghij", 9, 1); + test(S("abcdefghij"), 1, 1, "abcdefghij", 10, 1); + test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghij"), 1, 4, "", 0, 4); + test(S("abcdefghij"), 1, 4, "abcde", 0, 4); + test(S("abcdefghij"), 1, 4, "abcde", 1, 1); + test(S("abcdefghij"), 1, 4, "abcde", 2, 1); + test(S("abcdefghij"), 1, 4, "abcde", 4, 1); + test(S("abcdefghij"), 1, 4, "abcde", 5, 1); + test(S("abcdefghij"), 1, 4, "abcdefghij", 0, 4); + test(S("abcdefghij"), 1, 4, "abcdefghij", 1, 1); + test(S("abcdefghij"), 1, 4, "abcdefghij", 5, 1); + test(S("abcdefghij"), 1, 4, "abcdefghij", 9, 1); + test(S("abcdefghij"), 1, 4, "abcdefghij", 10, 1); + test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 0, 4); + test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghij"), 1, 8, "", 0, 8); + test(S("abcdefghij"), 1, 8, "abcde", 0, 8); + test(S("abcdefghij"), 1, 8, "abcde", 1, 1); + test(S("abcdefghij"), 1, 8, "abcde", 2, 1); + test(S("abcdefghij"), 1, 8, "abcde", 4, 1); + test(S("abcdefghij"), 1, 8, "abcde", 5, 1); + test(S("abcdefghij"), 1, 8, "abcdefghij", 0, 8); + test(S("abcdefghij"), 1, 8, "abcdefghij", 1, 1); + test(S("abcdefghij"), 1, 8, "abcdefghij", 5, 1); + test(S("abcdefghij"), 1, 8, "abcdefghij", 9, 1); + test(S("abcdefghij"), 1, 8, "abcdefghij", 10, 1); + test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 0, 8); + test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghij"), 1, 9, "", 0, 9); + test(S("abcdefghij"), 1, 9, "abcde", 0, 9); + test(S("abcdefghij"), 1, 9, "abcde", 1, 1); + test(S("abcdefghij"), 1, 9, "abcde", 2, 1); + test(S("abcdefghij"), 1, 9, "abcde", 4, 1); + test(S("abcdefghij"), 1, 9, "abcde", 5, 1); + test(S("abcdefghij"), 1, 9, "abcdefghij", 0, 9); + test(S("abcdefghij"), 1, 9, "abcdefghij", 1, 1); + test(S("abcdefghij"), 1, 9, "abcdefghij", 5, 1); + test(S("abcdefghij"), 1, 9, "abcdefghij", 9, 1); + test(S("abcdefghij"), 1, 9, "abcdefghij", 10, 1); + test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 0, 9); + test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghij"), 1, 10, "", 0, 9); + test(S("abcdefghij"), 1, 10, "abcde", 0, 9); + test(S("abcdefghij"), 1, 10, "abcde", 1, 1); + test(S("abcdefghij"), 1, 10, "abcde", 2, 1); + test(S("abcdefghij"), 1, 10, "abcde", 4, 1); + test(S("abcdefghij"), 1, 10, "abcde", 5, 1); + test(S("abcdefghij"), 1, 10, "abcdefghij", 0, 9); + test(S("abcdefghij"), 1, 10, "abcdefghij", 1, 1); +} + +void test6() +{ + test(S("abcdefghij"), 1, 10, "abcdefghij", 5, 1); + test(S("abcdefghij"), 1, 10, "abcdefghij", 9, 1); + test(S("abcdefghij"), 1, 10, "abcdefghij", 10, 1); + test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 0, 9); + test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghij"), 5, 0, "", 0, 0); + test(S("abcdefghij"), 5, 0, "abcde", 0, 0); + test(S("abcdefghij"), 5, 0, "abcde", 1, -1); + test(S("abcdefghij"), 5, 0, "abcde", 2, -2); + test(S("abcdefghij"), 5, 0, "abcde", 4, -4); + test(S("abcdefghij"), 5, 0, "abcde", 5, -5); + test(S("abcdefghij"), 5, 0, "abcdefghij", 0, 0); + test(S("abcdefghij"), 5, 0, "abcdefghij", 1, -1); + test(S("abcdefghij"), 5, 0, "abcdefghij", 5, -5); + test(S("abcdefghij"), 5, 0, "abcdefghij", 9, -9); + test(S("abcdefghij"), 5, 0, "abcdefghij", 10, -10); + test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghij"), 5, 1, "", 0, 1); + test(S("abcdefghij"), 5, 1, "abcde", 0, 1); + test(S("abcdefghij"), 5, 1, "abcde", 1, 5); + test(S("abcdefghij"), 5, 1, "abcde", 2, 5); + test(S("abcdefghij"), 5, 1, "abcde", 4, 5); + test(S("abcdefghij"), 5, 1, "abcde", 5, 5); + test(S("abcdefghij"), 5, 1, "abcdefghij", 0, 1); + test(S("abcdefghij"), 5, 1, "abcdefghij", 1, 5); + test(S("abcdefghij"), 5, 1, "abcdefghij", 5, 5); + test(S("abcdefghij"), 5, 1, "abcdefghij", 9, 5); + test(S("abcdefghij"), 5, 1, "abcdefghij", 10, 5); + test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 1, 5); + test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 10, 5); + test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 19, 5); + test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 20, 5); + test(S("abcdefghij"), 5, 2, "", 0, 2); + test(S("abcdefghij"), 5, 2, "abcde", 0, 2); + test(S("abcdefghij"), 5, 2, "abcde", 1, 5); + test(S("abcdefghij"), 5, 2, "abcde", 2, 5); + test(S("abcdefghij"), 5, 2, "abcde", 4, 5); + test(S("abcdefghij"), 5, 2, "abcde", 5, 5); + test(S("abcdefghij"), 5, 2, "abcdefghij", 0, 2); + test(S("abcdefghij"), 5, 2, "abcdefghij", 1, 5); + test(S("abcdefghij"), 5, 2, "abcdefghij", 5, 5); + test(S("abcdefghij"), 5, 2, "abcdefghij", 9, 5); + test(S("abcdefghij"), 5, 2, "abcdefghij", 10, 5); + test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 0, 2); + test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 1, 5); + test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 10, 5); + test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 19, 5); + test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 20, 5); + test(S("abcdefghij"), 5, 4, "", 0, 4); + test(S("abcdefghij"), 5, 4, "abcde", 0, 4); + test(S("abcdefghij"), 5, 4, "abcde", 1, 5); + test(S("abcdefghij"), 5, 4, "abcde", 2, 5); + test(S("abcdefghij"), 5, 4, "abcde", 4, 5); + test(S("abcdefghij"), 5, 4, "abcde", 5, 5); + test(S("abcdefghij"), 5, 4, "abcdefghij", 0, 4); + test(S("abcdefghij"), 5, 4, "abcdefghij", 1, 5); + test(S("abcdefghij"), 5, 4, "abcdefghij", 5, 5); + test(S("abcdefghij"), 5, 4, "abcdefghij", 9, 5); + test(S("abcdefghij"), 5, 4, "abcdefghij", 10, 5); + test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 0, 4); + test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 1, 5); + test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 10, 5); + test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 19, 5); + test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 20, 5); + test(S("abcdefghij"), 5, 5, "", 0, 5); + test(S("abcdefghij"), 5, 5, "abcde", 0, 5); + test(S("abcdefghij"), 5, 5, "abcde", 1, 5); + test(S("abcdefghij"), 5, 5, "abcde", 2, 5); + test(S("abcdefghij"), 5, 5, "abcde", 4, 5); + test(S("abcdefghij"), 5, 5, "abcde", 5, 5); + test(S("abcdefghij"), 5, 5, "abcdefghij", 0, 5); + test(S("abcdefghij"), 5, 5, "abcdefghij", 1, 5); + test(S("abcdefghij"), 5, 5, "abcdefghij", 5, 5); + test(S("abcdefghij"), 5, 5, "abcdefghij", 9, 5); + test(S("abcdefghij"), 5, 5, "abcdefghij", 10, 5); + test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 0, 5); + test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 1, 5); + test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 10, 5); + test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 19, 5); + test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 20, 5); + test(S("abcdefghij"), 5, 6, "", 0, 5); + test(S("abcdefghij"), 5, 6, "abcde", 0, 5); + test(S("abcdefghij"), 5, 6, "abcde", 1, 5); + test(S("abcdefghij"), 5, 6, "abcde", 2, 5); + test(S("abcdefghij"), 5, 6, "abcde", 4, 5); + test(S("abcdefghij"), 5, 6, "abcde", 5, 5); + test(S("abcdefghij"), 5, 6, "abcdefghij", 0, 5); + test(S("abcdefghij"), 5, 6, "abcdefghij", 1, 5); + test(S("abcdefghij"), 5, 6, "abcdefghij", 5, 5); + test(S("abcdefghij"), 5, 6, "abcdefghij", 9, 5); + test(S("abcdefghij"), 5, 6, "abcdefghij", 10, 5); + test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 0, 5); +} + +void test7() +{ + test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 1, 5); + test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 10, 5); + test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 19, 5); + test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 20, 5); + test(S("abcdefghij"), 9, 0, "", 0, 0); + test(S("abcdefghij"), 9, 0, "abcde", 0, 0); + test(S("abcdefghij"), 9, 0, "abcde", 1, -1); + test(S("abcdefghij"), 9, 0, "abcde", 2, -2); + test(S("abcdefghij"), 9, 0, "abcde", 4, -4); + test(S("abcdefghij"), 9, 0, "abcde", 5, -5); + test(S("abcdefghij"), 9, 0, "abcdefghij", 0, 0); + test(S("abcdefghij"), 9, 0, "abcdefghij", 1, -1); + test(S("abcdefghij"), 9, 0, "abcdefghij", 5, -5); + test(S("abcdefghij"), 9, 0, "abcdefghij", 9, -9); + test(S("abcdefghij"), 9, 0, "abcdefghij", 10, -10); + test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghij"), 9, 1, "", 0, 1); + test(S("abcdefghij"), 9, 1, "abcde", 0, 1); + test(S("abcdefghij"), 9, 1, "abcde", 1, 9); + test(S("abcdefghij"), 9, 1, "abcde", 2, 9); + test(S("abcdefghij"), 9, 1, "abcde", 4, 9); + test(S("abcdefghij"), 9, 1, "abcde", 5, 9); + test(S("abcdefghij"), 9, 1, "abcdefghij", 0, 1); + test(S("abcdefghij"), 9, 1, "abcdefghij", 1, 9); + test(S("abcdefghij"), 9, 1, "abcdefghij", 5, 9); + test(S("abcdefghij"), 9, 1, "abcdefghij", 9, 9); + test(S("abcdefghij"), 9, 1, "abcdefghij", 10, 9); + test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 1, 9); + test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 10, 9); + test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 19, 9); + test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 20, 9); + test(S("abcdefghij"), 9, 2, "", 0, 1); + test(S("abcdefghij"), 9, 2, "abcde", 0, 1); + test(S("abcdefghij"), 9, 2, "abcde", 1, 9); + test(S("abcdefghij"), 9, 2, "abcde", 2, 9); + test(S("abcdefghij"), 9, 2, "abcde", 4, 9); + test(S("abcdefghij"), 9, 2, "abcde", 5, 9); + test(S("abcdefghij"), 9, 2, "abcdefghij", 0, 1); + test(S("abcdefghij"), 9, 2, "abcdefghij", 1, 9); + test(S("abcdefghij"), 9, 2, "abcdefghij", 5, 9); + test(S("abcdefghij"), 9, 2, "abcdefghij", 9, 9); + test(S("abcdefghij"), 9, 2, "abcdefghij", 10, 9); + test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 1, 9); + test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 10, 9); + test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 19, 9); + test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 20, 9); + test(S("abcdefghij"), 10, 0, "", 0, 0); + test(S("abcdefghij"), 10, 0, "abcde", 0, 0); + test(S("abcdefghij"), 10, 0, "abcde", 1, -1); + test(S("abcdefghij"), 10, 0, "abcde", 2, -2); + test(S("abcdefghij"), 10, 0, "abcde", 4, -4); + test(S("abcdefghij"), 10, 0, "abcde", 5, -5); + test(S("abcdefghij"), 10, 0, "abcdefghij", 0, 0); + test(S("abcdefghij"), 10, 0, "abcdefghij", 1, -1); + test(S("abcdefghij"), 10, 0, "abcdefghij", 5, -5); + test(S("abcdefghij"), 10, 0, "abcdefghij", 9, -9); + test(S("abcdefghij"), 10, 0, "abcdefghij", 10, -10); + test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghij"), 10, 1, "", 0, 0); + test(S("abcdefghij"), 10, 1, "abcde", 0, 0); + test(S("abcdefghij"), 10, 1, "abcde", 1, -1); + test(S("abcdefghij"), 10, 1, "abcde", 2, -2); + test(S("abcdefghij"), 10, 1, "abcde", 4, -4); + test(S("abcdefghij"), 10, 1, "abcde", 5, -5); + test(S("abcdefghij"), 10, 1, "abcdefghij", 0, 0); + test(S("abcdefghij"), 10, 1, "abcdefghij", 1, -1); + test(S("abcdefghij"), 10, 1, "abcdefghij", 5, -5); + test(S("abcdefghij"), 10, 1, "abcdefghij", 9, -9); + test(S("abcdefghij"), 10, 1, "abcdefghij", 10, -10); + test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghij"), 11, 0, "", 0, 0); + test(S("abcdefghij"), 11, 0, "abcde", 0, 0); + test(S("abcdefghij"), 11, 0, "abcde", 1, 0); + test(S("abcdefghij"), 11, 0, "abcde", 2, 0); + test(S("abcdefghij"), 11, 0, "abcde", 4, 0); + test(S("abcdefghij"), 11, 0, "abcde", 5, 0); + test(S("abcdefghij"), 11, 0, "abcdefghij", 0, 0); + test(S("abcdefghij"), 11, 0, "abcdefghij", 1, 0); + test(S("abcdefghij"), 11, 0, "abcdefghij", 5, 0); + test(S("abcdefghij"), 11, 0, "abcdefghij", 9, 0); + test(S("abcdefghij"), 11, 0, "abcdefghij", 10, 0); + test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 1, 0); + test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 10, 0); + test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 19, 0); + test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 20, 0); +} + +void test8() +{ + test(S("abcdefghijklmnopqrst"), 0, 0, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 4, -4); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 9, -9); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghijklmnopqrst"), 0, 1, "", 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 4, -3); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 5, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 5, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 9, -8); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 10, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 10, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 19, -18); + test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 20, -19); + test(S("abcdefghijklmnopqrst"), 0, 10, "", 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 1, 9); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 2, 8); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 4, 6); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 5, 5); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 1, 9); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 5, 5); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 9, 1); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 10, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 1, 9); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 10, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 19, -9); + test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 20, -10); + test(S("abcdefghijklmnopqrst"), 0, 19, "", 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 1, 18); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 2, 17); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 4, 15); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 5, 14); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 1, 18); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 5, 14); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 9, 10); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 10, 9); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 1, 18); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 10, 9); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 19, 0); + test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, "", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 2, 18); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 4, 16); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 9, 11); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 20, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, "", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 2, 18); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 4, 16); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 9, 11); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 20, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 2, -2); +} + +void test9() +{ + test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 5, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 5, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 10, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghijklmnopqrst"), 1, 1, "", 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "", 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "", 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 20, 1); + test(S("abcdefghijklmnopqrst"), 10, 0, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 2, -2); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 4, -4); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 5, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 1, -1); +} + +void test10() +{ + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 5, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 9, -9); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 10, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghijklmnopqrst"), 10, 1, "", 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "", 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "", 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 20, 10); + test(S("abcdefghijklmnopqrst"), 19, 0, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 2, -2); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 4, -4); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 5, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 5, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 9, -9); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 10, -10); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 0, 0); +} + +void test11() +{ + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghijklmnopqrst"), 19, 1, "", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 2, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 4, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 9, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 19, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 20, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 2, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 4, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 9, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 19, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 20, 19); + test(S("abcdefghijklmnopqrst"), 20, 0, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghijklmnopqrst"), 20, 1, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 19, -19); + test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 20, -20); + test(S("abcdefghijklmnopqrst"), 21, 0, "", 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 4, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 9, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 10, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 10, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 19, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 20, 0); +} + +int main() +{ + test0(); + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); + test7(); + test8(); + test9(); + test10(); + test11(); +} diff --git a/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_string.pass.cpp b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_string.pass.cpp new file mode 100644 index 00000000000..9eeb2d5fe09 --- /dev/null +++ b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_string.pass.cpp @@ -0,0 +1,358 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int compare(size_type pos1, size_type n1, const basic_string& str) const; + +#include <string> +#include <stdexcept> +#include <cassert> + +int sign(int x) +{ + if (x == 0) + return 0; + if (x < 0) + return -1; + return 1; +} + +template <class S> +void +test(const S& s, typename S::size_type pos1, typename S::size_type n1, + const S& str, int x) +{ + try + { + assert(sign(s.compare(pos1, n1, str)) == sign(x)); + assert(pos1 <= s.size()); + } + catch (std::out_of_range&) + { + assert(pos1 > s.size()); + } +} + +typedef std::string S; + +void test0() +{ + test(S(""), 0, 0, S(""), 0); + test(S(""), 0, 0, S("abcde"), -5); + test(S(""), 0, 0, S("abcdefghij"), -10); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), -20); + test(S(""), 0, 1, S(""), 0); + test(S(""), 0, 1, S("abcde"), -5); + test(S(""), 0, 1, S("abcdefghij"), -10); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), -20); + test(S(""), 1, 0, S(""), 0); + test(S(""), 1, 0, S("abcde"), 0); + test(S(""), 1, 0, S("abcdefghij"), 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0); + test(S("abcde"), 0, 0, S(""), 0); + test(S("abcde"), 0, 0, S("abcde"), -5); + test(S("abcde"), 0, 0, S("abcdefghij"), -10); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcde"), 0, 1, S(""), 1); + test(S("abcde"), 0, 1, S("abcde"), -4); + test(S("abcde"), 0, 1, S("abcdefghij"), -9); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), -19); + test(S("abcde"), 0, 2, S(""), 2); + test(S("abcde"), 0, 2, S("abcde"), -3); + test(S("abcde"), 0, 2, S("abcdefghij"), -8); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), -18); + test(S("abcde"), 0, 4, S(""), 4); + test(S("abcde"), 0, 4, S("abcde"), -1); + test(S("abcde"), 0, 4, S("abcdefghij"), -6); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), -16); + test(S("abcde"), 0, 5, S(""), 5); + test(S("abcde"), 0, 5, S("abcde"), 0); + test(S("abcde"), 0, 5, S("abcdefghij"), -5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), -15); + test(S("abcde"), 0, 6, S(""), 5); + test(S("abcde"), 0, 6, S("abcde"), 0); + test(S("abcde"), 0, 6, S("abcdefghij"), -5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), -15); + test(S("abcde"), 1, 0, S(""), 0); + test(S("abcde"), 1, 0, S("abcde"), -5); + test(S("abcde"), 1, 0, S("abcdefghij"), -10); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcde"), 1, 1, S(""), 1); + test(S("abcde"), 1, 1, S("abcde"), 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1); + test(S("abcde"), 1, 2, S(""), 2); + test(S("abcde"), 1, 2, S("abcde"), 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1); + test(S("abcde"), 1, 3, S(""), 3); + test(S("abcde"), 1, 3, S("abcde"), 1); + test(S("abcde"), 1, 3, S("abcdefghij"), 1); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1); + test(S("abcde"), 1, 4, S(""), 4); + test(S("abcde"), 1, 4, S("abcde"), 1); + test(S("abcde"), 1, 4, S("abcdefghij"), 1); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1); + test(S("abcde"), 1, 5, S(""), 4); + test(S("abcde"), 1, 5, S("abcde"), 1); + test(S("abcde"), 1, 5, S("abcdefghij"), 1); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1); + test(S("abcde"), 2, 0, S(""), 0); + test(S("abcde"), 2, 0, S("abcde"), -5); + test(S("abcde"), 2, 0, S("abcdefghij"), -10); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcde"), 2, 1, S(""), 1); + test(S("abcde"), 2, 1, S("abcde"), 2); + test(S("abcde"), 2, 1, S("abcdefghij"), 2); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 2); + test(S("abcde"), 2, 2, S(""), 2); + test(S("abcde"), 2, 2, S("abcde"), 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 2); + test(S("abcde"), 2, 3, S(""), 3); + test(S("abcde"), 2, 3, S("abcde"), 2); + test(S("abcde"), 2, 3, S("abcdefghij"), 2); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 2); + test(S("abcde"), 2, 4, S(""), 3); + test(S("abcde"), 2, 4, S("abcde"), 2); + test(S("abcde"), 2, 4, S("abcdefghij"), 2); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 2); + test(S("abcde"), 4, 0, S(""), 0); + test(S("abcde"), 4, 0, S("abcde"), -5); + test(S("abcde"), 4, 0, S("abcdefghij"), -10); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcde"), 4, 1, S(""), 1); + test(S("abcde"), 4, 1, S("abcde"), 4); + test(S("abcde"), 4, 1, S("abcdefghij"), 4); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 4); + test(S("abcde"), 4, 2, S(""), 1); + test(S("abcde"), 4, 2, S("abcde"), 4); + test(S("abcde"), 4, 2, S("abcdefghij"), 4); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 4); + test(S("abcde"), 5, 0, S(""), 0); + test(S("abcde"), 5, 0, S("abcde"), -5); + test(S("abcde"), 5, 0, S("abcdefghij"), -10); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcde"), 5, 1, S(""), 0); + test(S("abcde"), 5, 1, S("abcde"), -5); + test(S("abcde"), 5, 1, S("abcdefghij"), -10); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), -20); +} + +void test1() +{ + test(S("abcde"), 6, 0, S(""), 0); + test(S("abcde"), 6, 0, S("abcde"), 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0); + test(S("abcdefghij"), 0, 0, S(""), 0); + test(S("abcdefghij"), 0, 0, S("abcde"), -5); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), -10); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghij"), 0, 1, S(""), 1); + test(S("abcdefghij"), 0, 1, S("abcde"), -4); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), -9); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), -19); + test(S("abcdefghij"), 0, 5, S(""), 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 0); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), -5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), -15); + test(S("abcdefghij"), 0, 9, S(""), 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 4); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), -11); + test(S("abcdefghij"), 0, 10, S(""), 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), -10); + test(S("abcdefghij"), 0, 11, S(""), 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), -10); + test(S("abcdefghij"), 1, 0, S(""), 0); + test(S("abcdefghij"), 1, 0, S("abcde"), -5); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), -10); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghij"), 1, 1, S(""), 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghij"), 1, 4, S(""), 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 1); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghij"), 1, 8, S(""), 8); + test(S("abcdefghij"), 1, 8, S("abcde"), 1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghij"), 1, 9, S(""), 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 1); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghij"), 1, 10, S(""), 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghij"), 5, 0, S(""), 0); + test(S("abcdefghij"), 5, 0, S("abcde"), -5); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), -10); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghij"), 5, 1, S(""), 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 5); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 5); + test(S("abcdefghij"), 5, 2, S(""), 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 5); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 5); + test(S("abcdefghij"), 5, 4, S(""), 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 5); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 5); + test(S("abcdefghij"), 5, 5, S(""), 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 5); + test(S("abcdefghij"), 5, 6, S(""), 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 5); + test(S("abcdefghij"), 9, 0, S(""), 0); + test(S("abcdefghij"), 9, 0, S("abcde"), -5); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), -10); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghij"), 9, 1, S(""), 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 9); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 9); + test(S("abcdefghij"), 9, 2, S(""), 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 9); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 9); + test(S("abcdefghij"), 10, 0, S(""), 0); + test(S("abcdefghij"), 10, 0, S("abcde"), -5); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), -10); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghij"), 10, 1, S(""), 0); + test(S("abcdefghij"), 10, 1, S("abcde"), -5); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), -10); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghij"), 11, 0, S(""), 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0); +} + +void test2() +{ + test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), -10); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), -4); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), -9); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), -19); + test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), -10); + test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 14); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 15); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 15); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), -10); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1); + test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), -10); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10); + test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), -10); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19); + test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), -10); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), -10); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), -20); + test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0); +} + +int main() +{ + test0(); + test1(); + test2(); +} diff --git a/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_string_size_size.pass.cpp b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_string_size_size.pass.cpp new file mode 100644 index 00000000000..8a6be68bbb9 --- /dev/null +++ b/libcxx/test/strings/basic.string/string.ops/string::compare/size_size_string_size_size.pass.cpp @@ -0,0 +1,5800 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int compare(size_type pos1, size_type n1, const basic_string& str, +// size_type pos2, size_type n2) const; + +#include <string> +#include <stdexcept> +#include <cassert> + +int sign(int x) +{ + if (x == 0) + return 0; + if (x < 0) + return -1; + return 1; +} + +template <class S> +void +test(const S& s, typename S::size_type pos1, typename S::size_type n1, + const S& str, typename S::size_type pos2, typename S::size_type n2, int x) +{ + try + { + assert(sign(s.compare(pos1, n1, str, pos2, n2)) == sign(x)); + assert(pos1 <= s.size()); + assert(pos2 <= str.size()); + } + catch (std::out_of_range&) + { + assert(pos1 > s.size() || pos2 > str.size()); + } +} + +typedef std::string S; + +void test0() +{ + test(S(""), 0, 0, S(""), 0, 0, 0); + test(S(""), 0, 0, S(""), 0, 1, 0); + test(S(""), 0, 0, S(""), 1, 0, 0); + test(S(""), 0, 0, S("abcde"), 0, 0, 0); + test(S(""), 0, 0, S("abcde"), 0, 1, -1); + test(S(""), 0, 0, S("abcde"), 0, 2, -2); + test(S(""), 0, 0, S("abcde"), 0, 4, -4); + test(S(""), 0, 0, S("abcde"), 0, 5, -5); + test(S(""), 0, 0, S("abcde"), 0, 6, -5); + test(S(""), 0, 0, S("abcde"), 1, 0, 0); + test(S(""), 0, 0, S("abcde"), 1, 1, -1); + test(S(""), 0, 0, S("abcde"), 1, 2, -2); + test(S(""), 0, 0, S("abcde"), 1, 3, -3); + test(S(""), 0, 0, S("abcde"), 1, 4, -4); + test(S(""), 0, 0, S("abcde"), 1, 5, -4); + test(S(""), 0, 0, S("abcde"), 2, 0, 0); + test(S(""), 0, 0, S("abcde"), 2, 1, -1); + test(S(""), 0, 0, S("abcde"), 2, 2, -2); + test(S(""), 0, 0, S("abcde"), 2, 3, -3); + test(S(""), 0, 0, S("abcde"), 2, 4, -3); + test(S(""), 0, 0, S("abcde"), 4, 0, 0); + test(S(""), 0, 0, S("abcde"), 4, 1, -1); + test(S(""), 0, 0, S("abcde"), 4, 2, -1); + test(S(""), 0, 0, S("abcde"), 5, 0, 0); + test(S(""), 0, 0, S("abcde"), 5, 1, 0); + test(S(""), 0, 0, S("abcde"), 6, 0, 0); + test(S(""), 0, 0, S("abcdefghij"), 0, 0, 0); + test(S(""), 0, 0, S("abcdefghij"), 0, 1, -1); + test(S(""), 0, 0, S("abcdefghij"), 0, 5, -5); + test(S(""), 0, 0, S("abcdefghij"), 0, 9, -9); + test(S(""), 0, 0, S("abcdefghij"), 0, 10, -10); + test(S(""), 0, 0, S("abcdefghij"), 0, 11, -10); + test(S(""), 0, 0, S("abcdefghij"), 1, 0, 0); + test(S(""), 0, 0, S("abcdefghij"), 1, 1, -1); + test(S(""), 0, 0, S("abcdefghij"), 1, 4, -4); + test(S(""), 0, 0, S("abcdefghij"), 1, 8, -8); + test(S(""), 0, 0, S("abcdefghij"), 1, 9, -9); + test(S(""), 0, 0, S("abcdefghij"), 1, 10, -9); + test(S(""), 0, 0, S("abcdefghij"), 5, 0, 0); + test(S(""), 0, 0, S("abcdefghij"), 5, 1, -1); + test(S(""), 0, 0, S("abcdefghij"), 5, 2, -2); + test(S(""), 0, 0, S("abcdefghij"), 5, 4, -4); + test(S(""), 0, 0, S("abcdefghij"), 5, 5, -5); + test(S(""), 0, 0, S("abcdefghij"), 5, 6, -5); + test(S(""), 0, 0, S("abcdefghij"), 9, 0, 0); + test(S(""), 0, 0, S("abcdefghij"), 9, 1, -1); + test(S(""), 0, 0, S("abcdefghij"), 9, 2, -1); + test(S(""), 0, 0, S("abcdefghij"), 10, 0, 0); + test(S(""), 0, 0, S("abcdefghij"), 10, 1, 0); + test(S(""), 0, 0, S("abcdefghij"), 11, 0, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S(""), 0, 1, S(""), 0, 0, 0); + test(S(""), 0, 1, S(""), 0, 1, 0); + test(S(""), 0, 1, S(""), 1, 0, 0); + test(S(""), 0, 1, S("abcde"), 0, 0, 0); + test(S(""), 0, 1, S("abcde"), 0, 1, -1); + test(S(""), 0, 1, S("abcde"), 0, 2, -2); + test(S(""), 0, 1, S("abcde"), 0, 4, -4); + test(S(""), 0, 1, S("abcde"), 0, 5, -5); + test(S(""), 0, 1, S("abcde"), 0, 6, -5); + test(S(""), 0, 1, S("abcde"), 1, 0, 0); + test(S(""), 0, 1, S("abcde"), 1, 1, -1); + test(S(""), 0, 1, S("abcde"), 1, 2, -2); + test(S(""), 0, 1, S("abcde"), 1, 3, -3); + test(S(""), 0, 1, S("abcde"), 1, 4, -4); + test(S(""), 0, 1, S("abcde"), 1, 5, -4); + test(S(""), 0, 1, S("abcde"), 2, 0, 0); + test(S(""), 0, 1, S("abcde"), 2, 1, -1); + test(S(""), 0, 1, S("abcde"), 2, 2, -2); + test(S(""), 0, 1, S("abcde"), 2, 3, -3); + test(S(""), 0, 1, S("abcde"), 2, 4, -3); + test(S(""), 0, 1, S("abcde"), 4, 0, 0); + test(S(""), 0, 1, S("abcde"), 4, 1, -1); + test(S(""), 0, 1, S("abcde"), 4, 2, -1); + test(S(""), 0, 1, S("abcde"), 5, 0, 0); + test(S(""), 0, 1, S("abcde"), 5, 1, 0); + test(S(""), 0, 1, S("abcde"), 6, 0, 0); +} + +void test1() +{ + test(S(""), 0, 1, S("abcdefghij"), 0, 0, 0); + test(S(""), 0, 1, S("abcdefghij"), 0, 1, -1); + test(S(""), 0, 1, S("abcdefghij"), 0, 5, -5); + test(S(""), 0, 1, S("abcdefghij"), 0, 9, -9); + test(S(""), 0, 1, S("abcdefghij"), 0, 10, -10); + test(S(""), 0, 1, S("abcdefghij"), 0, 11, -10); + test(S(""), 0, 1, S("abcdefghij"), 1, 0, 0); + test(S(""), 0, 1, S("abcdefghij"), 1, 1, -1); + test(S(""), 0, 1, S("abcdefghij"), 1, 4, -4); + test(S(""), 0, 1, S("abcdefghij"), 1, 8, -8); + test(S(""), 0, 1, S("abcdefghij"), 1, 9, -9); + test(S(""), 0, 1, S("abcdefghij"), 1, 10, -9); + test(S(""), 0, 1, S("abcdefghij"), 5, 0, 0); + test(S(""), 0, 1, S("abcdefghij"), 5, 1, -1); + test(S(""), 0, 1, S("abcdefghij"), 5, 2, -2); + test(S(""), 0, 1, S("abcdefghij"), 5, 4, -4); + test(S(""), 0, 1, S("abcdefghij"), 5, 5, -5); + test(S(""), 0, 1, S("abcdefghij"), 5, 6, -5); + test(S(""), 0, 1, S("abcdefghij"), 9, 0, 0); + test(S(""), 0, 1, S("abcdefghij"), 9, 1, -1); + test(S(""), 0, 1, S("abcdefghij"), 9, 2, -1); + test(S(""), 0, 1, S("abcdefghij"), 10, 0, 0); + test(S(""), 0, 1, S("abcdefghij"), 10, 1, 0); + test(S(""), 0, 1, S("abcdefghij"), 11, 0, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S(""), 1, 0, S(""), 0, 0, 0); + test(S(""), 1, 0, S(""), 0, 1, 0); + test(S(""), 1, 0, S(""), 1, 0, 0); + test(S(""), 1, 0, S("abcde"), 0, 0, 0); + test(S(""), 1, 0, S("abcde"), 0, 1, 0); + test(S(""), 1, 0, S("abcde"), 0, 2, 0); + test(S(""), 1, 0, S("abcde"), 0, 4, 0); + test(S(""), 1, 0, S("abcde"), 0, 5, 0); + test(S(""), 1, 0, S("abcde"), 0, 6, 0); + test(S(""), 1, 0, S("abcde"), 1, 0, 0); + test(S(""), 1, 0, S("abcde"), 1, 1, 0); + test(S(""), 1, 0, S("abcde"), 1, 2, 0); + test(S(""), 1, 0, S("abcde"), 1, 3, 0); + test(S(""), 1, 0, S("abcde"), 1, 4, 0); + test(S(""), 1, 0, S("abcde"), 1, 5, 0); + test(S(""), 1, 0, S("abcde"), 2, 0, 0); + test(S(""), 1, 0, S("abcde"), 2, 1, 0); + test(S(""), 1, 0, S("abcde"), 2, 2, 0); + test(S(""), 1, 0, S("abcde"), 2, 3, 0); + test(S(""), 1, 0, S("abcde"), 2, 4, 0); + test(S(""), 1, 0, S("abcde"), 4, 0, 0); + test(S(""), 1, 0, S("abcde"), 4, 1, 0); + test(S(""), 1, 0, S("abcde"), 4, 2, 0); + test(S(""), 1, 0, S("abcde"), 5, 0, 0); + test(S(""), 1, 0, S("abcde"), 5, 1, 0); + test(S(""), 1, 0, S("abcde"), 6, 0, 0); + test(S(""), 1, 0, S("abcdefghij"), 0, 0, 0); + test(S(""), 1, 0, S("abcdefghij"), 0, 1, 0); + test(S(""), 1, 0, S("abcdefghij"), 0, 5, 0); + test(S(""), 1, 0, S("abcdefghij"), 0, 9, 0); + test(S(""), 1, 0, S("abcdefghij"), 0, 10, 0); + test(S(""), 1, 0, S("abcdefghij"), 0, 11, 0); + test(S(""), 1, 0, S("abcdefghij"), 1, 0, 0); + test(S(""), 1, 0, S("abcdefghij"), 1, 1, 0); + test(S(""), 1, 0, S("abcdefghij"), 1, 4, 0); + test(S(""), 1, 0, S("abcdefghij"), 1, 8, 0); + test(S(""), 1, 0, S("abcdefghij"), 1, 9, 0); + test(S(""), 1, 0, S("abcdefghij"), 1, 10, 0); + test(S(""), 1, 0, S("abcdefghij"), 5, 0, 0); + test(S(""), 1, 0, S("abcdefghij"), 5, 1, 0); + test(S(""), 1, 0, S("abcdefghij"), 5, 2, 0); + test(S(""), 1, 0, S("abcdefghij"), 5, 4, 0); + test(S(""), 1, 0, S("abcdefghij"), 5, 5, 0); + test(S(""), 1, 0, S("abcdefghij"), 5, 6, 0); + test(S(""), 1, 0, S("abcdefghij"), 9, 0, 0); + test(S(""), 1, 0, S("abcdefghij"), 9, 1, 0); + test(S(""), 1, 0, S("abcdefghij"), 9, 2, 0); + test(S(""), 1, 0, S("abcdefghij"), 10, 0, 0); + test(S(""), 1, 0, S("abcdefghij"), 10, 1, 0); + test(S(""), 1, 0, S("abcdefghij"), 11, 0, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, 0); +} + +void test2() +{ + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 0, 0, S(""), 0, 0, 0); + test(S("abcde"), 0, 0, S(""), 0, 1, 0); + test(S("abcde"), 0, 0, S(""), 1, 0, 0); + test(S("abcde"), 0, 0, S("abcde"), 0, 0, 0); + test(S("abcde"), 0, 0, S("abcde"), 0, 1, -1); + test(S("abcde"), 0, 0, S("abcde"), 0, 2, -2); + test(S("abcde"), 0, 0, S("abcde"), 0, 4, -4); + test(S("abcde"), 0, 0, S("abcde"), 0, 5, -5); + test(S("abcde"), 0, 0, S("abcde"), 0, 6, -5); + test(S("abcde"), 0, 0, S("abcde"), 1, 0, 0); + test(S("abcde"), 0, 0, S("abcde"), 1, 1, -1); + test(S("abcde"), 0, 0, S("abcde"), 1, 2, -2); + test(S("abcde"), 0, 0, S("abcde"), 1, 3, -3); + test(S("abcde"), 0, 0, S("abcde"), 1, 4, -4); + test(S("abcde"), 0, 0, S("abcde"), 1, 5, -4); + test(S("abcde"), 0, 0, S("abcde"), 2, 0, 0); + test(S("abcde"), 0, 0, S("abcde"), 2, 1, -1); + test(S("abcde"), 0, 0, S("abcde"), 2, 2, -2); + test(S("abcde"), 0, 0, S("abcde"), 2, 3, -3); + test(S("abcde"), 0, 0, S("abcde"), 2, 4, -3); + test(S("abcde"), 0, 0, S("abcde"), 4, 0, 0); + test(S("abcde"), 0, 0, S("abcde"), 4, 1, -1); + test(S("abcde"), 0, 0, S("abcde"), 4, 2, -1); + test(S("abcde"), 0, 0, S("abcde"), 5, 0, 0); + test(S("abcde"), 0, 0, S("abcde"), 5, 1, 0); + test(S("abcde"), 0, 0, S("abcde"), 6, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcde"), 0, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcde"), 0, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcde"), 0, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcde"), 0, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcde"), 0, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcde"), 0, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcde"), 0, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcde"), 0, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcde"), 0, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 0, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 0, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 0, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcde"), 0, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 0, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 0, 1, S(""), 0, 0, 1); + test(S("abcde"), 0, 1, S(""), 0, 1, 1); + test(S("abcde"), 0, 1, S(""), 1, 0, 0); + test(S("abcde"), 0, 1, S("abcde"), 0, 0, 1); +} + +void test3() +{ + test(S("abcde"), 0, 1, S("abcde"), 0, 1, 0); + test(S("abcde"), 0, 1, S("abcde"), 0, 2, -1); + test(S("abcde"), 0, 1, S("abcde"), 0, 4, -3); + test(S("abcde"), 0, 1, S("abcde"), 0, 5, -4); + test(S("abcde"), 0, 1, S("abcde"), 0, 6, -4); + test(S("abcde"), 0, 1, S("abcde"), 1, 0, 1); + test(S("abcde"), 0, 1, S("abcde"), 1, 1, -1); + test(S("abcde"), 0, 1, S("abcde"), 1, 2, -1); + test(S("abcde"), 0, 1, S("abcde"), 1, 3, -1); + test(S("abcde"), 0, 1, S("abcde"), 1, 4, -1); + test(S("abcde"), 0, 1, S("abcde"), 1, 5, -1); + test(S("abcde"), 0, 1, S("abcde"), 2, 0, 1); + test(S("abcde"), 0, 1, S("abcde"), 2, 1, -2); + test(S("abcde"), 0, 1, S("abcde"), 2, 2, -2); + test(S("abcde"), 0, 1, S("abcde"), 2, 3, -2); + test(S("abcde"), 0, 1, S("abcde"), 2, 4, -2); + test(S("abcde"), 0, 1, S("abcde"), 4, 0, 1); + test(S("abcde"), 0, 1, S("abcde"), 4, 1, -4); + test(S("abcde"), 0, 1, S("abcde"), 4, 2, -4); + test(S("abcde"), 0, 1, S("abcde"), 5, 0, 1); + test(S("abcde"), 0, 1, S("abcde"), 5, 1, 1); + test(S("abcde"), 0, 1, S("abcde"), 6, 0, 0); + test(S("abcde"), 0, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghij"), 0, 1, 0); + test(S("abcde"), 0, 1, S("abcdefghij"), 0, 5, -4); + test(S("abcde"), 0, 1, S("abcdefghij"), 0, 9, -8); + test(S("abcde"), 0, 1, S("abcdefghij"), 0, 10, -9); + test(S("abcde"), 0, 1, S("abcdefghij"), 0, 11, -9); + test(S("abcde"), 0, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 0, 1, S("abcdefghij"), 1, 4, -1); + test(S("abcde"), 0, 1, S("abcdefghij"), 1, 8, -1); + test(S("abcde"), 0, 1, S("abcdefghij"), 1, 9, -1); + test(S("abcde"), 0, 1, S("abcdefghij"), 1, 10, -1); + test(S("abcde"), 0, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghij"), 5, 1, -5); + test(S("abcde"), 0, 1, S("abcdefghij"), 5, 2, -5); + test(S("abcde"), 0, 1, S("abcdefghij"), 5, 4, -5); + test(S("abcde"), 0, 1, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 0, 1, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 0, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghij"), 9, 1, -9); + test(S("abcde"), 0, 1, S("abcdefghij"), 9, 2, -9); + test(S("abcde"), 0, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcde"), 0, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 0, 2, S(""), 0, 0, 2); + test(S("abcde"), 0, 2, S(""), 0, 1, 2); + test(S("abcde"), 0, 2, S(""), 1, 0, 0); + test(S("abcde"), 0, 2, S("abcde"), 0, 0, 2); + test(S("abcde"), 0, 2, S("abcde"), 0, 1, 1); + test(S("abcde"), 0, 2, S("abcde"), 0, 2, 0); + test(S("abcde"), 0, 2, S("abcde"), 0, 4, -2); + test(S("abcde"), 0, 2, S("abcde"), 0, 5, -3); + test(S("abcde"), 0, 2, S("abcde"), 0, 6, -3); + test(S("abcde"), 0, 2, S("abcde"), 1, 0, 2); + test(S("abcde"), 0, 2, S("abcde"), 1, 1, -1); + test(S("abcde"), 0, 2, S("abcde"), 1, 2, -1); + test(S("abcde"), 0, 2, S("abcde"), 1, 3, -1); + test(S("abcde"), 0, 2, S("abcde"), 1, 4, -1); + test(S("abcde"), 0, 2, S("abcde"), 1, 5, -1); + test(S("abcde"), 0, 2, S("abcde"), 2, 0, 2); + test(S("abcde"), 0, 2, S("abcde"), 2, 1, -2); + test(S("abcde"), 0, 2, S("abcde"), 2, 2, -2); + test(S("abcde"), 0, 2, S("abcde"), 2, 3, -2); + test(S("abcde"), 0, 2, S("abcde"), 2, 4, -2); + test(S("abcde"), 0, 2, S("abcde"), 4, 0, 2); + test(S("abcde"), 0, 2, S("abcde"), 4, 1, -4); + test(S("abcde"), 0, 2, S("abcde"), 4, 2, -4); + test(S("abcde"), 0, 2, S("abcde"), 5, 0, 2); + test(S("abcde"), 0, 2, S("abcde"), 5, 1, 2); + test(S("abcde"), 0, 2, S("abcde"), 6, 0, 0); + test(S("abcde"), 0, 2, S("abcdefghij"), 0, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghij"), 0, 1, 1); + test(S("abcde"), 0, 2, S("abcdefghij"), 0, 5, -3); + test(S("abcde"), 0, 2, S("abcdefghij"), 0, 9, -7); +} + +void test4() +{ + test(S("abcde"), 0, 2, S("abcdefghij"), 0, 10, -8); + test(S("abcde"), 0, 2, S("abcdefghij"), 0, 11, -8); + test(S("abcde"), 0, 2, S("abcdefghij"), 1, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 0, 2, S("abcdefghij"), 1, 4, -1); + test(S("abcde"), 0, 2, S("abcdefghij"), 1, 8, -1); + test(S("abcde"), 0, 2, S("abcdefghij"), 1, 9, -1); + test(S("abcde"), 0, 2, S("abcdefghij"), 1, 10, -1); + test(S("abcde"), 0, 2, S("abcdefghij"), 5, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghij"), 5, 1, -5); + test(S("abcde"), 0, 2, S("abcdefghij"), 5, 2, -5); + test(S("abcde"), 0, 2, S("abcdefghij"), 5, 4, -5); + test(S("abcde"), 0, 2, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 0, 2, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 0, 2, S("abcdefghij"), 9, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghij"), 9, 1, -9); + test(S("abcde"), 0, 2, S("abcdefghij"), 9, 2, -9); + test(S("abcde"), 0, 2, S("abcdefghij"), 10, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghij"), 10, 1, 2); + test(S("abcde"), 0, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 10, -8); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 19, -17); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 20, -18); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 21, -18); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 0, 2); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 1, 2); + test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 0, 4, S(""), 0, 0, 4); + test(S("abcde"), 0, 4, S(""), 0, 1, 4); + test(S("abcde"), 0, 4, S(""), 1, 0, 0); + test(S("abcde"), 0, 4, S("abcde"), 0, 0, 4); + test(S("abcde"), 0, 4, S("abcde"), 0, 1, 3); + test(S("abcde"), 0, 4, S("abcde"), 0, 2, 2); + test(S("abcde"), 0, 4, S("abcde"), 0, 4, 0); + test(S("abcde"), 0, 4, S("abcde"), 0, 5, -1); + test(S("abcde"), 0, 4, S("abcde"), 0, 6, -1); + test(S("abcde"), 0, 4, S("abcde"), 1, 0, 4); + test(S("abcde"), 0, 4, S("abcde"), 1, 1, -1); + test(S("abcde"), 0, 4, S("abcde"), 1, 2, -1); + test(S("abcde"), 0, 4, S("abcde"), 1, 3, -1); + test(S("abcde"), 0, 4, S("abcde"), 1, 4, -1); + test(S("abcde"), 0, 4, S("abcde"), 1, 5, -1); + test(S("abcde"), 0, 4, S("abcde"), 2, 0, 4); + test(S("abcde"), 0, 4, S("abcde"), 2, 1, -2); + test(S("abcde"), 0, 4, S("abcde"), 2, 2, -2); + test(S("abcde"), 0, 4, S("abcde"), 2, 3, -2); + test(S("abcde"), 0, 4, S("abcde"), 2, 4, -2); + test(S("abcde"), 0, 4, S("abcde"), 4, 0, 4); + test(S("abcde"), 0, 4, S("abcde"), 4, 1, -4); + test(S("abcde"), 0, 4, S("abcde"), 4, 2, -4); + test(S("abcde"), 0, 4, S("abcde"), 5, 0, 4); + test(S("abcde"), 0, 4, S("abcde"), 5, 1, 4); + test(S("abcde"), 0, 4, S("abcde"), 6, 0, 0); + test(S("abcde"), 0, 4, S("abcdefghij"), 0, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghij"), 0, 1, 3); + test(S("abcde"), 0, 4, S("abcdefghij"), 0, 5, -1); + test(S("abcde"), 0, 4, S("abcdefghij"), 0, 9, -5); + test(S("abcde"), 0, 4, S("abcdefghij"), 0, 10, -6); + test(S("abcde"), 0, 4, S("abcdefghij"), 0, 11, -6); + test(S("abcde"), 0, 4, S("abcdefghij"), 1, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 0, 4, S("abcdefghij"), 1, 4, -1); + test(S("abcde"), 0, 4, S("abcdefghij"), 1, 8, -1); + test(S("abcde"), 0, 4, S("abcdefghij"), 1, 9, -1); + test(S("abcde"), 0, 4, S("abcdefghij"), 1, 10, -1); + test(S("abcde"), 0, 4, S("abcdefghij"), 5, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghij"), 5, 1, -5); + test(S("abcde"), 0, 4, S("abcdefghij"), 5, 2, -5); + test(S("abcde"), 0, 4, S("abcdefghij"), 5, 4, -5); + test(S("abcde"), 0, 4, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 0, 4, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 0, 4, S("abcdefghij"), 9, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghij"), 9, 1, -9); + test(S("abcde"), 0, 4, S("abcdefghij"), 9, 2, -9); + test(S("abcde"), 0, 4, S("abcdefghij"), 10, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghij"), 10, 1, 4); + test(S("abcde"), 0, 4, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 1, 3); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 10, -6); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 19, -15); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 20, -16); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 21, -16); +} + +void test5() +{ + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 0, 4); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 1, 4); + test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 0, 5, S(""), 0, 0, 5); + test(S("abcde"), 0, 5, S(""), 0, 1, 5); + test(S("abcde"), 0, 5, S(""), 1, 0, 0); + test(S("abcde"), 0, 5, S("abcde"), 0, 0, 5); + test(S("abcde"), 0, 5, S("abcde"), 0, 1, 4); + test(S("abcde"), 0, 5, S("abcde"), 0, 2, 3); + test(S("abcde"), 0, 5, S("abcde"), 0, 4, 1); + test(S("abcde"), 0, 5, S("abcde"), 0, 5, 0); + test(S("abcde"), 0, 5, S("abcde"), 0, 6, 0); + test(S("abcde"), 0, 5, S("abcde"), 1, 0, 5); + test(S("abcde"), 0, 5, S("abcde"), 1, 1, -1); + test(S("abcde"), 0, 5, S("abcde"), 1, 2, -1); + test(S("abcde"), 0, 5, S("abcde"), 1, 3, -1); + test(S("abcde"), 0, 5, S("abcde"), 1, 4, -1); + test(S("abcde"), 0, 5, S("abcde"), 1, 5, -1); + test(S("abcde"), 0, 5, S("abcde"), 2, 0, 5); + test(S("abcde"), 0, 5, S("abcde"), 2, 1, -2); + test(S("abcde"), 0, 5, S("abcde"), 2, 2, -2); + test(S("abcde"), 0, 5, S("abcde"), 2, 3, -2); + test(S("abcde"), 0, 5, S("abcde"), 2, 4, -2); + test(S("abcde"), 0, 5, S("abcde"), 4, 0, 5); + test(S("abcde"), 0, 5, S("abcde"), 4, 1, -4); + test(S("abcde"), 0, 5, S("abcde"), 4, 2, -4); + test(S("abcde"), 0, 5, S("abcde"), 5, 0, 5); + test(S("abcde"), 0, 5, S("abcde"), 5, 1, 5); + test(S("abcde"), 0, 5, S("abcde"), 6, 0, 0); + test(S("abcde"), 0, 5, S("abcdefghij"), 0, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghij"), 0, 1, 4); + test(S("abcde"), 0, 5, S("abcdefghij"), 0, 5, 0); + test(S("abcde"), 0, 5, S("abcdefghij"), 0, 9, -4); + test(S("abcde"), 0, 5, S("abcdefghij"), 0, 10, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 0, 11, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 1, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 0, 5, S("abcdefghij"), 1, 4, -1); + test(S("abcde"), 0, 5, S("abcdefghij"), 1, 8, -1); + test(S("abcde"), 0, 5, S("abcdefghij"), 1, 9, -1); + test(S("abcde"), 0, 5, S("abcdefghij"), 1, 10, -1); + test(S("abcde"), 0, 5, S("abcdefghij"), 5, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghij"), 5, 1, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 5, 2, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 5, 4, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 0, 5, S("abcdefghij"), 9, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghij"), 9, 1, -9); + test(S("abcde"), 0, 5, S("abcdefghij"), 9, 2, -9); + test(S("abcde"), 0, 5, S("abcdefghij"), 10, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghij"), 10, 1, 5); + test(S("abcde"), 0, 5, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5); + test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 0, 6, S(""), 0, 0, 5); + test(S("abcde"), 0, 6, S(""), 0, 1, 5); + test(S("abcde"), 0, 6, S(""), 1, 0, 0); + test(S("abcde"), 0, 6, S("abcde"), 0, 0, 5); + test(S("abcde"), 0, 6, S("abcde"), 0, 1, 4); + test(S("abcde"), 0, 6, S("abcde"), 0, 2, 3); + test(S("abcde"), 0, 6, S("abcde"), 0, 4, 1); + test(S("abcde"), 0, 6, S("abcde"), 0, 5, 0); +} + +void test6() +{ + test(S("abcde"), 0, 6, S("abcde"), 0, 6, 0); + test(S("abcde"), 0, 6, S("abcde"), 1, 0, 5); + test(S("abcde"), 0, 6, S("abcde"), 1, 1, -1); + test(S("abcde"), 0, 6, S("abcde"), 1, 2, -1); + test(S("abcde"), 0, 6, S("abcde"), 1, 3, -1); + test(S("abcde"), 0, 6, S("abcde"), 1, 4, -1); + test(S("abcde"), 0, 6, S("abcde"), 1, 5, -1); + test(S("abcde"), 0, 6, S("abcde"), 2, 0, 5); + test(S("abcde"), 0, 6, S("abcde"), 2, 1, -2); + test(S("abcde"), 0, 6, S("abcde"), 2, 2, -2); + test(S("abcde"), 0, 6, S("abcde"), 2, 3, -2); + test(S("abcde"), 0, 6, S("abcde"), 2, 4, -2); + test(S("abcde"), 0, 6, S("abcde"), 4, 0, 5); + test(S("abcde"), 0, 6, S("abcde"), 4, 1, -4); + test(S("abcde"), 0, 6, S("abcde"), 4, 2, -4); + test(S("abcde"), 0, 6, S("abcde"), 5, 0, 5); + test(S("abcde"), 0, 6, S("abcde"), 5, 1, 5); + test(S("abcde"), 0, 6, S("abcde"), 6, 0, 0); + test(S("abcde"), 0, 6, S("abcdefghij"), 0, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghij"), 0, 1, 4); + test(S("abcde"), 0, 6, S("abcdefghij"), 0, 5, 0); + test(S("abcde"), 0, 6, S("abcdefghij"), 0, 9, -4); + test(S("abcde"), 0, 6, S("abcdefghij"), 0, 10, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 0, 11, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 1, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 0, 6, S("abcdefghij"), 1, 4, -1); + test(S("abcde"), 0, 6, S("abcdefghij"), 1, 8, -1); + test(S("abcde"), 0, 6, S("abcdefghij"), 1, 9, -1); + test(S("abcde"), 0, 6, S("abcdefghij"), 1, 10, -1); + test(S("abcde"), 0, 6, S("abcdefghij"), 5, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghij"), 5, 1, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 5, 2, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 5, 4, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 0, 6, S("abcdefghij"), 9, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghij"), 9, 1, -9); + test(S("abcde"), 0, 6, S("abcdefghij"), 9, 2, -9); + test(S("abcde"), 0, 6, S("abcdefghij"), 10, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghij"), 10, 1, 5); + test(S("abcde"), 0, 6, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 1, 4); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 10, -5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 19, -14); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 20, -15); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 21, -15); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 0, 5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 1, 5); + test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 1, 0, S(""), 0, 0, 0); + test(S("abcde"), 1, 0, S(""), 0, 1, 0); + test(S("abcde"), 1, 0, S(""), 1, 0, 0); + test(S("abcde"), 1, 0, S("abcde"), 0, 0, 0); + test(S("abcde"), 1, 0, S("abcde"), 0, 1, -1); + test(S("abcde"), 1, 0, S("abcde"), 0, 2, -2); + test(S("abcde"), 1, 0, S("abcde"), 0, 4, -4); + test(S("abcde"), 1, 0, S("abcde"), 0, 5, -5); + test(S("abcde"), 1, 0, S("abcde"), 0, 6, -5); + test(S("abcde"), 1, 0, S("abcde"), 1, 0, 0); + test(S("abcde"), 1, 0, S("abcde"), 1, 1, -1); + test(S("abcde"), 1, 0, S("abcde"), 1, 2, -2); + test(S("abcde"), 1, 0, S("abcde"), 1, 3, -3); + test(S("abcde"), 1, 0, S("abcde"), 1, 4, -4); + test(S("abcde"), 1, 0, S("abcde"), 1, 5, -4); + test(S("abcde"), 1, 0, S("abcde"), 2, 0, 0); + test(S("abcde"), 1, 0, S("abcde"), 2, 1, -1); + test(S("abcde"), 1, 0, S("abcde"), 2, 2, -2); + test(S("abcde"), 1, 0, S("abcde"), 2, 3, -3); + test(S("abcde"), 1, 0, S("abcde"), 2, 4, -3); + test(S("abcde"), 1, 0, S("abcde"), 4, 0, 0); + test(S("abcde"), 1, 0, S("abcde"), 4, 1, -1); + test(S("abcde"), 1, 0, S("abcde"), 4, 2, -1); + test(S("abcde"), 1, 0, S("abcde"), 5, 0, 0); + test(S("abcde"), 1, 0, S("abcde"), 5, 1, 0); + test(S("abcde"), 1, 0, S("abcde"), 6, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcde"), 1, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcde"), 1, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcde"), 1, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcde"), 1, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 1, 1, -1); +} + +void test7() +{ + test(S("abcde"), 1, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcde"), 1, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcde"), 1, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcde"), 1, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcde"), 1, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcde"), 1, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 1, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 1, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 1, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcde"), 1, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 1, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 1, 1, S(""), 0, 0, 1); + test(S("abcde"), 1, 1, S(""), 0, 1, 1); + test(S("abcde"), 1, 1, S(""), 1, 0, 0); + test(S("abcde"), 1, 1, S("abcde"), 0, 0, 1); + test(S("abcde"), 1, 1, S("abcde"), 0, 1, 1); + test(S("abcde"), 1, 1, S("abcde"), 0, 2, 1); + test(S("abcde"), 1, 1, S("abcde"), 0, 4, 1); + test(S("abcde"), 1, 1, S("abcde"), 0, 5, 1); + test(S("abcde"), 1, 1, S("abcde"), 0, 6, 1); + test(S("abcde"), 1, 1, S("abcde"), 1, 0, 1); + test(S("abcde"), 1, 1, S("abcde"), 1, 1, 0); + test(S("abcde"), 1, 1, S("abcde"), 1, 2, -1); + test(S("abcde"), 1, 1, S("abcde"), 1, 3, -2); + test(S("abcde"), 1, 1, S("abcde"), 1, 4, -3); + test(S("abcde"), 1, 1, S("abcde"), 1, 5, -3); + test(S("abcde"), 1, 1, S("abcde"), 2, 0, 1); + test(S("abcde"), 1, 1, S("abcde"), 2, 1, -1); + test(S("abcde"), 1, 1, S("abcde"), 2, 2, -1); + test(S("abcde"), 1, 1, S("abcde"), 2, 3, -1); + test(S("abcde"), 1, 1, S("abcde"), 2, 4, -1); + test(S("abcde"), 1, 1, S("abcde"), 4, 0, 1); + test(S("abcde"), 1, 1, S("abcde"), 4, 1, -3); + test(S("abcde"), 1, 1, S("abcde"), 4, 2, -3); + test(S("abcde"), 1, 1, S("abcde"), 5, 0, 1); + test(S("abcde"), 1, 1, S("abcde"), 5, 1, 1); + test(S("abcde"), 1, 1, S("abcde"), 6, 0, 0); + test(S("abcde"), 1, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 0, 1, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 0, 5, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 0, 9, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 0, 10, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 0, 11, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 1, 1, 0); + test(S("abcde"), 1, 1, S("abcdefghij"), 1, 4, -3); + test(S("abcde"), 1, 1, S("abcdefghij"), 1, 8, -7); + test(S("abcde"), 1, 1, S("abcdefghij"), 1, 9, -8); + test(S("abcde"), 1, 1, S("abcdefghij"), 1, 10, -8); + test(S("abcde"), 1, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 5, 1, -4); + test(S("abcde"), 1, 1, S("abcdefghij"), 5, 2, -4); + test(S("abcde"), 1, 1, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 1, 1, S("abcdefghij"), 5, 5, -4); + test(S("abcde"), 1, 1, S("abcdefghij"), 5, 6, -4); + test(S("abcde"), 1, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 9, 1, -8); + test(S("abcde"), 1, 1, S("abcdefghij"), 9, 2, -8); + test(S("abcde"), 1, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcde"), 1, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17); +} + +void test8() +{ + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 1, 2, S(""), 0, 0, 2); + test(S("abcde"), 1, 2, S(""), 0, 1, 2); + test(S("abcde"), 1, 2, S(""), 1, 0, 0); + test(S("abcde"), 1, 2, S("abcde"), 0, 0, 2); + test(S("abcde"), 1, 2, S("abcde"), 0, 1, 1); + test(S("abcde"), 1, 2, S("abcde"), 0, 2, 1); + test(S("abcde"), 1, 2, S("abcde"), 0, 4, 1); + test(S("abcde"), 1, 2, S("abcde"), 0, 5, 1); + test(S("abcde"), 1, 2, S("abcde"), 0, 6, 1); + test(S("abcde"), 1, 2, S("abcde"), 1, 0, 2); + test(S("abcde"), 1, 2, S("abcde"), 1, 1, 1); + test(S("abcde"), 1, 2, S("abcde"), 1, 2, 0); + test(S("abcde"), 1, 2, S("abcde"), 1, 3, -1); + test(S("abcde"), 1, 2, S("abcde"), 1, 4, -2); + test(S("abcde"), 1, 2, S("abcde"), 1, 5, -2); + test(S("abcde"), 1, 2, S("abcde"), 2, 0, 2); + test(S("abcde"), 1, 2, S("abcde"), 2, 1, -1); + test(S("abcde"), 1, 2, S("abcde"), 2, 2, -1); + test(S("abcde"), 1, 2, S("abcde"), 2, 3, -1); + test(S("abcde"), 1, 2, S("abcde"), 2, 4, -1); + test(S("abcde"), 1, 2, S("abcde"), 4, 0, 2); + test(S("abcde"), 1, 2, S("abcde"), 4, 1, -3); + test(S("abcde"), 1, 2, S("abcde"), 4, 2, -3); + test(S("abcde"), 1, 2, S("abcde"), 5, 0, 2); + test(S("abcde"), 1, 2, S("abcde"), 5, 1, 2); + test(S("abcde"), 1, 2, S("abcde"), 6, 0, 0); + test(S("abcde"), 1, 2, S("abcdefghij"), 0, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghij"), 0, 1, 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 0, 5, 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 0, 9, 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 0, 10, 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 0, 11, 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 1, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghij"), 1, 1, 1); + test(S("abcde"), 1, 2, S("abcdefghij"), 1, 4, -2); + test(S("abcde"), 1, 2, S("abcdefghij"), 1, 8, -6); + test(S("abcde"), 1, 2, S("abcdefghij"), 1, 9, -7); + test(S("abcde"), 1, 2, S("abcdefghij"), 1, 10, -7); + test(S("abcde"), 1, 2, S("abcdefghij"), 5, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghij"), 5, 1, -4); + test(S("abcde"), 1, 2, S("abcdefghij"), 5, 2, -4); + test(S("abcde"), 1, 2, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 1, 2, S("abcdefghij"), 5, 5, -4); + test(S("abcde"), 1, 2, S("abcdefghij"), 5, 6, -4); + test(S("abcde"), 1, 2, S("abcdefghij"), 9, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghij"), 9, 1, -8); + test(S("abcde"), 1, 2, S("abcdefghij"), 9, 2, -8); + test(S("abcde"), 1, 2, S("abcdefghij"), 10, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghij"), 10, 1, 2); + test(S("abcde"), 1, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 1, 1); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 9, -7); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 18, -16); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 19, -17); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 20, -17); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 0, 2); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 1, 2); + test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 1, 3, S(""), 0, 0, 3); + test(S("abcde"), 1, 3, S(""), 0, 1, 3); + test(S("abcde"), 1, 3, S(""), 1, 0, 0); + test(S("abcde"), 1, 3, S("abcde"), 0, 0, 3); + test(S("abcde"), 1, 3, S("abcde"), 0, 1, 1); + test(S("abcde"), 1, 3, S("abcde"), 0, 2, 1); + test(S("abcde"), 1, 3, S("abcde"), 0, 4, 1); + test(S("abcde"), 1, 3, S("abcde"), 0, 5, 1); + test(S("abcde"), 1, 3, S("abcde"), 0, 6, 1); + test(S("abcde"), 1, 3, S("abcde"), 1, 0, 3); + test(S("abcde"), 1, 3, S("abcde"), 1, 1, 2); + test(S("abcde"), 1, 3, S("abcde"), 1, 2, 1); +} + +void test9() +{ + test(S("abcde"), 1, 3, S("abcde"), 1, 3, 0); + test(S("abcde"), 1, 3, S("abcde"), 1, 4, -1); + test(S("abcde"), 1, 3, S("abcde"), 1, 5, -1); + test(S("abcde"), 1, 3, S("abcde"), 2, 0, 3); + test(S("abcde"), 1, 3, S("abcde"), 2, 1, -1); + test(S("abcde"), 1, 3, S("abcde"), 2, 2, -1); + test(S("abcde"), 1, 3, S("abcde"), 2, 3, -1); + test(S("abcde"), 1, 3, S("abcde"), 2, 4, -1); + test(S("abcde"), 1, 3, S("abcde"), 4, 0, 3); + test(S("abcde"), 1, 3, S("abcde"), 4, 1, -3); + test(S("abcde"), 1, 3, S("abcde"), 4, 2, -3); + test(S("abcde"), 1, 3, S("abcde"), 5, 0, 3); + test(S("abcde"), 1, 3, S("abcde"), 5, 1, 3); + test(S("abcde"), 1, 3, S("abcde"), 6, 0, 0); + test(S("abcde"), 1, 3, S("abcdefghij"), 0, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghij"), 0, 1, 1); + test(S("abcde"), 1, 3, S("abcdefghij"), 0, 5, 1); + test(S("abcde"), 1, 3, S("abcdefghij"), 0, 9, 1); + test(S("abcde"), 1, 3, S("abcdefghij"), 0, 10, 1); + test(S("abcde"), 1, 3, S("abcdefghij"), 0, 11, 1); + test(S("abcde"), 1, 3, S("abcdefghij"), 1, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghij"), 1, 1, 2); + test(S("abcde"), 1, 3, S("abcdefghij"), 1, 4, -1); + test(S("abcde"), 1, 3, S("abcdefghij"), 1, 8, -5); + test(S("abcde"), 1, 3, S("abcdefghij"), 1, 9, -6); + test(S("abcde"), 1, 3, S("abcdefghij"), 1, 10, -6); + test(S("abcde"), 1, 3, S("abcdefghij"), 5, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghij"), 5, 1, -4); + test(S("abcde"), 1, 3, S("abcdefghij"), 5, 2, -4); + test(S("abcde"), 1, 3, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 1, 3, S("abcdefghij"), 5, 5, -4); + test(S("abcde"), 1, 3, S("abcdefghij"), 5, 6, -4); + test(S("abcde"), 1, 3, S("abcdefghij"), 9, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghij"), 9, 1, -8); + test(S("abcde"), 1, 3, S("abcdefghij"), 9, 2, -8); + test(S("abcde"), 1, 3, S("abcdefghij"), 10, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghij"), 10, 1, 3); + test(S("abcde"), 1, 3, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 1, 2); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 9, -6); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 18, -15); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 19, -16); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 20, -16); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 0, 3); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 1, 3); + test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 1, 4, S(""), 0, 0, 4); + test(S("abcde"), 1, 4, S(""), 0, 1, 4); + test(S("abcde"), 1, 4, S(""), 1, 0, 0); + test(S("abcde"), 1, 4, S("abcde"), 0, 0, 4); + test(S("abcde"), 1, 4, S("abcde"), 0, 1, 1); + test(S("abcde"), 1, 4, S("abcde"), 0, 2, 1); + test(S("abcde"), 1, 4, S("abcde"), 0, 4, 1); + test(S("abcde"), 1, 4, S("abcde"), 0, 5, 1); + test(S("abcde"), 1, 4, S("abcde"), 0, 6, 1); + test(S("abcde"), 1, 4, S("abcde"), 1, 0, 4); + test(S("abcde"), 1, 4, S("abcde"), 1, 1, 3); + test(S("abcde"), 1, 4, S("abcde"), 1, 2, 2); + test(S("abcde"), 1, 4, S("abcde"), 1, 3, 1); + test(S("abcde"), 1, 4, S("abcde"), 1, 4, 0); + test(S("abcde"), 1, 4, S("abcde"), 1, 5, 0); + test(S("abcde"), 1, 4, S("abcde"), 2, 0, 4); + test(S("abcde"), 1, 4, S("abcde"), 2, 1, -1); + test(S("abcde"), 1, 4, S("abcde"), 2, 2, -1); + test(S("abcde"), 1, 4, S("abcde"), 2, 3, -1); + test(S("abcde"), 1, 4, S("abcde"), 2, 4, -1); + test(S("abcde"), 1, 4, S("abcde"), 4, 0, 4); + test(S("abcde"), 1, 4, S("abcde"), 4, 1, -3); + test(S("abcde"), 1, 4, S("abcde"), 4, 2, -3); + test(S("abcde"), 1, 4, S("abcde"), 5, 0, 4); + test(S("abcde"), 1, 4, S("abcde"), 5, 1, 4); + test(S("abcde"), 1, 4, S("abcde"), 6, 0, 0); + test(S("abcde"), 1, 4, S("abcdefghij"), 0, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghij"), 0, 1, 1); + test(S("abcde"), 1, 4, S("abcdefghij"), 0, 5, 1); + test(S("abcde"), 1, 4, S("abcdefghij"), 0, 9, 1); + test(S("abcde"), 1, 4, S("abcdefghij"), 0, 10, 1); + test(S("abcde"), 1, 4, S("abcdefghij"), 0, 11, 1); + test(S("abcde"), 1, 4, S("abcdefghij"), 1, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghij"), 1, 1, 3); + test(S("abcde"), 1, 4, S("abcdefghij"), 1, 4, 0); + test(S("abcde"), 1, 4, S("abcdefghij"), 1, 8, -4); + test(S("abcde"), 1, 4, S("abcdefghij"), 1, 9, -5); + test(S("abcde"), 1, 4, S("abcdefghij"), 1, 10, -5); +} + +void test10() +{ + test(S("abcde"), 1, 4, S("abcdefghij"), 5, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghij"), 5, 1, -4); + test(S("abcde"), 1, 4, S("abcdefghij"), 5, 2, -4); + test(S("abcde"), 1, 4, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 1, 4, S("abcdefghij"), 5, 5, -4); + test(S("abcde"), 1, 4, S("abcdefghij"), 5, 6, -4); + test(S("abcde"), 1, 4, S("abcdefghij"), 9, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghij"), 9, 1, -8); + test(S("abcde"), 1, 4, S("abcdefghij"), 9, 2, -8); + test(S("abcde"), 1, 4, S("abcdefghij"), 10, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghij"), 10, 1, 4); + test(S("abcde"), 1, 4, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4); + test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 1, 5, S(""), 0, 0, 4); + test(S("abcde"), 1, 5, S(""), 0, 1, 4); + test(S("abcde"), 1, 5, S(""), 1, 0, 0); + test(S("abcde"), 1, 5, S("abcde"), 0, 0, 4); + test(S("abcde"), 1, 5, S("abcde"), 0, 1, 1); + test(S("abcde"), 1, 5, S("abcde"), 0, 2, 1); + test(S("abcde"), 1, 5, S("abcde"), 0, 4, 1); + test(S("abcde"), 1, 5, S("abcde"), 0, 5, 1); + test(S("abcde"), 1, 5, S("abcde"), 0, 6, 1); + test(S("abcde"), 1, 5, S("abcde"), 1, 0, 4); + test(S("abcde"), 1, 5, S("abcde"), 1, 1, 3); + test(S("abcde"), 1, 5, S("abcde"), 1, 2, 2); + test(S("abcde"), 1, 5, S("abcde"), 1, 3, 1); + test(S("abcde"), 1, 5, S("abcde"), 1, 4, 0); + test(S("abcde"), 1, 5, S("abcde"), 1, 5, 0); + test(S("abcde"), 1, 5, S("abcde"), 2, 0, 4); + test(S("abcde"), 1, 5, S("abcde"), 2, 1, -1); + test(S("abcde"), 1, 5, S("abcde"), 2, 2, -1); + test(S("abcde"), 1, 5, S("abcde"), 2, 3, -1); + test(S("abcde"), 1, 5, S("abcde"), 2, 4, -1); + test(S("abcde"), 1, 5, S("abcde"), 4, 0, 4); + test(S("abcde"), 1, 5, S("abcde"), 4, 1, -3); + test(S("abcde"), 1, 5, S("abcde"), 4, 2, -3); + test(S("abcde"), 1, 5, S("abcde"), 5, 0, 4); + test(S("abcde"), 1, 5, S("abcde"), 5, 1, 4); + test(S("abcde"), 1, 5, S("abcde"), 6, 0, 0); + test(S("abcde"), 1, 5, S("abcdefghij"), 0, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghij"), 0, 1, 1); + test(S("abcde"), 1, 5, S("abcdefghij"), 0, 5, 1); + test(S("abcde"), 1, 5, S("abcdefghij"), 0, 9, 1); + test(S("abcde"), 1, 5, S("abcdefghij"), 0, 10, 1); + test(S("abcde"), 1, 5, S("abcdefghij"), 0, 11, 1); + test(S("abcde"), 1, 5, S("abcdefghij"), 1, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghij"), 1, 1, 3); + test(S("abcde"), 1, 5, S("abcdefghij"), 1, 4, 0); + test(S("abcde"), 1, 5, S("abcdefghij"), 1, 8, -4); + test(S("abcde"), 1, 5, S("abcdefghij"), 1, 9, -5); + test(S("abcde"), 1, 5, S("abcdefghij"), 1, 10, -5); + test(S("abcde"), 1, 5, S("abcdefghij"), 5, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghij"), 5, 1, -4); + test(S("abcde"), 1, 5, S("abcdefghij"), 5, 2, -4); + test(S("abcde"), 1, 5, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 1, 5, S("abcdefghij"), 5, 5, -4); + test(S("abcde"), 1, 5, S("abcdefghij"), 5, 6, -4); + test(S("abcde"), 1, 5, S("abcdefghij"), 9, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghij"), 9, 1, -8); + test(S("abcde"), 1, 5, S("abcdefghij"), 9, 2, -8); + test(S("abcde"), 1, 5, S("abcdefghij"), 10, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghij"), 10, 1, 4); + test(S("abcde"), 1, 5, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 1, 3); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 9, -5); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 18, -14); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 19, -15); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 20, -15); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 1, -9); +} + +void test11() +{ + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 0, 4); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 1, 4); + test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 2, 0, S(""), 0, 0, 0); + test(S("abcde"), 2, 0, S(""), 0, 1, 0); + test(S("abcde"), 2, 0, S(""), 1, 0, 0); + test(S("abcde"), 2, 0, S("abcde"), 0, 0, 0); + test(S("abcde"), 2, 0, S("abcde"), 0, 1, -1); + test(S("abcde"), 2, 0, S("abcde"), 0, 2, -2); + test(S("abcde"), 2, 0, S("abcde"), 0, 4, -4); + test(S("abcde"), 2, 0, S("abcde"), 0, 5, -5); + test(S("abcde"), 2, 0, S("abcde"), 0, 6, -5); + test(S("abcde"), 2, 0, S("abcde"), 1, 0, 0); + test(S("abcde"), 2, 0, S("abcde"), 1, 1, -1); + test(S("abcde"), 2, 0, S("abcde"), 1, 2, -2); + test(S("abcde"), 2, 0, S("abcde"), 1, 3, -3); + test(S("abcde"), 2, 0, S("abcde"), 1, 4, -4); + test(S("abcde"), 2, 0, S("abcde"), 1, 5, -4); + test(S("abcde"), 2, 0, S("abcde"), 2, 0, 0); + test(S("abcde"), 2, 0, S("abcde"), 2, 1, -1); + test(S("abcde"), 2, 0, S("abcde"), 2, 2, -2); + test(S("abcde"), 2, 0, S("abcde"), 2, 3, -3); + test(S("abcde"), 2, 0, S("abcde"), 2, 4, -3); + test(S("abcde"), 2, 0, S("abcde"), 4, 0, 0); + test(S("abcde"), 2, 0, S("abcde"), 4, 1, -1); + test(S("abcde"), 2, 0, S("abcde"), 4, 2, -1); + test(S("abcde"), 2, 0, S("abcde"), 5, 0, 0); + test(S("abcde"), 2, 0, S("abcde"), 5, 1, 0); + test(S("abcde"), 2, 0, S("abcde"), 6, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcde"), 2, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcde"), 2, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcde"), 2, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcde"), 2, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcde"), 2, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcde"), 2, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcde"), 2, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcde"), 2, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcde"), 2, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 2, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 2, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 2, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcde"), 2, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 2, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 2, 1, S(""), 0, 0, 1); + test(S("abcde"), 2, 1, S(""), 0, 1, 1); + test(S("abcde"), 2, 1, S(""), 1, 0, 0); + test(S("abcde"), 2, 1, S("abcde"), 0, 0, 1); + test(S("abcde"), 2, 1, S("abcde"), 0, 1, 2); + test(S("abcde"), 2, 1, S("abcde"), 0, 2, 2); + test(S("abcde"), 2, 1, S("abcde"), 0, 4, 2); + test(S("abcde"), 2, 1, S("abcde"), 0, 5, 2); + test(S("abcde"), 2, 1, S("abcde"), 0, 6, 2); + test(S("abcde"), 2, 1, S("abcde"), 1, 0, 1); + test(S("abcde"), 2, 1, S("abcde"), 1, 1, 1); + test(S("abcde"), 2, 1, S("abcde"), 1, 2, 1); + test(S("abcde"), 2, 1, S("abcde"), 1, 3, 1); + test(S("abcde"), 2, 1, S("abcde"), 1, 4, 1); + test(S("abcde"), 2, 1, S("abcde"), 1, 5, 1); + test(S("abcde"), 2, 1, S("abcde"), 2, 0, 1); +} + +void test12() +{ + test(S("abcde"), 2, 1, S("abcde"), 2, 1, 0); + test(S("abcde"), 2, 1, S("abcde"), 2, 2, -1); + test(S("abcde"), 2, 1, S("abcde"), 2, 3, -2); + test(S("abcde"), 2, 1, S("abcde"), 2, 4, -2); + test(S("abcde"), 2, 1, S("abcde"), 4, 0, 1); + test(S("abcde"), 2, 1, S("abcde"), 4, 1, -2); + test(S("abcde"), 2, 1, S("abcde"), 4, 2, -2); + test(S("abcde"), 2, 1, S("abcde"), 5, 0, 1); + test(S("abcde"), 2, 1, S("abcde"), 5, 1, 1); + test(S("abcde"), 2, 1, S("abcde"), 6, 0, 0); + test(S("abcde"), 2, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 0, 1, 2); + test(S("abcde"), 2, 1, S("abcdefghij"), 0, 5, 2); + test(S("abcde"), 2, 1, S("abcdefghij"), 0, 9, 2); + test(S("abcde"), 2, 1, S("abcdefghij"), 0, 10, 2); + test(S("abcde"), 2, 1, S("abcdefghij"), 0, 11, 2); + test(S("abcde"), 2, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 1, 1, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 1, 4, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 1, 8, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 1, 9, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 1, 10, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 5, 1, -3); + test(S("abcde"), 2, 1, S("abcdefghij"), 5, 2, -3); + test(S("abcde"), 2, 1, S("abcdefghij"), 5, 4, -3); + test(S("abcde"), 2, 1, S("abcdefghij"), 5, 5, -3); + test(S("abcde"), 2, 1, S("abcdefghij"), 5, 6, -3); + test(S("abcde"), 2, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 9, 1, -7); + test(S("abcde"), 2, 1, S("abcdefghij"), 9, 2, -7); + test(S("abcde"), 2, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcde"), 2, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 1, 2); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 10, 2); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 19, 2); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 20, 2); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 21, 2); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 1, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 9, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 18, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 19, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 20, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 1, -8); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 5, -8); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 9, -8); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 10, -8); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 11, -8); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 1, -17); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 2, -17); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 2, 2, S(""), 0, 0, 2); + test(S("abcde"), 2, 2, S(""), 0, 1, 2); + test(S("abcde"), 2, 2, S(""), 1, 0, 0); + test(S("abcde"), 2, 2, S("abcde"), 0, 0, 2); + test(S("abcde"), 2, 2, S("abcde"), 0, 1, 2); + test(S("abcde"), 2, 2, S("abcde"), 0, 2, 2); + test(S("abcde"), 2, 2, S("abcde"), 0, 4, 2); + test(S("abcde"), 2, 2, S("abcde"), 0, 5, 2); + test(S("abcde"), 2, 2, S("abcde"), 0, 6, 2); + test(S("abcde"), 2, 2, S("abcde"), 1, 0, 2); + test(S("abcde"), 2, 2, S("abcde"), 1, 1, 1); + test(S("abcde"), 2, 2, S("abcde"), 1, 2, 1); + test(S("abcde"), 2, 2, S("abcde"), 1, 3, 1); + test(S("abcde"), 2, 2, S("abcde"), 1, 4, 1); + test(S("abcde"), 2, 2, S("abcde"), 1, 5, 1); + test(S("abcde"), 2, 2, S("abcde"), 2, 0, 2); + test(S("abcde"), 2, 2, S("abcde"), 2, 1, 1); + test(S("abcde"), 2, 2, S("abcde"), 2, 2, 0); + test(S("abcde"), 2, 2, S("abcde"), 2, 3, -1); + test(S("abcde"), 2, 2, S("abcde"), 2, 4, -1); + test(S("abcde"), 2, 2, S("abcde"), 4, 0, 2); + test(S("abcde"), 2, 2, S("abcde"), 4, 1, -2); + test(S("abcde"), 2, 2, S("abcde"), 4, 2, -2); + test(S("abcde"), 2, 2, S("abcde"), 5, 0, 2); + test(S("abcde"), 2, 2, S("abcde"), 5, 1, 2); + test(S("abcde"), 2, 2, S("abcde"), 6, 0, 0); + test(S("abcde"), 2, 2, S("abcdefghij"), 0, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 0, 1, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 0, 5, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 0, 9, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 0, 10, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 0, 11, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 1, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 1, 1, 1); + test(S("abcde"), 2, 2, S("abcdefghij"), 1, 4, 1); + test(S("abcde"), 2, 2, S("abcdefghij"), 1, 8, 1); + test(S("abcde"), 2, 2, S("abcdefghij"), 1, 9, 1); + test(S("abcde"), 2, 2, S("abcdefghij"), 1, 10, 1); + test(S("abcde"), 2, 2, S("abcdefghij"), 5, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 5, 1, -3); + test(S("abcde"), 2, 2, S("abcdefghij"), 5, 2, -3); + test(S("abcde"), 2, 2, S("abcdefghij"), 5, 4, -3); +} + +void test13() +{ + test(S("abcde"), 2, 2, S("abcdefghij"), 5, 5, -3); + test(S("abcde"), 2, 2, S("abcdefghij"), 5, 6, -3); + test(S("abcde"), 2, 2, S("abcdefghij"), 9, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 9, 1, -7); + test(S("abcde"), 2, 2, S("abcdefghij"), 9, 2, -7); + test(S("abcde"), 2, 2, S("abcdefghij"), 10, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 10, 1, 2); + test(S("abcde"), 2, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 1, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 10, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 19, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 20, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 21, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 1, 1); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 9, 1); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 18, 1); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 19, 1); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 20, 1); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 1, -8); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 5, -8); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 9, -8); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 10, -8); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 11, -8); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 1, -17); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 2, -17); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 0, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 1, 2); + test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 2, 3, S(""), 0, 0, 3); + test(S("abcde"), 2, 3, S(""), 0, 1, 3); + test(S("abcde"), 2, 3, S(""), 1, 0, 0); + test(S("abcde"), 2, 3, S("abcde"), 0, 0, 3); + test(S("abcde"), 2, 3, S("abcde"), 0, 1, 2); + test(S("abcde"), 2, 3, S("abcde"), 0, 2, 2); + test(S("abcde"), 2, 3, S("abcde"), 0, 4, 2); + test(S("abcde"), 2, 3, S("abcde"), 0, 5, 2); + test(S("abcde"), 2, 3, S("abcde"), 0, 6, 2); + test(S("abcde"), 2, 3, S("abcde"), 1, 0, 3); + test(S("abcde"), 2, 3, S("abcde"), 1, 1, 1); + test(S("abcde"), 2, 3, S("abcde"), 1, 2, 1); + test(S("abcde"), 2, 3, S("abcde"), 1, 3, 1); + test(S("abcde"), 2, 3, S("abcde"), 1, 4, 1); + test(S("abcde"), 2, 3, S("abcde"), 1, 5, 1); + test(S("abcde"), 2, 3, S("abcde"), 2, 0, 3); + test(S("abcde"), 2, 3, S("abcde"), 2, 1, 2); + test(S("abcde"), 2, 3, S("abcde"), 2, 2, 1); + test(S("abcde"), 2, 3, S("abcde"), 2, 3, 0); + test(S("abcde"), 2, 3, S("abcde"), 2, 4, 0); + test(S("abcde"), 2, 3, S("abcde"), 4, 0, 3); + test(S("abcde"), 2, 3, S("abcde"), 4, 1, -2); + test(S("abcde"), 2, 3, S("abcde"), 4, 2, -2); + test(S("abcde"), 2, 3, S("abcde"), 5, 0, 3); + test(S("abcde"), 2, 3, S("abcde"), 5, 1, 3); + test(S("abcde"), 2, 3, S("abcde"), 6, 0, 0); + test(S("abcde"), 2, 3, S("abcdefghij"), 0, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghij"), 0, 1, 2); + test(S("abcde"), 2, 3, S("abcdefghij"), 0, 5, 2); + test(S("abcde"), 2, 3, S("abcdefghij"), 0, 9, 2); + test(S("abcde"), 2, 3, S("abcdefghij"), 0, 10, 2); + test(S("abcde"), 2, 3, S("abcdefghij"), 0, 11, 2); + test(S("abcde"), 2, 3, S("abcdefghij"), 1, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghij"), 1, 1, 1); + test(S("abcde"), 2, 3, S("abcdefghij"), 1, 4, 1); + test(S("abcde"), 2, 3, S("abcdefghij"), 1, 8, 1); + test(S("abcde"), 2, 3, S("abcdefghij"), 1, 9, 1); + test(S("abcde"), 2, 3, S("abcdefghij"), 1, 10, 1); + test(S("abcde"), 2, 3, S("abcdefghij"), 5, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghij"), 5, 1, -3); + test(S("abcde"), 2, 3, S("abcdefghij"), 5, 2, -3); + test(S("abcde"), 2, 3, S("abcdefghij"), 5, 4, -3); + test(S("abcde"), 2, 3, S("abcdefghij"), 5, 5, -3); + test(S("abcde"), 2, 3, S("abcdefghij"), 5, 6, -3); + test(S("abcde"), 2, 3, S("abcdefghij"), 9, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghij"), 9, 1, -7); + test(S("abcde"), 2, 3, S("abcdefghij"), 9, 2, -7); + test(S("abcde"), 2, 3, S("abcdefghij"), 10, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghij"), 10, 1, 3); + test(S("abcde"), 2, 3, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 1, 2); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 10, 2); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 19, 2); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 20, 2); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 21, 2); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 1, 1); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 9, 1); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 18, 1); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 19, 1); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 20, 1); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 1, -8); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 5, -8); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 9, -8); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 10, -8); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 11, -8); +} + +void test14() +{ + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 1, -17); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 2, -17); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 0, 3); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 1, 3); + test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 2, 4, S(""), 0, 0, 3); + test(S("abcde"), 2, 4, S(""), 0, 1, 3); + test(S("abcde"), 2, 4, S(""), 1, 0, 0); + test(S("abcde"), 2, 4, S("abcde"), 0, 0, 3); + test(S("abcde"), 2, 4, S("abcde"), 0, 1, 2); + test(S("abcde"), 2, 4, S("abcde"), 0, 2, 2); + test(S("abcde"), 2, 4, S("abcde"), 0, 4, 2); + test(S("abcde"), 2, 4, S("abcde"), 0, 5, 2); + test(S("abcde"), 2, 4, S("abcde"), 0, 6, 2); + test(S("abcde"), 2, 4, S("abcde"), 1, 0, 3); + test(S("abcde"), 2, 4, S("abcde"), 1, 1, 1); + test(S("abcde"), 2, 4, S("abcde"), 1, 2, 1); + test(S("abcde"), 2, 4, S("abcde"), 1, 3, 1); + test(S("abcde"), 2, 4, S("abcde"), 1, 4, 1); + test(S("abcde"), 2, 4, S("abcde"), 1, 5, 1); + test(S("abcde"), 2, 4, S("abcde"), 2, 0, 3); + test(S("abcde"), 2, 4, S("abcde"), 2, 1, 2); + test(S("abcde"), 2, 4, S("abcde"), 2, 2, 1); + test(S("abcde"), 2, 4, S("abcde"), 2, 3, 0); + test(S("abcde"), 2, 4, S("abcde"), 2, 4, 0); + test(S("abcde"), 2, 4, S("abcde"), 4, 0, 3); + test(S("abcde"), 2, 4, S("abcde"), 4, 1, -2); + test(S("abcde"), 2, 4, S("abcde"), 4, 2, -2); + test(S("abcde"), 2, 4, S("abcde"), 5, 0, 3); + test(S("abcde"), 2, 4, S("abcde"), 5, 1, 3); + test(S("abcde"), 2, 4, S("abcde"), 6, 0, 0); + test(S("abcde"), 2, 4, S("abcdefghij"), 0, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghij"), 0, 1, 2); + test(S("abcde"), 2, 4, S("abcdefghij"), 0, 5, 2); + test(S("abcde"), 2, 4, S("abcdefghij"), 0, 9, 2); + test(S("abcde"), 2, 4, S("abcdefghij"), 0, 10, 2); + test(S("abcde"), 2, 4, S("abcdefghij"), 0, 11, 2); + test(S("abcde"), 2, 4, S("abcdefghij"), 1, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghij"), 1, 1, 1); + test(S("abcde"), 2, 4, S("abcdefghij"), 1, 4, 1); + test(S("abcde"), 2, 4, S("abcdefghij"), 1, 8, 1); + test(S("abcde"), 2, 4, S("abcdefghij"), 1, 9, 1); + test(S("abcde"), 2, 4, S("abcdefghij"), 1, 10, 1); + test(S("abcde"), 2, 4, S("abcdefghij"), 5, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghij"), 5, 1, -3); + test(S("abcde"), 2, 4, S("abcdefghij"), 5, 2, -3); + test(S("abcde"), 2, 4, S("abcdefghij"), 5, 4, -3); + test(S("abcde"), 2, 4, S("abcdefghij"), 5, 5, -3); + test(S("abcde"), 2, 4, S("abcdefghij"), 5, 6, -3); + test(S("abcde"), 2, 4, S("abcdefghij"), 9, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghij"), 9, 1, -7); + test(S("abcde"), 2, 4, S("abcdefghij"), 9, 2, -7); + test(S("abcde"), 2, 4, S("abcdefghij"), 10, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghij"), 10, 1, 3); + test(S("abcde"), 2, 4, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 1, 2); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 10, 2); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 19, 2); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 20, 2); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 21, 2); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 1, 1); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 9, 1); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 18, 1); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 19, 1); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 20, 1); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 1, -8); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 5, -8); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 9, -8); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 10, -8); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 11, -8); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 1, -17); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 2, -17); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 0, 3); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 1, 3); + test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 4, 0, S(""), 0, 0, 0); + test(S("abcde"), 4, 0, S(""), 0, 1, 0); + test(S("abcde"), 4, 0, S(""), 1, 0, 0); + test(S("abcde"), 4, 0, S("abcde"), 0, 0, 0); + test(S("abcde"), 4, 0, S("abcde"), 0, 1, -1); + test(S("abcde"), 4, 0, S("abcde"), 0, 2, -2); + test(S("abcde"), 4, 0, S("abcde"), 0, 4, -4); + test(S("abcde"), 4, 0, S("abcde"), 0, 5, -5); + test(S("abcde"), 4, 0, S("abcde"), 0, 6, -5); + test(S("abcde"), 4, 0, S("abcde"), 1, 0, 0); + test(S("abcde"), 4, 0, S("abcde"), 1, 1, -1); + test(S("abcde"), 4, 0, S("abcde"), 1, 2, -2); + test(S("abcde"), 4, 0, S("abcde"), 1, 3, -3); + test(S("abcde"), 4, 0, S("abcde"), 1, 4, -4); + test(S("abcde"), 4, 0, S("abcde"), 1, 5, -4); + test(S("abcde"), 4, 0, S("abcde"), 2, 0, 0); + test(S("abcde"), 4, 0, S("abcde"), 2, 1, -1); + test(S("abcde"), 4, 0, S("abcde"), 2, 2, -2); + test(S("abcde"), 4, 0, S("abcde"), 2, 3, -3); + test(S("abcde"), 4, 0, S("abcde"), 2, 4, -3); +} + +void test15() +{ + test(S("abcde"), 4, 0, S("abcde"), 4, 0, 0); + test(S("abcde"), 4, 0, S("abcde"), 4, 1, -1); + test(S("abcde"), 4, 0, S("abcde"), 4, 2, -1); + test(S("abcde"), 4, 0, S("abcde"), 5, 0, 0); + test(S("abcde"), 4, 0, S("abcde"), 5, 1, 0); + test(S("abcde"), 4, 0, S("abcde"), 6, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcde"), 4, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcde"), 4, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcde"), 4, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcde"), 4, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcde"), 4, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcde"), 4, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcde"), 4, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcde"), 4, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcde"), 4, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 4, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 4, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 4, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcde"), 4, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 4, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 4, 1, S(""), 0, 0, 1); + test(S("abcde"), 4, 1, S(""), 0, 1, 1); + test(S("abcde"), 4, 1, S(""), 1, 0, 0); + test(S("abcde"), 4, 1, S("abcde"), 0, 0, 1); + test(S("abcde"), 4, 1, S("abcde"), 0, 1, 4); + test(S("abcde"), 4, 1, S("abcde"), 0, 2, 4); + test(S("abcde"), 4, 1, S("abcde"), 0, 4, 4); + test(S("abcde"), 4, 1, S("abcde"), 0, 5, 4); + test(S("abcde"), 4, 1, S("abcde"), 0, 6, 4); + test(S("abcde"), 4, 1, S("abcde"), 1, 0, 1); + test(S("abcde"), 4, 1, S("abcde"), 1, 1, 3); + test(S("abcde"), 4, 1, S("abcde"), 1, 2, 3); + test(S("abcde"), 4, 1, S("abcde"), 1, 3, 3); + test(S("abcde"), 4, 1, S("abcde"), 1, 4, 3); + test(S("abcde"), 4, 1, S("abcde"), 1, 5, 3); + test(S("abcde"), 4, 1, S("abcde"), 2, 0, 1); + test(S("abcde"), 4, 1, S("abcde"), 2, 1, 2); + test(S("abcde"), 4, 1, S("abcde"), 2, 2, 2); + test(S("abcde"), 4, 1, S("abcde"), 2, 3, 2); + test(S("abcde"), 4, 1, S("abcde"), 2, 4, 2); + test(S("abcde"), 4, 1, S("abcde"), 4, 0, 1); + test(S("abcde"), 4, 1, S("abcde"), 4, 1, 0); + test(S("abcde"), 4, 1, S("abcde"), 4, 2, 0); + test(S("abcde"), 4, 1, S("abcde"), 5, 0, 1); + test(S("abcde"), 4, 1, S("abcde"), 5, 1, 1); + test(S("abcde"), 4, 1, S("abcde"), 6, 0, 0); + test(S("abcde"), 4, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghij"), 0, 1, 4); + test(S("abcde"), 4, 1, S("abcdefghij"), 0, 5, 4); + test(S("abcde"), 4, 1, S("abcdefghij"), 0, 9, 4); + test(S("abcde"), 4, 1, S("abcdefghij"), 0, 10, 4); + test(S("abcde"), 4, 1, S("abcdefghij"), 0, 11, 4); + test(S("abcde"), 4, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghij"), 1, 1, 3); + test(S("abcde"), 4, 1, S("abcdefghij"), 1, 4, 3); + test(S("abcde"), 4, 1, S("abcdefghij"), 1, 8, 3); + test(S("abcde"), 4, 1, S("abcdefghij"), 1, 9, 3); + test(S("abcde"), 4, 1, S("abcdefghij"), 1, 10, 3); + test(S("abcde"), 4, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 4, 1, S("abcdefghij"), 5, 2, -1); + test(S("abcde"), 4, 1, S("abcdefghij"), 5, 4, -1); + test(S("abcde"), 4, 1, S("abcdefghij"), 5, 5, -1); + test(S("abcde"), 4, 1, S("abcdefghij"), 5, 6, -1); + test(S("abcde"), 4, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghij"), 9, 1, -5); +} + +void test16() +{ + test(S("abcde"), 4, 1, S("abcdefghij"), 9, 2, -5); + test(S("abcde"), 4, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcde"), 4, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 1, 4); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 10, 4); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 19, 4); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 20, 4); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 21, 4); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 1, 3); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 9, 3); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 18, 3); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 19, 3); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 20, 3); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 1, -6); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 5, -6); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 9, -6); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 10, -6); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 11, -6); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 1, -15); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 2, -15); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 4, 2, S(""), 0, 0, 1); + test(S("abcde"), 4, 2, S(""), 0, 1, 1); + test(S("abcde"), 4, 2, S(""), 1, 0, 0); + test(S("abcde"), 4, 2, S("abcde"), 0, 0, 1); + test(S("abcde"), 4, 2, S("abcde"), 0, 1, 4); + test(S("abcde"), 4, 2, S("abcde"), 0, 2, 4); + test(S("abcde"), 4, 2, S("abcde"), 0, 4, 4); + test(S("abcde"), 4, 2, S("abcde"), 0, 5, 4); + test(S("abcde"), 4, 2, S("abcde"), 0, 6, 4); + test(S("abcde"), 4, 2, S("abcde"), 1, 0, 1); + test(S("abcde"), 4, 2, S("abcde"), 1, 1, 3); + test(S("abcde"), 4, 2, S("abcde"), 1, 2, 3); + test(S("abcde"), 4, 2, S("abcde"), 1, 3, 3); + test(S("abcde"), 4, 2, S("abcde"), 1, 4, 3); + test(S("abcde"), 4, 2, S("abcde"), 1, 5, 3); + test(S("abcde"), 4, 2, S("abcde"), 2, 0, 1); + test(S("abcde"), 4, 2, S("abcde"), 2, 1, 2); + test(S("abcde"), 4, 2, S("abcde"), 2, 2, 2); + test(S("abcde"), 4, 2, S("abcde"), 2, 3, 2); + test(S("abcde"), 4, 2, S("abcde"), 2, 4, 2); + test(S("abcde"), 4, 2, S("abcde"), 4, 0, 1); + test(S("abcde"), 4, 2, S("abcde"), 4, 1, 0); + test(S("abcde"), 4, 2, S("abcde"), 4, 2, 0); + test(S("abcde"), 4, 2, S("abcde"), 5, 0, 1); + test(S("abcde"), 4, 2, S("abcde"), 5, 1, 1); + test(S("abcde"), 4, 2, S("abcde"), 6, 0, 0); + test(S("abcde"), 4, 2, S("abcdefghij"), 0, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghij"), 0, 1, 4); + test(S("abcde"), 4, 2, S("abcdefghij"), 0, 5, 4); + test(S("abcde"), 4, 2, S("abcdefghij"), 0, 9, 4); + test(S("abcde"), 4, 2, S("abcdefghij"), 0, 10, 4); + test(S("abcde"), 4, 2, S("abcdefghij"), 0, 11, 4); + test(S("abcde"), 4, 2, S("abcdefghij"), 1, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghij"), 1, 1, 3); + test(S("abcde"), 4, 2, S("abcdefghij"), 1, 4, 3); + test(S("abcde"), 4, 2, S("abcdefghij"), 1, 8, 3); + test(S("abcde"), 4, 2, S("abcdefghij"), 1, 9, 3); + test(S("abcde"), 4, 2, S("abcdefghij"), 1, 10, 3); + test(S("abcde"), 4, 2, S("abcdefghij"), 5, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 4, 2, S("abcdefghij"), 5, 2, -1); + test(S("abcde"), 4, 2, S("abcdefghij"), 5, 4, -1); + test(S("abcde"), 4, 2, S("abcdefghij"), 5, 5, -1); + test(S("abcde"), 4, 2, S("abcdefghij"), 5, 6, -1); + test(S("abcde"), 4, 2, S("abcdefghij"), 9, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghij"), 9, 1, -5); + test(S("abcde"), 4, 2, S("abcdefghij"), 9, 2, -5); + test(S("abcde"), 4, 2, S("abcdefghij"), 10, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghij"), 10, 1, 1); + test(S("abcde"), 4, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 1, 4); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 10, 4); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 19, 4); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 20, 4); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 21, 4); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 1, 3); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 9, 3); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 18, 3); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 19, 3); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 20, 3); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 1, -6); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 5, -6); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 9, -6); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 10, -6); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 11, -6); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 1, -15); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 2, -15); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 0, 1); +} + +void test17() +{ + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 5, 0, S(""), 0, 0, 0); + test(S("abcde"), 5, 0, S(""), 0, 1, 0); + test(S("abcde"), 5, 0, S(""), 1, 0, 0); + test(S("abcde"), 5, 0, S("abcde"), 0, 0, 0); + test(S("abcde"), 5, 0, S("abcde"), 0, 1, -1); + test(S("abcde"), 5, 0, S("abcde"), 0, 2, -2); + test(S("abcde"), 5, 0, S("abcde"), 0, 4, -4); + test(S("abcde"), 5, 0, S("abcde"), 0, 5, -5); + test(S("abcde"), 5, 0, S("abcde"), 0, 6, -5); + test(S("abcde"), 5, 0, S("abcde"), 1, 0, 0); + test(S("abcde"), 5, 0, S("abcde"), 1, 1, -1); + test(S("abcde"), 5, 0, S("abcde"), 1, 2, -2); + test(S("abcde"), 5, 0, S("abcde"), 1, 3, -3); + test(S("abcde"), 5, 0, S("abcde"), 1, 4, -4); + test(S("abcde"), 5, 0, S("abcde"), 1, 5, -4); + test(S("abcde"), 5, 0, S("abcde"), 2, 0, 0); + test(S("abcde"), 5, 0, S("abcde"), 2, 1, -1); + test(S("abcde"), 5, 0, S("abcde"), 2, 2, -2); + test(S("abcde"), 5, 0, S("abcde"), 2, 3, -3); + test(S("abcde"), 5, 0, S("abcde"), 2, 4, -3); + test(S("abcde"), 5, 0, S("abcde"), 4, 0, 0); + test(S("abcde"), 5, 0, S("abcde"), 4, 1, -1); + test(S("abcde"), 5, 0, S("abcde"), 4, 2, -1); + test(S("abcde"), 5, 0, S("abcde"), 5, 0, 0); + test(S("abcde"), 5, 0, S("abcde"), 5, 1, 0); + test(S("abcde"), 5, 0, S("abcde"), 6, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcde"), 5, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcde"), 5, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcde"), 5, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcde"), 5, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcde"), 5, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcde"), 5, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcde"), 5, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcde"), 5, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcde"), 5, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 5, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 5, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 5, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcde"), 5, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 5, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 5, 1, S(""), 0, 0, 0); + test(S("abcde"), 5, 1, S(""), 0, 1, 0); + test(S("abcde"), 5, 1, S(""), 1, 0, 0); + test(S("abcde"), 5, 1, S("abcde"), 0, 0, 0); + test(S("abcde"), 5, 1, S("abcde"), 0, 1, -1); + test(S("abcde"), 5, 1, S("abcde"), 0, 2, -2); + test(S("abcde"), 5, 1, S("abcde"), 0, 4, -4); + test(S("abcde"), 5, 1, S("abcde"), 0, 5, -5); + test(S("abcde"), 5, 1, S("abcde"), 0, 6, -5); + test(S("abcde"), 5, 1, S("abcde"), 1, 0, 0); + test(S("abcde"), 5, 1, S("abcde"), 1, 1, -1); + test(S("abcde"), 5, 1, S("abcde"), 1, 2, -2); + test(S("abcde"), 5, 1, S("abcde"), 1, 3, -3); + test(S("abcde"), 5, 1, S("abcde"), 1, 4, -4); + test(S("abcde"), 5, 1, S("abcde"), 1, 5, -4); + test(S("abcde"), 5, 1, S("abcde"), 2, 0, 0); + test(S("abcde"), 5, 1, S("abcde"), 2, 1, -1); + test(S("abcde"), 5, 1, S("abcde"), 2, 2, -2); + test(S("abcde"), 5, 1, S("abcde"), 2, 3, -3); + test(S("abcde"), 5, 1, S("abcde"), 2, 4, -3); + test(S("abcde"), 5, 1, S("abcde"), 4, 0, 0); + test(S("abcde"), 5, 1, S("abcde"), 4, 1, -1); + test(S("abcde"), 5, 1, S("abcde"), 4, 2, -1); + test(S("abcde"), 5, 1, S("abcde"), 5, 0, 0); +} + +void test18() +{ + test(S("abcde"), 5, 1, S("abcde"), 5, 1, 0); + test(S("abcde"), 5, 1, S("abcde"), 6, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 0, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghij"), 0, 5, -5); + test(S("abcde"), 5, 1, S("abcdefghij"), 0, 9, -9); + test(S("abcde"), 5, 1, S("abcdefghij"), 0, 10, -10); + test(S("abcde"), 5, 1, S("abcdefghij"), 0, 11, -10); + test(S("abcde"), 5, 1, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 1, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghij"), 1, 4, -4); + test(S("abcde"), 5, 1, S("abcdefghij"), 1, 8, -8); + test(S("abcde"), 5, 1, S("abcdefghij"), 1, 9, -9); + test(S("abcde"), 5, 1, S("abcdefghij"), 1, 10, -9); + test(S("abcde"), 5, 1, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 5, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghij"), 5, 2, -2); + test(S("abcde"), 5, 1, S("abcdefghij"), 5, 4, -4); + test(S("abcde"), 5, 1, S("abcdefghij"), 5, 5, -5); + test(S("abcde"), 5, 1, S("abcdefghij"), 5, 6, -5); + test(S("abcde"), 5, 1, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 9, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghij"), 9, 2, -1); + test(S("abcde"), 5, 1, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 5, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcde"), 6, 0, S(""), 0, 0, 0); + test(S("abcde"), 6, 0, S(""), 0, 1, 0); + test(S("abcde"), 6, 0, S(""), 1, 0, 0); + test(S("abcde"), 6, 0, S("abcde"), 0, 0, 0); + test(S("abcde"), 6, 0, S("abcde"), 0, 1, 0); + test(S("abcde"), 6, 0, S("abcde"), 0, 2, 0); + test(S("abcde"), 6, 0, S("abcde"), 0, 4, 0); + test(S("abcde"), 6, 0, S("abcde"), 0, 5, 0); + test(S("abcde"), 6, 0, S("abcde"), 0, 6, 0); + test(S("abcde"), 6, 0, S("abcde"), 1, 0, 0); + test(S("abcde"), 6, 0, S("abcde"), 1, 1, 0); + test(S("abcde"), 6, 0, S("abcde"), 1, 2, 0); + test(S("abcde"), 6, 0, S("abcde"), 1, 3, 0); + test(S("abcde"), 6, 0, S("abcde"), 1, 4, 0); + test(S("abcde"), 6, 0, S("abcde"), 1, 5, 0); + test(S("abcde"), 6, 0, S("abcde"), 2, 0, 0); + test(S("abcde"), 6, 0, S("abcde"), 2, 1, 0); + test(S("abcde"), 6, 0, S("abcde"), 2, 2, 0); + test(S("abcde"), 6, 0, S("abcde"), 2, 3, 0); + test(S("abcde"), 6, 0, S("abcde"), 2, 4, 0); + test(S("abcde"), 6, 0, S("abcde"), 4, 0, 0); + test(S("abcde"), 6, 0, S("abcde"), 4, 1, 0); + test(S("abcde"), 6, 0, S("abcde"), 4, 2, 0); + test(S("abcde"), 6, 0, S("abcde"), 5, 0, 0); + test(S("abcde"), 6, 0, S("abcde"), 5, 1, 0); + test(S("abcde"), 6, 0, S("abcde"), 6, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0, 5, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0, 9, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0, 10, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 0, 11, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 1, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 1, 4, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 1, 8, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 1, 9, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 1, 10, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 5, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 5, 2, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 5, 4, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 5, 5, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 5, 6, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 9, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 9, 2, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghij"), 11, 0, 0); +} + +void test19() +{ + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 19, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 20, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 21, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 18, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 19, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 20, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 5, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 9, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 10, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 11, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 2, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 0, 0, S(""), 0, 0, 0); + test(S("abcdefghij"), 0, 0, S(""), 0, 1, 0); + test(S("abcdefghij"), 0, 0, S(""), 1, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghij"), 0, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghij"), 0, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghij"), 0, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghij"), 0, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghij"), 0, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghij"), 0, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghij"), 0, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghij"), 0, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 0, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghij"), 0, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghij"), 0, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghij"), 0, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 0, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 0, 1, S(""), 0, 0, 1); + test(S("abcdefghij"), 0, 1, S(""), 0, 1, 1); +} + +void test20() +{ + test(S("abcdefghij"), 0, 1, S(""), 1, 0, 0); + test(S("abcdefghij"), 0, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcde"), 0, 1, 0); + test(S("abcdefghij"), 0, 1, S("abcde"), 0, 2, -1); + test(S("abcdefghij"), 0, 1, S("abcde"), 0, 4, -3); + test(S("abcdefghij"), 0, 1, S("abcde"), 0, 5, -4); + test(S("abcdefghij"), 0, 1, S("abcde"), 0, 6, -4); + test(S("abcdefghij"), 0, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 0, 1, S("abcde"), 1, 2, -1); + test(S("abcdefghij"), 0, 1, S("abcde"), 1, 3, -1); + test(S("abcdefghij"), 0, 1, S("abcde"), 1, 4, -1); + test(S("abcdefghij"), 0, 1, S("abcde"), 1, 5, -1); + test(S("abcdefghij"), 0, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcde"), 2, 1, -2); + test(S("abcdefghij"), 0, 1, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 0, 1, S("abcde"), 2, 3, -2); + test(S("abcdefghij"), 0, 1, S("abcde"), 2, 4, -2); + test(S("abcdefghij"), 0, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcde"), 4, 1, -4); + test(S("abcdefghij"), 0, 1, S("abcde"), 4, 2, -4); + test(S("abcdefghij"), 0, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghij"), 0, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 1, 0); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 5, -4); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 9, -8); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 10, -9); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 11, -9); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 0, 5, S(""), 0, 0, 5); + test(S("abcdefghij"), 0, 5, S(""), 0, 1, 5); + test(S("abcdefghij"), 0, 5, S(""), 1, 0, 0); + test(S("abcdefghij"), 0, 5, S("abcde"), 0, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 0, 1, 4); + test(S("abcdefghij"), 0, 5, S("abcde"), 0, 2, 3); + test(S("abcdefghij"), 0, 5, S("abcde"), 0, 4, 1); + test(S("abcdefghij"), 0, 5, S("abcde"), 0, 5, 0); + test(S("abcdefghij"), 0, 5, S("abcde"), 0, 6, 0); + test(S("abcdefghij"), 0, 5, S("abcde"), 1, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 0, 5, S("abcde"), 1, 2, -1); + test(S("abcdefghij"), 0, 5, S("abcde"), 1, 3, -1); + test(S("abcdefghij"), 0, 5, S("abcde"), 1, 4, -1); + test(S("abcdefghij"), 0, 5, S("abcde"), 1, 5, -1); + test(S("abcdefghij"), 0, 5, S("abcde"), 2, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 2, 1, -2); + test(S("abcdefghij"), 0, 5, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 0, 5, S("abcde"), 2, 3, -2); + test(S("abcdefghij"), 0, 5, S("abcde"), 2, 4, -2); + test(S("abcdefghij"), 0, 5, S("abcde"), 4, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 4, 1, -4); + test(S("abcdefghij"), 0, 5, S("abcde"), 4, 2, -4); + test(S("abcdefghij"), 0, 5, S("abcde"), 5, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 5, 1, 5); + test(S("abcdefghij"), 0, 5, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 1, 4); +} + +void test21() +{ + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 5, 0); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 9, -4); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 10, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 11, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 1, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5); + test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 0, 9, S(""), 0, 0, 9); + test(S("abcdefghij"), 0, 9, S(""), 0, 1, 9); + test(S("abcdefghij"), 0, 9, S(""), 1, 0, 0); + test(S("abcdefghij"), 0, 9, S("abcde"), 0, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 0, 1, 8); + test(S("abcdefghij"), 0, 9, S("abcde"), 0, 2, 7); + test(S("abcdefghij"), 0, 9, S("abcde"), 0, 4, 5); + test(S("abcdefghij"), 0, 9, S("abcde"), 0, 5, 4); + test(S("abcdefghij"), 0, 9, S("abcde"), 0, 6, 4); + test(S("abcdefghij"), 0, 9, S("abcde"), 1, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 0, 9, S("abcde"), 1, 2, -1); + test(S("abcdefghij"), 0, 9, S("abcde"), 1, 3, -1); + test(S("abcdefghij"), 0, 9, S("abcde"), 1, 4, -1); + test(S("abcdefghij"), 0, 9, S("abcde"), 1, 5, -1); + test(S("abcdefghij"), 0, 9, S("abcde"), 2, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 2, 1, -2); + test(S("abcdefghij"), 0, 9, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 0, 9, S("abcde"), 2, 3, -2); + test(S("abcdefghij"), 0, 9, S("abcde"), 2, 4, -2); + test(S("abcdefghij"), 0, 9, S("abcde"), 4, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 4, 1, -4); + test(S("abcdefghij"), 0, 9, S("abcde"), 4, 2, -4); + test(S("abcdefghij"), 0, 9, S("abcde"), 5, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 5, 1, 9); + test(S("abcdefghij"), 0, 9, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 1, 8); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 5, 4); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 9, 0); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 10, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 11, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 1, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 1, 8); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 10, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 19, -10); +} + +void test22() +{ + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 20, -11); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 21, -11); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 0, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 1, 9); + test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 0, 10, S(""), 0, 0, 10); + test(S("abcdefghij"), 0, 10, S(""), 0, 1, 10); + test(S("abcdefghij"), 0, 10, S(""), 1, 0, 0); + test(S("abcdefghij"), 0, 10, S("abcde"), 0, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 0, 1, 9); + test(S("abcdefghij"), 0, 10, S("abcde"), 0, 2, 8); + test(S("abcdefghij"), 0, 10, S("abcde"), 0, 4, 6); + test(S("abcdefghij"), 0, 10, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 0, 10, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 0, 10, S("abcde"), 1, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 0, 10, S("abcde"), 1, 2, -1); + test(S("abcdefghij"), 0, 10, S("abcde"), 1, 3, -1); + test(S("abcdefghij"), 0, 10, S("abcde"), 1, 4, -1); + test(S("abcdefghij"), 0, 10, S("abcde"), 1, 5, -1); + test(S("abcdefghij"), 0, 10, S("abcde"), 2, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 2, 1, -2); + test(S("abcdefghij"), 0, 10, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 0, 10, S("abcde"), 2, 3, -2); + test(S("abcdefghij"), 0, 10, S("abcde"), 2, 4, -2); + test(S("abcdefghij"), 0, 10, S("abcde"), 4, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 4, 1, -4); + test(S("abcdefghij"), 0, 10, S("abcde"), 4, 2, -4); + test(S("abcdefghij"), 0, 10, S("abcde"), 5, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 5, 1, 10); + test(S("abcdefghij"), 0, 10, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 1, 9); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 10, 0); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 11, 0); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 1, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10); + test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 0, 11, S(""), 0, 0, 10); + test(S("abcdefghij"), 0, 11, S(""), 0, 1, 10); + test(S("abcdefghij"), 0, 11, S(""), 1, 0, 0); + test(S("abcdefghij"), 0, 11, S("abcde"), 0, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 0, 1, 9); + test(S("abcdefghij"), 0, 11, S("abcde"), 0, 2, 8); +} + +void test23() +{ + test(S("abcdefghij"), 0, 11, S("abcde"), 0, 4, 6); + test(S("abcdefghij"), 0, 11, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 0, 11, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 0, 11, S("abcde"), 1, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 0, 11, S("abcde"), 1, 2, -1); + test(S("abcdefghij"), 0, 11, S("abcde"), 1, 3, -1); + test(S("abcdefghij"), 0, 11, S("abcde"), 1, 4, -1); + test(S("abcdefghij"), 0, 11, S("abcde"), 1, 5, -1); + test(S("abcdefghij"), 0, 11, S("abcde"), 2, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 2, 1, -2); + test(S("abcdefghij"), 0, 11, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 0, 11, S("abcde"), 2, 3, -2); + test(S("abcdefghij"), 0, 11, S("abcde"), 2, 4, -2); + test(S("abcdefghij"), 0, 11, S("abcde"), 4, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 4, 1, -4); + test(S("abcdefghij"), 0, 11, S("abcde"), 4, 2, -4); + test(S("abcdefghij"), 0, 11, S("abcde"), 5, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 5, 1, 10); + test(S("abcdefghij"), 0, 11, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 1, 9); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 10, 0); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 11, 0); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 1, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 1, 9); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 19, -9); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 20, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 21, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 0, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 1, 10); + test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 1, 0, S(""), 0, 0, 0); + test(S("abcdefghij"), 1, 0, S(""), 0, 1, 0); + test(S("abcdefghij"), 1, 0, S(""), 1, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghij"), 1, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghij"), 1, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghij"), 1, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghij"), 1, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghij"), 1, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghij"), 1, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghij"), 1, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghij"), 1, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 1, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghij"), 1, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghij"), 1, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghij"), 1, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 1, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 11, -10); +} + +void test24() +{ + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 1, 1, S(""), 0, 0, 1); + test(S("abcdefghij"), 1, 1, S(""), 0, 1, 1); + test(S("abcdefghij"), 1, 1, S(""), 1, 0, 0); + test(S("abcdefghij"), 1, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 0, 1, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 0, 2, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 0, 4, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 0, 5, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 0, 6, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 1, 1, 0); + test(S("abcdefghij"), 1, 1, S("abcde"), 1, 2, -1); + test(S("abcdefghij"), 1, 1, S("abcde"), 1, 3, -2); + test(S("abcdefghij"), 1, 1, S("abcde"), 1, 4, -3); + test(S("abcdefghij"), 1, 1, S("abcde"), 1, 5, -3); + test(S("abcdefghij"), 1, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 1, 1, S("abcde"), 2, 2, -1); + test(S("abcdefghij"), 1, 1, S("abcde"), 2, 3, -1); + test(S("abcdefghij"), 1, 1, S("abcde"), 2, 4, -1); + test(S("abcdefghij"), 1, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 4, 1, -3); + test(S("abcdefghij"), 1, 1, S("abcde"), 4, 2, -3); + test(S("abcdefghij"), 1, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghij"), 1, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 1, 0); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 4, -3); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 8, -7); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 9, -8); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 10, -8); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0); +} + +void test25() +{ + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 1, 4, S(""), 0, 0, 4); + test(S("abcdefghij"), 1, 4, S(""), 0, 1, 4); + test(S("abcdefghij"), 1, 4, S(""), 1, 0, 0); + test(S("abcdefghij"), 1, 4, S("abcde"), 0, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 0, 1, 1); + test(S("abcdefghij"), 1, 4, S("abcde"), 0, 2, 1); + test(S("abcdefghij"), 1, 4, S("abcde"), 0, 4, 1); + test(S("abcdefghij"), 1, 4, S("abcde"), 0, 5, 1); + test(S("abcdefghij"), 1, 4, S("abcde"), 0, 6, 1); + test(S("abcdefghij"), 1, 4, S("abcde"), 1, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 1, 1, 3); + test(S("abcdefghij"), 1, 4, S("abcde"), 1, 2, 2); + test(S("abcdefghij"), 1, 4, S("abcde"), 1, 3, 1); + test(S("abcdefghij"), 1, 4, S("abcde"), 1, 4, 0); + test(S("abcdefghij"), 1, 4, S("abcde"), 1, 5, 0); + test(S("abcdefghij"), 1, 4, S("abcde"), 2, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 1, 4, S("abcde"), 2, 2, -1); + test(S("abcdefghij"), 1, 4, S("abcde"), 2, 3, -1); + test(S("abcdefghij"), 1, 4, S("abcde"), 2, 4, -1); + test(S("abcdefghij"), 1, 4, S("abcde"), 4, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 4, 1, -3); + test(S("abcdefghij"), 1, 4, S("abcde"), 4, 2, -3); + test(S("abcdefghij"), 1, 4, S("abcde"), 5, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 5, 1, 4); + test(S("abcdefghij"), 1, 4, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 1, 3); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 4, 0); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 8, -4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 9, -5); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 10, -5); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 1, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4); + test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 1, 8, S(""), 0, 0, 8); + test(S("abcdefghij"), 1, 8, S(""), 0, 1, 8); + test(S("abcdefghij"), 1, 8, S(""), 1, 0, 0); + test(S("abcdefghij"), 1, 8, S("abcde"), 0, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcde"), 0, 1, 1); + test(S("abcdefghij"), 1, 8, S("abcde"), 0, 2, 1); + test(S("abcdefghij"), 1, 8, S("abcde"), 0, 4, 1); + test(S("abcdefghij"), 1, 8, S("abcde"), 0, 5, 1); + test(S("abcdefghij"), 1, 8, S("abcde"), 0, 6, 1); + test(S("abcdefghij"), 1, 8, S("abcde"), 1, 0, 8); +} + +void test26() +{ + test(S("abcdefghij"), 1, 8, S("abcde"), 1, 1, 7); + test(S("abcdefghij"), 1, 8, S("abcde"), 1, 2, 6); + test(S("abcdefghij"), 1, 8, S("abcde"), 1, 3, 5); + test(S("abcdefghij"), 1, 8, S("abcde"), 1, 4, 4); + test(S("abcdefghij"), 1, 8, S("abcde"), 1, 5, 4); + test(S("abcdefghij"), 1, 8, S("abcde"), 2, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 1, 8, S("abcde"), 2, 2, -1); + test(S("abcdefghij"), 1, 8, S("abcde"), 2, 3, -1); + test(S("abcdefghij"), 1, 8, S("abcde"), 2, 4, -1); + test(S("abcdefghij"), 1, 8, S("abcde"), 4, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcde"), 4, 1, -3); + test(S("abcdefghij"), 1, 8, S("abcde"), 4, 2, -3); + test(S("abcdefghij"), 1, 8, S("abcde"), 5, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcde"), 5, 1, 8); + test(S("abcdefghij"), 1, 8, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 1, 7); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 4, 4); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 8, 0); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 1, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 1, 7); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 18, -10); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 19, -11); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 20, -11); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 0, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 1, 8); + test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 1, 9, S(""), 0, 0, 9); + test(S("abcdefghij"), 1, 9, S(""), 0, 1, 9); + test(S("abcdefghij"), 1, 9, S(""), 1, 0, 0); + test(S("abcdefghij"), 1, 9, S("abcde"), 0, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 0, 1, 1); + test(S("abcdefghij"), 1, 9, S("abcde"), 0, 2, 1); + test(S("abcdefghij"), 1, 9, S("abcde"), 0, 4, 1); + test(S("abcdefghij"), 1, 9, S("abcde"), 0, 5, 1); + test(S("abcdefghij"), 1, 9, S("abcde"), 0, 6, 1); + test(S("abcdefghij"), 1, 9, S("abcde"), 1, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 1, 1, 8); + test(S("abcdefghij"), 1, 9, S("abcde"), 1, 2, 7); + test(S("abcdefghij"), 1, 9, S("abcde"), 1, 3, 6); + test(S("abcdefghij"), 1, 9, S("abcde"), 1, 4, 5); + test(S("abcdefghij"), 1, 9, S("abcde"), 1, 5, 5); + test(S("abcdefghij"), 1, 9, S("abcde"), 2, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 1, 9, S("abcde"), 2, 2, -1); + test(S("abcdefghij"), 1, 9, S("abcde"), 2, 3, -1); + test(S("abcdefghij"), 1, 9, S("abcde"), 2, 4, -1); + test(S("abcdefghij"), 1, 9, S("abcde"), 4, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 4, 1, -3); + test(S("abcdefghij"), 1, 9, S("abcde"), 4, 2, -3); + test(S("abcdefghij"), 1, 9, S("abcde"), 5, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 5, 1, 9); + test(S("abcdefghij"), 1, 9, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 1, 8); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 4, 5); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 8, 1); +} + +void test27() +{ + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 9, 0); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 10, 0); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 1, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9); + test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 1, 10, S(""), 0, 0, 9); + test(S("abcdefghij"), 1, 10, S(""), 0, 1, 9); + test(S("abcdefghij"), 1, 10, S(""), 1, 0, 0); + test(S("abcdefghij"), 1, 10, S("abcde"), 0, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 0, 1, 1); + test(S("abcdefghij"), 1, 10, S("abcde"), 0, 2, 1); + test(S("abcdefghij"), 1, 10, S("abcde"), 0, 4, 1); + test(S("abcdefghij"), 1, 10, S("abcde"), 0, 5, 1); + test(S("abcdefghij"), 1, 10, S("abcde"), 0, 6, 1); + test(S("abcdefghij"), 1, 10, S("abcde"), 1, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 1, 1, 8); + test(S("abcdefghij"), 1, 10, S("abcde"), 1, 2, 7); + test(S("abcdefghij"), 1, 10, S("abcde"), 1, 3, 6); + test(S("abcdefghij"), 1, 10, S("abcde"), 1, 4, 5); + test(S("abcdefghij"), 1, 10, S("abcde"), 1, 5, 5); + test(S("abcdefghij"), 1, 10, S("abcde"), 2, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 1, 10, S("abcde"), 2, 2, -1); + test(S("abcdefghij"), 1, 10, S("abcde"), 2, 3, -1); + test(S("abcdefghij"), 1, 10, S("abcde"), 2, 4, -1); + test(S("abcdefghij"), 1, 10, S("abcde"), 4, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 4, 1, -3); + test(S("abcdefghij"), 1, 10, S("abcde"), 4, 2, -3); + test(S("abcdefghij"), 1, 10, S("abcde"), 5, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 5, 1, 9); + test(S("abcdefghij"), 1, 10, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 1, 8); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 4, 5); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 8, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 9, 0); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 10, 0); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 1, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 1, 8); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 18, -9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 19, -10); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 20, -10); +} + +void test28() +{ + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 0, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 1, 9); + test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 5, 0, S(""), 0, 0, 0); + test(S("abcdefghij"), 5, 0, S(""), 0, 1, 0); + test(S("abcdefghij"), 5, 0, S(""), 1, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghij"), 5, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghij"), 5, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghij"), 5, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghij"), 5, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghij"), 5, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghij"), 5, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghij"), 5, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghij"), 5, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 5, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghij"), 5, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghij"), 5, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghij"), 5, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 5, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 5, 1, S(""), 0, 0, 1); + test(S("abcdefghij"), 5, 1, S(""), 0, 1, 1); + test(S("abcdefghij"), 5, 1, S(""), 1, 0, 0); + test(S("abcdefghij"), 5, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 0, 1, 5); + test(S("abcdefghij"), 5, 1, S("abcde"), 0, 2, 5); + test(S("abcdefghij"), 5, 1, S("abcde"), 0, 4, 5); + test(S("abcdefghij"), 5, 1, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 5, 1, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 5, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 1, 1, 4); + test(S("abcdefghij"), 5, 1, S("abcde"), 1, 2, 4); + test(S("abcdefghij"), 5, 1, S("abcde"), 1, 3, 4); + test(S("abcdefghij"), 5, 1, S("abcde"), 1, 4, 4); +} + +void test29() +{ + test(S("abcdefghij"), 5, 1, S("abcde"), 1, 5, 4); + test(S("abcdefghij"), 5, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 2, 1, 3); + test(S("abcdefghij"), 5, 1, S("abcde"), 2, 2, 3); + test(S("abcdefghij"), 5, 1, S("abcde"), 2, 3, 3); + test(S("abcdefghij"), 5, 1, S("abcde"), 2, 4, 3); + test(S("abcdefghij"), 5, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 4, 1, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 4, 2, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghij"), 5, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 1, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 9, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 10, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 11, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 1, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 4, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 8, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 9, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 10, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 1, 0); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 2, -1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 4, -3); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 1, -4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 2, -4); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, 5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, 4); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -5); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -14); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -14); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 5, 2, S(""), 0, 0, 2); + test(S("abcdefghij"), 5, 2, S(""), 0, 1, 2); + test(S("abcdefghij"), 5, 2, S(""), 1, 0, 0); + test(S("abcdefghij"), 5, 2, S("abcde"), 0, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 0, 1, 5); + test(S("abcdefghij"), 5, 2, S("abcde"), 0, 2, 5); + test(S("abcdefghij"), 5, 2, S("abcde"), 0, 4, 5); + test(S("abcdefghij"), 5, 2, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 5, 2, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 5, 2, S("abcde"), 1, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 1, 1, 4); + test(S("abcdefghij"), 5, 2, S("abcde"), 1, 2, 4); + test(S("abcdefghij"), 5, 2, S("abcde"), 1, 3, 4); + test(S("abcdefghij"), 5, 2, S("abcde"), 1, 4, 4); + test(S("abcdefghij"), 5, 2, S("abcde"), 1, 5, 4); + test(S("abcdefghij"), 5, 2, S("abcde"), 2, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 2, 1, 3); + test(S("abcdefghij"), 5, 2, S("abcde"), 2, 2, 3); + test(S("abcdefghij"), 5, 2, S("abcde"), 2, 3, 3); + test(S("abcdefghij"), 5, 2, S("abcde"), 2, 4, 3); + test(S("abcdefghij"), 5, 2, S("abcde"), 4, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 4, 1, 1); + test(S("abcdefghij"), 5, 2, S("abcde"), 4, 2, 1); + test(S("abcdefghij"), 5, 2, S("abcde"), 5, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 5, 1, 2); + test(S("abcdefghij"), 5, 2, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 1, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 9, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 10, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 11, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 1, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 4, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 8, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 9, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 10, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 1, 1); +} + +void test30() +{ + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 2, 0); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 4, -2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 5, -3); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 6, -3); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 1, -4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 2, -4); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 1, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 1, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 10, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 19, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 20, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 21, 5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 1, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 9, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 18, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 19, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 20, 4); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 1, -5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 9, -5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 10, -5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 11, -5); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 1, -14); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 2, -14); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 0, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 1, 2); + test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 5, 4, S(""), 0, 0, 4); + test(S("abcdefghij"), 5, 4, S(""), 0, 1, 4); + test(S("abcdefghij"), 5, 4, S(""), 1, 0, 0); + test(S("abcdefghij"), 5, 4, S("abcde"), 0, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 0, 1, 5); + test(S("abcdefghij"), 5, 4, S("abcde"), 0, 2, 5); + test(S("abcdefghij"), 5, 4, S("abcde"), 0, 4, 5); + test(S("abcdefghij"), 5, 4, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 5, 4, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 5, 4, S("abcde"), 1, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 1, 1, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 1, 2, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 1, 3, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 1, 4, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 1, 5, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 2, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 2, 1, 3); + test(S("abcdefghij"), 5, 4, S("abcde"), 2, 2, 3); + test(S("abcdefghij"), 5, 4, S("abcde"), 2, 3, 3); + test(S("abcdefghij"), 5, 4, S("abcde"), 2, 4, 3); + test(S("abcdefghij"), 5, 4, S("abcde"), 4, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 4, 1, 1); + test(S("abcdefghij"), 5, 4, S("abcde"), 4, 2, 1); + test(S("abcdefghij"), 5, 4, S("abcde"), 5, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 5, 1, 4); + test(S("abcdefghij"), 5, 4, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 1, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 9, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 10, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 11, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 1, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 4, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 8, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 9, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 10, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 1, 3); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 2, 2); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 4, 0); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 5, -1); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 6, -1); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 1, -4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 2, -4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 1, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 1, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 10, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 19, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 20, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 21, 5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 1, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 9, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 18, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 19, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 20, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 1, -5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 9, -5); +} + +void test31() +{ + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 10, -5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 11, -5); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 1, -14); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 2, -14); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 0, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 1, 4); + test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 5, 5, S(""), 0, 0, 5); + test(S("abcdefghij"), 5, 5, S(""), 0, 1, 5); + test(S("abcdefghij"), 5, 5, S(""), 1, 0, 0); + test(S("abcdefghij"), 5, 5, S("abcde"), 0, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 0, 1, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 0, 2, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 0, 4, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 1, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 1, 1, 4); + test(S("abcdefghij"), 5, 5, S("abcde"), 1, 2, 4); + test(S("abcdefghij"), 5, 5, S("abcde"), 1, 3, 4); + test(S("abcdefghij"), 5, 5, S("abcde"), 1, 4, 4); + test(S("abcdefghij"), 5, 5, S("abcde"), 1, 5, 4); + test(S("abcdefghij"), 5, 5, S("abcde"), 2, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 2, 1, 3); + test(S("abcdefghij"), 5, 5, S("abcde"), 2, 2, 3); + test(S("abcdefghij"), 5, 5, S("abcde"), 2, 3, 3); + test(S("abcdefghij"), 5, 5, S("abcde"), 2, 4, 3); + test(S("abcdefghij"), 5, 5, S("abcde"), 4, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 4, 1, 1); + test(S("abcdefghij"), 5, 5, S("abcde"), 4, 2, 1); + test(S("abcdefghij"), 5, 5, S("abcde"), 5, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 5, 1, 5); + test(S("abcdefghij"), 5, 5, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 1, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 9, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 10, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 11, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 1, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 4, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 8, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 9, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 10, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 1, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 2, 3); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 4, 1); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 5, 0); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 6, 0); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 1, -4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 2, -4); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 1, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 1, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 10, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 19, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 20, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 21, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 1, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 9, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 18, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 19, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 20, 4); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 1, -5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 9, -5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 10, -5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 11, -5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 1, -14); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 2, -14); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 0, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 1, 5); + test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 5, 6, S(""), 0, 0, 5); + test(S("abcdefghij"), 5, 6, S(""), 0, 1, 5); + test(S("abcdefghij"), 5, 6, S(""), 1, 0, 0); + test(S("abcdefghij"), 5, 6, S("abcde"), 0, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 0, 1, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 0, 2, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 0, 4, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 0, 5, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 0, 6, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 1, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 1, 1, 4); + test(S("abcdefghij"), 5, 6, S("abcde"), 1, 2, 4); + test(S("abcdefghij"), 5, 6, S("abcde"), 1, 3, 4); + test(S("abcdefghij"), 5, 6, S("abcde"), 1, 4, 4); + test(S("abcdefghij"), 5, 6, S("abcde"), 1, 5, 4); + test(S("abcdefghij"), 5, 6, S("abcde"), 2, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 2, 1, 3); + test(S("abcdefghij"), 5, 6, S("abcde"), 2, 2, 3); +} + +void test32() +{ + test(S("abcdefghij"), 5, 6, S("abcde"), 2, 3, 3); + test(S("abcdefghij"), 5, 6, S("abcde"), 2, 4, 3); + test(S("abcdefghij"), 5, 6, S("abcde"), 4, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 4, 1, 1); + test(S("abcdefghij"), 5, 6, S("abcde"), 4, 2, 1); + test(S("abcdefghij"), 5, 6, S("abcde"), 5, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 5, 1, 5); + test(S("abcdefghij"), 5, 6, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 1, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 9, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 10, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 11, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 1, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 4, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 8, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 9, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 10, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 1, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 2, 3); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 4, 1); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 5, 0); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 6, 0); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 1, -4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 2, -4); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 1, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 1, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 10, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 19, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 20, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 21, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 1, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 9, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 18, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 19, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 20, 4); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 1, -5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 9, -5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 10, -5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 11, -5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 1, -14); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 2, -14); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 0, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 1, 5); + test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 9, 0, S(""), 0, 0, 0); + test(S("abcdefghij"), 9, 0, S(""), 0, 1, 0); + test(S("abcdefghij"), 9, 0, S(""), 1, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghij"), 9, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghij"), 9, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghij"), 9, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghij"), 9, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghij"), 9, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghij"), 9, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghij"), 9, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghij"), 9, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 9, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghij"), 9, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghij"), 9, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghij"), 9, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 9, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 6, -5); +} + +void test33() +{ + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 9, 1, S(""), 0, 0, 1); + test(S("abcdefghij"), 9, 1, S(""), 0, 1, 1); + test(S("abcdefghij"), 9, 1, S(""), 1, 0, 0); + test(S("abcdefghij"), 9, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 0, 1, 9); + test(S("abcdefghij"), 9, 1, S("abcde"), 0, 2, 9); + test(S("abcdefghij"), 9, 1, S("abcde"), 0, 4, 9); + test(S("abcdefghij"), 9, 1, S("abcde"), 0, 5, 9); + test(S("abcdefghij"), 9, 1, S("abcde"), 0, 6, 9); + test(S("abcdefghij"), 9, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 1, 1, 8); + test(S("abcdefghij"), 9, 1, S("abcde"), 1, 2, 8); + test(S("abcdefghij"), 9, 1, S("abcde"), 1, 3, 8); + test(S("abcdefghij"), 9, 1, S("abcde"), 1, 4, 8); + test(S("abcdefghij"), 9, 1, S("abcde"), 1, 5, 8); + test(S("abcdefghij"), 9, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 2, 1, 7); + test(S("abcdefghij"), 9, 1, S("abcde"), 2, 2, 7); + test(S("abcdefghij"), 9, 1, S("abcde"), 2, 3, 7); + test(S("abcdefghij"), 9, 1, S("abcde"), 2, 4, 7); + test(S("abcdefghij"), 9, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 4, 1, 5); + test(S("abcdefghij"), 9, 1, S("abcde"), 4, 2, 5); + test(S("abcdefghij"), 9, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghij"), 9, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 1, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 5, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 9, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 10, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 11, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 1, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 4, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 8, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 9, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 10, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 1, 4); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 2, 4); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 4, 4); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 5, 4); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 6, 4); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 1, 0); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 2, 0); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 1, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 10, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 19, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 20, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 21, 9); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 1, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 9, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 18, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 19, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 20, 8); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 5, -1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 9, -1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 10, -1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 11, -1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 1, -10); +} + +void test34() +{ + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 2, -10); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 9, 2, S(""), 0, 0, 1); + test(S("abcdefghij"), 9, 2, S(""), 0, 1, 1); + test(S("abcdefghij"), 9, 2, S(""), 1, 0, 0); + test(S("abcdefghij"), 9, 2, S("abcde"), 0, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 0, 1, 9); + test(S("abcdefghij"), 9, 2, S("abcde"), 0, 2, 9); + test(S("abcdefghij"), 9, 2, S("abcde"), 0, 4, 9); + test(S("abcdefghij"), 9, 2, S("abcde"), 0, 5, 9); + test(S("abcdefghij"), 9, 2, S("abcde"), 0, 6, 9); + test(S("abcdefghij"), 9, 2, S("abcde"), 1, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 1, 1, 8); + test(S("abcdefghij"), 9, 2, S("abcde"), 1, 2, 8); + test(S("abcdefghij"), 9, 2, S("abcde"), 1, 3, 8); + test(S("abcdefghij"), 9, 2, S("abcde"), 1, 4, 8); + test(S("abcdefghij"), 9, 2, S("abcde"), 1, 5, 8); + test(S("abcdefghij"), 9, 2, S("abcde"), 2, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 2, 1, 7); + test(S("abcdefghij"), 9, 2, S("abcde"), 2, 2, 7); + test(S("abcdefghij"), 9, 2, S("abcde"), 2, 3, 7); + test(S("abcdefghij"), 9, 2, S("abcde"), 2, 4, 7); + test(S("abcdefghij"), 9, 2, S("abcde"), 4, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 4, 1, 5); + test(S("abcdefghij"), 9, 2, S("abcde"), 4, 2, 5); + test(S("abcdefghij"), 9, 2, S("abcde"), 5, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 5, 1, 1); + test(S("abcdefghij"), 9, 2, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 1, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 5, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 9, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 10, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 11, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 1, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 4, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 8, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 9, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 10, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 1, 4); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 2, 4); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 4, 4); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 5, 4); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 6, 4); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 1, 0); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 2, 0); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 1, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 10, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 19, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 20, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 21, 9); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 1, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 9, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 18, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 19, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 20, 8); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 5, -1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 9, -1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 10, -1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 11, -1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 1, -10); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 2, -10); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 10, 0, S(""), 0, 0, 0); + test(S("abcdefghij"), 10, 0, S(""), 0, 1, 0); + test(S("abcdefghij"), 10, 0, S(""), 1, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghij"), 10, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghij"), 10, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghij"), 10, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghij"), 10, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghij"), 10, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghij"), 10, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghij"), 10, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghij"), 10, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 10, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghij"), 10, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghij"), 10, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 4, 1, -1); +} + +void test35() +{ + test(S("abcdefghij"), 10, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghij"), 10, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 10, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 10, 1, S(""), 0, 0, 0); + test(S("abcdefghij"), 10, 1, S(""), 0, 1, 0); + test(S("abcdefghij"), 10, 1, S(""), 1, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 0, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcde"), 0, 2, -2); + test(S("abcdefghij"), 10, 1, S("abcde"), 0, 4, -4); + test(S("abcdefghij"), 10, 1, S("abcde"), 0, 5, -5); + test(S("abcdefghij"), 10, 1, S("abcde"), 0, 6, -5); + test(S("abcdefghij"), 10, 1, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 1, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcde"), 1, 2, -2); + test(S("abcdefghij"), 10, 1, S("abcde"), 1, 3, -3); + test(S("abcdefghij"), 10, 1, S("abcde"), 1, 4, -4); + test(S("abcdefghij"), 10, 1, S("abcde"), 1, 5, -4); + test(S("abcdefghij"), 10, 1, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 2, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcde"), 2, 2, -2); + test(S("abcdefghij"), 10, 1, S("abcde"), 2, 3, -3); + test(S("abcdefghij"), 10, 1, S("abcde"), 2, 4, -3); + test(S("abcdefghij"), 10, 1, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 4, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcde"), 4, 2, -1); + test(S("abcdefghij"), 10, 1, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 10, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 0, 0); +} + +void test36() +{ + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghij"), 11, 0, S(""), 0, 0, 0); + test(S("abcdefghij"), 11, 0, S(""), 0, 1, 0); + test(S("abcdefghij"), 11, 0, S(""), 1, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0, 4, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0, 5, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 0, 6, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 1, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 1, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 1, 3, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 1, 4, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 1, 5, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 2, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 2, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 2, 3, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 2, 4, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 4, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 4, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 5, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 9, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 10, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 11, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 4, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 8, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 9, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 10, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 4, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 5, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 6, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 19, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 20, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 21, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 18, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 19, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 20, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 5, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 9, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 10, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 11, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 2, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); +} + +void test37() +{ + test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 4, -3); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 5, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 6, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 3, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 5, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 1, -2); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 3, -2); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 4, -2); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 1, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 2, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 6, 0, 0); +} + +void test38() +{ + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 5, -4); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 9, -8); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 10, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 11, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 1, 9); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 2, 8); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 4, 6); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 5, 5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 6, 5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 3, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 5, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 1, -2); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 3, -2); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 4, -2); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 1, -4); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 2, -4); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 1, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 1, 9); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 5, 5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 10, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 11, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 1, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9); +} + +void test39() +{ + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10); + test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 1, 18); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 2, 17); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 4, 15); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 5, 14); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 6, 14); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 3, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 5, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 1, -2); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 3, -2); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 4, -2); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 1, -4); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 2, -4); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 1, 18); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 5, 14); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 9, 10); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 10, 9); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 11, 9); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 1, 18); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 10, 9); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 19, 0); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 21, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 0, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 0, 20); +} + +void test40() +{ + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 2, 18); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 4, 16); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 6, 15); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 3, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 5, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 1, -2); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 3, -2); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 4, -2); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 1, -4); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 2, -4); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 9, 11); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 20, 0); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 21, 0); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 2, 18); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 4, 16); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 6, 15); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 2, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 3, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 5, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 1, -2); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 3, -2); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 4, -2); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 1, -4); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 2, -4); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 5, 15); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 9, 11); +} + +void test41() +{ + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 4, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 8, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 10, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 1, -5); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 2, -5); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 4, -5); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 1, -9); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 2, -9); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 20, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 21, 0); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 9, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 18, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 1, -10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 5, -10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 9, -10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 1, -19); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 2, -19); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 0, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 1, 20); + test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); +} + +void test42() +{ + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 6, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 3, -2); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 4, -3); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 5, -3); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 3, -1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 4, -1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 1, -3); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 2, -3); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 4, -3); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 8, -7); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 9, -8); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 10, -8); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 1, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 5, 1); +} + +void test43() +{ + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 6, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 1, 8); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 2, 7); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 3, 6); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 4, 5); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 5, 5); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 3, -1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 4, -1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 1, -3); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 2, -3); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 1, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 1, 8); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 4, 5); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 8, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 9, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 10, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 1, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9); + test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 6, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 1, 17); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 2, 16); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 3, 15); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 4, 14); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 5, 14); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 3, -1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 4, -1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 1, -3); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 2, -3); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 1, 17); +} + +void test44() +{ + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 4, 14); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 8, 10); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 10, 9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 1, 17); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 18, 0); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 19, -1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 20, -1); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 0, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 6, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 2, 17); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 3, 16); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 4, 15); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 5, 15); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 3, -1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 4, -1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 1, -3); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 2, -3); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 4, 15); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 8, 11); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 9, 10); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 10, 10); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 9, 10); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 18, 1); +} + +void test45() +{ + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 19, 0); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 20, 0); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 2, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 4, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 6, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 2, 17); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 3, 16); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 4, 15); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 5, 15); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 2, -1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 3, -1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 4, -1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 1, -3); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 2, -3); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 5, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 9, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 11, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 4, 15); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 8, 11); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 9, 10); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 10, 10); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 1, -4); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 2, -4); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 5, -4); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 6, -4); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 1, -8); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 2, -8); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 10, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 19, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 20, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 21, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 9, 10); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 18, 1); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 19, 0); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 20, 0); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 1, -9); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 5, -9); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 1, -18); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 2, -18); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 0, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 1, 19); + test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 2, -2); +} + +void test46() +{ + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 6, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 2, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 3, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 5, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 1, 8); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 2, 8); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 3, 8); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 4, 8); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 1, 6); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 2, 6); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 8, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 10, 9); +} + +void test47() +{ + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 2, 5); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 4, 5); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 6, 5); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 2, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, 10); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, 9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -4); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -8); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -9); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 6, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 2, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 3, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 5, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 1, 8); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 2, 8); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 3, 8); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 4, 8); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 1, 6); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 2, 6); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 8, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 10, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 2, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 4, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 6, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 2, 1); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 21, 10); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 18, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 19, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 20, 9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 1, 4); +} + +void test48() +{ + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 5, 0); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 9, -4); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 10, -5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 11, -5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 1, -9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 2, -9); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 0, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 6, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 2, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 3, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 5, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 1, 8); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 2, 8); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 3, 8); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 4, 8); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 1, 6); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 2, 6); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 8, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 10, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 2, 5); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 4, 5); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 6, 5); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 2, 1); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 21, 10); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 18, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 19, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 20, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 1, 8); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 5, 4); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 9, 0); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 10, -1); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 11, -1); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 1, -9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 2, -9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 0, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 6, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 2, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 3, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 5, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 0, 10); +} + +void test49() +{ + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 1, 8); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 2, 8); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 3, 8); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 4, 8); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 1, 6); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 2, 6); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 8, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 10, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 2, 5); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 4, 5); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 6, 5); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 2, 1); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 21, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 18, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 19, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 20, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 9, 1); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 10, 0); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 11, 0); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 1, -9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 2, -9); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 2, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 4, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 6, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 2, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 3, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 5, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 1, 8); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 2, 8); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 3, 8); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 4, 8); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 1, 6); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 2, 6); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 5, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 9, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 11, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 4, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 8, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 10, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 1, 5); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 2, 5); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 4, 5); +} + +void test50() +{ + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 6, 5); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 1, 1); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 2, 1); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 10, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 19, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 20, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 21, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 9, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 18, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 19, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 20, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 1, 9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 5, 5); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 9, 1); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 10, 0); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 11, 0); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 1, -9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 2, -9); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 0, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 1, 10); + test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); +} + +void test51() +{ + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 2, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 4, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 6, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 2, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 3, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 4, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 5, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 1, 17); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 2, 17); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 3, 17); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 4, 17); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 1, 15); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 2, 15); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 9, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 11, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 4, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 8, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 9, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 10, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 1, 14); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 2, 14); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 4, 14); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 5, 14); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 6, 14); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 1, 10); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 2, 10); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 19, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 20, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 21, 19); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 9, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 18, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 19, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 20, 18); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 1, 9); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 5, 9); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 9, 9); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 10, 9); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 11, 9); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 1, 0); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 2, 0); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 2, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 4, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 6, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 2, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 3, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 4, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 5, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 1, 17); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 2, 17); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 3, 17); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 4, 17); +} + +void test52() +{ + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 1, 15); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 2, 15); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 5, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 9, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 11, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 4, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 8, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 9, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 10, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 1, 14); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 2, 14); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 4, 14); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 5, 14); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 6, 14); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 1, 10); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 2, 10); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 1, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 10, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 19, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 20, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 21, 19); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 1, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 9, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 18, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 19, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 20, 18); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 1, 9); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 5, 9); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 9, 9); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 10, 9); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 11, 9); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 1, 0); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 2, 0); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 0, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 1, 1); + test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 6, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 3, -3); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 5, -4); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 3, -3); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 4, -3); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 2, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 1, -1); +} + +void test53() +{ + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 6, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 3, -3); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 5, -4); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 3, -3); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 4, -3); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 2, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 11, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 8, -8); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 10, -9); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 2, -2); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 4, -4); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 6, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 2, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 19, -19); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 20, -20); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 21, -20); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 18, -18); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 19, -19); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 20, -19); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 5, -5); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 9, -9); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 10, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 11, -10); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 1, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 2, -1); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 0, 0); +} + +void test54() +{ + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 21, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 4, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 6, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 3, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 4, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 3, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 4, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 6, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 9, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 10, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 11, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 4, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 8, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 9, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 10, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 4, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 6, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 11, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 10, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 19, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 20, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 21, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 9, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 18, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 19, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 20, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 5, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 9, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 10, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 11, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 2, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 0, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 1, 0); + test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 21, 0, 0); +} + +int main() +{ + test0(); + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); + test7(); + test8(); + test9(); + test10(); + test11(); + test12(); + test13(); + test14(); + test15(); + test16(); + test17(); + test18(); + test19(); + test20(); + test21(); + test22(); + test23(); + test24(); + test25(); + test26(); + test27(); + test28(); + test29(); + test30(); + test31(); + test32(); + test33(); + test34(); + test35(); + test36(); + test37(); + test38(); + test39(); + test40(); + test41(); + test42(); + test43(); + test44(); + test45(); + test46(); + test47(); + test48(); + test49(); + test50(); + test51(); + test52(); + test53(); + test54(); +} diff --git a/libcxx/test/strings/basic.string/string.ops/string::compare/string.pass.cpp b/libcxx/test/strings/basic.string/string.ops/string::compare/string.pass.cpp new file mode 100644 index 00000000000..de7b1061021 --- /dev/null +++ b/libcxx/test/strings/basic.string/string.ops/string::compare/string.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int compare(const basic_string& str) const + +#include <string> +#include <cassert> + +int sign(int x) +{ + if (x == 0) + return 0; + if (x < 0) + return -1; + return 1; +} + +template <class S> +void +test(const S& s, const S& str, int x) +{ + assert(sign(s.compare(str)) == sign(x)); +} + +typedef std::string S; + +int main() +{ + test(S(""), S(""), 0); + test(S(""), S("abcde"), -5); + test(S(""), S("abcdefghij"), -10); + test(S(""), S("abcdefghijklmnopqrst"), -20); + test(S("abcde"), S(""), 5); + test(S("abcde"), S("abcde"), 0); + test(S("abcde"), S("abcdefghij"), -5); + test(S("abcde"), S("abcdefghijklmnopqrst"), -15); + test(S("abcdefghij"), S(""), 10); + test(S("abcdefghij"), S("abcde"), 5); + test(S("abcdefghij"), S("abcdefghij"), 0); + test(S("abcdefghij"), S("abcdefghijklmnopqrst"), -10); + test(S("abcdefghijklmnopqrst"), S(""), 20); + test(S("abcdefghijklmnopqrst"), S("abcde"), 15); + test(S("abcdefghijklmnopqrst"), S("abcdefghij"), 10); + test(S("abcdefghijklmnopqrst"), S("abcdefghijklmnopqrst"), 0); +} |