| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <gtest/gtest.h> |
| |
|
| | #include <Gui/Application.h> |
| | #include <Gui/Utilities.h> |
| | #include <Gui/StyleParameters/ParameterManager.h> |
| |
|
| | using namespace Gui::StyleParameters; |
| |
|
| | class ParameterManagerTest: public ::testing::Test |
| | { |
| | protected: |
| | void SetUp() override |
| | { |
| | |
| | auto source1 = std::make_unique<InMemoryParameterSource>( |
| | std::list<Parameter> { |
| | {"BaseSize", "8px"}, |
| | {"PrimaryColor", "#ff0000"}, |
| | {"SecondaryColor", "#00ff00"}, |
| | }, |
| | ParameterSource::Metadata {"Source 1"} |
| | ); |
| |
|
| | auto source2 = std::make_unique<InMemoryParameterSource>( |
| | std::list<Parameter> { |
| | {"BaseSize", "16px"}, |
| | {"Margin", "@BaseSize * 2"}, |
| | {"Padding", "@BaseSize / 2"}, |
| | }, |
| | ParameterSource::Metadata {"Source 2"} |
| | ); |
| |
|
| | manager.addSource(source1.get()); |
| | manager.addSource(source2.get()); |
| | sources.push_back(std::move(source1)); |
| | sources.push_back(std::move(source2)); |
| | } |
| |
|
| | Gui::StyleParameters::ParameterManager manager; |
| | std::vector<std::unique_ptr<ParameterSource>> sources; |
| | }; |
| |
|
| | |
| | TEST_F(ParameterManagerTest, BasicParameterResolution) |
| | { |
| | { |
| | auto result = manager.resolve("BaseSize"); |
| | EXPECT_TRUE(result.has_value()); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result)); |
| | auto length = std::get<Numeric>(*result); |
| | EXPECT_DOUBLE_EQ(length.value, 16.0); |
| | EXPECT_EQ(length.unit, "px"); |
| | } |
| |
|
| | { |
| | auto result = manager.resolve("PrimaryColor"); |
| | EXPECT_TRUE(result.has_value()); |
| | EXPECT_TRUE(std::holds_alternative<Base::Color>(*result)); |
| | auto color = std::get<Base::Color>(*result); |
| | EXPECT_EQ(color.r, 1); |
| | EXPECT_EQ(color.g, 0); |
| | EXPECT_EQ(color.b, 0); |
| | } |
| |
|
| | { |
| | auto result = manager.resolve("SecondaryColor"); |
| | EXPECT_TRUE(result.has_value()); |
| | EXPECT_TRUE(std::holds_alternative<Base::Color>(*result)); |
| | auto color = std::get<Base::Color>(*result); |
| | EXPECT_EQ(color.r, 0); |
| | EXPECT_EQ(color.g, 1); |
| | EXPECT_EQ(color.b, 0); |
| | } |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, ParameterReferences) |
| | { |
| | { |
| | auto result = manager.resolve("Margin"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result)); |
| | auto length = std::get<Numeric>(*result); |
| | EXPECT_DOUBLE_EQ(length.value, 32.0); |
| | EXPECT_EQ(length.unit, "px"); |
| | } |
| |
|
| | { |
| | auto result = manager.resolve("Padding"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result)); |
| | auto length = std::get<Numeric>(*result); |
| | EXPECT_DOUBLE_EQ(length.value, 8.0); |
| | EXPECT_EQ(length.unit, "px"); |
| | } |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, Caching) |
| | { |
| | |
| | auto result1 = manager.resolve("BaseSize"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result1)); |
| |
|
| | |
| | auto result2 = manager.resolve("BaseSize"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result2)); |
| |
|
| | |
| | auto length1 = std::get<Numeric>(*result1); |
| | auto length2 = std::get<Numeric>(*result2); |
| | EXPECT_DOUBLE_EQ(length1.value, length2.value); |
| | EXPECT_EQ(length1.unit, length2.unit); |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, CacheInvalidation) |
| | { |
| | |
| | auto result1 = manager.resolve("BaseSize"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result1)); |
| | auto length1 = std::get<Numeric>(*result1); |
| | EXPECT_DOUBLE_EQ(length1.value, 16.0); |
| |
|
| | |
| | manager.reload(); |
| |
|
| | |
| | auto result2 = manager.resolve("BaseSize"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result2)); |
| | auto length2 = std::get<Numeric>(*result2); |
| | EXPECT_DOUBLE_EQ(length2.value, 16.0); |
| | EXPECT_EQ(length1.unit, length2.unit); |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, SourcePriority) |
| | { |
| | |
| | auto source3 = std::make_unique<InMemoryParameterSource>( |
| | std::list<Parameter> { |
| | {"BaseSize", "24px"}, |
| | }, |
| | ParameterSource::Metadata {"Source 3"} |
| | ); |
| |
|
| | manager.addSource(source3.get()); |
| | sources.push_back(std::move(source3)); |
| |
|
| | |
| | auto result = manager.resolve("BaseSize"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result)); |
| | auto length = std::get<Numeric>(*result); |
| | EXPECT_DOUBLE_EQ(length.value, 24.0); |
| | EXPECT_EQ(length.unit, "px"); |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, ParameterListing) |
| | { |
| | auto params = manager.parameters(); |
| |
|
| | |
| | std::set<std::string> paramNames; |
| | for (const auto& param : params) { |
| | paramNames.insert(param.name); |
| | } |
| |
|
| | EXPECT_TRUE(paramNames.contains("BaseSize")); |
| | EXPECT_TRUE(paramNames.contains("PrimaryColor")); |
| | EXPECT_TRUE(paramNames.contains("SecondaryColor")); |
| | EXPECT_TRUE(paramNames.contains("Margin")); |
| | EXPECT_TRUE(paramNames.contains("Padding")); |
| |
|
| | |
| | EXPECT_EQ(paramNames.count("BaseSize"), 1); |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, ExpressionRetrieval) |
| | { |
| | { |
| | auto expr = manager.expression("BaseSize"); |
| | EXPECT_TRUE(expr.has_value()); |
| | EXPECT_EQ(*expr, "16px"); |
| | } |
| |
|
| | { |
| | auto expr = manager.expression("Margin"); |
| | EXPECT_TRUE(expr.has_value()); |
| | EXPECT_EQ(*expr, "@BaseSize * 2"); |
| | } |
| |
|
| | { |
| | auto expr = manager.expression("NonExistent"); |
| | EXPECT_FALSE(expr.has_value()); |
| | } |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, ParameterRetrieval) |
| | { |
| | { |
| | auto param = manager.parameter("BaseSize"); |
| | EXPECT_TRUE(param.has_value()); |
| | EXPECT_EQ(param->name, "BaseSize"); |
| | EXPECT_EQ(param->value, "16px"); |
| | } |
| |
|
| | { |
| | auto param = manager.parameter("NonExistent"); |
| | EXPECT_FALSE(param.has_value()); |
| | } |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, SourceManagement) |
| | { |
| | auto sources = manager.sources(); |
| | EXPECT_EQ(sources.size(), 2); |
| |
|
| | |
| | for (auto source : sources) { |
| | EXPECT_NE(source, nullptr); |
| | auto params = source->all(); |
| | EXPECT_FALSE(params.empty()); |
| | } |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, CircularReferenceDetection) |
| | { |
| | |
| | auto circularSource = std::make_unique<InMemoryParameterSource>( |
| | std::list<Parameter> { |
| | {"A", "@B"}, |
| | {"B", "@A"}, |
| | }, |
| | ParameterSource::Metadata {"Circular Source"} |
| | ); |
| |
|
| | manager.addSource(circularSource.get()); |
| | sources.push_back(std::move(circularSource)); |
| |
|
| | |
| | auto result = manager.resolve("A"); |
| | |
| | EXPECT_TRUE(std::holds_alternative<std::string>(*result)); |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, ComplexExpressions) |
| | { |
| | |
| | auto complexSource = std::make_unique<InMemoryParameterSource>( |
| | std::list<Parameter> { |
| | {"ComplexMargin", "(@BaseSize + 4px) * 2"}, |
| | {"ComplexPadding", "(@BaseSize - 2px) / 2"}, |
| | {"ColorWithFunction", "lighten(@PrimaryColor, 20)"}, |
| | }, |
| | ParameterSource::Metadata {"Complex Source"} |
| | ); |
| |
|
| | manager.addSource(complexSource.get()); |
| | sources.push_back(std::move(complexSource)); |
| |
|
| | { |
| | auto result = manager.resolve("ComplexMargin"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result)); |
| | auto length = std::get<Numeric>(*result); |
| | EXPECT_DOUBLE_EQ(length.value, 40.0); |
| | EXPECT_EQ(length.unit, "px"); |
| | } |
| |
|
| | { |
| | auto result = manager.resolve("ComplexPadding"); |
| | EXPECT_TRUE(std::holds_alternative<Numeric>(*result)); |
| | auto length = std::get<Numeric>(*result); |
| | EXPECT_DOUBLE_EQ(length.value, 7.0); |
| | EXPECT_EQ(length.unit, "px"); |
| | } |
| |
|
| | { |
| | auto result = manager.resolve("ColorWithFunction"); |
| | EXPECT_TRUE(std::holds_alternative<Base::Color>(*result)); |
| | auto color = std::get<Base::Color>(*result).asValue<QColor>(); |
| | |
| | EXPECT_GT(color.lightness(), QColor(0xff0000).lightness()); |
| | } |
| | } |
| |
|
| | |
| | TEST_F(ParameterManagerTest, ErrorHandling) |
| | { |
| | |
| | auto result = manager.resolve("NonExistent"); |
| | EXPECT_FALSE(result.has_value()); |
| |
|
| | |
| | auto invalidSource = std::make_unique<InMemoryParameterSource>( |
| | std::list<Parameter> { |
| | {"Invalid", "invalid expression that will fail"}, |
| | }, |
| | ParameterSource::Metadata {"Invalid Source"} |
| | ); |
| |
|
| | manager.addSource(invalidSource.get()); |
| | sources.push_back(std::move(invalidSource)); |
| |
|
| | |
| | auto invalidResult = manager.resolve("Invalid"); |
| | |
| | EXPECT_TRUE(invalidResult.has_value()); |
| | EXPECT_TRUE(std::holds_alternative<std::string>(*invalidResult)); |
| | } |
| |
|
| | DEFINE_STYLE_PARAMETER(BaseSize, Numeric(8, "px")); |
| |
|
| | TEST_F(ParameterManagerTest, ResolveParameterDefinition) |
| | { |
| | auto result = manager.resolve(BaseSize); |
| | EXPECT_DOUBLE_EQ(result.value, 16); |
| | EXPECT_EQ(result.unit, "px"); |
| | } |
| |
|
| |
|
| | DEFINE_STYLE_PARAMETER(MarginSize, Numeric(16, "px")); |
| |
|
| | TEST_F(ParameterManagerTest, ResolveParameterDefinitionDefault) |
| | { |
| | auto result = manager.resolve(MarginSize); |
| | EXPECT_DOUBLE_EQ(result.value, 16); |
| | EXPECT_EQ(result.unit, "px"); |
| | } |
| |
|