|  | // 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 |