111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// XFAIL: libcpp-no-exceptions 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <string> 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// basic_string<charT,traits,Allocator>& 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// assign(const basic_string<charT,traits>& str, size_type pos, size_type n=npos); 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the =npos was added for C++14 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <string> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stdexcept> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_macros.h" 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "min_allocator.h" 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class S> 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest(S s, S str, typename S::size_type pos, typename S::size_type n, S expected) 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert s.assign(str, pos, n); 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert LIBCPP_ASSERT(s.__invariants()); 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(pos <= str.size()); 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(s == expected); 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catch (std::out_of_range&) 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(pos > str.size()); 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class S> 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest_npos(S s, S str, typename S::size_type pos, S expected) 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert s.assign(str, pos); 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert LIBCPP_ASSERT(s.__invariants()); 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(pos <= str.size()); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(s == expected); 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catch (std::out_of_range&) 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(pos > str.size()); 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::string S; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S(), 0, 0, S()); 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S(), 1, 0, S()); 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 0, 3, S("123")); 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 1, 4, S("2345")); 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 3, 15, S("45")); 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 5, 15, S("")); 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 6, 15, S("not happening")); 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 0, 0, S()); 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 1, 1, S("2")); 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 2, 3, S("345")); 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 12, 13, S("34567890")); 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 21, 13, S("not happening")); 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345"), S(), 0, 0, S()); 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345"), S("12345"), 2, 2, S("34")); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345"), S("1234567890"), 0, 100, S("1234567890")); 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345678901234567890"), S(), 0, 0, S()); 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345678901234567890"), S("12345"), 1, 3, S("234")); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345678901234567890"), S("12345678901234567890"), 5, 10, 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert S("6789012345")); 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if TEST_STD_VER >= 11 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S(), 0, 0, S()); 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S(), 1, 0, S()); 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 0, 3, S("123")); 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 1, 4, S("2345")); 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 3, 15, S("45")); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 5, 15, S("")); 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345"), 6, 15, S("not happening")); 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 0, 0, S()); 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 1, 1, S("2")); 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 2, 3, S("345")); 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 12, 13, S("34567890")); 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S(), S("12345678901234567890"), 21, 13, S("not happening")); 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345"), S(), 0, 0, S()); 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345"), S("12345"), 2, 2, S("34")); 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345"), S("1234567890"), 0, 100, S("1234567890")); 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345678901234567890"), S(), 0, 0, S()); 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345678901234567890"), S("12345"), 1, 3, S("234")); 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test(S("12345678901234567890"), S("12345678901234567890"), 5, 10, 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert S("6789012345")); 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::string S; 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S(), 0, S()); 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S(), 1, S()); 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S("12345"), 0, S("12345")); 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S("12345"), 1, S("2345")); 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S("12345"), 3, S("45")); 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S("12345"), 5, S("")); 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert test_npos(S(), S("12345"), 6, S("not happening")); 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 121