mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-21 19:35:36 -05:00
163 lines
5.4 KiB
C++
163 lines
5.4 KiB
C++
/* Selftest support for JSON.
|
|
Copyright (C) 2024-2026 Free Software Foundation, Inc.
|
|
Contributed by David Malcolm <dmalcolm@redhat.com>.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#include "coretypes.h"
|
|
#include "diagnostic.h"
|
|
#include "selftest.h"
|
|
#include "selftest-json.h"
|
|
|
|
/* The selftest code should entirely disappear in a production
|
|
configuration, hence we guard all of it with #if CHECKING_P. */
|
|
|
|
#if CHECKING_P
|
|
|
|
namespace selftest {
|
|
|
|
/* Assert that VALUE is a non-null json::string
|
|
equalling EXPECTED_VALUE.
|
|
Use LOC for any failures. */
|
|
|
|
void
|
|
assert_json_string_eq (const location &loc,
|
|
const json::value *value,
|
|
const char *expected_value)
|
|
{
|
|
ASSERT_EQ_AT (loc, value->get_kind (), json::JSON_STRING);
|
|
const json::string *str = static_cast<const json::string *> (value);
|
|
ASSERT_STREQ_AT (loc, expected_value, str->get_string ());
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object,
|
|
returning it as such, failing at LOC if this isn't the case. */
|
|
|
|
const json::object *
|
|
expect_json_object (const location &loc,
|
|
const json::value *value)
|
|
{
|
|
ASSERT_NE_AT (loc, value, nullptr);
|
|
ASSERT_EQ_AT (loc, value->get_kind (), json::JSON_OBJECT);
|
|
return static_cast<const json::object *> (value);
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object that has property
|
|
PROPERTY_NAME.
|
|
Return the value of the property.
|
|
Use LOC for any failures. */
|
|
|
|
const json::value *
|
|
expect_json_object_with_property (const location &loc,
|
|
const json::value *value,
|
|
const char *property_name)
|
|
{
|
|
const json::object *obj = expect_json_object (loc, value);
|
|
const json::value *property_value = obj->get (property_name);
|
|
ASSERT_NE_AT (loc, property_value, nullptr);
|
|
return property_value;
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object that has property
|
|
PROPERTY_NAME, and that the value of that property is a non-null
|
|
json::integer_number equalling EXPECTED_VALUE.
|
|
Use LOC for any failures. */
|
|
|
|
void
|
|
assert_json_int_property_eq (const location &loc,
|
|
const json::value *value,
|
|
const char *property_name,
|
|
long expected_value)
|
|
{
|
|
const json::value *property_value
|
|
= expect_json_object_with_property (loc, value, property_name);
|
|
ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_INTEGER);
|
|
long actual_value
|
|
= static_cast<const json::integer_number *> (property_value)->get ();
|
|
ASSERT_EQ_AT (loc, expected_value, actual_value);
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object that has property
|
|
PROPERTY_NAME, and that the property value is a non-null JSON object.
|
|
Return the value of the property as a json::object.
|
|
Use LOC for any failures. */
|
|
|
|
const json::object *
|
|
expect_json_object_with_object_property (const location &loc,
|
|
const json::value *value,
|
|
const char *property_name)
|
|
{
|
|
const json::value *property_value
|
|
= expect_json_object_with_property (loc, value, property_name);
|
|
ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_OBJECT);
|
|
return static_cast<const json::object *> (property_value);
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object that has property
|
|
PROPERTY_NAME, and that the property value is a non-null JSON array.
|
|
Return the value of the property as a json::array.
|
|
Use LOC for any failures. */
|
|
|
|
const json::array *
|
|
expect_json_object_with_array_property (const location &loc,
|
|
const json::value *value,
|
|
const char *property_name)
|
|
{
|
|
const json::value *property_value
|
|
= expect_json_object_with_property (loc, value, property_name);
|
|
ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_ARRAY);
|
|
return static_cast<const json::array *> (property_value);
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object that has property
|
|
PROPERTY_NAME, and that the property value is a non-null JSON string.
|
|
Return the value of the property as a json::string.
|
|
Use LOC for any failures. */
|
|
|
|
const json::string *
|
|
expect_json_object_with_string_property (const location &loc,
|
|
const json::value *value,
|
|
const char *property_name)
|
|
{
|
|
const json::value *property_value
|
|
= expect_json_object_with_property (loc, value, property_name);
|
|
ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_STRING);
|
|
return static_cast<const json::string *> (property_value);
|
|
}
|
|
|
|
/* Assert that VALUE is a non-null json::object that has property
|
|
PROPERTY_NAME, and that the value of that property is a non-null
|
|
JSON string equalling EXPECTED_VALUE.
|
|
Use LOC for any failures. */
|
|
|
|
void
|
|
assert_json_string_property_eq (const location &loc,
|
|
const json::value *value,
|
|
const char *property_name,
|
|
const char *expected_value)
|
|
{
|
|
const json::value *property_value
|
|
= expect_json_object_with_property (loc, value, property_name);
|
|
assert_json_string_eq (loc, property_value, expected_value);
|
|
}
|
|
|
|
} // namespace selftest
|
|
|
|
#endif /* #if CHECKING_P */
|