From 9796e68db6e5f5be1d64f429c1b4356618a6d93c Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:11:39 +0200 Subject: [PATCH 1/2] Add clone method to Variable --- include/scratchcpp/variable.h | 2 ++ src/scratch/sprite.cpp | 2 +- src/scratch/variable.cpp | 6 ++++++ test/scratch_classes/variable_test.cpp | 20 ++++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/scratchcpp/variable.h b/include/scratchcpp/variable.h index 9dc644f5..54e58ab2 100644 --- a/include/scratchcpp/variable.h +++ b/include/scratchcpp/variable.h @@ -29,6 +29,8 @@ class LIBSCRATCHCPP_EXPORT Variable : public Entity bool isCloudVariable() const; void setIsCloudVariable(bool isCloudVariable); + std::shared_ptr clone(); + private: spimpl::unique_impl_ptr impl; }; diff --git a/src/scratch/sprite.cpp b/src/scratch/sprite.cpp index 787d36f8..3378390f 100644 --- a/src/scratch/sprite.cpp +++ b/src/scratch/sprite.cpp @@ -57,7 +57,7 @@ std::shared_ptr Sprite::clone() const auto &vars = variables(); for (auto var : vars) - clone->addVariable(std::make_shared(var->id(), var->name(), var->value())); + clone->addVariable(var->clone()); const auto &l = lists(); diff --git a/src/scratch/variable.cpp b/src/scratch/variable.cpp index 87b15600..6edf7450 100644 --- a/src/scratch/variable.cpp +++ b/src/scratch/variable.cpp @@ -48,3 +48,9 @@ void Variable::setIsCloudVariable(bool isCloudVariable) { impl->isCloudVariable = isCloudVariable; } + +/*! Creates a copy of the variable. */ +std::shared_ptr Variable::clone() +{ + return std::make_shared(id(), impl->name, impl->value, impl->isCloudVariable); +} diff --git a/test/scratch_classes/variable_test.cpp b/test/scratch_classes/variable_test.cpp index 265af866..4613b004 100644 --- a/test/scratch_classes/variable_test.cpp +++ b/test/scratch_classes/variable_test.cpp @@ -56,3 +56,23 @@ TEST(VariableTest, IsCloudVariable) var.setIsCloudVariable(true); ASSERT_TRUE(var.isCloudVariable()); } + +TEST(VariableTest, Clone) +{ + std::shared_ptr clone; + std::vector> vars; + + vars.push_back(std::make_shared("abc", "var1")); + vars.push_back(std::make_shared("abc", "var2", "test")); + vars.push_back(std::make_shared("abc", "var3", "test", true)); + vars.push_back(std::make_shared("abc", "var4", "test", false)); + + for (auto var : vars) { + clone = var->clone(); + ASSERT_TRUE(clone); + ASSERT_EQ(clone->id(), var->id()); + ASSERT_EQ(clone->name(), var->name()); + ASSERT_EQ(clone->value(), var->value()); + ASSERT_EQ(clone->isCloudVariable(), var->isCloudVariable()); + } +} From d13078b5fb8029a47ac22cdac1046cd3d0ddf750 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:26:05 +0200 Subject: [PATCH 2/2] Add clone method to List --- include/scratchcpp/list.h | 2 ++ src/scratch/list.cpp | 11 +++++++++++ src/scratch/sprite.cpp | 9 ++------- test/scratch_classes/list_test.cpp | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/include/scratchcpp/list.h b/include/scratchcpp/list.h index daa1887d..bd4be76c 100644 --- a/include/scratchcpp/list.h +++ b/include/scratchcpp/list.h @@ -39,6 +39,8 @@ class LIBSCRATCHCPP_EXPORT List std::string toString() const; + std::shared_ptr clone(); + private: spimpl::unique_impl_ptr impl; }; diff --git a/src/scratch/list.cpp b/src/scratch/list.cpp index db958547..3ac5d472 100644 --- a/src/scratch/list.cpp +++ b/src/scratch/list.cpp @@ -76,3 +76,14 @@ std::string List::toString() const return ret; } + +/*! Creates a copy of the list. */ +std::shared_ptr List::clone() +{ + auto copy = std::make_shared(id(), impl->name); + + for (const Value &item : *this) + copy->push_back(item); + + return copy; +} diff --git a/src/scratch/sprite.cpp b/src/scratch/sprite.cpp index 3378390f..85c30317 100644 --- a/src/scratch/sprite.cpp +++ b/src/scratch/sprite.cpp @@ -61,13 +61,8 @@ std::shared_ptr Sprite::clone() const auto &l = lists(); - for (auto list : l) { - auto newList = std::make_shared(list->id(), list->name()); - clone->addList(newList); - - for (const Value &item : *list) - newList->push_back(item); - } + for (auto list : l) + clone->addList(list->clone()); clone->setCurrentCostume(currentCostume()); clone->setLayerOrder(layerOrder()); diff --git a/test/scratch_classes/list_test.cpp b/test/scratch_classes/list_test.cpp index 4464d666..9e1c9f1f 100644 --- a/test/scratch_classes/list_test.cpp +++ b/test/scratch_classes/list_test.cpp @@ -170,3 +170,22 @@ TEST(ListTest, ToString) list.push_back(8); ASSERT_EQ(list.toString(), "098"); } + +TEST(ListTest, Clone) +{ + List list("abc", "test list"); + list.push_back("Lorem"); + list.push_back("ipsum"); + list.push_back("dolor"); + list.push_back("sit"); + list.push_back("amet"); + + std::shared_ptr clone = list.clone(); + ASSERT_TRUE(clone); + ASSERT_EQ(clone->id(), list.id()); + ASSERT_EQ(clone->name(), list.name()); + ASSERT_EQ(clone->size(), list.size()); + + for (std::size_t i = 0; i < list.size(); i++) + ASSERT_EQ(list[i], (*clone)[i]); +}