yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
command_context_test.cc
Go to the documentation of this file.
2
3#include <gtest/gtest.h>
4#include <gmock/gmock.h>
5
6#include "absl/status/status.h"
7#include "absl/status/statusor.h"
8#include "app/rom.h"
9#include "mocks/mock_rom.h"
10
11namespace yaze {
12namespace cli {
13namespace resources {
14
15class CommandContextTest : public ::testing::Test {
16 protected:
17 void SetUp() override {
18 // Initialize mock ROM for testing
19 std::vector<uint8_t> test_data(1024, 0); // 1KB of empty data
20 auto status = mock_rom_.SetTestData(test_data);
21 ASSERT_TRUE(status.ok());
22 }
23
25};
26
27TEST_F(CommandContextTest, LoadsRomFromConfig) {
29 config.use_mock_rom = true;
30
31 CommandContext context(config);
32
33 auto rom_or = context.GetRom();
34 ASSERT_TRUE(rom_or.ok());
35 EXPECT_TRUE(rom_or.value()->is_loaded());
36}
37
38TEST_F(CommandContextTest, UsesExternalRomContext) {
40 config.external_rom_context = &mock_rom_;
41
42 CommandContext context(config);
43
44 auto rom_or = context.GetRom();
45 ASSERT_TRUE(rom_or.ok());
46 EXPECT_EQ(rom_or.value(), &mock_rom_);
47}
48
49TEST_F(CommandContextTest, LoadsRomFromPath) {
51 config.rom_path = "test_rom.sfc"; // This would need a real ROM file
52
53 CommandContext context(config);
54
55 // This test would need a real ROM file to pass
56 // For now, we expect it to fail gracefully
57 auto rom_or = context.GetRom();
58 EXPECT_FALSE(rom_or.ok());
59}
60
61TEST_F(CommandContextTest, EnsuresLabelsLoaded) {
63 config.use_mock_rom = true;
64
65 CommandContext context(config);
66
67 auto rom_or = context.GetRom();
68 ASSERT_TRUE(rom_or.ok());
69
70 auto status = context.EnsureLabelsLoaded(rom_or.value());
71 EXPECT_TRUE(status.ok());
72}
73
74TEST_F(CommandContextTest, GetFormatReturnsConfigFormat) {
76 config.format = "text";
77
78 CommandContext context(config);
79
80 EXPECT_EQ(context.GetFormat(), "text");
81}
82
83TEST_F(CommandContextTest, IsVerboseReturnsConfigVerbose) {
85 config.verbose = true;
86
87 CommandContext context(config);
88
89 EXPECT_TRUE(context.IsVerbose());
90}
91
92// ArgumentParser Tests
93class ArgumentParserTest : public ::testing::Test {
94 protected:
95 void SetUp() override {}
96};
97
98TEST_F(ArgumentParserTest, ParsesStringArguments) {
99 std::vector<std::string> args = {"--type=dungeon", "--format", "json"};
100 ArgumentParser parser(args);
101
102 EXPECT_EQ(parser.GetString("type").value(), "dungeon");
103 EXPECT_EQ(parser.GetString("format").value(), "json");
104}
105
106TEST_F(ArgumentParserTest, ParsesIntArguments) {
107 std::vector<std::string> args = {"--room=0x12", "--count", "42"};
108 ArgumentParser parser(args);
109
110 auto room_or = parser.GetInt("room");
111 ASSERT_TRUE(room_or.ok());
112 EXPECT_EQ(room_or.value(), 0x12);
113
114 auto count_or = parser.GetInt("count");
115 ASSERT_TRUE(count_or.ok());
116 EXPECT_EQ(count_or.value(), 42);
117}
118
119TEST_F(ArgumentParserTest, ParsesHexArguments) {
120 std::vector<std::string> args = {"--address=0x1234", "--value", "0xFF"};
121 ArgumentParser parser(args);
122
123 auto addr_or = parser.GetHex("address");
124 ASSERT_TRUE(addr_or.ok());
125 EXPECT_EQ(addr_or.value(), 0x1234);
126
127 auto value_or = parser.GetHex("value");
128 ASSERT_TRUE(value_or.ok());
129 EXPECT_EQ(value_or.value(), 0xFF);
130}
131
133 std::vector<std::string> args = {"--verbose", "--debug", "--format=json"};
134 ArgumentParser parser(args);
135
136 EXPECT_TRUE(parser.HasFlag("verbose"));
137 EXPECT_TRUE(parser.HasFlag("debug"));
138 EXPECT_FALSE(parser.HasFlag("format")); // format is a value, not a flag
139}
140
141TEST_F(ArgumentParserTest, GetsPositionalArguments) {
142 std::vector<std::string> args = {"command", "--flag", "value", "positional1", "positional2"};
143 ArgumentParser parser(args);
144
145 auto positional = parser.GetPositional();
146 EXPECT_THAT(positional, ::testing::ElementsAre("command", "positional1", "positional2"));
147}
148
149TEST_F(ArgumentParserTest, ValidatesRequiredArguments) {
150 std::vector<std::string> args = {"--type=dungeon"};
151 ArgumentParser parser(args);
152
153 auto status = parser.RequireArgs({"type"});
154 EXPECT_TRUE(status.ok());
155
156 status = parser.RequireArgs({"type", "missing"});
157 EXPECT_FALSE(status.ok());
158}
159
160TEST_F(ArgumentParserTest, HandlesMissingArguments) {
161 std::vector<std::string> args = {"--type=dungeon"};
162 ArgumentParser parser(args);
163
164 auto missing = parser.GetString("missing");
165 EXPECT_FALSE(missing.has_value());
166
167 auto int_missing = parser.GetInt("missing");
168 EXPECT_FALSE(int_missing.ok());
169}
170
171// OutputFormatter Tests
172class OutputFormatterTest : public ::testing::Test {
173 protected:
174 void SetUp() override {}
175};
176
177TEST_F(OutputFormatterTest, CreatesFromString) {
178 auto json_formatter = OutputFormatter::FromString("json");
179 ASSERT_TRUE(json_formatter.ok());
180 EXPECT_TRUE(json_formatter.value().IsJson());
181
182 auto text_formatter = OutputFormatter::FromString("text");
183 ASSERT_TRUE(text_formatter.ok());
184 EXPECT_TRUE(text_formatter.value().IsText());
185
186 auto invalid_formatter = OutputFormatter::FromString("invalid");
187 EXPECT_FALSE(invalid_formatter.ok());
188}
189
190TEST_F(OutputFormatterTest, GeneratesValidJson) {
191 auto formatter_or = OutputFormatter::FromString("json");
192 ASSERT_TRUE(formatter_or.ok());
193 auto formatter = std::move(formatter_or.value());
194
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);
200
201 formatter.BeginArray("array_field");
202 formatter.AddArrayItem("item1");
203 formatter.AddArrayItem("item2");
204 formatter.EndArray();
205
206 formatter.EndObject();
207
208 std::string output = formatter.GetOutput();
209
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\""));
217}
218
219TEST_F(OutputFormatterTest, GeneratesValidText) {
220 auto formatter_or = OutputFormatter::FromString("text");
221 ASSERT_TRUE(formatter_or.ok());
222 auto formatter = std::move(formatter_or.value());
223
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);
229
230 formatter.BeginArray("array_field");
231 formatter.AddArrayItem("item1");
232 formatter.AddArrayItem("item2");
233 formatter.EndArray();
234
235 formatter.EndObject();
236
237 std::string output = formatter.GetOutput();
238
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"));
247}
248
249TEST_F(OutputFormatterTest, EscapesJsonStrings) {
250 auto formatter_or = OutputFormatter::FromString("json");
251 ASSERT_TRUE(formatter_or.ok());
252 auto formatter = std::move(formatter_or.value());
253
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();
259
260 std::string output = formatter.GetOutput();
261
262 EXPECT_THAT(output, ::testing::HasSubstr("\\\""));
263 EXPECT_THAT(output, ::testing::HasSubstr("\\n"));
264 EXPECT_THAT(output, ::testing::HasSubstr("\\\\"));
265}
266
267TEST_F(OutputFormatterTest, HandlesEmptyObjects) {
268 auto formatter_or = OutputFormatter::FromString("json");
269 ASSERT_TRUE(formatter_or.ok());
270 auto formatter = std::move(formatter_or.value());
271
272 formatter.BeginObject("Empty");
273 formatter.EndObject();
274
275 std::string output = formatter.GetOutput();
276 EXPECT_THAT(output, ::testing::HasSubstr("{}"));
277}
278
279TEST_F(OutputFormatterTest, HandlesEmptyArrays) {
280 auto formatter_or = OutputFormatter::FromString("json");
281 ASSERT_TRUE(formatter_or.ok());
282 auto formatter = std::move(formatter_or.value());
283
284 formatter.BeginObject("Test");
285 formatter.BeginArray("empty_array");
286 formatter.EndArray();
287 formatter.EndObject();
288
289 std::string output = formatter.GetOutput();
290 EXPECT_THAT(output, ::testing::HasSubstr("\"empty_array\": []"));
291}
292
293} // namespace resources
294} // namespace cli
295} // namespace yaze
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)
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.
static absl::StatusOr< OutputFormatter > FromString(const std::string &format)
Create formatter from string ("json" or "text")
Enhanced ROM for testing that behaves like a real ROM but with test data.
Definition mock_rom.h:21
absl::Status SetTestData(const std::vector< uint8_t > &data)
Load test data into the ROM.
Definition mock_rom.h:33
TEST_F(CommandContextTest, LoadsRomFromConfig)
Main namespace for the application.
Configuration for command context.