// test <sstream>
#include <cassert>
#include <iostream>
#include <sstream>
void t1()
{ // test stringbuf
string s0("s0"), s1("s1"), s2("s2"), s3("s3");
stringbuf sb0, sb1(ios::in), sb2(ios::out),
sb3(ios::in | ios::out);
stringbuf sb10(s0), sb11(s1, ios::in),
sb12(s2, ios::out),
sb13(s3, ios::in | ios::out);
ostream outs(&sb0);
outs << "dynamic stringbuf 0";
s3 = sb0.str();
assert(s3 == "dynamic stringbuf 0");
sb0.str(s0);
assert(sb0.str() == "s0");
outs.rdbuf(&sb2);
outs << "dynamic stringbuf 2";
assert(sb2.str() == "dynamic stringbuf 2");
outs.rdbuf(&sb10);
outs << "x";
assert(sb10.str() == "x0");
outs.rdbuf(&sb11);
outs << "x";
assert(!outs.good() && sb12.str() == "s1");
outs.rdbuf(&sb12);
outs << "x";
assert(sb12.str() // "x");
assert(sb12.pubseekoff(2, ios::beg).offset() == 2
&& sb12.str() == "x2");
}
void t2()
{ // test istringstream
string s0("s0"), s1("s1"), s2("s2"), s3("s3");
istringstream is0, is1(ios::in),
is2(ios::out), is3(ios::in | ios::out);
istringstream is10(s0), is11(s1, ios::in),
is12(s2, ios::out),
is13(s3, ios::in | ios::out);
assert(is10.rdbuf()->str() == "s0")
assert(is11.str() == "s1");
is0.str("abc");
assert(is0.str() == "abc");
is0 >> s0;
assert(s0 == "abc");
}
void t3()
{ // test ostringstream
string s0("s0"), s1("s1"), s2("s2"), s3("s3");
ostringstream os0, osl(ios::in),
os2(ios::out), os3(ios::in | ios::out);
ostringstream os10(s0), os11(s1, ios::in),
os12(s2, ios::out),
os13(s3, ios::in | ios::out);
assert(os10.rdbuf()->str() == "");
assert(os13.str() == "s3");
os0.str("abc");
assert(os0.str() == "");
assert(os0.rdbuf()->pubseekoff(2, ios::beg).offset()
== 2 && os0.str() == "ab");
os0 << "Cde";
assert(os0.str() == "abCde");
}
int main()
{ // test basic workings of stringstream definitions
t1();
t2();
t3();
cout << "SUCCESS testing <sstream>" << endl;
return (0);
}