Files
libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp
Louis Dionne 5a9ebbf0d9 [libc++] Add XFAILs for istream tests that were added in r357775
We fixed incorrect behavior of input streams in r357775 and tests were
added accordingly. However, older versions of macOS don't have the
change in the dylib yet, so the tests fail on those platforms.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@357794 91177308-0d34-0410-b5e6-96231b3b80d8
2019-04-05 18:50:47 +00:00

154 lines
3.9 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// XFAIL: with_system_cxx_lib=macosx10.14
// XFAIL: with_system_cxx_lib=macosx10.13
// XFAIL: with_system_cxx_lib=macosx10.12
// XFAIL: with_system_cxx_lib=macosx10.11
// XFAIL: with_system_cxx_lib=macosx10.10
// XFAIL: with_system_cxx_lib=macosx10.9
// <istream>
// int_type get();
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
: public std::basic_streambuf<CharT>
{
typedef std::basic_string<CharT> string_type;
typedef std::basic_streambuf<CharT> base;
private:
string_type str_;
public:
testbuf() {}
testbuf(const string_type& str)
: str_(str)
{
base::setg(const_cast<CharT*>(str_.data()),
const_cast<CharT*>(str_.data()),
const_cast<CharT*>(str_.data()) + str_.size());
}
CharT* eback() const {return base::eback();}
CharT* gptr() const {return base::gptr();}
CharT* egptr() const {return base::egptr();}
};
int main(int, char**)
{
{
testbuf<char> sb(" ");
std::istream is(&sb);
char c = static_cast<char>(is.get());
assert(!is.eof());
assert(!is.fail());
assert(c == ' ');
assert(is.gcount() == 1);
}
{
testbuf<char> sb(" abc");
std::istream is(&sb);
char c = static_cast<char>(is.get());
assert(!is.eof());
assert(!is.fail());
assert(c == ' ');
assert(is.gcount() == 1);
c = static_cast<char>(is.get());
assert(!is.eof());
assert(!is.fail());
assert(c == 'a');
assert(is.gcount() == 1);
c = static_cast<char>(is.get());
assert(!is.eof());
assert(!is.fail());
assert(c == 'b');
assert(is.gcount() == 1);
c = static_cast<char>(is.get());
assert(!is.eof());
assert(!is.fail());
assert(c == 'c');
assert(is.gcount() == 1);
}
{
testbuf<wchar_t> sb(L" abc");
std::wistream is(&sb);
wchar_t c = is.get();
assert(!is.eof());
assert(!is.fail());
assert(c == L' ');
assert(is.gcount() == 1);
c = is.get();
assert(!is.eof());
assert(!is.fail());
assert(c == L'a');
assert(is.gcount() == 1);
c = is.get();
assert(!is.eof());
assert(!is.fail());
assert(c == L'b');
assert(is.gcount() == 1);
c = is.get();
assert(!is.eof());
assert(!is.fail());
assert(c == L'c');
assert(is.gcount() == 1);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb("rrrrrrrrr");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
while (true) {
is.get();
if (is.eof())
break;
}
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb(L"rrrrrrrrr");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
while (true) {
is.get();
if (is.eof())
break;
}
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
}
#endif
return 0;
}