// TODO: more output buffering tests, when i'm not so tired.
scope {
assert 'object' === typename s2.ob;
const ob = s2.ob;
assert 0 === ob.level();
assert ob === ob.push();
print('buffered');
var b = ob.pop(1);
assert 0 === ob.level();
assert b inherits s2.Buffer;
assert b.length()>0;
// Reminder to self: if assertion tracing is on, assertions will generate
// output to our buffer, making exact content checks here impractical.
// But we can do...
assert b.toString().indexOf('buffered') >= 0;
//print("Buffered",b.length(),"bytes.");
}
scope{
const ob = s2.ob;
const out = print;
ob.push();
out("This will be flushed to stdout.");
ob.flush();
out("level 1");
var v1 = ob.takeString();
ob.push();
out("This will be flushed to level 1.");
ob.flush();
out("level 2");
var v2 = ob.takeString();
ob.pop();
var v1b = ob.takeString();
out("discarded");
//ob.clear()// not needed b/c pop() will do this
ob.pop();
assert v1 === 'level 1\n';
assert v2 === 'level 2\n';
assert v1b === 'This will be flushed to level 1.\n';
}