blob: 433f5c982258390f94bf04b1389f798a6b5903ed [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/lib/ujson/example.h"
#include <cstring>
#include <gtest/gtest.h>
#include <string>
#include "sw/device/lib/base/status.h"
#include "sw/device/lib/ujson/test_helpers.h"
#include "sw/device/lib/ujson/ujson.h"
namespace {
using test_helpers::SourceSink;
TEST(Derive, FooSerialize) {
foo foo = {-5, 150000, "Kilroy was here"};
SourceSink ss;
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_serialize_foo(&uj, &foo)));
EXPECT_EQ(ss.Sink(),
R"json({"foo":-5,"bar":150000,"message":"Kilroy was here"})json");
}
TEST(Derive, FooDeserialize) {
foo expected = {-5, 150000, "Kilroy was here"};
foo foo{};
SourceSink ss(
R"json({"foo":-5,"bar":150000,"message":"Kilroy was here"})json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
}
TEST(Derive, FooDeserializeNoFoo) {
foo expected = {0, 150000, "Kilroy was here"};
foo foo{};
SourceSink ss(R"json({"bar":150000,"message":"Kilroy was here"})json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
}
TEST(Derive, FooDeserializeNoMessage) {
foo expected = {
-5,
150000,
};
foo foo{};
SourceSink ss(R"json({"foo":-5,"bar":150000})json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
}
TEST(Derive, FooDeserializeMessageToLong) {
foo expected = {-5, 150000, "abcdefghijklmnopqrs"};
foo foo{};
SourceSink ss(
R"json({"foo":-5,"bar":150000,"message":"abcdefghijklmnopqrstuvwxyz"})json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
}
TEST(Derive, FooDeserializeBogusKey) {
foo foo{};
SourceSink ss(
R"json({"bar":150000,"message":"Kilroy was here","bogus":99})json");
ujson_t uj = ss.UJson();
EXPECT_EQ(status_err(ujson_deserialize_foo(&uj, &foo)), kInvalidArgument);
}
TEST(Derive, RectSerialize) {
rect r = {{10, 10}, {60, 40}};
SourceSink ss;
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_serialize_rect(&uj, &r)));
EXPECT_EQ(
ss.Sink(),
R"json({"top_left":{"x":10,"y":10},"bottom_right":{"x":60,"y":40}})json");
}
TEST(Derive, RectDeserialize) {
rect expected = {{10, 20}, {30, 40}};
rect r{};
SourceSink ss(
R"json({"top_left":{"x":10,"y":20},"bottom_right":{"x":30,"y":40}})json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_rect(&uj, &r)));
EXPECT_EQ(memcmp(&r, &expected, sizeof(r)), 0);
}
TEST(Derive, MatrixSerialize) {
matrix m = {
{{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}, {-1, -2, -3, -4, -5}},
};
SourceSink ss;
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_serialize_matrix(&uj, &m)));
EXPECT_EQ(ss.Sink(),
R"json({"k":[[0,1,2,3,4],[5,6,7,8,9],[-1,-2,-3,-4,-5]]})json");
}
TEST(Derive, MatrixDeserialize) {
matrix expected = {
{{0, 1, 0, 0, 0}, {2, 3, 4, 5, 0}, {-1, 0, 0, 0, 0}},
};
matrix m{};
SourceSink ss(R"json({"k":[[0,1],[2, 3, 4, 5],[-1]]})json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_matrix(&uj, &m)));
ujson_serialize_matrix(&uj, &m);
std::cout << ss.Sink() << "\n\n";
EXPECT_EQ(memcmp(&m, &expected, sizeof(m)), 0);
}
TEST(Derive, DirectionSerialize) {
direction d = kDirectionEast;
SourceSink ss;
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_serialize_direction(&uj, &d)));
EXPECT_EQ(ss.Sink(), R"json("East")json");
ss.Reset();
d = kDirectionSouth;
EXPECT_TRUE(status_ok(ujson_serialize_direction(&uj, &d)));
EXPECT_EQ(ss.Sink(), R"json("South")json");
ss.Reset();
d = static_cast<direction>(120);
EXPECT_TRUE(status_ok(ujson_serialize_direction(&uj, &d)));
EXPECT_EQ(ss.Sink(), R"json({"IntValue":120})json");
}
TEST(Derive, DirectionDeserialize) {
direction d;
SourceSink ss(R"json("West")json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_direction(&uj, &d)));
EXPECT_EQ(d, kDirectionWest);
ss.Reset(R"json("North")json");
EXPECT_TRUE(status_ok(ujson_deserialize_direction(&uj, &d)));
EXPECT_EQ(d, kDirectionNorth);
ss.Reset(R"json({"IntValue":35})json");
EXPECT_TRUE(status_ok(ujson_deserialize_direction(&uj, &d)));
EXPECT_EQ(d, static_cast<direction>(35));
}
TEST(Derive, FuzzyBoolSerialize) {
fuzzy_bool d = kFuzzyBoolTrue;
SourceSink ss;
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_serialize_fuzzy_bool(&uj, &d)));
EXPECT_EQ(ss.Sink(), R"json("True")json");
ss.Reset();
d = kFuzzyBoolFalse;
EXPECT_TRUE(status_ok(ujson_serialize_fuzzy_bool(&uj, &d)));
EXPECT_EQ(ss.Sink(), R"json("False")json");
ss.Reset();
d = static_cast<fuzzy_bool>(75);
EXPECT_TRUE(status_ok(ujson_serialize_fuzzy_bool(&uj, &d)));
EXPECT_EQ(ss.Sink(), R"json(75)json");
}
TEST(Derive, FuzzyBoolDeserialize) {
fuzzy_bool d;
SourceSink ss(R"json("False")json");
ujson_t uj = ss.UJson();
EXPECT_TRUE(status_ok(ujson_deserialize_fuzzy_bool(&uj, &d)));
EXPECT_EQ(d, kFuzzyBoolFalse);
ss.Reset(R"json("True")json");
EXPECT_TRUE(status_ok(ujson_deserialize_fuzzy_bool(&uj, &d)));
EXPECT_EQ(d, kFuzzyBoolTrue);
ss.Reset(R"json(35)json");
EXPECT_TRUE(status_ok(ujson_deserialize_fuzzy_bool(&uj, &d)));
EXPECT_EQ(d, static_cast<fuzzy_bool>(35));
}
} // namespace