///////////////////////////////////////////////////////////////////////// // MT1Q4.cpp - Demonstrate ITest interface with factory function // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2009 // ///////////////////////////////////////////////////////////////////////// #include #include #define TESTMODULE2 struct ITest { virtual bool test()=0; virtual std::string name()=0; static ITest* Create(); virtual ~ITest() {} }; #ifdef TESTMODULE1 class Module1 { public: void opA(std::string& s) { s = "Lucretia Borge"; } std::string opB(const std::string& s) { if(s == "Arnold") return "terminator"; if(s == "Wiley") return "cayote"; // note misspelled if(s == "Luke") return "Darth"; return "Don't know"; } }; class Module1Test : public ITest { public: bool test() { if(mod.opB("Arnold") != "terminator") return false; if(mod.opB("Wiley") != "Coyote") return false; // fails due to spelling error in Module1 if(mod.opB("Luke") != "Darth") return false; std::string s = "ardvark"; mod.opA(s); if(s != "Lucretia Borge") return false; return true; } std::string name() { return "Module1Test"; } private: Module1 mod; }; ITest* ITest::Create() { return new Module1Test; } #endif #ifdef TESTMODULE2 class Module2 { public: void func() { std::cout << "\n running Module2"; } }; class Module2Test : public ITest { public: bool test() { mod.func(); // anything module2 does is correct :-) return true; } std::string name() { return "Module2Test"; } private: Module2 mod; }; ITest* ITest::Create() { return new Module2Test; } #endif #ifdef TESTMODULE3 class Module3 { public: int comp() { throw std::exception("bad test"); } }; class Module3Test : public ITest { public: bool test() { try { int z = mod.comp(); return (z!=0); } catch (std::exception& ex) { std::cout << "\n " << ex.what(); return false; } } std::string name() { return "Module3Test"; } private: Module3 mod; }; ITest* ITest::Create() { return new Module3Test; } #endif void main() { std::cout << "\n Demonstrating ITest interface"; std::cout << "\n ===============================\n"; ITest* pTest1 = ITest::Create(); std::cout << "\n " << pTest1->name() << " " << ((pTest1->test()) ? "passed" : "failed") << "\n\n"; }