3#include <gtest/gtest.h>
4#include <gmock/gmock.h>
6#include "absl/status/status.h"
7#include "absl/status/statusor.h"
19 std::vector<uint8_t> test_data(1024, 0);
21 ASSERT_TRUE(status.ok());
33 auto rom_or = context.
GetRom();
34 ASSERT_TRUE(rom_or.ok());
35 EXPECT_TRUE(rom_or.value()->is_loaded());
44 auto rom_or = context.
GetRom();
45 ASSERT_TRUE(rom_or.ok());
46 EXPECT_EQ(rom_or.value(), &mock_rom_);
57 auto rom_or = context.
GetRom();
58 EXPECT_FALSE(rom_or.ok());
67 auto rom_or = context.
GetRom();
68 ASSERT_TRUE(rom_or.ok());
71 EXPECT_TRUE(status.ok());
99 std::vector<std::string> args = {
"--type=dungeon",
"--format",
"json"};
102 EXPECT_EQ(parser.
GetString(
"type").value(),
"dungeon");
103 EXPECT_EQ(parser.
GetString(
"format").value(),
"json");
107 std::vector<std::string> args = {
"--room=0x12",
"--count",
"42"};
110 auto room_or = parser.
GetInt(
"room");
111 ASSERT_TRUE(room_or.ok());
112 EXPECT_EQ(room_or.value(), 0x12);
114 auto count_or = parser.
GetInt(
"count");
115 ASSERT_TRUE(count_or.ok());
116 EXPECT_EQ(count_or.value(), 42);
120 std::vector<std::string> args = {
"--address=0x1234",
"--value",
"0xFF"};
123 auto addr_or = parser.
GetHex(
"address");
124 ASSERT_TRUE(addr_or.ok());
125 EXPECT_EQ(addr_or.value(), 0x1234);
127 auto value_or = parser.
GetHex(
"value");
128 ASSERT_TRUE(value_or.ok());
129 EXPECT_EQ(value_or.value(), 0xFF);
133 std::vector<std::string> args = {
"--verbose",
"--debug",
"--format=json"};
136 EXPECT_TRUE(parser.
HasFlag(
"verbose"));
137 EXPECT_TRUE(parser.
HasFlag(
"debug"));
138 EXPECT_FALSE(parser.
HasFlag(
"format"));
142 std::vector<std::string> args = {
"command",
"--flag",
"value",
"positional1",
"positional2"};
146 EXPECT_THAT(positional, ::testing::ElementsAre(
"command",
"positional1",
"positional2"));
150 std::vector<std::string> args = {
"--type=dungeon"};
154 EXPECT_TRUE(status.ok());
157 EXPECT_FALSE(status.ok());
161 std::vector<std::string> args = {
"--type=dungeon"};
164 auto missing = parser.
GetString(
"missing");
165 EXPECT_FALSE(missing.has_value());
167 auto int_missing = parser.
GetInt(
"missing");
168 EXPECT_FALSE(int_missing.ok());
179 ASSERT_TRUE(json_formatter.ok());
180 EXPECT_TRUE(json_formatter.value().IsJson());
183 ASSERT_TRUE(text_formatter.ok());
184 EXPECT_TRUE(text_formatter.value().IsText());
187 EXPECT_FALSE(invalid_formatter.ok());
192 ASSERT_TRUE(formatter_or.ok());
193 auto formatter = std::move(formatter_or.value());
195 formatter.BeginObject(
"Test");
196 formatter.AddField(
"string_field",
"value");
197 formatter.AddField(
"int_field", 42);
198 formatter.AddField(
"bool_field",
true);
199 formatter.AddHexField(
"hex_field", 0x1234, 4);
201 formatter.BeginArray(
"array_field");
202 formatter.AddArrayItem(
"item1");
203 formatter.AddArrayItem(
"item2");
204 formatter.EndArray();
206 formatter.EndObject();
208 std::string output = formatter.GetOutput();
210 EXPECT_THAT(output, ::testing::HasSubstr(
"\"string_field\": \"value\""));
211 EXPECT_THAT(output, ::testing::HasSubstr(
"\"int_field\": 42"));
212 EXPECT_THAT(output, ::testing::HasSubstr(
"\"bool_field\": true"));
213 EXPECT_THAT(output, ::testing::HasSubstr(
"\"hex_field\": \"0x1234\""));
214 EXPECT_THAT(output, ::testing::HasSubstr(
"\"array_field\": ["));
215 EXPECT_THAT(output, ::testing::HasSubstr(
"\"item1\""));
216 EXPECT_THAT(output, ::testing::HasSubstr(
"\"item2\""));
221 ASSERT_TRUE(formatter_or.ok());
222 auto formatter = std::move(formatter_or.value());
224 formatter.BeginObject(
"Test Object");
225 formatter.AddField(
"string_field",
"value");
226 formatter.AddField(
"int_field", 42);
227 formatter.AddField(
"bool_field",
true);
228 formatter.AddHexField(
"hex_field", 0x1234, 4);
230 formatter.BeginArray(
"array_field");
231 formatter.AddArrayItem(
"item1");
232 formatter.AddArrayItem(
"item2");
233 formatter.EndArray();
235 formatter.EndObject();
237 std::string output = formatter.GetOutput();
239 EXPECT_THAT(output, ::testing::HasSubstr(
"=== Test Object ==="));
240 EXPECT_THAT(output, ::testing::HasSubstr(
"string_field : value"));
241 EXPECT_THAT(output, ::testing::HasSubstr(
"int_field : 42"));
242 EXPECT_THAT(output, ::testing::HasSubstr(
"bool_field : yes"));
243 EXPECT_THAT(output, ::testing::HasSubstr(
"hex_field : 0x1234"));
244 EXPECT_THAT(output, ::testing::HasSubstr(
"array_field:"));
245 EXPECT_THAT(output, ::testing::HasSubstr(
"- item1"));
246 EXPECT_THAT(output, ::testing::HasSubstr(
"- item2"));
251 ASSERT_TRUE(formatter_or.ok());
252 auto formatter = std::move(formatter_or.value());
254 formatter.BeginObject(
"Test");
255 formatter.AddField(
"quotes",
"He said \"Hello\"");
256 formatter.AddField(
"newlines",
"Line1\nLine2");
257 formatter.AddField(
"backslashes",
"Path\\to\\file");
258 formatter.EndObject();
260 std::string output = formatter.GetOutput();
262 EXPECT_THAT(output, ::testing::HasSubstr(
"\\\""));
263 EXPECT_THAT(output, ::testing::HasSubstr(
"\\n"));
264 EXPECT_THAT(output, ::testing::HasSubstr(
"\\\\"));
269 ASSERT_TRUE(formatter_or.ok());
270 auto formatter = std::move(formatter_or.value());
272 formatter.BeginObject(
"Empty");
273 formatter.EndObject();
275 std::string output = formatter.GetOutput();
276 EXPECT_THAT(output, ::testing::HasSubstr(
"{}"));
281 ASSERT_TRUE(formatter_or.ok());
282 auto formatter = std::move(formatter_or.value());
284 formatter.BeginObject(
"Test");
285 formatter.BeginArray(
"empty_array");
286 formatter.EndArray();
287 formatter.EndObject();
289 std::string output = formatter.GetOutput();
290 EXPECT_THAT(output, ::testing::HasSubstr(
"\"empty_array\": []"));
Utility for parsing common CLI argument patterns.
std::vector< std::string > GetPositional() const
Get all remaining positional arguments.
std::optional< std::string > GetString(const std::string &name) const
Parse a named argument (e.g., –format=json or –format json)
bool HasFlag(const std::string &name) const
Check if a flag is present.
absl::Status RequireArgs(const std::vector< std::string > &required) const
Validate that required arguments are present.
absl::StatusOr< int > GetHex(const std::string &name) const
Parse a hex integer argument.
absl::StatusOr< int > GetInt(const std::string &name) const
Parse an integer argument (supports hex with 0x prefix)
yaze::test::MockRom mock_rom_
Encapsulates common context for CLI command execution.
const std::string & GetFormat() const
Get the output format ("json" or "text")
bool IsVerbose() const
Check if verbose mode is enabled.
absl::StatusOr< Rom * > GetRom()
Get the ROM instance (loads if not already loaded)
absl::Status EnsureLabelsLoaded(Rom *rom)
Ensure resource labels are loaded.
Enhanced ROM for testing that behaves like a real ROM but with test data.
absl::Status SetTestData(const std::vector< uint8_t > &data)
Load test data into the ROM.
TEST_F(CommandContextTest, LoadsRomFromConfig)
Main namespace for the application.
Configuration for command context.
std::optional< std::string > rom_path
Rom * external_rom_context