blob: 811220d0318abbeb6d245e5af74f40d78f5d3ba6 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/geometry/length.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/geometry/calculation_expression_node.h"
#include "third_party/blink/renderer/platform/geometry/calculation_value.h"
namespace blink {
namespace {
const PixelsAndPercent ten_px(10,
0,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
const PixelsAndPercent twenty_px(20,
0,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
const PixelsAndPercent thirty_px(30,
0,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
const PixelsAndPercent ten_percent(0,
10,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
const PixelsAndPercent twenty_percent(0,
20,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
const PixelsAndPercent thirty_percent(0,
30,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
const PixelsAndPercent twenty_px_ten_percent(20,
10,
/*has_explicit_pixels=*/true,
/*has_explicit_percent=*/true);
} // namespace
class LengthTest : public ::testing::Test {
public:
const CalculationExpressionNode* PixelsAndPercent(PixelsAndPercent value) {
return MakeGarbageCollected<CalculationExpressionPixelsAndPercentNode>(
value);
}
const CalculationExpressionNode* Add(const CalculationExpressionNode* lhs,
const CalculationExpressionNode* rhs) {
return MakeGarbageCollected<CalculationExpressionOperationNode>(
CalculationExpressionOperationNode::Children({lhs, rhs}),
CalculationOperator::kAdd);
}
const CalculationExpressionNode* Subtract(
const CalculationExpressionNode* lhs,
const CalculationExpressionNode* rhs) {
return MakeGarbageCollected<CalculationExpressionOperationNode>(
CalculationExpressionOperationNode::Children({lhs, rhs}),
CalculationOperator::kSubtract);
}
const CalculationExpressionNode* Multiply(
const CalculationExpressionNode* node,
float factor) {
return MakeGarbageCollected<CalculationExpressionOperationNode>(
CalculationExpressionOperationNode::Children(
{node,
MakeGarbageCollected<CalculationExpressionNumberNode>(factor)}),
CalculationOperator::kMultiply);
}
const CalculationExpressionNode* Min(
HeapVector<Member<const CalculationExpressionNode>>&& operands) {
return MakeGarbageCollected<CalculationExpressionOperationNode>(
std::move(operands), CalculationOperator::kMin);
}
const CalculationExpressionNode* Max(
HeapVector<Member<const CalculationExpressionNode>>&& operands) {
return MakeGarbageCollected<CalculationExpressionOperationNode>(
std::move(operands), CalculationOperator::kMax);
}
const CalculationExpressionNode* Clamp(
HeapVector<Member<const CalculationExpressionNode>>&& operands) {
return MakeGarbageCollected<CalculationExpressionOperationNode>(
std::move(operands), CalculationOperator::kClamp);
}
Length CreateLength(const CalculationExpressionNode* expression) {
return Length(CalculationValue::CreateSimplified(expression,
Length::ValueRange::kAll));
}
};
TEST_F(LengthTest, EvaluateSimpleComparison) {
// min(10px, 20px)
{
Length length = CreateLength(
Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px)}));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(-200));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(-100));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(0));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(200));
}
// min(10%, 20%)
{
Length length = CreateLength(
Min({PixelsAndPercent(ten_percent), PixelsAndPercent(twenty_percent)}));
EXPECT_EQ(-40.0f, length.GetCalculationValue().Evaluate(-200));
EXPECT_EQ(-20.0f, length.GetCalculationValue().Evaluate(-100));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(0));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(200));
}
// min(10px, 10%)
{
Length length = CreateLength(
Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_percent)}));
EXPECT_EQ(-40.0f, length.GetCalculationValue().Evaluate(-200));
EXPECT_EQ(-20.0f, length.GetCalculationValue().Evaluate(-100));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(0));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(200));
}
// max(10px, 20px)
{
Length length = CreateLength(
Max({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px)}));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(-200));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(-100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(0));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(200));
}
// max(10%, 20%)
{
Length length = CreateLength(
Max({PixelsAndPercent(ten_percent), PixelsAndPercent(twenty_percent)}));
EXPECT_EQ(-20.0f, length.GetCalculationValue().Evaluate(-200));
EXPECT_EQ(-10.0f, length.GetCalculationValue().Evaluate(-100));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(0));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(40.0f, length.GetCalculationValue().Evaluate(200));
}
// max(10px, 10%)
{
Length length = CreateLength(
Max({PixelsAndPercent(ten_px), PixelsAndPercent(ten_percent)}));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(-200));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(-100));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(0));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(200));
}
}
TEST_F(LengthTest, EvaluateNestedComparisons) {
// max(10px, min(10%, 20px))
{
Length length = CreateLength(Max(
{PixelsAndPercent(ten_px),
Min({PixelsAndPercent(ten_percent), PixelsAndPercent(twenty_px)})}));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(15.0f, length.GetCalculationValue().Evaluate(150));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(250));
}
// max(10%, min(10px, 20%))
{
Length length = CreateLength(Max(
{PixelsAndPercent(ten_percent),
Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_percent)})}));
EXPECT_EQ(5.0f, length.GetCalculationValue().Evaluate(25));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(75));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(12.5f, length.GetCalculationValue().Evaluate(125));
}
// min(max(10px, 10%), 20px)
{
Length length = CreateLength(
Min({Max({PixelsAndPercent(ten_px), PixelsAndPercent(ten_percent)}),
PixelsAndPercent(twenty_px)}));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(15.0f, length.GetCalculationValue().Evaluate(150));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(250));
}
// min(max(10%, 10px), 20%)
{
Length length = CreateLength(
Min({Max({PixelsAndPercent(ten_percent), PixelsAndPercent(ten_px)}),
PixelsAndPercent(twenty_percent)}));
EXPECT_EQ(5.0f, length.GetCalculationValue().Evaluate(25));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(75));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(12.5f, length.GetCalculationValue().Evaluate(125));
}
}
TEST_F(LengthTest, EvaluateAdditive) {
// min(10%, 10px) + 10px
{
Length length = CreateLength(
Add(Min({PixelsAndPercent(ten_percent), PixelsAndPercent(ten_px)}),
PixelsAndPercent(ten_px)));
EXPECT_EQ(15.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(150));
}
// min(10%, 10px) - 10px
{
Length length = CreateLength(
Subtract(Min({PixelsAndPercent(ten_percent), PixelsAndPercent(ten_px)}),
PixelsAndPercent(ten_px)));
EXPECT_EQ(-5.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(150));
}
// 10px + max(10%, 10px)
{
Length length = CreateLength(
Add(PixelsAndPercent(ten_px),
Max({PixelsAndPercent(ten_percent), PixelsAndPercent(ten_px)})));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(25.0f, length.GetCalculationValue().Evaluate(150));
}
// 10px - max(10%, 10px)
{
Length length = CreateLength(Subtract(
PixelsAndPercent(ten_px),
Max({PixelsAndPercent(ten_percent), PixelsAndPercent(ten_px)})));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(0.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(-5.0f, length.GetCalculationValue().Evaluate(150));
}
}
TEST_F(LengthTest, EvaluateMultiplicative) {
// min(10px, 10%) * 2
{
Length length = CreateLength(Multiply(
Min({PixelsAndPercent(ten_px), PixelsAndPercent(ten_percent)}), 2));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(150));
}
// max(10px, 10%) * 0.5
{
Length length = CreateLength(Multiply(
Max({PixelsAndPercent(ten_px), PixelsAndPercent(ten_percent)}), 0.5));
EXPECT_EQ(5.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(5.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(200));
}
}
TEST_F(LengthTest, EvaluateClamp) {
// clamp(10px, 20px, 30px)
{
Length length = CreateLength(
Clamp({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
PixelsAndPercent(thirty_px)}));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(150));
}
// clamp(20px, 10px, 30px)
{
Length length = CreateLength(
Clamp({PixelsAndPercent(twenty_px), PixelsAndPercent(ten_px),
PixelsAndPercent(thirty_px)}));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(150));
}
// clamp(30px, 10px, 20px)
{
Length length = CreateLength(
Clamp({PixelsAndPercent(thirty_px), PixelsAndPercent(ten_px),
PixelsAndPercent(twenty_px)}));
EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(150));
}
// clamp(10%, 20%, 30%)
{
Length length = CreateLength(
Clamp({PixelsAndPercent(ten_percent), PixelsAndPercent(twenty_percent),
PixelsAndPercent(thirty_percent)}));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(150));
}
// clamp(20%, 10%, 30%)
{
Length length = CreateLength(
Clamp({PixelsAndPercent(twenty_percent), PixelsAndPercent(ten_percent),
PixelsAndPercent(thirty_percent)}));
EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(150));
}
// clamp(30%, 10%, 20%)
{
Length length = CreateLength(
Clamp({PixelsAndPercent(thirty_percent), PixelsAndPercent(ten_percent),
PixelsAndPercent(twenty_percent)}));
EXPECT_EQ(45.0f, length.GetCalculationValue().Evaluate(150));
EXPECT_EQ(90.0f, length.GetCalculationValue().Evaluate(300));
EXPECT_EQ(135.0f, length.GetCalculationValue().Evaluate(450));
}
// clamp(20px + 10%, 20%, 30%)
{
Length length = CreateLength(Clamp({PixelsAndPercent(twenty_px_ten_percent),
PixelsAndPercent(twenty_percent),
PixelsAndPercent(thirty_percent)}));
EXPECT_EQ(35.0f, length.GetCalculationValue().Evaluate(150));
EXPECT_EQ(60.0f, length.GetCalculationValue().Evaluate(300));
EXPECT_EQ(90.0f, length.GetCalculationValue().Evaluate(450));
}
}
TEST_F(LengthTest, BlendExpressions) {
// From: min(10px, 20%)
// To: max(20px, 10%)
// Progress: 0.25
Length from_length = CreateLength(
Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_percent)}));
Length to_length = CreateLength(
Max({PixelsAndPercent(twenty_px), PixelsAndPercent(ten_percent)}));
Length blended = to_length.Blend(from_length, 0.25, Length::ValueRange::kAll);
EXPECT_EQ(8.75f, blended.GetCalculationValue().Evaluate(25));
EXPECT_EQ(12.5f, blended.GetCalculationValue().Evaluate(50));
EXPECT_EQ(12.5f, blended.GetCalculationValue().Evaluate(100));
EXPECT_EQ(12.5f, blended.GetCalculationValue().Evaluate(200));
EXPECT_EQ(17.5f, blended.GetCalculationValue().Evaluate(400));
}
TEST_F(LengthTest, ZoomExpression) {
// Original: min(10px, 10%)
// Factor: 2.0
{
Length original = CreateLength(
Min({PixelsAndPercent(ten_px), PixelsAndPercent(ten_percent)}));
Length zoomed = original.Zoom(2);
EXPECT_EQ(10.0f, zoomed.GetCalculationValue().Evaluate(100));
EXPECT_EQ(20.0f, zoomed.GetCalculationValue().Evaluate(200));
EXPECT_EQ(20.0f, zoomed.GetCalculationValue().Evaluate(400));
}
// Original: max(10px, 10%)
// Factor: 0.5
{
Length original = CreateLength(
Max({PixelsAndPercent(ten_px), PixelsAndPercent(ten_percent)}));
Length zoomed = original.Zoom(0.5);
EXPECT_EQ(5.0f, zoomed.GetCalculationValue().Evaluate(25));
EXPECT_EQ(5.0f, zoomed.GetCalculationValue().Evaluate(50));
EXPECT_EQ(10.0f, zoomed.GetCalculationValue().Evaluate(100));
}
}
TEST_F(LengthTest, SubtractExpressionFromOneHundredPercent) {
// min(10px, 20%)
{
Length original = CreateLength(
Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_percent)}));
Length result = original.SubtractFromOneHundredPercent();
EXPECT_EQ(20.0f, result.GetCalculationValue().Evaluate(25));
EXPECT_EQ(40.0f, result.GetCalculationValue().Evaluate(50));
EXPECT_EQ(90.0f, result.GetCalculationValue().Evaluate(100));
}
// max(20px, 10%)
{
Length original = CreateLength(
Max({PixelsAndPercent(twenty_px), PixelsAndPercent(ten_percent)}));
Length result = original.SubtractFromOneHundredPercent();
EXPECT_EQ(80.0f, result.GetCalculationValue().Evaluate(100));
EXPECT_EQ(180.0f, result.GetCalculationValue().Evaluate(200));
EXPECT_EQ(360.0f, result.GetCalculationValue().Evaluate(400));
}
}
TEST_F(LengthTest, SimplifiedExpressionFromComparisonCreation) {
// min(10px, 20px, 30px)
{
Length original =
CreateLength(Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
PixelsAndPercent(thirty_px)}));
Length zoomed = original.Zoom(1);
// If it was not simplified, DCHECK fails in
// CalculationValue::GetPixelsAndPercent.
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(10.0f, result.pixels);
}
// max(10px, 20px, 30px)
{
Length original =
CreateLength(Max({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
PixelsAndPercent(thirty_px)}));
Length zoomed = original.Zoom(1);
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(30.0f, result.pixels);
}
}
// Non-simplified and simplified CalculationExpressionOperationNode creation
// with CalculationOperator::kMultiply should return the same evaluation result.
TEST_F(LengthTest, MultiplyPixelsAndPercent) {
// Multiply (20px + 10%) by 2
Length non_simplified =
CreateLength(Multiply(PixelsAndPercent(twenty_px_ten_percent), 2));
const auto& non_simplified_calc_value = non_simplified.GetCalculationValue();
EXPECT_TRUE(non_simplified_calc_value.IsExpression());
float result_for_non_simplified =
non_simplified_calc_value.GetOrCreateExpression()->Evaluate(100, {});
EXPECT_EQ(60.0f, result_for_non_simplified);
Length simplified =
CreateLength(CalculationExpressionOperationNode::CreateSimplified(
CalculationExpressionOperationNode::Children(
{PixelsAndPercent(twenty_px_ten_percent),
MakeGarbageCollected<CalculationExpressionNumberNode>(2)}),
CalculationOperator::kMultiply));
const auto& simplified_calc_value = simplified.GetCalculationValue();
EXPECT_FALSE(simplified_calc_value.IsExpression());
float result_for_simplified = simplified_calc_value.Evaluate(100);
EXPECT_EQ(60.0f, result_for_simplified);
}
TEST_F(LengthTest, ZoomToOperation) {
// Add 10px + 20px
{
Length original = CreateLength(
Add(PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px)));
Length zoomed = original.Zoom(1);
// If it was not simplified, DCHECK fails in
// CalculationValue::GetPixelsAndPercent.
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(30.0f, result.pixels);
}
// Subtract 20px - 10px
{
Length original = CreateLength(
Subtract(PixelsAndPercent(twenty_px), PixelsAndPercent(ten_px)));
Length zoomed = original.Zoom(1);
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(10.0f, result.pixels);
}
// Multiply 30px by 3
{
Length original = CreateLength(Multiply(PixelsAndPercent(thirty_px), 3));
Length zoomed = original.Zoom(1);
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(90.0f, result.pixels);
}
// min(10px, 20px, 30px) with zoom by 2
{
Length original =
CreateLength(Min({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
PixelsAndPercent(thirty_px)}));
Length zoomed = original.Zoom(2);
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(20.0f, result.pixels);
}
// max(10px, 20px, 30px) with zoom by 2
{
Length original =
CreateLength(Max({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
PixelsAndPercent(thirty_px)}));
Length zoomed = original.Zoom(2);
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(60.0f, result.pixels);
}
// clamp(10px, 20px, 30px) with zoom by 2
{
Length original = CreateLength(
Clamp({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
PixelsAndPercent(thirty_px)}));
Length zoomed = original.Zoom(2);
auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
EXPECT_EQ(40.0f, result.pixels);
}
}
TEST_F(LengthTest, Add) {
// 1px + 1px = 2px
EXPECT_EQ(2.0f, Length::Fixed(1).Add(Length::Fixed(1)).Pixels());
// 1px + 0px = 1px
EXPECT_EQ(1.0f, Length::Fixed(1).Add(Length::Fixed(0)).Pixels());
// 0px + 1px = 1px
EXPECT_EQ(1.0f, Length::Fixed(0).Add(Length::Fixed(1)).Pixels());
// 1% + 1% = 2%
EXPECT_EQ(2.0f, Length::Percent(1).Add(Length::Percent(1)).Percent());
// 1% + 0% = 1%
EXPECT_EQ(1.0f, Length::Percent(1).Add(Length::Percent(0)).Percent());
// 0% + 1% = 1%
EXPECT_EQ(1.0f, Length::Percent(0).Add(Length::Percent(1)).Percent());
// 1px + 10% = calc(1px + 10%) = 2px (for a max_value of 10)
EXPECT_EQ(2.0f, Length::Fixed(1)
.Add(Length::Percent(10))
.GetCalculationValue()
.Evaluate(10));
// 10% + 1px = calc(10% + 1px) = 2px (for a max_value of 10)
EXPECT_EQ(2.0f, Length::Percent(10)
.Add(Length::Fixed(1))
.GetCalculationValue()
.Evaluate(10));
// 1px + calc(10px * 3) = 31px
const Length non_simplified =
CreateLength(Multiply(PixelsAndPercent(ten_px), 3));
EXPECT_EQ(
31.0f,
Length::Fixed(1).Add(non_simplified).GetCalculationValue().Evaluate(123));
// calc(10px * 3) + 1px = 31px
EXPECT_EQ(
31.0f,
non_simplified.Add(Length::Fixed(1)).GetCalculationValue().Evaluate(123));
}
} // namespace blink