# 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 < typename T >
void checkWidgetTrWrap ( MainWindow & w ) {
for ( auto widget : w . findChildren < T > ( ) ) {
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 < QPushButton * > ( w ) ;
checkWidgetTrWrap < QLabel * > ( w ) ;
}