1
// Copyright (c) 2009-2018 The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4

            
5
#include <list>
6
#include <locale>
7
#include <stdexcept>
8

            
9
namespace
10
{
11
// trigger: use ctype<char>::widen to trigger ctype<char>::_M_widen_init().
12
// test: convert a char from narrow to wide and back. Verify that the result
13
//   matches the original.
14
bool sanity_test_widen(char testchar)
15
{
16
    const std::ctype<char>& test(std::use_facet<std::ctype<char> >(std::locale()));
17
    return test.narrow(test.widen(testchar), 'b') == testchar;
18
}
19

            
20
// trigger: use list::push_back and list::pop_back to trigger _M_hook and
21
//   _M_unhook.
22
// test: Push a sequence of integers into a list. Pop them off and verify that
23
//   they match the original sequence.
24
bool sanity_test_list(unsigned int size)
25
{
26
    std::list<unsigned int> test;
27
    for (unsigned int i = 0; i != size; ++i)
28
        test.push_back(i + 1);
29

            
30
    if (test.size() != size)
31
        return false;
32

            
33
    while (!test.empty()) {
34
        if (test.back() != test.size())
35
            return false;
36
        test.pop_back();
37
    }
38
    return true;
39
}
40

            
41
} // namespace
42

            
43
// trigger: string::at(x) on an empty string to trigger __throw_out_of_range_fmt.
44
// test: force std::string to throw an out_of_range exception. Verify that
45
//   it's caught correctly.
46
bool sanity_test_range_fmt()
47
{
48
    std::string test;
49
    try {
50
        test.at(1);
51
    } catch (const std::out_of_range&) {
52
        return true;
53
    } catch (...) {
54
    }
55
    return false;
56
}
57

            
58
bool glibcxx_sanity_test()
59
{
60
    return sanity_test_widen('a') && sanity_test_list(100) && sanity_test_range_fmt();
61
}