131 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <string>10 11// size_type copy(charT* s, size_type n, size_type pos = 0) const; // constexpr since C++2012 13#include <string>14#include <stdexcept>15#include <algorithm>16#include <cassert>17 18#include "test_macros.h"19#include "min_allocator.h"20#include "asan_testing.h"21 22template <class S>23TEST_CONSTEXPR_CXX20 void test(S str, typename S::value_type* s, typename S::size_type n, typename S::size_type pos) {24 const S& cs = str;25 if (pos <= cs.size()) {26 typename S::size_type r = cs.copy(s, n, pos);27 typename S::size_type rlen = std::min(n, cs.size() - pos);28 assert(r == rlen);29 LIBCPP_ASSERT(is_string_asan_correct(str));30 LIBCPP_ASSERT(is_string_asan_correct(cs));31 32 for (r = 0; r < rlen; ++r)33 assert(S::traits_type::eq(cs[pos + r], s[r]));34 }35#ifndef TEST_HAS_NO_EXCEPTIONS36 else if (!TEST_IS_CONSTANT_EVALUATED) {37 try {38 typename S::size_type r = cs.copy(s, n, pos);39 ((void)r); // Prevent unused warning40 assert(false);41 } catch (std::out_of_range&) {42 assert(pos > str.size());43 }44 }45#endif46}47 48template <class S>49TEST_CONSTEXPR_CXX20 void test_string() {50 char s[50];51 test(S(""), s, 0, 0);52 test(S(""), s, 0, 1);53 test(S(""), s, 1, 0);54 test(S("abcde"), s, 0, 0);55 test(S("abcde"), s, 0, 1);56 test(S("abcde"), s, 0, 2);57 test(S("abcde"), s, 0, 4);58 test(S("abcde"), s, 0, 5);59 test(S("abcde"), s, 0, 6);60 test(S("abcde"), s, 1, 0);61 test(S("abcde"), s, 1, 1);62 test(S("abcde"), s, 1, 2);63 test(S("abcde"), s, 1, 4);64 test(S("abcde"), s, 1, 5);65 test(S("abcde"), s, 2, 0);66 test(S("abcde"), s, 2, 1);67 test(S("abcde"), s, 2, 2);68 test(S("abcde"), s, 2, 4);69 test(S("abcde"), s, 4, 0);70 test(S("abcde"), s, 4, 1);71 test(S("abcde"), s, 4, 2);72 test(S("abcde"), s, 5, 0);73 test(S("abcde"), s, 5, 1);74 test(S("abcde"), s, 6, 0);75 test(S("abcdefghijklmnopqrst"), s, 0, 0);76 test(S("abcdefghijklmnopqrst"), s, 0, 1);77 test(S("abcdefghijklmnopqrst"), s, 0, 2);78 test(S("abcdefghijklmnopqrst"), s, 0, 10);79 test(S("abcdefghijklmnopqrst"), s, 0, 19);80 test(S("abcdefghijklmnopqrst"), s, 0, 20);81 test(S("abcdefghijklmnopqrst"), s, 0, 21);82 test(S("abcdefghijklmnopqrst"), s, 1, 0);83 test(S("abcdefghijklmnopqrst"), s, 1, 1);84 test(S("abcdefghijklmnopqrst"), s, 1, 2);85 test(S("abcdefghijklmnopqrst"), s, 1, 9);86 test(S("abcdefghijklmnopqrst"), s, 1, 18);87 test(S("abcdefghijklmnopqrst"), s, 1, 19);88 test(S("abcdefghijklmnopqrst"), s, 1, 20);89 test(S("abcdefghijklmnopqrst"), s, 2, 0);90 test(S("abcdefghijklmnopqrst"), s, 2, 1);91 test(S("abcdefghijklmnopqrst"), s, 2, 2);92 test(S("abcdefghijklmnopqrst"), s, 2, 9);93 test(S("abcdefghijklmnopqrst"), s, 2, 17);94 test(S("abcdefghijklmnopqrst"), s, 2, 18);95 test(S("abcdefghijklmnopqrst"), s, 2, 19);96 test(S("abcdefghijklmnopqrst"), s, 10, 0);97 test(S("abcdefghijklmnopqrst"), s, 10, 1);98 test(S("abcdefghijklmnopqrst"), s, 10, 2);99 test(S("abcdefghijklmnopqrst"), s, 10, 5);100 test(S("abcdefghijklmnopqrst"), s, 10, 9);101 test(S("abcdefghijklmnopqrst"), s, 10, 10);102 test(S("abcdefghijklmnopqrst"), s, 10, 11);103 test(S("abcdefghijklmnopqrst"), s, 19, 0);104 test(S("abcdefghijklmnopqrst"), s, 19, 1);105 test(S("abcdefghijklmnopqrst"), s, 19, 2);106 test(S("abcdefghijklmnopqrst"), s, 20, 0);107 test(S("abcdefghijklmnopqrst"), s, 20, 1);108 test(S("abcdefghijklmnopqrst"), s, 21, 0);109 test(S("abcdefghijklmnopqrstabcdefghijklmnopqrst"), s, 40, 1);110 test(S("abcdefghijklmnopqrstabcdefghijklmnopqrst"), s, 40, 0);111}112 113TEST_CONSTEXPR_CXX20 bool test() {114 test_string<std::string>();115#if TEST_STD_VER >= 11116 test_string<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();117 test_string<std::basic_string<char, std::char_traits<char>, safe_allocator<char>>>();118#endif119 120 return true;121}122 123int main(int, char**) {124 test();125#if TEST_STD_VER > 17126 static_assert(test());127#endif128 129 return 0;130}131