173 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <sstream>10 11// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >12// class basic_stringbuf13 14// pos_type seekoff(off_type off, ios_base::seekdir way,15// ios_base::openmode which = ios_base::in | ios_base::out);16 17#include <sstream>18#include <cassert>19 20#include "test_macros.h"21 22int main(int, char**)23{24 {25 std::stringbuf sb(std::ios_base::in);26 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);27 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);28 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);29 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);30 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);31 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);32 assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::in) == 0);33 assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::in) == 0);34 assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::in) == 0);35 }36 {37 std::stringbuf sb(std::ios_base::out);38 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);39 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);40 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);41 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);42 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);43 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);44 assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::out) == 0);45 assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::out) == 0);46 assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::out) == 0);47 }48 {49 std::stringbuf sb("0123456789", std::ios_base::in);50 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);51 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);52 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);53 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);54 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);55 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);56 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);57 assert(sb.sgetc() == '3');58 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);59 assert(sb.sgetc() == '6');60 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);61 assert(sb.sgetc() == '7');62 }63 {64 std::stringbuf sb("0123456789", std::ios_base::out);65 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);66 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);67 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);68 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == -1);69 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);70 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == -1);71 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);72 assert(sb.sputc('a') == 'a');73 assert(sb.str() == "012a456789");74 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);75 assert(sb.sputc('b') == 'b');76 assert(sb.str() == "012a456b89");77 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);78 assert(sb.sputc('c') == 'c');79 assert(sb.str() == "012a456c89");80 }81 {82 std::stringbuf sb("0123456789");83 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);84 assert(sb.sgetc() == '3');85 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);86 assert(sb.sgetc() == '6');87 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);88 assert(sb.sgetc() == '7');89 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == 3);90 assert(sb.sgetc() == '3');91 assert(sb.sputc('a') == 'a');92 assert(sb.str() == "012a456789");93 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);94 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == 7);95 assert(sb.sgetc() == '7');96 assert(sb.sputc('c') == 'c');97 assert(sb.str() == "012a456c89");98 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);99 assert(sb.sputc('3') == '3');100 assert(sb.str() == "0123456c89");101 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);102 assert(sb.sputc('7') == '7');103 assert(sb.str() == "0123456789");104 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);105 assert(sb.sputc('c') == 'c');106 assert(sb.str() == "0123456c89");107 }108#ifndef TEST_HAS_NO_WIDE_CHARACTERS109 {110 std::wstringbuf sb(L"0123456789", std::ios_base::in);111 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);112 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);113 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);114 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);115 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);116 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);117 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);118 assert(sb.sgetc() == L'3');119 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);120 assert(sb.sgetc() == L'6');121 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);122 assert(sb.sgetc() == L'7');123 }124 {125 std::wstringbuf sb(L"0123456789", std::ios_base::out);126 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);127 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);128 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);129 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == -1);130 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);131 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == -1);132 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);133 assert(sb.sputc(L'a') == L'a');134 assert(sb.str() == L"012a456789");135 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);136 assert(sb.sputc(L'b') == L'b');137 assert(sb.str() == L"012a456b89");138 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);139 assert(sb.sputc(L'c') == L'c');140 assert(sb.str() == L"012a456c89");141 }142 {143 std::wstringbuf sb(L"0123456789");144 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);145 assert(sb.sgetc() == L'3');146 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);147 assert(sb.sgetc() == L'6');148 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);149 assert(sb.sgetc() == L'7');150 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == 3);151 assert(sb.sgetc() == L'3');152 assert(sb.sputc(L'a') == L'a');153 assert(sb.str() == L"012a456789");154 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);155 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == 7);156 assert(sb.sgetc() == L'7');157 assert(sb.sputc(L'c') == L'c');158 assert(sb.str() == L"012a456c89");159 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);160 assert(sb.sputc(L'3') == L'3');161 assert(sb.str() == L"0123456c89");162 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);163 assert(sb.sputc(L'7') == L'7');164 assert(sb.str() == L"0123456789");165 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);166 assert(sb.sputc(L'c') == L'c');167 assert(sb.str() == L"0123456c89");168 }169#endif // TEST_HAS_NO_WIDE_CHARACTERS170 171 return 0;172}173