Skip to content

Commit 7ed99b5

Browse files
committed
Implement data_variable
1 parent 7e8502a commit 7ed99b5

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

src/dev/blocks/variableblocks.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
// SPDX-License-Identifier: Apache-2.0
22

3+
#include <scratchcpp/iengine.h>
4+
#include <scratchcpp/dev/compiler.h>
5+
#include <scratchcpp/dev/compilerconstant.h>
6+
#include <scratchcpp/input.h>
7+
#include <scratchcpp/field.h>
8+
#include <scratchcpp/variable.h>
9+
310
#include "variableblocks.h"
411

512
using namespace libscratchcpp;
@@ -16,4 +23,17 @@ std::string VariableBlocks::description() const
1623

1724
void VariableBlocks::registerBlocks(IEngine *engine)
1825
{
26+
engine->addCompileFunction(this, "data_variable", &compileVariable);
27+
}
28+
29+
CompilerValue *VariableBlocks::compileVariable(Compiler *compiler)
30+
{
31+
Field *varField = compiler->field("VARIABLE");
32+
Variable *var = static_cast<Variable *>(varField->valuePtr().get());
33+
assert(var);
34+
35+
if (var)
36+
return compiler->addVariableValue(var);
37+
else
38+
return compiler->addConstValue(Value());
1939
}

src/dev/blocks/variableblocks.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class VariableBlocks : public IExtension
1414
std::string description() const override;
1515

1616
void registerBlocks(IEngine *engine) override;
17+
18+
private:
19+
static CompilerValue *compileVariable(Compiler *compiler);
1720
};
1821

1922
} // namespace libscratchcpp
Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,56 @@
1+
#include <scratchcpp/project.h>
2+
#include <scratchcpp/sprite.h>
3+
#include <scratchcpp/variable.h>
4+
#include <scratchcpp/list.h>
5+
#include <scratchcpp/dev/compiler.h>
6+
#include <scratchcpp/dev/test/scriptbuilder.h>
17
#include <enginemock.h>
28

39
#include "../common.h"
410
#include "dev/blocks/variableblocks.h"
511

612
using namespace libscratchcpp;
13+
using namespace libscratchcpp::test;
714

815
class VariableBlocksTest : public testing::Test
916
{
1017
public:
11-
void SetUp() override { m_extension = std::make_unique<VariableBlocks>(); }
18+
void SetUp() override
19+
{
20+
m_extension = std::make_unique<VariableBlocks>();
21+
m_engine = m_project.engine().get();
22+
m_extension->registerBlocks(m_engine);
23+
}
1224

1325
std::unique_ptr<IExtension> m_extension;
26+
Project m_project;
27+
IEngine *m_engine = nullptr;
1428
EngineMock m_engineMock;
1529
};
30+
31+
TEST_F(VariableBlocksTest, Variable)
32+
{
33+
auto target = std::make_shared<Sprite>();
34+
auto var1 = std::make_shared<Variable>("", "", 835.21);
35+
target->addVariable(var1);
36+
auto var2 = std::make_shared<Variable>("", "", "Hello world");
37+
target->addVariable(var2);
38+
ScriptBuilder builder(m_extension.get(), m_engine, target);
39+
40+
builder.addBlock("data_variable");
41+
builder.addEntityField("VARIABLE", var1);
42+
builder.captureBlockReturnValue();
43+
44+
builder.addBlock("data_variable");
45+
builder.addEntityField("VARIABLE", var2);
46+
builder.captureBlockReturnValue();
47+
48+
builder.build();
49+
builder.run();
50+
51+
List *valueList = builder.capturedValues();
52+
ValueData *values = valueList->data();
53+
ASSERT_EQ(valueList->size(), 2);
54+
ASSERT_EQ(Value(values[0]), 835.21);
55+
ASSERT_EQ(Value(values[1]), "Hello world");
56+
}

0 commit comments

Comments
 (0)