blob: 8b0e737c50642abccb72ab8681e1e6f5f3666dde [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <cstdint>
#include <memory>
#include <vector>
#include "src/developer/shell/common/result.h"
#include "src/developer/shell/interpreter/test/interpreter_test.h"
#define EmitResultTest(name, type, left, right, result) \
TEST_F(InterpreterTest, name) { \
constexpr uint64_t kFileId = 1; \
InterpreterTestContext* context = CreateContext(); \
shell().CreateExecutionContext(context->id); \
\
shell::console::AstBuilder builder(kFileId); \
builder.AddVariableDeclaration("x", type, \
(left < 0) ? builder.AddIntegerLiteral(-left, true) \
: builder.AddIntegerLiteral(left, false), \
false, true); \
builder.AddEmitResult(builder.AddAddition(false, builder.AddVariable("x"), \
(right < 0) \
? builder.AddIntegerLiteral(-right, true) \
: builder.AddIntegerLiteral(right, false))); \
\
shell().AddNodes(context->id, builder.DefsAsVectorView()); \
shell().ExecuteExecutionContext(context->id); \
Finish(kExecute); \
\
ASSERT_EQ(fuchsia_shell::wire::ExecuteResult::kOk, context->GetResult()); \
\
CHECK_RESULT(0, result); \
}
EmitResultTest(EmitResultInt8, builder.TypeInt8(), 10, -30, "-20");
EmitResultTest(EmitResultUint8, builder.TypeUint8(), 10, 30, "40");
EmitResultTest(EmitResultInt16, builder.TypeInt16(), 1000, -3000, "-2000");
EmitResultTest(EmitResultUint16, builder.TypeUint16(), 1000, 3000, "4000");
EmitResultTest(EmitResultInt32, builder.TypeInt32(), 100000, -300000, "-200000");
EmitResultTest(EmitResultUint32, builder.TypeUint32(), 100000, 300000, "400000");
EmitResultTest(EmitResultInt64, builder.TypeInt64(), 10000000000LL, -30000000000LL, "-20000000000");
EmitResultTest(EmitResultUint64, builder.TypeUint64(), 10000000000LL, 30000000000LL, "40000000000");
TEST_F(InterpreterTest, EmitResultString) {
constexpr uint64_t kFileId = 1;
InterpreterTestContext* context = CreateContext();
shell().CreateExecutionContext(context->id);
shell::console::AstBuilder builder(kFileId);
builder.AddVariableDeclaration("good", builder.TypeString(), builder.AddStringLiteral("good"),
/*is_const=*/false, /*is_root=*/true);
builder.AddEmitResult(builder.AddAddition(/*with_exceptions=*/true, builder.AddVariable("good"),
builder.AddStringLiteral(" morning")));
shell().AddNodes(context->id, builder.DefsAsVectorView());
shell().ExecuteExecutionContext(context->id);
Finish(kExecute);
ASSERT_EQ(fuchsia_shell::wire::ExecuteResult::kOk, context->GetResult());
CHECK_RESULT(0, "\"good morning\"");
}
TEST_F(InterpreterTest, EmitObject) {
constexpr uint64_t kFileId = 1;
InterpreterTestContext* context = CreateContext();
ASSERT_CALL_OK(shell().CreateExecutionContext(context->id));
shell::console::AstBuilder builder(kFileId);
builder.OpenObject();
shell::console::AstBuilder::NodePair obj1 = builder.CloseObject();
builder.AddVariableDeclaration("obj1", builder.TypeObject(obj1.schema_node), obj1.value_node,
/*is_const=*/false, /*is_root=*/true);
builder.AddEmitResult(builder.AddVariable("obj1"));
builder.OpenObject();
builder.AddField("alpha", builder.AddIntegerLiteral(100, false), builder.TypeUint64());
builder.AddField("beta", builder.AddStringLiteral("hello"), builder.TypeString());
shell::console::AstBuilder::NodePair obj2 = builder.CloseObject();
builder.AddEmitResult(obj2.value_node);
ASSERT_CALL_OK(shell().AddNodes(context->id, builder.DefsAsVectorView()));
ASSERT_CALL_OK(shell().ExecuteExecutionContext(context->id));
Finish(kExecute);
ASSERT_EQ(fuchsia_shell::wire::ExecuteResult::kOk, context->GetResult());
CHECK_RESULT(0, "{}");
CHECK_RESULT(1, "{alpha: uint64(100), beta: string(\"hello\")}");
}
TEST_F(InterpreterTest, EmitMultipleResults) {
constexpr uint64_t kFileId = 1;
InterpreterTestContext* context = CreateContext();
shell().CreateExecutionContext(context->id);
shell::console::AstBuilder builder(kFileId);
builder.AddVariableDeclaration("x", builder.TypeInt64(), builder.AddIntegerLiteral(1250, false),
/*is_const=*/false, /*is_root=*/true);
builder.AddEmitResult(builder.AddAddition(/*with_exceptions=*/false, builder.AddVariable("x"),
builder.AddIntegerLiteral(3000, true)));
builder.AddEmitResult(builder.AddAddition(/*with_exceptions=*/false, builder.AddVariable("x"),
builder.AddIntegerLiteral(3000, false)));
builder.AddEmitResult(builder.AddAddition(/*with_exceptions=*/false, builder.AddVariable("x"),
builder.AddIntegerLiteral(1000, true)));
shell().AddNodes(context->id, builder.DefsAsVectorView());
shell().ExecuteExecutionContext(context->id);
Finish(kExecute);
ASSERT_EQ(fuchsia_shell::wire::ExecuteResult::kOk, context->GetResult());
CHECK_RESULT(0, "-1750");
CHECK_RESULT(1, "4250");
CHECK_RESULT(2, "250");
}