blob: 5e932691275a7fcd3891c32dcf922d2a79c356f5 [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkStream.h"
#include "src/sksl/codegen/SkVMDebugTrace.h"
#include "tests/Test.h"
DEF_TEST(SkVMDebugTraceSetSource, r) {
SkSL::SkVMDebugTrace i;
i.setSource("SkVMDebugTrace::setSource unit test\n"
"\t// first line\n"
"\t// second line\n"
"\t// third line");
REPORTER_ASSERT(r, i.fSource.size() == 4);
REPORTER_ASSERT(r, i.fSource[0] == "SkVMDebugTrace::setSource unit test");
REPORTER_ASSERT(r, i.fSource[1] == "\t// first line");
REPORTER_ASSERT(r, i.fSource[2] == "\t// second line");
REPORTER_ASSERT(r, i.fSource[3] == "\t// third line");
}
DEF_TEST(SkVMDebugTraceSetSourceReplacesExistingText, r) {
SkSL::SkVMDebugTrace i;
i.setSource("One");
i.setSource("Two");
i.setSource("Three");
REPORTER_ASSERT(r, i.fSource.size() == 1);
REPORTER_ASSERT(r, i.fSource[0] == "Three");
}
DEF_TEST(SkVMDebugTraceWrite, r) {
SkSL::SkVMDebugTrace i;
i.fSource = {
"\t// first line",
"// \"second line\"",
"//\\\\//\\\\ third line",
};
i.fSlotInfo = {
{"SkVM_DebugTrace", 1, 2, 3, (SkSL::Type::NumberKind)4, 5},
{"Unit_Test", 6, 7, 8, (SkSL::Type::NumberKind)9, 10},
};
i.fFuncInfo = {
{"void testFunc();"},
};
i.fTraceInfo = {
{SkSL::SkVMTraceInfo::Op::kEnter, {0, 0}},
{SkSL::SkVMTraceInfo::Op::kLine, {5, 0}},
{SkSL::SkVMTraceInfo::Op::kVar, {10, 15}},
{SkSL::SkVMTraceInfo::Op::kExit, {20, 0}},
};
SkDynamicMemoryWStream wstream;
i.writeTrace(&wstream);
sk_sp<SkData> trace = wstream.detachAsData();
static constexpr char kExpected[] =
R"({"source":["\t// first line","// \"second line\"","//\\\\//\\\\ third line"],"s)"
R"(lots":[{"slot":0,"name":"SkVM_DebugTrace","columns":1,"rows":2,"index":3,"kind")"
R"(:4,"line":5},{"slot":1,"name":"Unit_Test","columns":6,"rows":7,"index":8,"kind")"
R"(:9,"line":10}],"functions":[{"slot":0,"name":"void testFunc();"}],"trace":[[2],)"
R"([0,5],[1,10,15],[3,20]]})";
skstd::string_view actual{reinterpret_cast<const char*>(trace->bytes()), trace->size()};
REPORTER_ASSERT(r, actual == kExpected,
"Expected:\n %s\n\n Actual:\n %.*s\n",
kExpected, (int)actual.size(), actual.data());
}
DEF_TEST(SkVMDebugTraceRead, r) {
const skstd::string_view kJSONTrace =
R"({"source":["\t// first line","// \"second line\"","//\\\\//\\\\ third line"],"s)"
R"(lots":[{"slot":0,"name":"SkVM_DebugTrace","columns":1,"rows":2,"index":3,"kind")"
R"(:4,"line":5},{"slot":1,"name":"Unit_Test","columns":6,"rows":7,"index":8,"kind")"
R"(:9,"line":10}],"functions":[{"slot":0,"name":"void testFunc();"}],"trace":[[2],)"
R"([0,5],[1,10,15],[3,20]]})";
SkMemoryStream stream(kJSONTrace.data(), kJSONTrace.size(), /*copyData=*/false);
SkSL::SkVMDebugTrace i;
REPORTER_ASSERT(r, i.readTrace(&stream));
REPORTER_ASSERT(r, i.fSource.size() == 3);
REPORTER_ASSERT(r, i.fSlotInfo.size() == 2);
REPORTER_ASSERT(r, i.fFuncInfo.size() == 1);
REPORTER_ASSERT(r, i.fTraceInfo.size() == 4);
REPORTER_ASSERT(r, i.fSource[0] == "\t// first line");
REPORTER_ASSERT(r, i.fSource[1] == "// \"second line\"");
REPORTER_ASSERT(r, i.fSource[2] == "//\\\\//\\\\ third line");
REPORTER_ASSERT(r, i.fSlotInfo[0].name == "SkVM_DebugTrace");
REPORTER_ASSERT(r, i.fSlotInfo[0].columns == 1);
REPORTER_ASSERT(r, i.fSlotInfo[0].rows == 2);
REPORTER_ASSERT(r, i.fSlotInfo[0].componentIndex == 3);
REPORTER_ASSERT(r, i.fSlotInfo[0].numberKind == (SkSL::Type::NumberKind)4);
REPORTER_ASSERT(r, i.fSlotInfo[0].line == 5);
REPORTER_ASSERT(r, i.fSlotInfo[1].name == "Unit_Test");
REPORTER_ASSERT(r, i.fSlotInfo[1].columns == 6);
REPORTER_ASSERT(r, i.fSlotInfo[1].rows == 7);
REPORTER_ASSERT(r, i.fSlotInfo[1].componentIndex == 8);
REPORTER_ASSERT(r, i.fSlotInfo[1].numberKind == (SkSL::Type::NumberKind)9);
REPORTER_ASSERT(r, i.fSlotInfo[1].line == 10);
REPORTER_ASSERT(r, i.fFuncInfo[0].name == "void testFunc();");
REPORTER_ASSERT(r, i.fTraceInfo[0].op == SkSL::SkVMTraceInfo::Op::kEnter);
REPORTER_ASSERT(r, i.fTraceInfo[0].data[0] == 0);
REPORTER_ASSERT(r, i.fTraceInfo[0].data[1] == 0);
REPORTER_ASSERT(r, i.fTraceInfo[1].op == SkSL::SkVMTraceInfo::Op::kLine);
REPORTER_ASSERT(r, i.fTraceInfo[1].data[0] == 5);
REPORTER_ASSERT(r, i.fTraceInfo[1].data[1] == 0);
REPORTER_ASSERT(r, i.fTraceInfo[2].op == SkSL::SkVMTraceInfo::Op::kVar);
REPORTER_ASSERT(r, i.fTraceInfo[2].data[0] == 10);
REPORTER_ASSERT(r, i.fTraceInfo[2].data[1] == 15);
REPORTER_ASSERT(r, i.fTraceInfo[3].op == SkSL::SkVMTraceInfo::Op::kExit);
REPORTER_ASSERT(r, i.fTraceInfo[3].data[0] == 20);
REPORTER_ASSERT(r, i.fTraceInfo[3].data[1] == 0);
}