diff --git a/src/controllers/legacycontrollersettings.h b/src/controllers/legacycontrollersettings.h index b7d2f378d9c..863992376ec 100644 --- a/src/controllers/legacycontrollersettings.h +++ b/src/controllers/legacycontrollersettings.h @@ -6,6 +6,16 @@ #include "controllers/legacycontrollersettingslayout.h" #include "util/parented_ptr.h" +namespace { +template +bool valid_range(T min, T max, T step) { + VERIFY_OR_DEBUG_ASSERT(step >= 0) { + return false; + } + return step > 0 && ((min <= 0 && min + step <= max) || (max >= 0 && max - step >= min)); +} +} // namespace + class QSpinBox; class QDoubleSpinBox; @@ -218,7 +228,13 @@ class LegacyControllerNumberSetting } m_defaultValue = ValueDeserializer(element.attribute("default"), &isOk); if (!isOk) { - m_defaultValue = 0; + if (0 > m_maxValue) { + m_defaultValue = m_maxValue; + } else if (0 < m_minValue) { + m_defaultValue = m_minValue; + } else { + m_defaultValue = 0; + } } reset(); save(); @@ -263,7 +279,7 @@ class LegacyControllerNumberSetting m_defaultValue >= m_minValue && m_savedValue >= m_minValue && m_editedValue >= m_minValue && m_defaultValue <= m_maxValue && m_savedValue <= m_maxValue && m_editedValue <= m_maxValue && - m_stepValue > 0 && m_stepValue < m_maxValue; + valid_range(m_minValue, m_maxValue, m_stepValue); } static AbstractLegacyControllerSetting* createFrom(const QDomElement& element) { diff --git a/src/test/controller_mapping_settings_test.cpp b/src/test/controller_mapping_settings_test.cpp index 3719fcefaf4..9689f5a6c27 100644 --- a/src/test/controller_mapping_settings_test.cpp +++ b/src/test/controller_mapping_settings_test.cpp @@ -511,3 +511,38 @@ TEST_F(LegacyControllerMappingSettingsTest, discardDuplicateSettings) { ASSERT_EQ(settings.at(1)->value().toNumber(), 50); ASSERT_EQ(settings.at(2)->value().toString(), "myOptionValue1"); } + +TEST_F(LegacyControllerMappingSettingsTest, handleNumberWithNegativeRange) { + QDomDocument doc; + QString dom; + QTextStream(&dom) + << QString(kValidInteger).arg("0", "-500", "0", "1"); + doc.setContent( + QString("%1") + .arg(dom)); + + auto pMapping = LegacyDummyMappingFileHandler::loadDummyMapping( + doc.documentElement(), "/fake/path"); + + ASSERT_EQ(pMapping->getSettings().size(), 1); + ASSERT_EQ(pMapping->getSettings().at(0)->variableName(), "myInteger1"); + ASSERT_EQ(pMapping->getSettings().at(0)->value().toNumber(), 0); + + dom.clear(); + QTextStream(&dom) + << QString(kValidInteger).arg("20", "-100", "100", "50"); + doc.setContent( + QString("%1") + .arg(dom)); + + pMapping = LegacyDummyMappingFileHandler::loadDummyMapping( + doc.documentElement(), "/fake/path"); + + ASSERT_EQ(pMapping->getSettings().size(), 1); + ASSERT_EQ(pMapping->getSettings().at(0)->variableName(), "myInteger1"); + ASSERT_EQ(pMapping->getSettings().at(0)->value().toNumber(), 20); +}