TEST_F(ModelFixture,ResourceObject_Clone) {
  Model original;
  Construction construction(original);
  construction.standardsInformation();
  StandardOpaqueMaterial material(original);
  bool ok = construction.setLayers(MaterialVector(1u,material));
  EXPECT_TRUE(ok);
  EXPECT_EQ(3u,original.numObjects()) << original;
  EXPECT_EQ(1u,construction.numLayers()) << construction;

  // clone into original
  Construction newConstruction = construction.clone(original).cast<Construction>();
  // self cloned
  EXPECT_FALSE(newConstruction == construction);
  EXPECT_TRUE(newConstruction.model() == construction.model());
  // child cloned
  EXPECT_EQ(2u,original.getModelObjects<StandardsInformationConstruction>().size()) << original;
  EXPECT_FALSE(newConstruction.standardsInformation() == construction.standardsInformation());
  EXPECT_EQ(2u,original.getModelObjects<StandardsInformationConstruction>().size()) << original;
  // resource not cloned
  EXPECT_EQ(1u,newConstruction.numLayers());
  EXPECT_TRUE(newConstruction.layers() == construction.layers());
  EXPECT_EQ(5u,original.numObjects()) << original;

  // clone into new model
  Model newModel;
  newConstruction = construction.clone(newModel).cast<Construction>();
  EXPECT_FALSE(newConstruction.model() == construction.model());
  EXPECT_EQ(3u,newModel.numObjects()) << newModel;
  EXPECT_EQ("Material 1",newConstruction.layers()[0].name().get());
  // clone again -- object and child added again, resource reused
  Construction anotherNewConstruction = construction.clone(newModel).cast<Construction>();
  EXPECT_FALSE(anotherNewConstruction == newConstruction);
  EXPECT_EQ(5u,newModel.numObjects()) << newModel;
  EXPECT_EQ("Material 1",anotherNewConstruction.layers()[0].name().get());
  // change resource data
  newConstruction.layers()[0].setName("Material with Changed Data");
  // clone again -- all added again
  anotherNewConstruction = construction.clone(newModel).cast<Construction>();
  EXPECT_EQ(8u,newModel.numObjects()) << newModel;
  EXPECT_EQ("Material with Changed Data",newConstruction.layers()[0].name().get());
  EXPECT_EQ("Material 1",anotherNewConstruction.layers()[0].name().get());
}