Line data Source code
1 : /* Selftest support for JSON.
2 : Copyright (C) 2024-2026 Free Software Foundation, Inc.
3 : Contributed by David Malcolm <dmalcolm@redhat.com>.
4 :
5 : This file is part of GCC.
6 :
7 : GCC is free software; you can redistribute it and/or modify it under
8 : the terms of the GNU General Public License as published by the Free
9 : Software Foundation; either version 3, or (at your option) any later
10 : version.
11 :
12 : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with GCC; see the file COPYING3. If not see
19 : <http://www.gnu.org/licenses/>. */
20 :
21 : #include "config.h"
22 : #include "system.h"
23 : #include "coretypes.h"
24 : #include "diagnostic.h"
25 : #include "selftest.h"
26 : #include "selftest-json.h"
27 :
28 : /* The selftest code should entirely disappear in a production
29 : configuration, hence we guard all of it with #if CHECKING_P. */
30 :
31 : #if CHECKING_P
32 :
33 : namespace selftest {
34 :
35 : /* Assert that VALUE is a non-null json::string
36 : equalling EXPECTED_VALUE.
37 : Use LOC for any failures. */
38 :
39 : void
40 1256 : assert_json_string_eq (const location &loc,
41 : const json::value *value,
42 : const char *expected_value)
43 : {
44 1256 : ASSERT_EQ_AT (loc, value->get_kind (), json::JSON_STRING);
45 1256 : const json::string *str = static_cast<const json::string *> (value);
46 1256 : ASSERT_STREQ_AT (loc, expected_value, str->get_string ());
47 1256 : }
48 :
49 : /* Assert that VALUE is a non-null json::object,
50 : returning it as such, failing at LOC if this isn't the case. */
51 :
52 : const json::object *
53 5872 : expect_json_object (const location &loc,
54 : const json::value *value)
55 : {
56 5872 : ASSERT_NE_AT (loc, value, nullptr);
57 5872 : ASSERT_EQ_AT (loc, value->get_kind (), json::JSON_OBJECT);
58 5872 : return static_cast<const json::object *> (value);
59 : }
60 :
61 : /* Assert that VALUE is a non-null json::object that has property
62 : PROPERTY_NAME.
63 : Return the value of the property.
64 : Use LOC for any failures. */
65 :
66 : const json::value *
67 5840 : expect_json_object_with_property (const location &loc,
68 : const json::value *value,
69 : const char *property_name)
70 : {
71 5840 : const json::object *obj = expect_json_object (loc, value);
72 5840 : const json::value *property_value = obj->get (property_name);
73 5840 : ASSERT_NE_AT (loc, property_value, nullptr);
74 5840 : return property_value;
75 : }
76 :
77 : /* Assert that VALUE is a non-null json::object that has property
78 : PROPERTY_NAME, and that the value of that property is a non-null
79 : json::integer_number equalling EXPECTED_VALUE.
80 : Use LOC for any failures. */
81 :
82 : void
83 2184 : assert_json_int_property_eq (const location &loc,
84 : const json::value *value,
85 : const char *property_name,
86 : long expected_value)
87 : {
88 2184 : const json::value *property_value
89 2184 : = expect_json_object_with_property (loc, value, property_name);
90 2184 : ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_INTEGER);
91 2184 : long actual_value
92 2184 : = static_cast<const json::integer_number *> (property_value)->get ();
93 2184 : ASSERT_EQ_AT (loc, expected_value, actual_value);
94 2184 : }
95 :
96 : /* Assert that VALUE is a non-null json::object that has property
97 : PROPERTY_NAME, and that the property value is a non-null JSON object.
98 : Return the value of the property as a json::object.
99 : Use LOC for any failures. */
100 :
101 : const json::object *
102 1752 : expect_json_object_with_object_property (const location &loc,
103 : const json::value *value,
104 : const char *property_name)
105 : {
106 1752 : const json::value *property_value
107 1752 : = expect_json_object_with_property (loc, value, property_name);
108 1752 : ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_OBJECT);
109 1752 : return static_cast<const json::object *> (property_value);
110 : }
111 :
112 : /* Assert that VALUE is a non-null json::object that has property
113 : PROPERTY_NAME, and that the property value is a non-null JSON array.
114 : Return the value of the property as a json::array.
115 : Use LOC for any failures. */
116 :
117 : const json::array *
118 632 : expect_json_object_with_array_property (const location &loc,
119 : const json::value *value,
120 : const char *property_name)
121 : {
122 632 : const json::value *property_value
123 632 : = expect_json_object_with_property (loc, value, property_name);
124 632 : ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_ARRAY);
125 632 : return static_cast<const json::array *> (property_value);
126 : }
127 :
128 : /* Assert that VALUE is a non-null json::object that has property
129 : PROPERTY_NAME, and that the property value is a non-null JSON string.
130 : Return the value of the property as a json::string.
131 : Use LOC for any failures. */
132 :
133 : const json::string *
134 24 : expect_json_object_with_string_property (const location &loc,
135 : const json::value *value,
136 : const char *property_name)
137 : {
138 24 : const json::value *property_value
139 24 : = expect_json_object_with_property (loc, value, property_name);
140 24 : ASSERT_EQ_AT (loc, property_value->get_kind (), json::JSON_STRING);
141 24 : return static_cast<const json::string *> (property_value);
142 : }
143 :
144 : /* Assert that VALUE is a non-null json::object that has property
145 : PROPERTY_NAME, and that the value of that property is a non-null
146 : JSON string equalling EXPECTED_VALUE.
147 : Use LOC for any failures. */
148 :
149 : void
150 1248 : assert_json_string_property_eq (const location &loc,
151 : const json::value *value,
152 : const char *property_name,
153 : const char *expected_value)
154 : {
155 1248 : const json::value *property_value
156 1248 : = expect_json_object_with_property (loc, value, property_name);
157 1248 : assert_json_string_eq (loc, property_value, expected_value);
158 1248 : }
159 :
160 : } // namespace selftest
161 :
162 : #endif /* #if CHECKING_P */
|