Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions SerialPrograms/Source/ComputerPrograms/UnitTestRunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "CommonTools/OCR/OCR_Tests.h"
#include "Kernels/Kernels_Tests.h"
#include "PokemonFRLG/PokemonFRLG_Tests.h"
#include "PokemonRSE/PokemonRSE_Tests.h"
#include "PokemonHome/PokemonHome_Tests.h"
#include "PokemonSwSh/PokemonSwSh_Tests.h"
#include "PokemonLA/PokemonLA_Tests.h"
Expand All @@ -43,6 +44,7 @@ UnitTestDatabase make_UNIT_TESTS_ALL(){
NintendoSwitch::add_tests_FailedToConnectDetector(ret);
NintendoSwitch::add_tests_UpdatePopupDetector(ret);
NintendoSwitch::PokemonFRLG::add_tests(ret);
NintendoSwitch::PokemonRSE::add_tests(ret);
NintendoSwitch::PokemonHome::add_tests(ret);
NintendoSwitch::PokemonSwSh::add_tests(ret);
NintendoSwitch::PokemonLA::add_tests(ret);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "CommonTools/Images/SolidColorTest.h"
#include "CommonTools/Images/ImageFilter.h"
#include "CommonFramework/GlobalAutoPaths.h"
#include "CommonFramework/ImageTools/ImageBoxes.h"
#include "CommonFramework/ImageTypes/ImageRGB32.h"
#include "CommonFramework/ImageTools/ImageStats.h"
Expand Down Expand Up @@ -201,6 +202,175 @@ bool SelectionDialogDetector::detect(const ImageViewRGB32& screen){
}


static std::vector<SlotCandidate> confirm_candidates(ConfirmSlot slot, ConfirmPosition position) {
double offset = SELECTION_SLOT_OFFSETS[(int)slot];

switch (position) {
case ConfirmPosition::STANDARD:
return {
{ 0.69, 0.45 + offset, SelectionIndicator::ARROW },
{ 0.685, 0.458 + offset, SelectionIndicator::BORDER }
};
case ConfirmPosition::SPECIAL:
return {
{ 0.79, 0.45 + offset, SelectionIndicator::ARROW },
{ 0.785, 0.458 + offset, SelectionIndicator::BORDER }
};
case ConfirmPosition::STARTER:
return {
{ 0.79, 0.45 + offset, SelectionIndicator::ARROW },
{ 0.725, 0.397 + offset, SelectionIndicator::ARROW }, // jpn rs
{ 0.72, 0.405 + offset, SelectionIndicator::BORDER }
};
case ConfirmPosition::MART:
return {
{ 0.69, 0.45 + offset, SelectionIndicator::ARROW },
{ 0.255, 0.45 + offset, SelectionIndicator::ARROW }, // jpn rs
{ 0.25, 0.458 + offset, SelectionIndicator::BORDER }
};
case ConfirmPosition::TOP_LEFT:
return {
{ 0.094, 0.115 + offset, SelectionIndicator::ARROW },
{ 0.089, 0.123 + offset, SelectionIndicator::BORDER }
};
default:
return {
{ 0.69, 0.45 + offset, SelectionIndicator::ARROW },
{ 0.685, 0.458 + offset, SelectionIndicator::BORDER }
};
}
}

ConfirmSlotDetector::ConfirmSlotDetector(Color color, ConfirmSlot slot, ConfirmPosition position)
: SelectionSlotDetector(color
, confirm_candidates(slot, position))
{}



class Test_SelectionDialogDetector : public UnitTest {
public:

Test_SelectionDialogDetector(
const std::string& image,
bool expected
)
: UnitTest("PokemonRSE::SelectionDialogDetector - " + image)
, m_image(UNIT_TEST_RESOURCE_PATH() + image)
, m_expected(expected)
{}

virtual UnitTestResult run(Logger& logger, CancellableScope& scope) const override {
SelectionDialogDetector detector(COLOR_RED);
ImageRGB32 image(m_image);
return detector.detect(image) == m_expected;
};

private:
std::string m_image;
bool m_expected;
};

void add_tests_SelectionDialogDetector(UnitTestDatabase& database) {
// Switch 1/2

/*
// Original GBA resolution; {0.0, 0.0, 1.0, 1.0}
database.add<Test_SelectionDialogDetector>("PokemonRSE/SelectionDialogDetector/GBA-Eng-Ruby_true.png", true);
database.add<Test_SelectionDialogDetector>("PokemonRSE/SelectionDialogDetector/GBA-Ger-Emerald_true.png", true);

// Game Boy Player; {0.064217, 0.107667, 0.86413, 0.787928}
database.add<Test_SelectionDialogDetector>("PokemonRSE/SelectionDialogDetector/GBP-Ger-Emerald_true.png", true);
database.add<Test_SelectionDialogDetector>("PokemonRSE/SelectionDialogDetector/GBP-Ger-Ruby_true.png", true);
*/
}


class Test_ConfirmSlotDetector : public UnitTest {
public:

Test_ConfirmSlotDetector(
const std::string& image,
ConfirmSlot slot,
ConfirmPosition position,
bool expected
)
: UnitTest("PokemonRSE::ConfirmSlotDetector - " + std::to_string((int)slot) + " - " + image)
, m_image(UNIT_TEST_RESOURCE_PATH() + image)
, m_slot(slot)
, m_position(position)
, m_expected(expected)
{
}

virtual UnitTestResult run(Logger& logger, CancellableScope& scope) const override {
ConfirmSlotDetector detector(COLOR_RED, m_slot, m_position);
ImageRGB32 image(m_image);
return detector.detect(image) == m_expected;
};

private:
std::string m_image;
ConfirmSlot m_slot;
ConfirmPosition m_position;
bool m_expected;
};

void add_tests_ConfirmSlotDetector(UnitTestDatabase& database) {
// Switch 1/2

/*
// Original GBA resolution {0.0, 0.0, 1.0, 1.0}
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Eng-Ruby_yes.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Eng-Ruby_yes.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, false);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Emerald_yes.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Emerald_yes.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, false);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Ruby_yes.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Ruby_yes.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, false);

// GBA SPECIAL
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Eng-Emerald-Special_no.png", ConfirmSlot::NO, ConfirmPosition::SPECIAL, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Eng-Ruby-Special_yes.png", ConfirmSlot::YES, ConfirmPosition::SPECIAL, true);

// GBA TOP_LEFT
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Eng-Emerald-Top_no.png", ConfirmSlot::NO, ConfirmPosition::TOP_LEFT, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Eng-Ruby-Top_no.png", ConfirmSlot::NO, ConfirmPosition::TOP_LEFT, true);

// GBA MART
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Emerald-Mart_yes.png", ConfirmSlot::YES, ConfirmPosition::MART, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Ruby-Mart_no.png", ConfirmSlot::NO, ConfirmPosition::MART, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Jpn-Ruby-Mart_yes.png", ConfirmSlot::YES, ConfirmPosition::MART, true);

// GBA STARTER
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Emerald-Starter_yes.png", ConfirmSlot::YES, ConfirmPosition::STARTER, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Ger-Ruby-Starter_no.png", ConfirmSlot::NO, ConfirmPosition::STARTER, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBA-Jpn-Ruby-Starter_yes.png", ConfirmSlot::YES, ConfirmPosition::STARTER, true);

// Game Boy Player {0.064217, 0.107667, 0.86413, 0.787928}
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald_no.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald_no.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, false);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald_yes.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald_yes.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, false);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Ruby_no.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Ruby_no.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, false);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Ruby_yes.png", ConfirmSlot::YES, ConfirmPosition::STANDARD, true);
//database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Ruby_yes.png", ConfirmSlot::NO, ConfirmPosition::STANDARD, false);

// GBP SPECIAL
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald-Special_yes.png", ConfirmSlot::YES, ConfirmPosition::SPECIAL, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Ruby-Special_no.png", ConfirmSlot::NO, ConfirmPosition::SPECIAL, true);

// GBP MART
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald-Mart_yes.png", ConfirmSlot::YES, ConfirmPosition::MART, true);
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Ruby-Mart_yes.png", ConfirmSlot::YES, ConfirmPosition::MART, true);

// GBP STARTER
database.add<Test_ConfirmSlotDetector>("PokemonRSE/ConfirmSlotDetector/GBP-Ger-Emerald-Starter_yes.png", ConfirmSlot::YES, ConfirmPosition::STARTER, true);
*/
}




}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@

