#include <iostream>
#include <exception>
#include <stdexcept>
int gcd(int a, int b) {
// Trigger to fail the test case
if(a<0 /* || b<0 */ ) {
throw std::invalid_argument("a and b must be negative values");
}
if(!(a >= 0 && b >= 0)) {
return -1;
}
if(a==0 || b==0 )
return a+b;
while(a!=b) {
if(a>b) {
a = a - b;
}
else {
b = b - a;
}
}
return a;
}
#define expect_true(arg) \
do { \
if(!(arg)) { \
std::cout << "Unexpected false at " \
<< __FILE__ << ", " << __LINE__ << ", " << __func__ << ": " << #arg \
<< std::endl; } \
} while(false);
void test_gcd() {
expect_true(gcd(16,24) == 8);
expect_true(gcd(0, 19) == 19);
bool exceptionCaught = false;
try {
gcd(5, -15);
} catch (const std::invalid_argument& ex) {
std::cout << "Illegal as expected" << std::endl;
exceptionCaught = true;
}
expect_true(exceptionCaught);
}
int main() {
test_gcd();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZXhjZXB0aW9uPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKaW50IGdjZChpbnQgYSwgaW50IGIpIHsKCS8vIFRyaWdnZXIgdG8gZmFpbCB0aGUgdGVzdCBjYXNlCiAgICBpZihhPDAgLyogfHwgYjwwICovICkgewogICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiYSBhbmQgYiBtdXN0IGJlIG5lZ2F0aXZlIHZhbHVlcyIpOwogICAgfQogICAgaWYoIShhID49IDAgJiYgYiA+PSAwKSkgewogICAgCXJldHVybiAtMTsKICAgIH0KCWlmKGE9PTAgfHwgYj09MCApCgkgICAgcmV0dXJuIGErYjsKCXdoaWxlKGEhPWIpIHsKCSAgICBpZihhPmIpIHsKCSAgICAgICAgYSA9IGEgLSBiOwoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgICAgYiA9IGIgLSBhOwoJICAgIH0KCX0KCXJldHVybiBhOwp9CgojZGVmaW5lIGV4cGVjdF90cnVlKGFyZykgXAogICAgICAgIGRvIHsgXAogICAgICAgICAgICBpZighKGFyZykpIHsgXAogICAgICAgICAgICAJc3RkOjpjb3V0IDw8ICJVbmV4cGVjdGVkIGZhbHNlIGF0ICIgXAogICAgICAgICAgICAJICAgICAgICAgIDw8IF9fRklMRV9fIDw8ICIsICIgPDwgX19MSU5FX18gPDwgIiwgIiA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8ICNhcmcgXAogICAgICAgICAgICAJICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsgfSBcCiAgICAgICAgfSB3aGlsZShmYWxzZSk7Cgp2b2lkIHRlc3RfZ2NkKCkgewogICAgZXhwZWN0X3RydWUoZ2NkKDE2LDI0KSA9PSA4KTsKICAgIGV4cGVjdF90cnVlKGdjZCgwLCAxOSkgPT0gMTkpOwogICAgYm9vbCBleGNlcHRpb25DYXVnaHQgPSBmYWxzZTsKICAgIHRyeSB7CiAgICAgICAgZ2NkKDUsIC0xNSk7CiAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmludmFsaWRfYXJndW1lbnQmIGV4KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJbGxlZ2FsIGFzIGV4cGVjdGVkIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgZXhjZXB0aW9uQ2F1Z2h0ID0gdHJ1ZTsKICAgIH0KICAgIGV4cGVjdF90cnVlKGV4Y2VwdGlvbkNhdWdodCk7Cn0KCmludCBtYWluKCkgewoJdGVzdF9nY2QoKTsKCXJldHVybiAwOwp9