#include #include using namespace mbgl; using namespace mbgl::style; using namespace std::literals::chrono_literals; float evaluate(UnevaluatedPaintProperty>& property, Duration delta = Duration::zero()) { PropertyEvaluationParameters parameters { 0, TimePoint::min() + delta, ZoomHistory(), Duration::zero() }; PropertyEvaluator evaluator { parameters, 0.0f }; return property.evaluate(evaluator, parameters.now); } PossiblyEvaluatedPropertyValue evaluate(UnevaluatedPaintProperty>& property, Duration delta = Duration::zero()) { PropertyEvaluationParameters parameters { 0, TimePoint::min() + delta, ZoomHistory(), Duration::zero() }; DataDrivenPropertyEvaluator evaluator { parameters, 0.0f }; return property.evaluate(evaluator, parameters.now); } TEST(UnevaluatedPaintProperty, EvaluateDefaultValue) { UnevaluatedPaintProperty> property; ASSERT_EQ(0.0f, evaluate(property)); } TEST(UnevaluatedPaintProperty, EvaluateUntransitionedConstant) { UnevaluatedPaintProperty> property { PropertyValue(1.0f), UnevaluatedPaintProperty>(), TransitionOptions(), TimePoint::min() }; ASSERT_EQ(1.0f, evaluate(property)); } TEST(UnevaluatedPaintProperty, EvaluateTransitionedConstantWithoutDelay) { TransitionOptions transition; transition.duration = { 1000ms }; UnevaluatedPaintProperty> t0 { PropertyValue(0.0f), UnevaluatedPaintProperty>(), TransitionOptions(), TimePoint::min() }; UnevaluatedPaintProperty> t1 { PropertyValue(1.0f), t0, transition, TimePoint::min() }; ASSERT_FLOAT_EQ(0.0f, evaluate(t1, 0ms)); ASSERT_FLOAT_EQ(0.823099f, evaluate(t1, 500ms)); ASSERT_FLOAT_EQ(1.0f, evaluate(t1, 1500ms)); } TEST(UnevaluatedPaintProperty, EvaluateTransitionedConstantWithDelay) { TransitionOptions transition; transition.delay = { 1000ms }; transition.duration = { 1000ms }; UnevaluatedPaintProperty> t0 { PropertyValue(0.0f), UnevaluatedPaintProperty>(), TransitionOptions(), TimePoint::min() }; UnevaluatedPaintProperty> t1 { PropertyValue(1.0f), t0, transition, TimePoint::min() }; ASSERT_FLOAT_EQ(0.0f, evaluate(t1, 0ms)); ASSERT_FLOAT_EQ(0.0f, evaluate(t1, 500ms)); ASSERT_FLOAT_EQ(0.0f, evaluate(t1, 612ms)); ASSERT_FLOAT_EQ(0.823099f, evaluate(t1, 1500ms)); ASSERT_FLOAT_EQ(1.0f, evaluate(t1, 2500ms)); } TEST(UnevaluatedPaintProperty, EvaluateDataDrivenValue) { TransitionOptions transition; transition.delay = { 1000ms }; transition.duration = { 1000ms }; UnevaluatedPaintProperty> t0 { DataDrivenPropertyValue(0.0f), UnevaluatedPaintProperty>(), TransitionOptions(), TimePoint::min() }; SourceFunction sourceFunction = { "property_name", IdentityStops() }; UnevaluatedPaintProperty> t1 { DataDrivenPropertyValue(sourceFunction), t0, transition, TimePoint::min() }; ASSERT_TRUE(evaluate(t0, 0ms).isConstant()); ASSERT_FALSE(evaluate(t1, 0ms).isConstant()) << "A paint property transition to a data-driven evaluates immediately to the final value (see https://github.com/mapbox/mapbox-gl-native/issues/8237)."; }