#include <chrono>
#include <atomic>
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "Common/Cpp/Color.h"
#include "Common/Cpp/TestRunners/UnitTestDatabase.h"
#include "CommonFramework/ImageTools/ImageBoxes.h"
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "CommonTools/VisualDetector.h"
#include "CommonTools/VisualDetectors/BlackScreenDetector.h"
#include "CommonTools/InferenceCallbacks/VisualInferenceCallback.h"
#include "PokemonRSE/Inference/PokemonRSE_SelectionDetector.h"
#include "PokemonRSE/PokemonRSE_Settings.h"

namespace PokemonAutomation{
Expand Down Expand Up @@ -161,6 +163,35 @@ class SelectionDialogWatcher : public DetectorToFinder<SelectionDialogDetector>{
};


enum class ConfirmSlot {
YES,
NO
};

enum class ConfirmPosition {
STANDARD, // e.g. save menu
SPECIAL, // e.g. clock in your room, replace move; not starter selection: ruby/sapphire is different
STARTER, // starter selection
MART, // confirm purchase
TOP_LEFT // e.g. player name
};

class ConfirmSlotDetector : public SelectionSlotDetector {
public:
ConfirmSlotDetector(Color color, ConfirmSlot slot, ConfirmPosition position = ConfirmPosition::STANDARD);
};
class ConfirmSlotWatcher : public DetectorToFinder<ConfirmSlotDetector> {
public:
ConfirmSlotWatcher(Color color, ConfirmSlot slot, ConfirmPosition position = ConfirmPosition::STANDARD, Milliseconds hold_duration = Milliseconds(250))
: DetectorToFinder("ConfirmSlotWatcher", hold_duration , color, slot, position)
{}
};



void add_tests_SelectionDialogDetector(UnitTestDatabase& database);
void add_tests_ConfirmSlotDetector(UnitTestDatabase& database);

}
}
}
Expand Down
Loading
Loading