Files
MapLibreParticleLab/test/util/padding.test.cpp
Bart Louwers 2a8ebc4906 core: rename mbgl directories to mln (#4511)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-22 20:50:14 +02:00

116 lines
3.8 KiB
C++

#include <mln/test/util.hpp>
#include <mln/renderer/property_evaluator.hpp>
#include <mln/renderer/property_evaluation_parameters.hpp>
#include <mln/style/types.hpp>
#include <mln/style/conversion/json.hpp>
#include <mln/style/expression/dsl.hpp>
#include <mln/style/property_expression.hpp>
#include <mln/style/conversion/function.hpp>
#include <mln/style/conversion/property_value.hpp>
#include <mln/style/conversion_impl.hpp>
#include <mln/test/stub_geometry_tile_feature.hpp>
using namespace mln;
using namespace style;
using namespace style::expression;
using namespace style::expression::dsl;
using namespace std::string_literals;
TEST(Padding, InterpolateExpression) {
// Use DLS methods to create an expression
{
auto expr = PropertyExpression<Padding>(
interpolate(linear(), zoom(), 0.0, literal(Padding(0.0)), 1.0, literal(Padding(8.0))));
auto result = expr.evaluate(0.5f);
EXPECT_EQ(Padding(4.0), result);
}
// Parse expression from JSON, verify that expansion from number/array is handled correctly.
{
auto json =
R"(["interpolate", ["linear"], ["zoom"], 0, ["to-padding", 0], 1, ["to-padding", ["literal",[8, 16, -32]]]])";
PropertyExpression<Padding> expr(createExpression(json));
auto result = expr.evaluate(0.5f);
EXPECT_EQ(Padding(4.0, 8, -16, 8), result);
}
}
TEST(Padding, Function) {
auto fromFunction = [](const char* json) {
conversion::Error error;
auto function = conversion::convertJSON<PropertyValue<Padding>>(
json, error, /*allowDataExpressions*/ true, /*convertTokens*/ false);
return function->asExpression();
};
auto evalInContext = [](const auto& expr, const PropertyMap& properties) {
StubGeometryTileFeature feature{{}, FeatureType::Unknown, {}, properties};
EvaluationContext context{0, &feature};
auto a = expr.evaluate(context);
return a;
};
// exponential
{
auto expr = fromFunction(R"({"type": "exponential", "stops": [[1, 2], [11, [2, 5, 2, 7]]]})");
EXPECT_EQ(Padding(2, 2, 2, 2), expr.evaluate(0));
EXPECT_EQ(Padding(2, 3.2, 2, 4), expr.evaluate(5));
EXPECT_EQ(Padding(2, 5, 2, 7), expr.evaluate(11));
}
// interval
{
auto expr = fromFunction(R"({"type": "interval", "stops": [[1, 2], [11, 4]]})");
EXPECT_EQ(Padding(2), expr.evaluate(0));
EXPECT_EQ(Padding(2), expr.evaluate(10));
EXPECT_EQ(Padding(4), expr.evaluate(11));
}
// categorical
{
auto expr = fromFunction(
R"({"type": "categorical", "property": "foo", "stops": [[0, 2], [1, 4]], "default": 6})");
EXPECT_EQ(Padding(2), evalInContext(expr, {{"foo", 0}}));
EXPECT_EQ(Padding(4), evalInContext(expr, {{"foo", 1}}));
EXPECT_EQ(Padding(6), evalInContext(expr, {{"foo", 2}}));
EXPECT_EQ(Padding(6), evalInContext(expr, {{"bar", 0}}));
}
// identity
{
auto expr = fromFunction(R"({"type": "identity", "property": "foo", "default": [3, 7, 9, 11]})");
EXPECT_EQ(Padding(2, 4, 6, 4), evalInContext(expr, {{"foo", std::vector<mln::Value>({2, 4, 6})}}));
EXPECT_EQ(Padding(3), evalInContext(expr, {{"foo", 3}}));
EXPECT_EQ(Padding(3, 7, 9, 11), evalInContext(expr, {{"bar", 3}}));
}
}
TEST(Padding, OperatorBool) {
Padding padding(0, 0, 0, 0);
EXPECT_FALSE(padding);
padding.left = 1;
EXPECT_TRUE(padding);
}
TEST(Padding, OperatorEqual) {
auto a = Padding({{3.5f, 9}});
auto b = Padding(3.5, 9, 3.5, 9);
EXPECT_TRUE(a == b);
EXPECT_FALSE(a != b);
a.left = 7;
EXPECT_FALSE(a == b);
EXPECT_TRUE(a != b);
}
TEST(Padding, OperatorMultiply) {
auto padding = Padding(1, 2, 3, 4) * 2;
EXPECT_EQ(Padding(2, 4, 6, 8), padding);
padding = padding * 0.0;
EXPECT_EQ(Padding(0), padding);
}