blob: 5fda53510e585ea4df4eb0039e60738d4bf11a93 [file] [log] [blame]
/* Selftest support for JSON.
Copyright (C) 2024-2025 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 */