Merge "SF: Update RefreshRateSelectorTest to check range of refresh rates."
diff --git a/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp
index 79d02dd..c9fefe3 100644
--- a/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp
+++ b/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp
@@ -230,6 +230,12 @@
         config.enableFrameRateOverride = GetParam();
         return TestableRefreshRateSelector(modes, activeModeId, config);
     }
+
+    // TODO(b/262783137) Test the complete range of refresh rates
+    struct FpsBeginEnd {
+        std::vector<std::pair<Fps, Fps>> begin;
+        std::vector<std::pair<Fps, Fps>> end;
+    };
 };
 
 RefreshRateSelectorTest::RefreshRateSelectorTest() {
@@ -1125,29 +1131,39 @@
     const auto refreshRates = selector.rankRefreshRates(selector.getActiveMode().getGroup(),
                                                         RefreshRateOrder::Descending);
 
-    const auto expectedRefreshRates = []() -> std::vector<FrameRateMode> {
+    const auto expectedRefreshRates = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{90_Hz, kMode90}, {60_Hz, kMode60}, {30_Hz, kMode30}};
+                return {.begin{{90_Hz, 90_Hz}, {60_Hz, 60_Hz}, {30_Hz, 30_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{90_Hz, kMode90}, {60_Hz, kMode60}, {45_Hz, kMode90}, {30_Hz, kMode30}};
+                return {.begin{{90_Hz, 90_Hz}, {60_Hz, 60_Hz}, {45_Hz, 90_Hz}, {30_Hz, 30_Hz}},
+                        .end{{1.022_Hz, 90_Hz},
+                             {1.016_Hz, 60_Hz},
+                             {1.011_Hz, 90_Hz},
+                             {1_Hz, 30_Hz}}};
         }
     }();
 
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates120, refreshRates.size());
     } else {
-        ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
+        ASSERT_EQ(expectedRefreshRates.begin.size(), refreshRates.size());
     }
 
