Skip to content

Commit e1c8736

Browse files
authored
Merge pull request #552 from Sightem/autotester-screenshots
Add -s flag for screenshot export to autotester
2 parents 516d420 + cbfbb43 commit e1c8736

3 files changed

Lines changed: 55 additions & 12 deletions

File tree

tests/autotester/autotester.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,37 @@ static char* myrealpath(const char* file_name)
4545
#endif
4646
}
4747

48+
static void dumpScreenshot(const std::string& description)
49+
{
50+
std::string safe_name = description;
51+
for (char& c : safe_name) {
52+
if (c == '/' || c == '\\' || c == ':' || c == '*' || c == '?' || c == '"' || c == '<' || c == '>' || c == '|') {
53+
c = '_';
54+
}
55+
}
56+
57+
std::string path = safe_name + ".rgba";
58+
59+
uint32_t *frame = static_cast<uint32_t*>(malloc(LCD_SIZE * sizeof(uint32_t)));
60+
if (!frame) {
61+
std::cerr << "\t[Screenshot] Failed to allocate frame buffer" << std::endl;
62+
return;
63+
}
64+
65+
cemucore::emu_lcd_drawframe(frame);
66+
67+
FILE *f = fopen(path.c_str(), "wb");
68+
if (f) {
69+
fwrite(frame, sizeof(uint32_t), LCD_SIZE, f);
70+
fclose(f);
71+
std::cout << "\t[Screenshot] Saved " << path << std::endl;
72+
} else {
73+
std::cerr << "\t[Screenshot] Failed to write " << path << std::endl;
74+
}
75+
76+
free(frame);
77+
}
78+
4879
namespace autotester
4980
{
5081

@@ -54,6 +85,7 @@ config_t config;
5485
std::string oldCWD;
5586

5687
bool debugMode = true;
88+
bool screenshotsMode = false;
5789
bool ignoreROMfield = false;
5890
bool configLoaded = false;
5991

@@ -217,6 +249,9 @@ static const std::unordered_map<std::string, seq_cmd_func_t> valid_seq_commands
217249
::free(temp_buffer_dup);
218250
}
219251
hashesTested++;
252+
if (screenshotsMode) {
253+
dumpScreenshot(param.description);
254+
}
220255
} else {
221256
std::cerr << "\t[Error] hash #" << which_hash << " was not declared in the JSON file. Ignoring." << std::endl;
222257
}

tests/autotester/autotester.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ namespace autotester
135135
extern config_t config;
136136

137137
extern bool debugMode;
138+
extern bool screenshotsMode;
138139
extern bool ignoreROMfield;
139140
extern bool configLoaded;
140141

@@ -147,4 +148,3 @@ namespace autotester
147148
}
148149

149150
#endif
150-

tests/autotester/autotester_cli.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,29 @@ int main(int argc, char* argv[])
6060
// Used if the coreThread has been started (need to exit properly ; uses gotos)
6161
int retVal = 0;
6262

63-
if (argc < 2)
64-
{
65-
std::cerr << "[Error] Needs a path argument, the test config JSON file" << std::endl;
66-
return -1;
63+
autotester::debugMode = false;
64+
autotester::screenshotsMode = false;
65+
int argi = 1;
66+
while (argi < argc && argv[argi][0] == '-') {
67+
if (strcmp(argv[argi], "-d") == 0) {
68+
autotester::debugMode = true;
69+
} else if (strcmp(argv[argi], "-s") == 0 || strcmp(argv[argi], "--screenshots") == 0) {
70+
autotester::screenshotsMode = true;
71+
} else {
72+
std::cerr << "[Error] Unknown option: " << argv[argi] << std::endl;
73+
std::cerr << "Usage: autotester [-d] [-s|--screenshots] <config.json>" << std::endl;
74+
return -1;
75+
}
76+
argi++;
6777
}
6878

69-
if (strcmp(argv[1], "-d") == 0)
70-
{
71-
autotester::debugMode = true;
72-
argv++;
73-
} else {
74-
autotester::debugMode = false;
79+
if (argi >= argc) {
80+
std::cerr << "[Error] Needs a path argument, the test config JSON file" << std::endl;
81+
std::cerr << "Usage: autotester [-d] [-s|--screenshots] <config.json>" << std::endl;
82+
return -1;
7583
}
7684

77-
const std::string jsonPath(argv[1]);
85+
const std::string jsonPath(argv[argi]);
7886
std::string jsonContents;
7987
std::ifstream ifs(jsonPath);
8088
if (ifs.good())

0 commit comments

Comments
 (0)