#include "catch2/catch.hpp" #include "common/params.h" #include "selfdrive/ui/qt/window.h" const QString TEST_TEXT = "(WRAPPED_SOURCE_TEXT)"; // what each string should be translated to QRegExp RE_NUM("\\d*"); QStringList getParentWidgets(QWidget* widget){ QStringList parentWidgets; while (widget->parentWidget() != Q_NULLPTR) { widget = widget->parentWidget(); parentWidgets.append(widget->metaObject()->className()); } return parentWidgets; } template void checkWidgetTrWrap(MainWindow &w) { for (auto widget : w.findChildren()) { const QString text = widget->text(); bool isNumber = RE_NUM.exactMatch(text); bool wrapped = text.contains(TEST_TEXT); QString parentWidgets = getParentWidgets(widget).join("->"); if (!text.isEmpty() && !isNumber && !wrapped) { FAIL(("\"" + text + "\" must be wrapped. Parent widgets: " + parentWidgets).toStdString()); } // warn if source string wrapped, but UI adds text // TODO: add way to ignore this if (wrapped && text != TEST_TEXT) { WARN(("\"" + text + "\" is dynamic and needs a custom retranslate function. Parent widgets: " + parentWidgets).toStdString()); } } } // Tests all strings in the UI are wrapped with tr() TEST_CASE("UI: test all strings wrapped") { Params().remove("LanguageSetting"); Params().remove("HardwareSerial"); Params().remove("DongleId"); qputenv("TICI", "1"); MainWindow w; checkWidgetTrWrap(w); checkWidgetTrWrap(w); }