blob: 596ea7ff7dbd414c01db4df30fdbf02e7c79c668 [file] [log] [blame] [edit]
// Copyright 2024 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "pw_thread/internal/priority.h"
#include "pw_compilation_testing/negative_compilation.h"
#include "pw_unit_test/constexpr.h"
#include "pw_unit_test/framework.h"
namespace {
using ::pw::thread::internal::Priority;
PW_CONSTEXPR_TEST(ThreadPriority, PriorityNotSuppoerted, {
using NoPriority = Priority<int, 0, 0, 0>;
PW_TEST_EXPECT_FALSE(NoPriority::IsSupported());
PW_TEST_EXPECT_EQ(NoPriority::Medium().NextHigherClamped(),
NoPriority::Medium());
});
PW_CONSTEXPR_TEST(ThreadPriority, Default, {
using Zero = Priority<int, 0, 0, 0>;
PW_TEST_EXPECT_EQ(Zero::Default().native(), 0);
using MidDefault = Priority<signed char, -100, 100, 0>;
PW_TEST_EXPECT_EQ(MidDefault::Default().native(), 0);
PW_TEST_EXPECT_EQ(MidDefault::Default(), MidDefault());
using HighDefault = Priority<signed char, -100, 100, 100>;
PW_TEST_EXPECT_EQ(HighDefault::Default().native(), 100);
PW_TEST_EXPECT_EQ(HighDefault::Default(), HighDefault());
using LowDefault = Priority<signed char, -100, 100, -100>;
PW_TEST_EXPECT_EQ(LowDefault::Default().native(), -100);
PW_TEST_EXPECT_EQ(LowDefault::Default(), LowDefault());
});
// Table of expected priority values where the columns are the priority tiers.
// lowest=lt, very low = vl, low = l, etc.
template <typename T>
constexpr std::array<T, 9> kExpectedPriorities[] = {
// clang-format off
// lt,vl, l,ml, m,mh, h,vh,ht
// Fewer native priorities than named priorities.
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 1, 1},
{0, 0, 1, 1, 1, 1, 2, 2, 2},
{0, 0, 1, 1, 2, 2, 2, 3, 3},
{0, 1, 1, 2, 2, 3, 3, 4, 4},
{0, 1, 1, 2, 3, 3, 4, 4, 5},
{0, 1, 2, 2, 3, 4, 5, 5, 6},
{0, 1, 2, 3, 4, 4, 5, 6, 7},
// One native level per named priority.
{0, 1, 2, 3, 4, 5, 6, 7, 8},
// More native priorities than named priorities.
{0, 1, 2, 3, 5, 6, 7, 8, 9},
{0, 1, 3, 4, 5, 6, 8, 9, 10},
{0, 1, 3, 4, 6, 7, 8, 10, 11},
{0, 2, 3, 5, 6, 8, 9, 11, 12},
{0, 2, 3, 5, 7, 8, 10, 11, 13},
{0, 2, 4, 5, 7, 9, 11, 12, 14},
{0, 2, 4, 6, 8, 9, 11, 13, 15},
{0, 2, 4, 6, 8, 10, 12, 14, 16},
}; // clang-format on
template <typename T, T kMax>
constexpr void TestNamedPrioritiesWithMax() {
using ThreadPriority = Priority<T, 0, kMax, 0>;
constexpr const auto& expected = kExpectedPriorities<T>[kMax];
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().native(), expected[0]);
PW_TEST_EXPECT_EQ(ThreadPriority::VeryLow().native(), expected[1]);
PW_TEST_EXPECT_EQ(ThreadPriority::Low().native(), expected[2]);
PW_TEST_EXPECT_EQ(ThreadPriority::MediumLow().native(), expected[3]);
PW_TEST_EXPECT_EQ(ThreadPriority::Medium().native(), expected[4]);
PW_TEST_EXPECT_EQ(ThreadPriority::MediumHigh().native(), expected[5]);
PW_TEST_EXPECT_EQ(ThreadPriority::High().native(), expected[6]);
PW_TEST_EXPECT_EQ(ThreadPriority::VeryHigh().native(), expected[7]);
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().native(), expected[8]);
}
template <typename T>
constexpr void TestNamedPrioritiesZeroLowest() {
TestNamedPrioritiesWithMax<T, 0>();
TestNamedPrioritiesWithMax<T, 1>();
TestNamedPrioritiesWithMax<T, 2>();
TestNamedPrioritiesWithMax<T, 3>();
TestNamedPrioritiesWithMax<T, 4>();
TestNamedPrioritiesWithMax<T, 5>();
TestNamedPrioritiesWithMax<T, 6>();
TestNamedPrioritiesWithMax<T, 7>();
TestNamedPrioritiesWithMax<T, 8>();
TestNamedPrioritiesWithMax<T, 9>();
TestNamedPrioritiesWithMax<T, 10>();
TestNamedPrioritiesWithMax<T, 11>();
TestNamedPrioritiesWithMax<T, 12>();
TestNamedPrioritiesWithMax<T, 13>();
TestNamedPrioritiesWithMax<T, 14>();
TestNamedPrioritiesWithMax<T, 15>();
TestNamedPrioritiesWithMax<T, 16>();
}
PW_CONSTEXPR_TEST(ThreadPriority, NamedPriorities0ToMax, {
TestNamedPrioritiesZeroLowest<int8_t>();
TestNamedPrioritiesZeroLowest<uint8_t>();
TestNamedPrioritiesZeroLowest<int32_t>();
TestNamedPrioritiesZeroLowest<uint32_t>();
});
PW_CONSTEXPR_TEST(ThreadPriority, OffsetLowToHigh, {
using ThreadPriority = Priority<int16_t, 1, 9, 1>;
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().native(), 1);
PW_TEST_EXPECT_EQ(ThreadPriority::VeryLow().native(), 2);
PW_TEST_EXPECT_EQ(ThreadPriority::Low().native(), 3);
PW_TEST_EXPECT_EQ(ThreadPriority::MediumLow().native(), 4);
PW_TEST_EXPECT_EQ(ThreadPriority::Medium().native(), 5);
PW_TEST_EXPECT_EQ(ThreadPriority::MediumHigh().native(), 6);
PW_TEST_EXPECT_EQ(ThreadPriority::High().native(), 7);
PW_TEST_EXPECT_EQ(ThreadPriority::VeryHigh().native(), 8);
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().native(), 9);
});
enum class HighPriorityIsLowValue {
kMaximum = -1,
kSuperHigh = 0,
kHigh = 1,
kPrettyHigh = 2,
kJustRight = 3,
kKindaLow = 4,
kLow = 5,
kLowLowLow = 6,
kAsLowAsItGoes = 7,
};
using HighIsLow = Priority<HighPriorityIsLowValue,
HighPriorityIsLowValue::kAsLowAsItGoes,
HighPriorityIsLowValue::kMaximum,
HighPriorityIsLowValue::kLow>;
PW_CONSTEXPR_TEST(ThreadPriority, HighIsLowEnumMapsCorrectlyToNamedPriorities, {
PW_TEST_EXPECT_EQ(HighIsLow::Lowest().native(),
HighPriorityIsLowValue::kAsLowAsItGoes);
PW_TEST_EXPECT_EQ(HighIsLow::VeryLow().native(),
HighPriorityIsLowValue::kLowLowLow);
PW_TEST_EXPECT_EQ(HighIsLow::Low().native(), HighPriorityIsLowValue::kLow);
PW_TEST_EXPECT_EQ(HighIsLow::MediumLow().native(),
HighPriorityIsLowValue::kKindaLow);
PW_TEST_EXPECT_EQ(HighIsLow::Medium().native(),
HighPriorityIsLowValue::kJustRight);
PW_TEST_EXPECT_EQ(HighIsLow::MediumHigh().native(),
HighPriorityIsLowValue::kPrettyHigh);
PW_TEST_EXPECT_EQ(HighIsLow::High().native(), HighPriorityIsLowValue::kHigh);
PW_TEST_EXPECT_EQ(HighIsLow::VeryHigh().native(),
HighPriorityIsLowValue::kSuperHigh);
PW_TEST_EXPECT_EQ(HighIsLow::Highest().native(),
HighPriorityIsLowValue::kMaximum);
});
PW_CONSTEXPR_TEST(ThreadPriority, HighIsLowEnumFromNative, {
PW_TEST_EXPECT_EQ(
HighIsLow::FromNative(HighPriorityIsLowValue::kMaximum).native(),
HighPriorityIsLowValue::kMaximum);
PW_TEST_EXPECT_EQ(
HighIsLow::FromNative(HighPriorityIsLowValue::kKindaLow).native(),
HighPriorityIsLowValue::kKindaLow);
PW_TEST_EXPECT_EQ(
HighIsLow::FromNative(HighPriorityIsLowValue::kAsLowAsItGoes).native(),
HighPriorityIsLowValue::kAsLowAsItGoes);
});
PW_CONSTEXPR_TEST(ThreadPriority, HighIsLowComparisons, {
PW_TEST_EXPECT_LT(HighIsLow::Lowest(), HighIsLow::Highest());
PW_TEST_EXPECT_LT(HighIsLow::Lowest(), HighIsLow::VeryLow());
PW_TEST_EXPECT_LT(HighIsLow::VeryLow(), HighIsLow::Low());
PW_TEST_EXPECT_LT(HighIsLow::Low(), HighIsLow::MediumLow());
PW_TEST_EXPECT_LT(HighIsLow::MediumLow(), HighIsLow::Medium());
PW_TEST_EXPECT_LT(HighIsLow::Medium(), HighIsLow::MediumHigh());
PW_TEST_EXPECT_LT(HighIsLow::MediumHigh(), HighIsLow::High());
PW_TEST_EXPECT_LT(HighIsLow::High(), HighIsLow::VeryHigh());
PW_TEST_EXPECT_LT(HighIsLow::VeryHigh(), HighIsLow::Highest());
PW_TEST_EXPECT_LE(HighIsLow::Lowest(), HighIsLow::Highest());
PW_TEST_EXPECT_LE(HighIsLow::Lowest(), HighIsLow::Lowest());
PW_TEST_EXPECT_LE(HighIsLow::Lowest(), HighIsLow::VeryLow());
PW_TEST_EXPECT_LE(HighIsLow::VeryLow(), HighIsLow::VeryLow());
PW_TEST_EXPECT_LE(HighIsLow::VeryLow(), HighIsLow::Low());
PW_TEST_EXPECT_LE(HighIsLow::Low(), HighIsLow::Low());
PW_TEST_EXPECT_LE(HighIsLow::Low(), HighIsLow::MediumLow());
PW_TEST_EXPECT_LE(HighIsLow::MediumLow(), HighIsLow::MediumLow());
PW_TEST_EXPECT_LE(HighIsLow::MediumLow(), HighIsLow::Medium());
PW_TEST_EXPECT_LE(HighIsLow::Medium(), HighIsLow::Medium());
PW_TEST_EXPECT_LE(HighIsLow::Medium(), HighIsLow::MediumHigh());
PW_TEST_EXPECT_LE(HighIsLow::MediumHigh(), HighIsLow::MediumHigh());
PW_TEST_EXPECT_LE(HighIsLow::MediumHigh(), HighIsLow::High());
PW_TEST_EXPECT_LE(HighIsLow::High(), HighIsLow::High());
PW_TEST_EXPECT_LE(HighIsLow::High(), HighIsLow::VeryHigh());
PW_TEST_EXPECT_LE(HighIsLow::VeryHigh(), HighIsLow::VeryHigh());
PW_TEST_EXPECT_LE(HighIsLow::VeryHigh(), HighIsLow::Highest());
PW_TEST_EXPECT_LE(HighIsLow::Highest(), HighIsLow::Highest());
PW_TEST_EXPECT_GT(HighIsLow::Highest(), HighIsLow::Lowest());
PW_TEST_EXPECT_GT(HighIsLow::VeryLow(), HighIsLow::Lowest());
PW_TEST_EXPECT_GT(HighIsLow::Low(), HighIsLow::VeryLow());
PW_TEST_EXPECT_GT(HighIsLow::MediumLow(), HighIsLow::Low());
PW_TEST_EXPECT_GT(HighIsLow::Medium(), HighIsLow::MediumLow());
PW_TEST_EXPECT_GT(HighIsLow::MediumHigh(), HighIsLow::Medium());
PW_TEST_EXPECT_GT(HighIsLow::High(), HighIsLow::MediumHigh());
PW_TEST_EXPECT_GT(HighIsLow::VeryHigh(), HighIsLow::High());
PW_TEST_EXPECT_GT(HighIsLow::Highest(), HighIsLow::VeryHigh());
PW_TEST_EXPECT_GE(HighIsLow::Highest(), HighIsLow::Lowest());
PW_TEST_EXPECT_GE(HighIsLow::Lowest(), HighIsLow::Lowest());
PW_TEST_EXPECT_GE(HighIsLow::VeryLow(), HighIsLow::Lowest());
PW_TEST_EXPECT_GE(HighIsLow::VeryLow(), HighIsLow::VeryLow());
PW_TEST_EXPECT_GE(HighIsLow::Low(), HighIsLow::VeryLow());
PW_TEST_EXPECT_GE(HighIsLow::Low(), HighIsLow::Low());
PW_TEST_EXPECT_GE(HighIsLow::MediumLow(), HighIsLow::Low());
PW_TEST_EXPECT_GE(HighIsLow::MediumLow(), HighIsLow::MediumLow());
PW_TEST_EXPECT_GE(HighIsLow::Medium(), HighIsLow::MediumLow());
PW_TEST_EXPECT_GE(HighIsLow::Medium(), HighIsLow::Medium());
PW_TEST_EXPECT_GE(HighIsLow::MediumHigh(), HighIsLow::Medium());
PW_TEST_EXPECT_GE(HighIsLow::MediumHigh(), HighIsLow::MediumHigh());
PW_TEST_EXPECT_GE(HighIsLow::High(), HighIsLow::MediumHigh());
PW_TEST_EXPECT_GE(HighIsLow::High(), HighIsLow::High());
PW_TEST_EXPECT_GE(HighIsLow::VeryHigh(), HighIsLow::High());
PW_TEST_EXPECT_GE(HighIsLow::VeryHigh(), HighIsLow::VeryHigh());
PW_TEST_EXPECT_GE(HighIsLow::Highest(), HighIsLow::VeryHigh());
PW_TEST_EXPECT_GE(HighIsLow::Highest(), HighIsLow::Highest());
});
PW_CONSTEXPR_TEST(ThreadPriority, LowIsHighComparisons, {
using ThreadPriority = Priority<int, 0, 100, 0>;
PW_TEST_EXPECT_LT(ThreadPriority::Lowest(), ThreadPriority::Highest());
PW_TEST_EXPECT_LT(ThreadPriority::Lowest(), ThreadPriority::VeryLow());
PW_TEST_EXPECT_LT(ThreadPriority::VeryLow(), ThreadPriority::Low());
PW_TEST_EXPECT_LT(ThreadPriority::Low(), ThreadPriority::MediumLow());
PW_TEST_EXPECT_LT(ThreadPriority::MediumLow(), ThreadPriority::Medium());
PW_TEST_EXPECT_LT(ThreadPriority::Medium(), ThreadPriority::MediumHigh());
PW_TEST_EXPECT_LT(ThreadPriority::MediumHigh(), ThreadPriority::High());
PW_TEST_EXPECT_LT(ThreadPriority::High(), ThreadPriority::VeryHigh());
PW_TEST_EXPECT_LT(ThreadPriority::VeryHigh(), ThreadPriority::Highest());
PW_TEST_EXPECT_LE(ThreadPriority::Lowest(), ThreadPriority::Highest());
PW_TEST_EXPECT_LE(ThreadPriority::Lowest(), ThreadPriority::Lowest());
PW_TEST_EXPECT_LE(ThreadPriority::Lowest(), ThreadPriority::VeryLow());
PW_TEST_EXPECT_LE(ThreadPriority::VeryLow(), ThreadPriority::VeryLow());
PW_TEST_EXPECT_LE(ThreadPriority::VeryLow(), ThreadPriority::Low());
PW_TEST_EXPECT_LE(ThreadPriority::Low(), ThreadPriority::Low());
PW_TEST_EXPECT_LE(ThreadPriority::Low(), ThreadPriority::MediumLow());
PW_TEST_EXPECT_LE(ThreadPriority::MediumLow(), ThreadPriority::MediumLow());
PW_TEST_EXPECT_LE(ThreadPriority::MediumLow(), ThreadPriority::Medium());
PW_TEST_EXPECT_LE(ThreadPriority::Medium(), ThreadPriority::Medium());
PW_TEST_EXPECT_LE(ThreadPriority::Medium(), ThreadPriority::MediumHigh());
PW_TEST_EXPECT_LE(ThreadPriority::MediumHigh(), ThreadPriority::MediumHigh());
PW_TEST_EXPECT_LE(ThreadPriority::MediumHigh(), ThreadPriority::High());
PW_TEST_EXPECT_LE(ThreadPriority::High(), ThreadPriority::High());
PW_TEST_EXPECT_LE(ThreadPriority::High(), ThreadPriority::VeryHigh());
PW_TEST_EXPECT_LE(ThreadPriority::VeryHigh(), ThreadPriority::VeryHigh());
PW_TEST_EXPECT_LE(ThreadPriority::VeryHigh(), ThreadPriority::Highest());
PW_TEST_EXPECT_LE(ThreadPriority::Highest(), ThreadPriority::Highest());
PW_TEST_EXPECT_GT(ThreadPriority::Highest(), ThreadPriority::Lowest());
PW_TEST_EXPECT_GT(ThreadPriority::VeryLow(), ThreadPriority::Lowest());
PW_TEST_EXPECT_GT(ThreadPriority::Low(), ThreadPriority::VeryLow());
PW_TEST_EXPECT_GT(ThreadPriority::MediumLow(), ThreadPriority::Low());
PW_TEST_EXPECT_GT(ThreadPriority::Medium(), ThreadPriority::MediumLow());
PW_TEST_EXPECT_GT(ThreadPriority::MediumHigh(), ThreadPriority::Medium());
PW_TEST_EXPECT_GT(ThreadPriority::High(), ThreadPriority::MediumHigh());
PW_TEST_EXPECT_GT(ThreadPriority::VeryHigh(), ThreadPriority::High());
PW_TEST_EXPECT_GT(ThreadPriority::Highest(), ThreadPriority::VeryHigh());
PW_TEST_EXPECT_GE(ThreadPriority::Highest(), ThreadPriority::Lowest());
PW_TEST_EXPECT_GE(ThreadPriority::Lowest(), ThreadPriority::Lowest());
PW_TEST_EXPECT_GE(ThreadPriority::VeryLow(), ThreadPriority::Lowest());
PW_TEST_EXPECT_GE(ThreadPriority::VeryLow(), ThreadPriority::VeryLow());
PW_TEST_EXPECT_GE(ThreadPriority::Low(), ThreadPriority::VeryLow());
PW_TEST_EXPECT_GE(ThreadPriority::Low(), ThreadPriority::Low());
PW_TEST_EXPECT_GE(ThreadPriority::MediumLow(), ThreadPriority::Low());
PW_TEST_EXPECT_GE(ThreadPriority::MediumLow(), ThreadPriority::MediumLow());
PW_TEST_EXPECT_GE(ThreadPriority::Medium(), ThreadPriority::MediumLow());
PW_TEST_EXPECT_GE(ThreadPriority::Medium(), ThreadPriority::Medium());
PW_TEST_EXPECT_GE(ThreadPriority::MediumHigh(), ThreadPriority::Medium());
PW_TEST_EXPECT_GE(ThreadPriority::MediumHigh(), ThreadPriority::MediumHigh());
PW_TEST_EXPECT_GE(ThreadPriority::High(), ThreadPriority::MediumHigh());
PW_TEST_EXPECT_GE(ThreadPriority::High(), ThreadPriority::High());
PW_TEST_EXPECT_GE(ThreadPriority::VeryHigh(), ThreadPriority::High());
PW_TEST_EXPECT_GE(ThreadPriority::VeryHigh(), ThreadPriority::VeryHigh());
PW_TEST_EXPECT_GE(ThreadPriority::Highest(), ThreadPriority::VeryHigh());
PW_TEST_EXPECT_GE(ThreadPriority::Highest(), ThreadPriority::Highest());
});
PW_CONSTEXPR_TEST(ThreadPriority, LowIsLowEnum, {
enum LowIsLowPriority {
kLowest = 99,
kLow = 100,
kMedium = 101,
kHigh = 102,
kVeryHigh = 103,
kHighest = 104,
};
using ThreadPriority = Priority<LowIsLowPriority, kLowest, kHighest, kMedium>;
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().native(), kLowest);
PW_TEST_EXPECT_EQ(ThreadPriority::VeryLow().native(), kLow);
PW_TEST_EXPECT_EQ(ThreadPriority::Low().native(), kLow);
PW_TEST_EXPECT_EQ(ThreadPriority::MediumLow().native(), kMedium);
PW_TEST_EXPECT_EQ(ThreadPriority::Medium().native(), kHigh);
PW_TEST_EXPECT_EQ(ThreadPriority::MediumHigh().native(), kHigh);
PW_TEST_EXPECT_EQ(ThreadPriority::High().native(), kVeryHigh);
PW_TEST_EXPECT_EQ(ThreadPriority::VeryHigh().native(), kVeryHigh);
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().native(), kHighest);
for (int i = kLowest; i <= kHighest; ++i) {
PW_TEST_EXPECT_EQ(
ThreadPriority::FromNative(static_cast<LowIsLowPriority>(i)).native(),
static_cast<LowIsLowPriority>(i));
}
});
PW_CONSTEXPR_TEST(ThreadPriority, NextHigher, {
using ThreadPriority = Priority<int, -1, 1, 0>;
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().native(), -1);
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().NextHigher().native(), 0);
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().NextHigher().NextHigher().native(),
1);
PW_TEST_EXPECT_EQ(ThreadPriority::Medium().NextLower().NextHigher(),
ThreadPriority::Medium());
});
PW_CONSTEXPR_TEST(ThreadPriority, NextLower, {
using ThreadPriority = Priority<int, -1, 1, 0>;
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().native(), 1);
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().NextLower().native(), 0);
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().NextLower().NextLower().native(),
-1);
});
#if PW_NC_TEST(NextHigherTooLarge)
PW_NC_EXPECT("Priority cannot exceed the maximum value");
[[maybe_unused]] constexpr auto TooLarge =
Priority<int, -1, 1, 0>::Highest().NextHigher();
#elif PW_NC_TEST(NextLowerTooLow)
PW_NC_EXPECT("Priority cannot subceed the minimum value");
[[maybe_unused]] constexpr auto TooLarge =
Priority<int, -1, 1, 0>::Lowest().NextLower();
#endif // PW_NC_TEST
PW_CONSTEXPR_TEST(ThreadPriority, NextHigherClamped, {
using ThreadPriority = Priority<int, 0, 100, 0>;
PW_TEST_EXPECT_EQ(ThreadPriority::Highest().NextHigherClamped(),
ThreadPriority::Highest());
PW_TEST_EXPECT_EQ(
ThreadPriority::Medium().NextHigherClamped(ThreadPriority::Medium()),
ThreadPriority::Medium());
PW_TEST_EXPECT_EQ(ThreadPriority::Medium().NextHigherClamped(),
ThreadPriority::Medium().NextHigher());
});
PW_CONSTEXPR_TEST(ThreadPriority, NextLowerClamped, {
using ThreadPriority = Priority<int, 0, 100, 0>;
PW_TEST_EXPECT_EQ(ThreadPriority::Lowest().NextLowerClamped(),
ThreadPriority::Lowest());
PW_TEST_EXPECT_EQ(
ThreadPriority::Medium().NextLowerClamped(ThreadPriority::Medium()),
ThreadPriority::Medium());
PW_TEST_EXPECT_EQ(ThreadPriority::Medium().NextLowerClamped(),
ThreadPriority::Medium().NextLower());
});
} // namespace