#include "SpBase.h" #include "SpTest.h" #include "SpTransactionContext.h" #include "SpEntity.h" #include #include namespace { class TestRegistry : public ITestCaseRegistry { public: TestRegistry() :m_unnamedCount(0) {} virtual ~TestRegistry() {} virtual void RegisterTest(TestCase const& testCase) { std::string name = testCase.GetTestInfo().strName; if (name.empty()) { std::ostringstream oss; oss << "Anonymous test case " << ++m_unnamedCount; return RegisterTest(testCase.CloneExceptName(oss.str())); } m_functions.push_back(testCase); } virtual std::vector const& getAllTests(TestConfig const& config) const { return m_functions; } private: std::vector m_functions; size_t m_unnamedCount; }; class CTestRegistryHub : public ITestRegistryHub { CTestRegistryHub(CTestRegistryHub const&) = delete; CTestRegistryHub& operator = (CTestRegistryHub const&) = delete; public: CTestRegistryHub() {} virtual void RegisterTest(TestCase const& testInfo) override { m_testCaseRegistry.RegisterTest(testInfo); } virtual ITestCaseRegistry const& GetTestCaseRegistry() const override { return m_testCaseRegistry; } private: TestRegistry m_testCaseRegistry; }; CTestRegistryHub*& getTheRegistryHub() { static CTestRegistryHub* theRegistryHub = nullptr; if (!theRegistryHub) { theRegistryHub = new CTestRegistryHub(); } return theRegistryHub; } } SPBASE_API ITestRegistryHub& GetRegistryHub() { return *getTheRegistryHub(); } SPBASE_API TestCase MakeTestCase(IMethodTestCase* testCase, std::string const& className, std::string const& name, std::string const& desc, SourceLineInfo const& lineInfo) { TestCaseInfo info(name, className, desc, lineInfo); return TestCase(testCase, info); } SPBASE_API void RegisterTestCaseFunction(TestFunction function, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo ) { RegisterTestCase(new DefaultFuncTestCase(function), "", nameAndDesc, lineInfo); } SPBASE_API void RegisterTestCase(IMethodTestCase* testCase, char const* className, NameAndDesc const& nameAndDesc, SourceLineInfo const& lineInfo) { GetRegistryHub().RegisterTest( MakeTestCase(testCase, SP::Utility::ExtractClassName(className), nameAndDesc.name, nameAndDesc.description, lineInfo )); } SPBASE_API CSmartPointer CreateMockTransactionContext(CSmartPointerconst& entityFunction) { CSmartPointer temp = entityFunction; CSmartPointer pTransactionContext; SpEntity* entity = temp.ConvertCase().GetRawPointer(); pTransactionContext.Attach(new SpMockTransactionContext(entity/*nullptr*/)); return pTransactionContext; }