]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/libcxx/debug/containers/db_string.pass.cpp
Vendor import of libc++ trunk r302418:
[FreeBSD/FreeBSD.git] / test / libcxx / debug / containers / db_string.pass.cpp
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // UNSUPPORTED: c++98, c++03, c++11, c++14
11 // UNSUPPORTED: libcpp-no-exceptions, libcpp-no-if-constexpr
12 // MODULES_DEFINES: _LIBCPP_DEBUG=1
13 // MODULES_DEFINES: _LIBCPP_DEBUG_USE_EXCEPTIONS
14
15 // Can't test the system lib because this test enables debug mode
16 // UNSUPPORTED: with_system_cxx_lib
17
18 // test container debugging
19
20 #define _LIBCPP_DEBUG 1
21 #define _LIBCPP_DEBUG_USE_EXCEPTIONS
22 #include <string>
23 #include <vector>
24
25 #include "test_macros.h"
26 #include "debug_mode_helper.h"
27
28 using namespace IteratorDebugChecks;
29
30 typedef std::basic_string<char, std::char_traits<char>, test_allocator<char>>  StringType;
31
32 template <class Container = StringType, ContainerType CT = CT_String>
33 struct StringContainerChecks : BasicContainerChecks<Container, CT> {
34   using Base = BasicContainerChecks<Container, CT_String>;
35   using value_type = typename Container::value_type;
36   using allocator_type = typename Container::allocator_type;
37   using iterator = typename Container::iterator;
38   using const_iterator = typename Container::const_iterator;
39
40   using Base::makeContainer;
41   using Base::makeValueType;
42
43 public:
44   static void run() {
45     Base::run_iterator_tests();
46     Base::run_allocator_aware_tests();
47     try {
48       for (int N : {3, 128}) {
49         FrontOnEmptyContainer(N);
50         BackOnEmptyContainer(N);
51         PopBack(N);
52       }
53     } catch (...) {
54       assert(false && "uncaught debug exception");
55     }
56   }
57
58 private:
59   static void BackOnEmptyContainer(int N) {
60     CHECKPOINT("testing back on empty");
61     Container C = makeContainer(N);
62     Container const& CC = C;
63     iterator it = --C.end();
64     (void)C.back();
65     (void)CC.back();
66     C.pop_back();
67     CHECK_DEBUG_THROWS( C.erase(it) );
68     C.clear();
69     CHECK_DEBUG_THROWS( C.back() );
70     CHECK_DEBUG_THROWS( CC.back() );
71   }
72
73   static void FrontOnEmptyContainer(int N) {
74     CHECKPOINT("testing front on empty");
75     Container C = makeContainer(N);
76     Container const& CC = C;
77     (void)C.front();
78     (void)CC.front();
79     C.clear();
80     CHECK_DEBUG_THROWS( C.front() );
81     CHECK_DEBUG_THROWS( CC.front() );
82   }
83
84   static void PopBack(int N) {
85     CHECKPOINT("testing pop_back() invalidation");
86     Container C1 = makeContainer(N);
87     iterator it1 = C1.end();
88     --it1;
89     C1.pop_back();
90     CHECK_DEBUG_THROWS( C1.erase(it1) );
91     C1.erase(C1.begin(), C1.end());
92     assert(C1.size() == 0);
93     CHECK_DEBUG_THROWS( C1.pop_back() );
94   }
95 };
96
97 int main()
98 {
99   StringContainerChecks<>::run();
100 }