diff --git a/src/Mod/Test/BaseTests.py b/src/Mod/Test/BaseTests.py index 92903d5da6..b07323552d 100644 --- a/src/Mod/Test/BaseTests.py +++ b/src/Mod/Test/BaseTests.py @@ -101,6 +101,11 @@ class ConsoleTestCase(unittest.TestCase): def tearDown(self): pass + def testILoggerBlocker(self): + if FreeCAD.GuiUp: + import QtUnitGui + QtUnitGui.testILoggerBlocker() + class ParameterTestCase(unittest.TestCase): def setUp(self): self.TestPar = FreeCAD.ParamGet("System parameter:Test") diff --git a/src/Mod/Test/Gui/AppTestGui.cpp b/src/Mod/Test/Gui/AppTestGui.cpp index 600171ec9b..fe0ef4830e 100644 --- a/src/Mod/Test/Gui/AppTestGui.cpp +++ b/src/Mod/Test/Gui/AppTestGui.cpp @@ -27,8 +27,87 @@ #include #include +#include #include +class ILoggerBlockerTest : public Base::ILogger +{ +public: + virtual ~ILoggerBlockerTest() {Base::Console().DetachObserver(this);} + + virtual const char *Name() {return "ILoggerBlockerTest";} + + void flush() {buffer.str("");buffer.clear();} + + void SendLog(const std::string& msg, Base::LogStyle level){ + (void) msg; + switch(level){ + case Base::LogStyle::Warning: + buffer << "WRN"; + break; + case Base::LogStyle::Message: + buffer << "MSG"; + break; + case Base::LogStyle::Error: + buffer << "ERR"; + break; + case Base::LogStyle::Log: + buffer << "LOG"; + break; + } + } + + void runSingleTest(const char* comment, std::string expectedResult) { + Base::Console().Log(comment); + flush(); + Base::Console().Log("LOG"); + Base::Console().Message("MSG"); + Base::Console().Warning("WRN"); + Base::Console().Error("ERR"); + if (buffer.str() != expectedResult) + throw Py::RuntimeError("ILoggerTest: " + buffer.str() + " different from " + expectedResult); + }; + + void runTest() + { + runSingleTest("Print all message types", "LOGMSGWRNERR"); + { + Base::ILoggerBlocker blocker("ILoggerBlockerTest"); + runSingleTest("All types blocked", ""); + } + runSingleTest("Print all", "LOGMSGWRNERR"); + { + Base::ILoggerBlocker blocker("ILoggerBlockerTest", Base::ConsoleSingleton::MsgType_Err | Base::ConsoleSingleton::MsgType_Wrn); + runSingleTest("Error & Warning blocked", "LOGMSG"); + } + runSingleTest("Print all", "LOGMSGWRNERR"); + { + Base::ILoggerBlocker blocker("ILoggerBlockerTest", Base::ConsoleSingleton::MsgType_Log | Base::ConsoleSingleton::MsgType_Txt); + runSingleTest("Log & Message blocked", "WRNERR"); + } + runSingleTest("Print all", "LOGMSGWRNERR"); + { + Base::ILoggerBlocker blocker("ILoggerBlockerTest", Base::ConsoleSingleton::MsgType_Err); + runSingleTest("Nested : Error blocked", "LOGMSGWRN"); + { + Base::ILoggerBlocker blocker2("ILoggerBlockerTest", Base::ConsoleSingleton::MsgType_Err | Base::ConsoleSingleton::MsgType_Wrn); + runSingleTest("Nested : Warning blocked + Error (from nesting) + Error (redundancy)", "LOGMSG"); + } + runSingleTest("Nested : Error still blocked", "LOGMSGWRN"); + } + runSingleTest("Print all", "LOGMSGWRNERR"); + { + Base::ILoggerBlocker blocker("ILoggerBlockerTest"); + Base::Console().SetEnabledMsgType("ILoggerBlockerTest", Base::ConsoleSingleton::MsgType_Log, true); + runSingleTest("Log is enabled but a warning is triggered in debug mode", "LOG"); + } + runSingleTest("Print all", "LOGMSGWRNERR"); + }; + +private: + std::ostringstream buffer; +}; + namespace TestGui { class Module : public Py::ExtensionModule @@ -41,6 +120,7 @@ public: add_varargs_method("UnitTest",&Module::new_UnitTest,"UnitTest"); add_varargs_method("setTest",&Module::setTest,"setTest"); add_varargs_method("addTest",&Module::addTest,"addTest"); + add_varargs_method("testILoggerBlocker",&Module::testILoggerBlocker,"testILoggerBlocker"); initialize("This module is the QtUnitGui module"); // register with Python } @@ -79,6 +159,13 @@ private: dlg->raise(); return Py::None(); } + Py::Object testILoggerBlocker(const Py::Tuple& args) { + (void) args; + ILoggerBlockerTest iltest; + Base::Console().AttachObserver(static_cast(&iltest)); + iltest.runTest(); + return Py::None(); + } }; PyObject* initModule()