#include<bits/stdc++.h>
using namespace std;
class Tester;
class Tester2;
class blackbox{
public:
friend class Tester;
friend class Tester2;
bool tes1(){
return true;
}
bool tes2(){
return true;
//return false;
}
void testall(){
tes1(),tes2();
}
};
class Tester1 {
public:
blackbox obj;
void test() {
cerr << "check tes1...\n";
assert((obj.tes1()));
cerr << "check tes2...\n";
assert((obj.tes2()) );
cerr << "All tests passed!\n";
}
};
class Tester2{
public:
blackbox obj;
void test(){
if (!obj.tes1()) {
cerr << "tes1 has a bug\n";
assert(false);
}
else {
cerr << "Test 1 works well\n";
}
if (!obj.tes2()) {
cerr << "tes2 has a bug\n";
assert(false);
}
else {
cerr << "Test 2 works well\n";
}
}
};
int main(){
Tester1 t;
t.test();
Tester2 t1;
t1.test();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFRlc3RlcjsKY2xhc3MgVGVzdGVyMjsKY2xhc3MgYmxhY2tib3h7CiAgICBwdWJsaWM6CiAgICBmcmllbmQgY2xhc3MgVGVzdGVyOwogICAgZnJpZW5kIGNsYXNzIFRlc3RlcjI7CiAgICBib29sIHRlczEoKXsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGJvb2wgdGVzMigpewogICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIC8vcmV0dXJuIGZhbHNlOwogICAgfQogICAgdm9pZCB0ZXN0YWxsKCl7CiAgICAgICAgdGVzMSgpLHRlczIoKTsKICAgIH0KfTsKY2xhc3MgVGVzdGVyMSB7CnB1YmxpYzoKICAgIGJsYWNrYm94IG9iajsKCiAgICB2b2lkIHRlc3QoKSB7CiAgICAgICAgY2VyciA8PCAiY2hlY2sgdGVzMS4uLlxuIjsKICAgICAgICBhc3NlcnQoKG9iai50ZXMxKCkpKTsKICAgICAgICAKICAgICAgICBjZXJyIDw8ICJjaGVjayB0ZXMyLi4uXG4iOwogICAgICAgIGFzc2VydCgob2JqLnRlczIoKSkgKTsgCiAgICAgICAgCiAgICAgICAgY2VyciA8PCAiQWxsIHRlc3RzIHBhc3NlZCFcbiI7CiAgICB9Cn07CmNsYXNzIFRlc3RlcjJ7CiAgICBwdWJsaWM6CiAgICBibGFja2JveCBvYmo7CiAgICB2b2lkIHRlc3QoKXsKICAgICAgICBpZiAoIW9iai50ZXMxKCkpIHsKICAgICAgICAgICAgY2VyciA8PCAidGVzMSBoYXMgYSBidWdcbiI7CiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgICAgfSAKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY2VyciA8PCAiVGVzdCAxIHdvcmtzIHdlbGxcbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW9iai50ZXMyKCkpIHsKICAgICAgICAgICAgY2VyciA8PCAidGVzMiBoYXMgYSBidWdcbiI7CiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgICAgfSAKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY2VyciA8PCAiVGVzdCAyIHdvcmtzIHdlbGxcbiI7CiAgICAgICAgfQogICAgfQoKfTsKaW50IG1haW4oKXsKICAgIFRlc3RlcjEgdDsKICAgIHQudGVzdCgpOwogICAgVGVzdGVyMiB0MTsKICAgIHQxLnRlc3QoKTsKICAgIHJldHVybiAwOwp9