浏览代码

Add test to ctkAbstractFactory

Julien Finet 14 年之前
父节点
当前提交
1caafa0599
共有 1 个文件被更改,包括 87 次插入1 次删除
  1. 87 1
      Libs/Core/Testing/Cpp/ctkAbstractFactoryTest1.cpp

+ 87 - 1
Libs/Core/Testing/Cpp/ctkAbstractFactoryTest1.cpp

@@ -29,13 +29,99 @@
 #include <cstdlib>
 #include <iostream>
 
+template<class BaseClassType>
+class FactoryItem : public ctkAbstractFactoryItem<BaseClassType>
+{
+public:
+  virtual bool load()
+    {
+    return true;
+    }
+protected:
+  /// Must be reimplemented in subclasses to instanciate a BaseClassType*
+  virtual BaseClassType* instanciator()
+    {
+    return new BaseClassType;
+    }
+};
+
+template<class BaseClassType>
+class Factory: public ctkAbstractFactory<BaseClassType>
+{
+public:
+  virtual void registerItems()
+  {
+    this->registerItem("item1", QSharedPointer<ctkAbstractFactoryItem<BaseClassType> >(new FactoryItem<BaseClassType>()));
+    this->registerItem("item2", QSharedPointer<ctkAbstractFactoryItem<BaseClassType> >(new FactoryItem<BaseClassType>()));
+  }
+};
+
+struct Item{
+};
 
 //-----------------------------------------------------------------------------
 int ctkAbstractFactoryTest1(int argc, char * argv [] )
 {
   QApplication app(argc, argv);
 
-  ctkAbstractFactory<ctkModelTester> factory;
+  ctkAbstractFactory<Item> abstractFactory;
+  abstractFactory.printAdditionalInfo();
+  
+  Item* item = abstractFactory.instantiate("unregistered item");
+  if (item != 0)
+    {
+    std::cerr << "ctkAbstractFactory::instantiate() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  abstractFactory.uninstantiate("uninstanced item");
+  if (!abstractFactory.path("wrong key").isEmpty())
+    {
+    std::cerr<< "ctkAbstractFactory::path() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  abstractFactory.registerItems();
+  if (abstractFactory.keys().count() != 0)
+    {
+    std::cerr<< "ctkAbstractFactory::keys() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  abstractFactory.setVerbose(true);
+  if (abstractFactory.verbose() != true)
+    {
+    std::cerr<< "ctkAbstractFactory::setVerbose() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  Factory<Item> factory;
+  factory.printAdditionalInfo();
+  
+  Item* item1 = factory.instantiate("item1");
+  if (item != 0)
+    {
+    std::cerr << "ctkAbstractFactory::instantiate() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  factory.uninstantiate("item1");
+  if (!factory.path("wrong key").isEmpty())
+    {
+    std::cerr<< "ctkAbstractFactory::path() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  factory.registerItems();
+  if (factory.keys().count() != 2 ||
+      factory.keys()[0] != "item1" || 
+      factory.keys()[1] != "item2")
+    {
+    std::cerr<< "ctkAbstractFactory::keys() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  item1 = factory.instantiate("item1");
+  if (item1 == 0)
+    {
+    std::cerr << "ctkAbstractFactory::instantiate() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  factory.uninstantiate("item1");
 
   return EXIT_SUCCESS;
 }