#include #include #include #include using namespace mbgl; using namespace mbgl::style; using namespace std::literals::chrono_literals; float evaluate(Transitioning>& property, Duration delta = Duration::zero()) { ZoomHistory zoomHistory; zoomHistory.update(0, TimePoint::min() + delta); PropertyEvaluationParameters parameters { zoomHistory, TimePoint::min() + delta, Duration::zero() }; PropertyEvaluator evaluator { parameters, 0.0f }; return property.evaluate(evaluator, parameters.now); } PossiblyEvaluatedPropertyValue evaluate(Transitioning>& property, Duration delta = Duration::zero()) { ZoomHistory zoomHistory; zoomHistory.update(0, TimePoint::min() + delta); PropertyEvaluationParameters parameters { zoomHistory, TimePoint::min() + delta, Duration::zero() }; DataDrivenPropertyEvaluator evaluator { parameters, 0.0f }; return property.evaluate(evaluator, parameters.now); } TEST(TransitioningPropertyValue, EvaluateDefaultValue) { Transitioning> property; ASSERT_EQ(0.0f, evaluate(property)); } TEST(TransitioningPropertyValue, EvaluateUntransitionedConstant) { Transitioning> property { PropertyValue(1.0f), Transitioning>(), TransitionOptions(), TimePoint::min() }; ASSERT_EQ(1.0f, evaluate(property)); } TEST(TransitioningPropertyValue, EvaluateTransitionedConstantWithoutDelay) { TransitionOptions transition; transition.duration = { 1000ms }; Transitioning> t0 { PropertyValue(0.0f), Transitioning>(), TransitionOptions(), TimePoint::min() }; Transitioning> 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(TransitioningPropertyValue, EvaluateTransitionedConstantWithDelay) { TransitionOptions transition; transition.delay = { 1000ms }; transition.duration = { 1000ms }; Transitioning> t0 { PropertyValue(0.0f), Transitioning>(), TransitionOptions(), TimePoint::min() }; Transitioning> 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(TransitioningDataDrivenPropertyValue, Evaluate) { TransitionOptions transition; transition.delay = { 1000ms }; transition.duration = { 1000ms }; Transitioning> t0 { DataDrivenPropertyValue(0.0f), Transitioning>(), TransitionOptions(), TimePoint::min() }; SourceFunction sourceFunction = { "property_name", IdentityStops() }; Transitioning> 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)."; }