| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <gtest/gtest.h> |
| |
|
| | #include <FCConfig.h> |
| |
|
| | #include <Base/Writer.h> |
| | #include <Base/Reader.h> |
| | #include <Base/Interpreter.h> |
| |
|
| | #include <App/Application.h> |
| | #include <App/AutoTransaction.h> |
| | #include <App/Document.h> |
| | #include <App/Expression.h> |
| | #include <App/ObjectIdentifier.h> |
| | #include <App/PropertyLinks.h> |
| | #include <App/PropertyStandard.h> |
| | #include <App/VarSet.h> |
| |
|
| | #include <src/App/InitApplication.h> |
| |
|
| | #include <xercesc/util/PlatformUtils.hpp> |
| |
|
| | #include "Property.h" |
| |
|
| | TEST(PropertyLink, TestSetValues) |
| | { |
| | App::PropertyLinkSubList prop; |
| | std::vector<App::DocumentObject*> objs {nullptr, nullptr}; |
| | std::vector<const char*> subs {"Sub1", "Sub2"}; |
| | prop.setValues(objs, subs); |
| | const auto& sub = prop.getSubValues(); |
| | EXPECT_EQ(sub.size(), 2); |
| | EXPECT_EQ(sub[0], "Sub1"); |
| | EXPECT_EQ(sub[1], "Sub2"); |
| | } |
| |
|
| | class PropertyFloatTest: public ::testing::Test |
| | { |
| | protected: |
| | static void SetUpTestSuite() |
| | { |
| | XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize(); |
| | } |
| | }; |
| |
|
| | TEST_F(PropertyFloatTest, testWriteRead) |
| | { |
| | #if defined(FC_OS_LINUX) || defined(FC_OS_BSD) |
| | setlocale(LC_ALL, ""); |
| | setlocale(LC_NUMERIC, "C"); |
| | #endif |
| | double value = 1.2345; |
| | App::PropertyFloat prop; |
| | prop.setValue(value); |
| | Base::StringWriter writer; |
| | prop.Save(writer); |
| |
|
| | std::string str = "<?xml version='1.0' encoding='utf-8'?>\n"; |
| | str.append("<Property name='Length' type='App::PropertyFloat'>\n"); |
| | str.append(writer.getString()); |
| | str.append("</Property>\n"); |
| |
|
| | std::stringstream data(str); |
| | Base::XMLReader reader("Document.xml", data); |
| | App::PropertyFloat prop2; |
| | prop2.Restore(reader); |
| | EXPECT_DOUBLE_EQ(prop2.getValue(), value); |
| | } |
| |
|
| | std::string RenameProperty::_docName; |
| | App::Document* RenameProperty::_doc {nullptr}; |
| |
|
| | |
| | TEST_F(RenameProperty, renameProperty) |
| | { |
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renamePropertyPython) |
| | { |
| | |
| | Base::Interpreter().runString( |
| | "App.ActiveDocument.getObject('VarSet').renameProperty('Variable', 'NewName')" |
| | ); |
| |
|
| | |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renamePropertyChain) |
| | { |
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "Name1"); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Name1"); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Name1"), prop); |
| |
|
| | |
| | auto prop1 = freecad_cast<App::PropertyInteger*>(varSet->getDynamicPropertyByName("Name1")); |
| | isRenamed = varSet->renameDynamicProperty(prop1, "Name2"); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_EQ(prop, prop1); |
| | EXPECT_STREQ(varSet->getPropertyName(prop1), "Name2"); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Name1"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Name2"), prop1); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renameStaticProperty) |
| | { |
| | |
| | App::Property* prop = varSet->getPropertyByName("Label"); |
| |
|
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "MyLabel"); |
| |
|
| | |
| | EXPECT_FALSE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Label"); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("MyLabel"), nullptr); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renameStaticPropertyPython) |
| | { |
| | |
| | App::Property* prop = varSet->getPropertyByName("Label"); |
| |
|
| | |
| | EXPECT_THROW( |
| | Base::Interpreter().runString( |
| | "App.ActiveDocument.getObject('VarSet006').renameProperty('Label', 'NewName')" |
| | ), |
| | Base::Exception |
| | ); |
| |
|
| | |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Label"); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), nullptr); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renameLockedProperty) |
| | { |
| | |
| | prop->setStatus(App::Property::LockDynamic, true); |
| |
|
| | |
| | EXPECT_THROW(varSet->renameDynamicProperty(prop, "NewName"), Base::RuntimeError); |
| |
|
| | |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Variable"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), prop); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), nullptr); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renameToExistingProperty) |
| | { |
| | |
| | App::Property* prop2 = varSet->addDynamicProperty("App::PropertyInteger", "Variable2", "Variables"); |
| |
|
| | |
| | EXPECT_THROW(varSet->renameDynamicProperty(prop2, "Variable"), Base::NameError); |
| |
|
| | |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Variable"); |
| | EXPECT_STREQ(varSet->getPropertyName(prop2), "Variable2"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), prop); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable2"), prop2); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renameToInvalidProperty) |
| | { |
| | |
| | EXPECT_THROW(varSet->renameDynamicProperty(prop, "0Variable"), Base::NameError); |
| |
|
| | |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Variable"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), prop); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("0Variable"), nullptr); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, updateExpressionSameContainer) |
| | { |
| | |
| | const auto* prop2 = freecad_cast<App::PropertyInteger*>( |
| | varSet->addDynamicProperty("App::PropertyInteger", "Variable2", "Variables") |
| | ); |
| |
|
| | App::ObjectIdentifier path(*prop2); |
| | std::shared_ptr<App::Expression> expr(App::Expression::parse(varSet, "Variable")); |
| | varSet->setExpression(path, expr); |
| | varSet->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(prop2->getValue(), Value); |
| |
|
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| | varSet->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| | EXPECT_EQ(prop2->getValue(), Value); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, updateExpressionDifferentContainer) |
| | { |
| | |
| | auto* varSet2 = freecad_cast<App::VarSet*>(_doc->addObject("App::VarSet", "VarSet2")); |
| | const auto* prop2 = freecad_cast<App::PropertyInteger*>( |
| | varSet2->addDynamicProperty("App::PropertyInteger", "Variable2", "Variables") |
| | ); |
| |
|
| | App::ObjectIdentifier path(*prop2); |
| | std::shared_ptr<App::Expression> expr(App::Expression::parse(varSet, "VarSet.Variable")); |
| | varSet2->setExpression(path, expr); |
| | varSet2->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(prop2->getValue(), Value); |
| |
|
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| | varSet2->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| | EXPECT_EQ(prop2->getValue(), Value); |
| |
|
| | |
| | _doc->removeObject(varSet2->getNameInDocument()); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, updateExpressionDifferentDocument) |
| | { |
| | |
| | std::string docName = App::GetApplication().getUniqueDocumentName("test2"); |
| | App::Document* doc = App::GetApplication().newDocument(docName.c_str(), "testUser"); |
| |
|
| | auto* varSet2 = freecad_cast<App::VarSet*>(doc->addObject("App::VarSet", "VarSet2")); |
| | const auto* prop2 = freecad_cast<App::PropertyInteger*>( |
| | varSet2->addDynamicProperty("App::PropertyInteger", "Variable2", "Variables") |
| | ); |
| |
|
| | App::ObjectIdentifier path(*prop2); |
| | std::shared_ptr<App::Expression> expr(App::Expression::parse(varSet, "test#VarSet.Variable")); |
| | _doc->saveAs("test.FCStd"); |
| | doc->saveAs("test2.FCStd"); |
| | varSet2->setExpression(path, expr); |
| | varSet2->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(prop2->getValue(), Value); |
| |
|
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| | varSet2->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| | EXPECT_EQ(prop2->getValue(), Value); |
| |
|
| | |
| | doc->removeObject(varSet2->getNameInDocument()); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, renamePropertyWithExpression) |
| | { |
| | |
| | auto* prop2 = freecad_cast<App::PropertyInteger*>( |
| | varSet->addDynamicProperty("App::PropertyInteger", "Variable2", "Variables") |
| | ); |
| | prop2->setValue(Value); |
| |
|
| | App::ObjectIdentifier path(*prop); |
| | std::shared_ptr<App::Expression> expr(App::Expression::parse(varSet, "Variable2")); |
| | varSet->setExpression(path, expr); |
| | varSet->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_EQ(prop2->getValue(), Value); |
| | EXPECT_EQ(prop->getValue(), Value); |
| |
|
| | |
| | bool isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| | varSet->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| |
|
| | |
| | prop2->setValue(Value + 1); |
| | varSet->ExpressionEngine.execute(); |
| |
|
| | |
| | EXPECT_EQ(prop2->getValue(), Value + 1); |
| | EXPECT_EQ(prop->getValue(), Value + 1); |
| | } |
| |
|
| | |
| | TEST_F(RenameProperty, undoRenameProperty) |
| | { |
| | |
| | _doc->setUndoMode(1); |
| |
|
| | |
| | bool isRenamed = false; |
| | { |
| | App::AutoTransaction transaction("Rename Property"); |
| | isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| | } |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| |
|
| | |
| | bool undone = _doc->undo(); |
| |
|
| | |
| | EXPECT_TRUE(undone); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Variable"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), prop); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), nullptr); |
| | } |
| |
|
| |
|
| | |
| | TEST_F(RenameProperty, redoRenameProperty) |
| | { |
| | |
| | _doc->setUndoMode(1); |
| |
|
| | |
| | bool isRenamed = false; |
| | { |
| | App::AutoTransaction transaction("Rename Property"); |
| | isRenamed = varSet->renameDynamicProperty(prop, "NewName"); |
| | } |
| |
|
| | |
| | EXPECT_TRUE(isRenamed); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| |
|
| | |
| | bool undone = _doc->undo(); |
| |
|
| | |
| | EXPECT_TRUE(undone); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "Variable"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), prop); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), nullptr); |
| |
|
| | |
| | bool redone = _doc->redo(); |
| | EXPECT_TRUE(redone); |
| | EXPECT_STREQ(varSet->getPropertyName(prop), "NewName"); |
| | EXPECT_EQ(prop->getValue(), Value); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("Variable"), nullptr); |
| | EXPECT_EQ(varSet->getDynamicPropertyByName("NewName"), prop); |
| | } |
| |
|