15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <string>
105a83710eSEric Fiselier
11*425620ccSNikolas Klauser // void resize(size_type n); // constexpr since C++20
125a83710eSEric Fiselier
135a83710eSEric Fiselier #include <string>
145a83710eSEric Fiselier #include <stdexcept>
155a83710eSEric Fiselier #include <cassert>
165a83710eSEric Fiselier
171f4231f8SEric Fiselier #include "test_macros.h"
185a83710eSEric Fiselier #include "min_allocator.h"
195a83710eSEric Fiselier
205a83710eSEric Fiselier template <class S>
21e85018b7SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test(S s,typename S::size_type n,S expected)225a83710eSEric Fiselier test(S s, typename S::size_type n, S expected)
235a83710eSEric Fiselier {
248a915ed6SRoger Ferrer Ibanez if (n <= s.max_size())
255a83710eSEric Fiselier {
265a83710eSEric Fiselier s.resize(n);
271f4231f8SEric Fiselier LIBCPP_ASSERT(s.__invariants());
285a83710eSEric Fiselier assert(s == expected);
295a83710eSEric Fiselier }
308a915ed6SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
3185e9b268SNikolas Klauser else if (!TEST_IS_CONSTANT_EVALUATED)
328a915ed6SRoger Ferrer Ibanez {
338a915ed6SRoger Ferrer Ibanez try
348a915ed6SRoger Ferrer Ibanez {
358a915ed6SRoger Ferrer Ibanez s.resize(n);
368a915ed6SRoger Ferrer Ibanez assert(false);
378a915ed6SRoger Ferrer Ibanez }
385a83710eSEric Fiselier catch (std::length_error&)
395a83710eSEric Fiselier {
405a83710eSEric Fiselier assert(n > s.max_size());
415a83710eSEric Fiselier }
425a83710eSEric Fiselier }
438a915ed6SRoger Ferrer Ibanez #endif
448a915ed6SRoger Ferrer Ibanez }
455a83710eSEric Fiselier
test()46*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
475a83710eSEric Fiselier {
485a83710eSEric Fiselier typedef std::string S;
495a83710eSEric Fiselier test(S(), 0, S());
505a83710eSEric Fiselier test(S(), 1, S(1, '\0'));
515a83710eSEric Fiselier test(S(), 10, S(10, '\0'));
525a83710eSEric Fiselier test(S(), 100, S(100, '\0'));
535a83710eSEric Fiselier test(S("12345"), 0, S());
545a83710eSEric Fiselier test(S("12345"), 2, S("12"));
555a83710eSEric Fiselier test(S("12345"), 5, S("12345"));
565a83710eSEric Fiselier test(S("12345"), 15, S("12345\0\0\0\0\0\0\0\0\0\0", 15));
575a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 0, S());
585a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 10,
595a83710eSEric Fiselier S("1234567890"));
605a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 50,
615a83710eSEric Fiselier S("12345678901234567890123456789012345678901234567890"));
625a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 60,
635a83710eSEric Fiselier S("12345678901234567890123456789012345678901234567890\0\0\0\0\0\0\0\0\0\0", 60));
645a83710eSEric Fiselier test(S(), S::npos, S("not going to happen"));
655a83710eSEric Fiselier }
661f4231f8SEric Fiselier #if TEST_STD_VER >= 11
675a83710eSEric Fiselier {
685a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
695a83710eSEric Fiselier test(S(), 0, S());
705a83710eSEric Fiselier test(S(), 1, S(1, '\0'));
715a83710eSEric Fiselier test(S(), 10, S(10, '\0'));
725a83710eSEric Fiselier test(S(), 100, S(100, '\0'));
735a83710eSEric Fiselier test(S("12345"), 0, S());
745a83710eSEric Fiselier test(S("12345"), 2, S("12"));
755a83710eSEric Fiselier test(S("12345"), 5, S("12345"));
765a83710eSEric Fiselier test(S("12345"), 15, S("12345\0\0\0\0\0\0\0\0\0\0", 15));
775a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 0, S());
785a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 10,
795a83710eSEric Fiselier S("1234567890"));
805a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 50,
815a83710eSEric Fiselier S("12345678901234567890123456789012345678901234567890"));
825a83710eSEric Fiselier test(S("12345678901234567890123456789012345678901234567890"), 60,
835a83710eSEric Fiselier S("12345678901234567890123456789012345678901234567890\0\0\0\0\0\0\0\0\0\0", 60));
845a83710eSEric Fiselier test(S(), S::npos, S("not going to happen"));
855a83710eSEric Fiselier }
865a83710eSEric Fiselier #endif
872df59c50SJF Bastien
88e85018b7SNikolas Klauser return true;
89e85018b7SNikolas Klauser }
90e85018b7SNikolas Klauser
main(int,char **)91e85018b7SNikolas Klauser int main(int, char**)
92e85018b7SNikolas Klauser {
93e85018b7SNikolas Klauser test();
94e85018b7SNikolas Klauser #if TEST_STD_VER > 17
95*425620ccSNikolas Klauser static_assert(test());
96e85018b7SNikolas Klauser #endif
97e85018b7SNikolas Klauser
982df59c50SJF Bastien return 0;
995a83710eSEric Fiselier }
100