47class HeadlessPlatform;
87 std::vector<unsigned char>
rgba;
91 const unsigned char*
at(
int x,
int y)
const {
return rgba.data() + ((size_t)y *
width + x) * 4; }
95 bool savePng(
const std::string& path)
const;
171 void swipe(
float fromX,
float fromY,
float toX,
float toY,
double ms = 200);
192 const std::vector<std::string>&
focusLog()
const {
return focusChanges; }
230 bool matchesReference(
const std::string& name,
int tolerance = 8,
double maxRatio = 0.001);
241 void walkShown(
const std::function<
void(
View*)>& visit);
247 std::vector<std::string> focusChanges;
266using TestFunction = void (*)();
267bool registerTest(
const char* name, TestFunction function);
268void reportFailure(
const char* file,
int line,
const std::string& what);
269int runTests(
int argc,
char** argv);
272#define AURORE_TEST(name) \
273 static void aurore_test_##name(); \
274 static const bool aurore_test_registered_##name = aurore::test::registerTest(#name, aurore_test_##name); \
275 static void aurore_test_##name()
277#define AURORE_CHECK(condition) \
281 aurore::test::reportFailure(__FILE__, __LINE__, "AURORE_CHECK(" #condition ")"); \
284#define AURORE_CHECK_EQ(actual, expected) \
287 auto aurore_actual_ = (actual); \
288 auto aurore_expected_ = (expected); \
289 if (!(aurore_actual_ == aurore_expected_)) \
290 aurore::test::reportFailure(__FILE__, __LINE__, \
291 std::string("AURORE_CHECK_EQ(" #actual ", " #expected "): got ") + aurore::test::describeValue(aurore_actual_) \
292 + ", expected " + aurore::test::describeValue(aurore_expected_)); \
297inline std::string describeValue(
const std::string& value) {
return "\"" + value +
"\""; }
298inline std::string describeValue(
const char* value) {
return "\"" + std::string(value) +
"\""; }
300std::string describeValue(
const T& value)
302 if constexpr (std::is_arithmetic_v<T>)
303 return std::to_string(value);
304 else if constexpr (std::is_pointer_v<T>)
305 return value ?
"a pointer" :
"nullptr";
Definition activity.hpp:45
Definition harness.hpp:114
bool hasText(const std::string &text)
void touchMove(float x, float y, int finger=0)
const std::vector< std::string > & focusLog() const
Definition harness.hpp:192
void tap(ControllerButton button, int times=1)
const ImageDiff & lastDiff() const
Definition harness.hpp:233
void mouseQuickClick(float x, float y)
std::vector< std::string > cutTexts()
void resize(int width, int height)
bool matchesReference(const std::string &name, int tolerance=8, double maxRatio=0.001)
HeadlessPlatform * platform()
Definition harness.hpp:123
void setKeyboardAnswer(const std::string &text)
void setAxis(ControllerAxis axis, float value)
View * find(const std::string &id)
Harness & operator=(const Harness &)=delete
View * findText(const std::string &text)
void pressKey(AuroreKeyboardScancode key)
void touchDown(float x, float y, int finger=0)
bool settle(double maxMs=5000)
void hold(ControllerButton button, double ms)
bool matchesReference(const std::string &name, const Rect &area, int tolerance=8, double maxRatio=0.001)
void push(Activity *activity, TransitionAnimation animation=TransitionAnimation::NONE)
bool focusByText(const std::string &text, ControllerButton button=BUTTON_DOWN, int maxSteps=30)
uint64_t frameCount() const
Definition harness.hpp:146
void clearFocusLog()
Definition harness.hpp:193
void mouseMove(float x, float y)
void release(ControllerButton button)
void swipe(float fromX, float fromY, float toX, float toY, double ms=200)
void press(ControllerButton button)
void tapKey(AuroreKeyboardScancode key, int times=1)
const Options & options() const
Definition harness.hpp:122
std::vector< std::string > texts()
Harness(const Harness &)=delete
Harness(Options options=Options())
std::vector< std::string > silentFocusables()
void releaseKey(AuroreKeyboardScancode key)
void tapAt(float x, float y)
void mouseClick(float x, float y)
void touchUp(int finger=0)
void mouseScroll(float dx, float dy)
Definition harness.hpp:52
std::string viewText(View *view)
ImageDiff compareImages(const Image &actual, const Image &expected, int tolerance=0)
Definition actions.hpp:25
AuroreKeyboardScancode
Definition input.hpp:44
TransitionAnimation
Definition view.hpp:153
ThemeVariant
The two sets of colours every theme has: light and dark.
Definition theme.hpp:37
ControllerButton
Definition input.hpp:179
@ BUTTON_DOWN
Definition input.hpp:187
retro_time_t Time
Definition time.hpp:31
ControllerAxis
Definition input.hpp:214
Definition geometry.hpp:70
Definition harness.hpp:100
double ratio
Definition harness.hpp:104
Image map
Definition harness.hpp:106
size_t differingPixels
Definition harness.hpp:102
int maxDelta
Definition harness.hpp:103
bool sameSize
Definition harness.hpp:101
Definition harness.hpp:84
bool empty() const
Definition harness.hpp:89
bool savePng(const std::string &path) const
int width
Definition harness.hpp:85
int height
Definition harness.hpp:86
static Image loadPng(const std::string &path)
const unsigned char * at(int x, int y) const
Definition harness.hpp:91
std::vector< unsigned char > rgba
Definition harness.hpp:87
Image crop(int x, int y, int w, int h) const
Definition harness.hpp:55
bool systemFonts
Definition harness.hpp:79
int width
Definition harness.hpp:57
std::string locale
Definition harness.hpp:63
int height
Definition harness.hpp:58
std::string title
Definition harness.hpp:70
std::string outputDir
Definition harness.hpp:75
double frameMs
Definition harness.hpp:60
int64_t wallTime
Definition harness.hpp:68
ThemeVariant theme
Definition harness.hpp:64
std::string referenceDir
Definition harness.hpp:74