-    for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
-        EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].frameRateMode)
-                << "Expected " << expectedRefreshRates[i].fps.getIntValue() << " ("
-                << expectedRefreshRates[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << refreshRates[i].frameRateMode.fps.getIntValue() << " ("
-                << refreshRates[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRefreshRates.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.begin[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, refreshRates[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRefreshRates.end.size(); i++) {
+        const size_t refreshRateIndex = refreshRates.size() - expectedRefreshRates.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.end[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  refreshRates[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 }
 
@@ -1159,32 +1175,39 @@
     const auto refreshRates = selector.rankRefreshRates(selector.getActiveMode().getGroup(),
                                                         RefreshRateOrder::Ascending);
 
-    const auto expectedRefreshRates = []() -> std::vector<FrameRateMode> {
+    const auto expectedRefreshRates = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}};
+                return {.begin{{30_Hz, 30_Hz}, {60_Hz, 60_Hz}, {90_Hz, 90_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{1_Hz, kMode30},
-                        {1.011_Hz, kMode90},
-                        {1.016_Hz, kMode60},
-                        {1.022_Hz, kMode90}};
+                return {.begin{{1_Hz, 30_Hz},
+                               {1.011_Hz, 90_Hz},
+                               {1.016_Hz, 60_Hz},
+                               {1.022_Hz, 90_Hz}},
+                        .end{{30_Hz, 30_Hz}, {45_Hz, 90_Hz}, {60_Hz, 60_Hz}, {90_Hz, 90_Hz}}};
         }
     }();
 
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates120, refreshRates.size());
     } else {
-        ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
+        ASSERT_EQ(expectedRefreshRates.begin.size(), refreshRates.size());
     }
 
-    for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
-        EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].frameRateMode)
-                << "Expected " << expectedRefreshRates[i].fps.getIntValue() << " ("
-                << expectedRefreshRates[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << refreshRates[i].frameRateMode.fps.getIntValue() << " ("
-                << refreshRates[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRefreshRates.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.begin[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, refreshRates[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRefreshRates.end.size(); i++) {
+        const size_t refreshRateIndex = refreshRates.size() - expectedRefreshRates.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.end[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  refreshRates[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 }
 
@@ -1258,30 +1281,44 @@
     auto [refreshRates, signals] = selector.getRankedFrameRates({}, {});
     EXPECT_FALSE(signals.powerOnImminent);
 
-    auto expectedRefreshRates = []() -> std::vector<FrameRateMode> {
+    auto expectedRefreshRates = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{90_Hz, kMode90}, {60_Hz, kMode60}};
+                return {.begin{{90_Hz, 90_Hz}, {60_Hz, 60_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{90_Hz, kMode90}, {60_Hz, kMode60},   {45_Hz, kMode90},
-                        {30_Hz, kMode60}, {22.5_Hz, kMode90}, {20_Hz, kMode60}};
+                return {.begin{{90_Hz, 90_Hz},
+                               {60_Hz, 60_Hz},
+                               {45_Hz, 90_Hz},
+                               {30_Hz, 60_Hz},
+                               {22.5_Hz, 90_Hz},
+                               {20_Hz, 60_Hz}},
+                        .end{{1.022_Hz, 90_Hz},
+                             {1.016_Hz, 60_Hz},
+                             {1.011_Hz, 90_Hz},
+                             {1_Hz, 60_Hz}}};
         }
     }();
 
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates120, refreshRates.size());
     } else {
-        ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
+        ASSERT_EQ(expectedRefreshRates.begin.size(), refreshRates.size());
     }
 
-    for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
-        EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].frameRateMode)
-                << "Expected " << expectedRefreshRates[i].fps.getIntValue() << " ("
-                << expectedRefreshRates[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << refreshRates[i].frameRateMode.fps.getIntValue() << " ("
-                << refreshRates[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRefreshRates.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.begin[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, refreshRates[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRefreshRates.end.size(); i++) {
+        const size_t refreshRateIndex = refreshRates.size() - expectedRefreshRates.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.end[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  refreshRates[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 
     std::tie(refreshRates, signals) =
@@ -1291,15 +1328,21 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates120, refreshRates.size());
     } else {
-        ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
+        ASSERT_EQ(expectedRefreshRates.begin.size(), refreshRates.size());
     }
 
-    for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
-        EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].frameRateMode)
-                << "Expected " << expectedRefreshRates[i].fps.getIntValue() << " ("
-                << expectedRefreshRates[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << refreshRates[i].frameRateMode.fps.getIntValue() << " ("
-                << refreshRates[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRefreshRates.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.begin[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, refreshRates[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRefreshRates.end.size(); i++) {
+        const size_t refreshRateIndex = refreshRates.size() - expectedRefreshRates.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.end[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  refreshRates[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 
     std::vector<LayerRequirement> layers = {{.weight = 1.f}};
@@ -1315,45 +1358,65 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates120, refreshRates.size());
     } else {
-        ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
+        ASSERT_EQ(expectedRefreshRates.begin.size(), refreshRates.size());
     }
 
-    for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
-        EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].frameRateMode)
-                << "Expected " << expectedRefreshRates[i].fps.getIntValue() << " ("
-                << expectedRefreshRates[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << refreshRates[i].frameRateMode.fps.getIntValue() << " ("
-                << refreshRates[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRefreshRates.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.begin[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, refreshRates[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRefreshRates.end.size(); i++) {
+        const size_t refreshRateIndex = refreshRates.size() - expectedRefreshRates.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.end[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  refreshRates[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 
     std::tie(refreshRates, signals) =
             selector.getRankedRefreshRatesAsPair(layers, {.powerOnImminent = false});
     EXPECT_FALSE(signals.powerOnImminent);
 
-    expectedRefreshRates = []() -> std::vector<FrameRateMode> {
+    expectedRefreshRates = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{60_Hz, kMode60}, {90_Hz, kMode90}};
+                return {.begin{{60_Hz, 60_Hz}, {90_Hz, 90_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{60_Hz, kMode60}, {90_Hz, kMode90},   {45_Hz, kMode90},
-                        {30_Hz, kMode60}, {22.5_Hz, kMode90}, {20_Hz, kMode60}};
+                return {.begin{{60_Hz, 60_Hz},
+                               {90_Hz, 90_Hz},
+                               {45_Hz, 90_Hz},
+                               {30_Hz, 60_Hz},
+                               {22.5_Hz, 90_Hz},
+                               {20_Hz, 60_Hz}},
+                        .end{{1.034_Hz, 60_Hz},
+                             {1.046_Hz, 90_Hz},
+                             {1.052_Hz, 60_Hz},
+                             {1.058_Hz, 90_Hz}}};
         }
     }();
 
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates120, refreshRates.size());
     } else {
-        ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
+        ASSERT_EQ(expectedRefreshRates.begin.size(), refreshRates.size());
     }
 
-    for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
-        EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].frameRateMode)
-                << "Expected " << expectedRefreshRates[i].fps.getIntValue() << " ("
-                << expectedRefreshRates[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << refreshRates[i].frameRateMode.fps.getIntValue() << " ("
-                << refreshRates[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRefreshRates.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.begin[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, refreshRates[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRefreshRates.end.size(); i++) {
+        const size_t refreshRateIndex = refreshRates.size() - expectedRefreshRates.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRefreshRates.end[i];
+        EXPECT_EQ(expectedRenderRate, refreshRates[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  refreshRates[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 }
 
@@ -1582,19 +1645,33 @@
     lr5.name = "30Hz";
     lr5.focused = true;
 
-    auto expectedRanking = []() -> std::vector<FrameRateMode> {
+    auto expectedRanking = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{120_Hz, kMode120},
-                        {90_Hz, kMode90},
-                        {72_Hz, kMode72},
-                        {60_Hz, kMode60},
-                        {30_Hz, kMode30}};
+                return {.begin{{120_Hz, 120_Hz},
+                               {90_Hz, 90_Hz},
+                               {72_Hz, 72_Hz},
+                               {60_Hz, 60_Hz},
+                               {30_Hz, 30_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{120_Hz, kMode120}, {90_Hz, kMode90},  {72_Hz, kMode72}, {60_Hz, kMode60},
-                        {45_Hz, kMode90},   {40_Hz, kMode120}, {36_Hz, kMode72}, {30_Hz, kMode30}};
+                return {.begin{{120_Hz, 120_Hz},
+                               {90_Hz, 90_Hz},
+                               {72_Hz, 72_Hz},
+                               {60_Hz, 60_Hz},
+                               {45_Hz, 90_Hz},
+                               {40_Hz, 120_Hz},
+                               {36_Hz, 72_Hz},
+                               {30_Hz, 30_Hz}},
+                        .end{{1.028_Hz, 72_Hz},
+                             {1.0256_Hz, 120_Hz},
+                             {1.022_Hz, 90_Hz},
+                             {1.016_Hz, 60_Hz},
+                             {1.014_Hz, 72_Hz},
+                             {1.011_Hz, 90_Hz},
+                             {1.008_Hz, 120_Hz},
+                             {1_Hz, 30_Hz}}};
         }
     }();
 
@@ -1602,15 +1679,21 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates216, actualRanking.size());
     } else {
-        ASSERT_EQ(expectedRanking.size(), actualRanking.size());
+        ASSERT_EQ(expectedRanking.begin.size(), actualRanking.size());
     }
 
-    for (size_t i = 0; i < expectedRanking.size(); ++i) {
-        EXPECT_EQ(expectedRanking[i], actualRanking[i].frameRateMode)
-                << "Expected " << expectedRanking[i].fps.getIntValue() << " ("
-                << expectedRanking[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << actualRanking[i].frameRateMode.fps.getIntValue() << " ("
-                << actualRanking[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRanking.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.begin[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, actualRanking[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRanking.end.size(); i++) {
+        const size_t refreshRateIndex = actualRanking.size() - expectedRanking.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.end[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  actualRanking[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 
     lr1.vote = LayerVoteType::Max;
@@ -1628,19 +1711,33 @@
     lr5.desiredRefreshRate = 120_Hz;
     lr5.name = "120Hz";
 
-    expectedRanking = []() -> std::vector<FrameRateMode> {
+    expectedRanking = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{120_Hz, kMode120},
-                        {90_Hz, kMode90},
-                        {72_Hz, kMode72},
-                        {60_Hz, kMode60},
-                        {30_Hz, kMode30}};
+                return {.begin{{120_Hz, 120_Hz},
+                               {90_Hz, 90_Hz},
+                               {72_Hz, 72_Hz},
+                               {60_Hz, 60_Hz},
+                               {30_Hz, 30_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{120_Hz, kMode120}, {90_Hz, kMode90},  {72_Hz, kMode72}, {60_Hz, kMode60},
-                        {45_Hz, kMode90},   {40_Hz, kMode120}, {36_Hz, kMode72}, {30_Hz, kMode30}};
+                return {.begin{{120_Hz, 120_Hz},
+                               {90_Hz, 90_Hz},
+                               {72_Hz, 72_Hz},
+                               {60_Hz, 60_Hz},
+                               {45_Hz, 90_Hz},
+                               {40_Hz, 120_Hz},
+                               {36_Hz, 72_Hz},
+                               {30_Hz, 30_Hz}},
+                        .end{{1.028_Hz, 72_Hz},
+                             {1.0256_Hz, 120_Hz},
+                             {1.022_Hz, 90_Hz},
+                             {1.016_Hz, 60_Hz},
+                             {1.014_Hz, 72_Hz},
+                             {1.011_Hz, 90_Hz},
+                             {1.008_Hz, 120_Hz},
+                             {1_Hz, 30_Hz}}};
         }
     }();
     actualRanking = selector.getRankedFrameRates(layers, {}).ranking;
@@ -1648,15 +1745,21 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates216, actualRanking.size());
     } else {
-        ASSERT_EQ(expectedRanking.size(), actualRanking.size());
+        ASSERT_EQ(expectedRanking.begin.size(), actualRanking.size());
     }
 
-    for (size_t i = 0; i < expectedRanking.size(); ++i) {
-        EXPECT_EQ(expectedRanking[i], actualRanking[i].frameRateMode)
-                << "Expected " << expectedRanking[i].fps.getIntValue() << " ("
-                << expectedRanking[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << actualRanking[i].frameRateMode.fps.getIntValue() << " ("
-                << actualRanking[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRanking.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.begin[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, actualRanking[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRanking.end.size(); i++) {
+        const size_t refreshRateIndex = actualRanking.size() - expectedRanking.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.end[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  actualRanking[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 
     lr1.vote = LayerVoteType::Heuristic;
@@ -1672,19 +1775,33 @@
     lr5.desiredRefreshRate = 72_Hz;
     lr5.name = "72Hz";
 
-    expectedRanking = []() -> std::vector<FrameRateMode> {
+    expectedRanking = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{30_Hz, kMode30},
-                        {60_Hz, kMode60},
-                        {90_Hz, kMode90},
-                        {120_Hz, kMode120},
-                        {72_Hz, kMode72}};
+                return {.begin{{30_Hz, 30_Hz},
+                               {60_Hz, 60_Hz},
+                               {90_Hz, 90_Hz},
+                               {120_Hz, 120_Hz},
+                               {72_Hz, 72_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{30_Hz, kMode30}, {60_Hz, kMode60},  {90_Hz, kMode90}, {120_Hz, kMode120},
-                        {45_Hz, kMode90}, {40_Hz, kMode120}, {72_Hz, kMode72}, {36_Hz, kMode72}};
+                return {.begin{{30_Hz, 30_Hz},
+                               {60_Hz, 60_Hz},
+                               {90_Hz, 90_Hz},
+                               {120_Hz, 120_Hz},
+                               {45_Hz, 90_Hz},
+                               {40_Hz, 120_Hz},
+                               {72_Hz, 72_Hz},
+                               {36_Hz, 72_Hz}},
+                        .end{{1.074_Hz, 72_Hz},
+                             {1.081_Hz, 120_Hz},
+                             {1.084_Hz, 90_Hz},
+                             {1.00_Hz, 30_Hz},
+                             {1.008_Hz, 120_Hz},
+                             {1.011_Hz, 90_Hz},
+                             {1.014_Hz, 72_Hz},
+                             {1.016_Hz, 60_Hz}}};
         }
     }();
     actualRanking = selector.getRankedFrameRates(layers, {}).ranking;
@@ -1692,15 +1809,21 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates216, actualRanking.size());
     } else {
-        ASSERT_EQ(expectedRanking.size(), actualRanking.size());
+        ASSERT_EQ(expectedRanking.begin.size(), actualRanking.size());
     }
 
-    for (size_t i = 0; i < expectedRanking.size(); ++i) {
-        EXPECT_EQ(expectedRanking[i], actualRanking[i].frameRateMode)
-                << "Expected " << expectedRanking[i].fps.getIntValue() << " ("
-                << expectedRanking[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << actualRanking[i].frameRateMode.fps.getIntValue() << " ("
-                << actualRanking[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRanking.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.begin[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, actualRanking[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRanking.end.size(); i++) {
+        const size_t refreshRateIndex = actualRanking.size() - expectedRanking.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.end[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  actualRanking[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 
     lr1.desiredRefreshRate = 120_Hz;
@@ -1719,19 +1842,26 @@
     lr5.desiredRefreshRate = 120_Hz;
     lr5.name = "120Hz-2";
 
-    expectedRanking = []() -> std::vector<FrameRateMode> {
+    expectedRanking = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{90_Hz, kMode90},
-                        {60_Hz, kMode60},
-                        {120_Hz, kMode120},
-                        {72_Hz, kMode72},
-                        {30_Hz, kMode30}};
+                return {.begin{{90_Hz, 90_Hz},
+                               {60_Hz, 60_Hz},
+                               {120_Hz, 120_Hz},
+                               {72_Hz, 72_Hz},
+                               {30_Hz, 30_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{90_Hz, kMode90}, {60_Hz, kMode60},  {120_Hz, kMode120}, {72_Hz, kMode72},
-                        {45_Hz, kMode90}, {40_Hz, kMode120}, {36_Hz, kMode72},   {30_Hz, kMode30}};
+                return {.begin{{90_Hz, 90_Hz},
+                               {60_Hz, 60_Hz},
+                               {120_Hz, 120_Hz},
+                               {72_Hz, 72_Hz},
+                               {45_Hz, 90_Hz},
+                               {40_Hz, 120_Hz},
+                               {36_Hz, 72_Hz},
+                               {30_Hz, 30_Hz}},
+                        .end{}};
         }
     }();
     actualRanking = selector.getRankedFrameRates(layers, {}).ranking;
@@ -1739,15 +1869,21 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates216, actualRanking.size());
     } else {
-        ASSERT_EQ(expectedRanking.size(), actualRanking.size());
+        ASSERT_EQ(expectedRanking.begin.size(), actualRanking.size());
     }
 
-    for (size_t i = 0; i < expectedRanking.size(); ++i) {
-        EXPECT_EQ(expectedRanking[i], actualRanking[i].frameRateMode)
-                << "Expected " << expectedRanking[i].fps.getIntValue() << " ("
-                << expectedRanking[i].modePtr->getFps().getIntValue() << ")"
-                << " Actual " << actualRanking[i].frameRateMode.fps.getIntValue() << " ("
-                << actualRanking[i].frameRateMode.modePtr->getFps().getIntValue() << ")";
+    for (size_t i = 0; i < expectedRanking.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.begin[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[i].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate, actualRanking[i].frameRateMode.modePtr->getFps());
+    }
+
+    for (size_t i = 0; i < expectedRanking.end.size(); i++) {
+        const size_t refreshRateIndex = actualRanking.size() - expectedRanking.end.size() + i;
+        const auto [expectedRenderRate, expectedRefreshRate] = expectedRanking.end[i];
+        EXPECT_EQ(expectedRenderRate, actualRanking[refreshRateIndex].frameRateMode.fps);
+        EXPECT_EQ(expectedRefreshRate,
+                  actualRanking[refreshRateIndex].frameRateMode.modePtr->getFps());
     }
 }
 
@@ -2943,20 +3079,35 @@
     auto selector = createSelector(kModes_30_60_72_90_120, kModeId120);
 
     // [renderRate, refreshRate]
-    const auto expected = []() -> std::vector<std::pair<Fps, Fps>> {
+    const auto expected = []() -> FpsBeginEnd {
         switch (GetParam()) {
             case Config::FrameRateOverride::Disabled:
             case Config::FrameRateOverride::AppOverrideNativeRefreshRates:
             case Config::FrameRateOverride::AppOverride:
-                return {{30_Hz, 30_Hz},
-                        {60_Hz, 60_Hz},
-                        {72_Hz, 72_Hz},
-                        {90_Hz, 90_Hz},
-                        {120_Hz, 120_Hz}};
+                return {.begin{{30_Hz, 30_Hz},
+                               {60_Hz, 60_Hz},
+                               {72_Hz, 72_Hz},
+                               {90_Hz, 90_Hz},
+                               {120_Hz, 120_Hz}}};
             case Config::FrameRateOverride::Enabled:
-                return {{1_Hz, 30_Hz},       {1.008_Hz, 120_Hz}, {1.011_Hz, 90_Hz},
-                        {1.014_Hz, 72_Hz},   {1.016_Hz, 60_Hz},  {1.022_Hz, 90_Hz},
-                        {1.0256_Hz, 120_Hz}, {1.028_Hz, 72_Hz}};
+                return {.begin{{1_Hz, 30_Hz},
+                               {1.008_Hz, 120_Hz},
+                               {1.011_Hz, 90_Hz},
+                               {1.014_Hz, 72_Hz},
+                               {1.016_Hz, 60_Hz},
+                               {1.022_Hz, 90_Hz},
+                               {1.0256_Hz, 120_Hz},
+                               {1.028_Hz, 72_Hz}},
+                        .end{
+                                {30_Hz, 30_Hz},
+                                {36_Hz, 72_Hz},
+                                {40_Hz, 120_Hz},
+                                {45_Hz, 90_Hz},
+                                {60_Hz, 60_Hz},
+                                {72_Hz, 72_Hz},
+                                {90_Hz, 90_Hz},
+                                {120_Hz, 120_Hz},
+                        }};
         }
     }();
 
@@ -2964,14 +3115,21 @@
     if (GetParam() == Config::FrameRateOverride::Enabled) {
         ASSERT_EQ(kTotalRefreshRates216, primaryRefreshRates.size());
     } else {
-        ASSERT_EQ(expected.size(), primaryRefreshRates.size());
+        ASSERT_EQ(expected.begin.size(), primaryRefreshRates.size());
     }
 
-    for (size_t i = 0; i < expected.size(); i++) {
-        const auto [expectedRenderRate, expectedRefreshRate] = expected[i];
+    for (size_t i = 0; i < expected.begin.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expected.begin[i];
         EXPECT_EQ(expectedRenderRate, primaryRefreshRates[i].fps);
         EXPECT_EQ(expectedRefreshRate, primaryRefreshRates[i].modePtr->getFps());
     }
+
+    for (size_t i = 0; i < expected.end.size(); i++) {
+        const auto [expectedRenderRate, expectedRefreshRate] = expected.end[i];
+        const size_t refreshRateIndex = primaryRefreshRates.size() - expected.end.size() + i;
+        EXPECT_EQ(expectedRenderRate, primaryRefreshRates[refreshRateIndex].fps);
+        EXPECT_EQ(expectedRefreshRate, primaryRefreshRates[refreshRateIndex].modePtr->getFps());
+    }
 }
 
 TEST_P(RefreshRateSelectorTest, refreshRateIsCappedWithRenderFrameRate) {