#include #include #include #include static void test1() { // Standard behavior auto logger = QPDFLogger::defaultLogger(); logger->info("info to stdout\n"); logger->warn("warn to stderr\n"); logger->error("error to stderr\n"); assert(logger->getSave(true) == nullptr); try { logger->getSave(); assert(false); } catch (std::logic_error& e) { *(logger->getInfo()) << "getSave exception: " << e.what() << "\n"; } try { logger->saveToStandardOutput(true); assert(false); } catch (std::logic_error& e) { *(logger->getInfo()) << "saveToStandardOutput exception: " << e.what() << "\n"; } logger->setWarn(logger->discard()); logger->warn("warning not seen\n"); logger->setWarn(nullptr); logger->warn("restored warning to stderr\n"); } static void test2() { // First call saveToStandardOutput. Then use info, which then to // go stderr. QPDFLogger l; l.saveToStandardOutput(true); l.info(std::string("info to stderr\n")); *(l.getSave()) << "save to stdout\n"; l.setInfo(nullptr); l.info("info still to stderr\n"); l.setSave(nullptr, false); l.setInfo(nullptr); l.info("info back to stdout\n"); } static void test3() { // Error/warning QPDFLogger l; // Warning follows error when error is set explicitly. std::string errors; auto pl_error = std::make_shared("errors", nullptr, errors); l.setError(pl_error); l.warn("warn follows error\n"); assert(errors == "warn follows error\n"); l.error("error too\n"); assert(errors == "warn follows error\nerror too\n"); // Set warnings -- now they're separate std::string warnings; auto pl_warn = std::make_shared("warnings", nullptr, warnings); l.setWarn(pl_warn); l.warn(std::string("warning now separate\n")); l.error(std::string("new error\n")); assert(warnings == "warning now separate\n"); assert(errors == "warn follows error\nerror too\nnew error\n"); std::string errors2; pl_error = std::make_shared("errors", nullptr, errors2); l.setError(pl_error); l.warn("new warning\n"); l.error("another new error\n"); assert(warnings == "warning now separate\nnew warning\n"); assert(errors == "warn follows error\nerror too\nnew error\n"); assert(errors2 == "another new error\n"); // Restore warnings to default -- follows error again l.setWarn(nullptr); l.warn("warning 3\n"); l.error("error 3\n"); assert(warnings == "warning now separate\nnew warning\n"); assert(errors == "warn follows error\nerror too\nnew error\n"); assert(errors2 == "another new error\nwarning 3\nerror 3\n"); // Restore everything to default l.setInfo(nullptr); l.setWarn(nullptr); l.setError(nullptr); l.info("after reset, info to stdout\n"); l.warn("after reset, warn to stderr\n"); l.error("after reset, error to stderr\n"); } int main() { test1(); test2(); test3(); return 0; }