#include #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 evaluateDataExpression(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{ PropertyValue(0.0f), Transitioning>(), TransitionOptions(), TimePoint::min()}; using namespace mbgl::style::expression::dsl; PropertyExpression expression(number(get("property_name"))); Transitioning> t1{PropertyValue(expression), t0, transition, TimePoint::min()}; ASSERT_TRUE(evaluateDataExpression(t0, 0ms).isConstant()); ASSERT_FALSE(evaluateDataExpression(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)."; }