Update TC-CC-2_2 to match latest test plan (#35361)

* Update TC-CC-2_2 to match latest test plan

* Remove unused import
diff --git a/src/python_testing/TC_CC_2_2.py b/src/python_testing/TC_CC_2_2.py
index 2cd9aef..c575ae8 100644
--- a/src/python_testing/TC_CC_2_2.py
+++ b/src/python_testing/TC_CC_2_2.py
@@ -35,7 +35,7 @@
 from matter_testing_support import (ClusterAttributeChangeAccumulator, MatterBaseTest, TestStep, default_matter_test_main,
                                     has_cluster, run_if_endpoint_matches)
 from mobly import asserts
-from test_plan_support import commission_if_required, if_feature_supported, read_attribute, verify_success
+from test_plan_support import commission_if_required, read_attribute, verify_success
 
 
 class TC_CC_2_3(MatterBaseTest):
@@ -48,14 +48,14 @@
     def steps_TC_CC_2_2(self):
         THcommand = "Test Harness sends the"
 
-        def store_values(attr: str) -> str:
-            return f"TH stores the reported values of _{attr}_ in all incoming reports for _{attr}_ attribute, that contains data in _reportedCurrentHueValuesList_, over a period of 20 seconds."
+        def store_values(reportList: str, attr: str) -> str:
+            return f"TH stores the reported values of _{attr}_ in all incoming reports for _{attr}_ attribute, that contains data in _{reportList}_, over a period of 20 seconds."
 
-        def verify_entry_count(attr: str) -> str:
-            return f'TH verifies that _reportedCurrentHueValuesList_ does not contain more than 10 entries for _{attr}_'
+        def verify_entry_count(reportList: str, attr: str) -> str:
+            return f'TH verifies that _{reportList}_ does not contain more than 12 entries for _{attr}_'
 
-        def entry_count_verification() -> str:
-            return '_reportedCurrentHueValuesList_ has 10 or less entries in the list'
+        def entry_count_verification(reportList: str) -> str:
+            return f'_{reportList}_ has 12 or less entries in the list'
 
         return [TestStep(1, commission_if_required(), is_commissioning=True),
                 TestStep(2, read_attribute('FeatureMap')),
@@ -63,47 +63,65 @@
                 TestStep(4, read_attribute('ServerList', 'Descriptor')),
                 TestStep(
                     5, f"If OnOff cluster is present in _ServerList_, {THcommand} On command on OnOff cluster", verify_success()),
-                TestStep(
-                    6, f'{if_feature_supported("HS")}, {THcommand} MoveHue with _MoveMode_ field set to Down, _Rate_ field set to 255 and remaining fields set to 0', verify_success()),
-                TestStep(7, f'{if_feature_supported("HS")}, {THcommand} MoveSaturation with _MoveMode_ field set to Down, _Rate_ field set to 255 and remaining fields set to 0', verify_success()),
-                TestStep(8, 'Set up a subscription wildcard subscription for the Color Control Cluster, with MinIntervalFloor set to 0, MaxIntervalCeiling set to 30 and KeepSubscriptions set to false',
+                TestStep(6, 'Set up a subscription wildcard subscription for the Color Control Cluster, with MinIntervalFloor set to 0, MaxIntervalCeiling set to 30 and KeepSubscriptions set to false',
                          'Subscription successfully established'),
-                TestStep(9, 'If the HS feature is not supported, skip step 10 to 15'),
-                TestStep(10, f'{THcommand} MoveToHue with _Hue_ field set to 254, _TransitionTime_ field set to 100, _Direction_ field set to Shortest and remaining fields set to 0', verify_success()),
-                TestStep(11, store_values('CurrentHue')),
-                TestStep(12, verify_entry_count('CurrentHue'), entry_count_verification()),
+                TestStep(7, 'If the CT feature is not supported, skip step 8 to 12'),
                 TestStep(
-                    13, f"{THcommand} MoveToSaturation with _Saturation_ field set to 254, _TransitionTime_ field set to 100 and remaining fields set to 0"),
-                TestStep(14, store_values('CurrentSaturation')),
-                TestStep(15, verify_entry_count('CurrentSaturation'), entry_count_verification()),
-                TestStep(16, 'If XY feature is not supported, skip steps 17-21'),
+                    8, f'{THcommand} MoveColorTemperature with _MoveMode_ field set to Down, _Rate_ field set to 65535 and remaining fields set to 0', verify_success()),
                 TestStep(
-                    "17a", f"{THcommand} MoveToColor with _ColorX_ field set to 32768, _ColorY_ set to 19660, _TransitionTime_ field set to 0 and remaining fields set to 0"),
+                    9, 'TH reads from the DUT the ColorTempPhysicalMaxMireds and stores the returned value as colorTempPhysicalMaxMireds', verify_success()),
+                TestStep(10, f'{THcommand} MoveToColorTemperature with ColorTemperatureMireds field set to the value of colorTempPhysicalMaxMireds, TransitionTime field set to 100, remaining fields set to 0', verify_success()),
+                TestStep(11, store_values('reportedColorTemperatureMiredsValuesList', 'ColorTemperatureMireds')),
+                TestStep(12, verify_entry_count('reportedColorTemperatureMiredsValuesList', 'ColorTemperatureMireds'),
+                         entry_count_verification('reportedColorTemperatureMiredsValuesList')),
+                TestStep(13, 'If the HS feature is not supported, skip step 14 to 21'),
                 TestStep(
-                    "17b", f"{THcommand} MoveToColor with _ColorX_ field set to 13107, _ColorY_ set to 13107, _TransitionTime_ field set to 100 and remaining fields set to 0"),
-                TestStep(18, store_values('CurrentX')),
-                TestStep(19, store_values('CurrentY')),
-                TestStep(20, verify_entry_count('CurrentX'), entry_count_verification()),
-                TestStep(21, verify_entry_count('CurrentY'), entry_count_verification()),
-                TestStep(22, "If the EHUE feature is not supported, skip steps 23 to 25"),
-                TestStep(23, f"{THcommand} EnhancedMoveToHue with _EnhancedHue_ field set to 0, _TransitionTime_ field set to 100, _Direction_ field set to Shortest and remaining fields set to 0", verify_success()),
-                TestStep(24, store_values('EnhancedCurrentHue')),
-                TestStep(25, verify_entry_count('EnhancedCurrentHue'), entry_count_verification()),
-                TestStep(26, "If the RemainingTime attribute is not supported, skip the remaining steps and end test case"),
-                TestStep(27, store_values('RemainingTime')),
+                    14, f'{THcommand} MoveHue with _MoveMode_ field set to Down, _Rate_ field set to 255 and remaining fields set to 0', verify_success()),
                 TestStep(
-                    29, f"If the XY feature is supported and the HS feature is not supported, {THcommand} MoveToColor with _ColorX_ field set to 32768, _ColorY_ set to 19660, _TransitionTime_ field set to 100 and remaining fields set to 0", verify_success()),
-                TestStep(30, "Wait for 5 seconds"),
+                    15, f'{THcommand} MoveSaturation with _MoveMode_ field set to Down, _Rate_ field set to 255 and remaining fields set to 0', verify_success()),
+                TestStep(16, f'{THcommand} MoveToHue with _Hue_ field set to 254, _TransitionTime_ field set to 100, _Direction_ field set to Shortest and remaining fields set to 0', verify_success()),
+                TestStep(17, store_values('reportedCurrentHueValuesList', 'CurrentHue')),
+                TestStep(18, verify_entry_count('reportedCurrentHueValuesList', 'CurrentHue'),
+                         entry_count_verification('reportedCurrentHueValuesList')),
                 TestStep(
-                    32, f"If the XY feature is supported and the HS feature is not supported, {THcommand} MoveToColor with _ColorX_ field set to 13107, _ColorY_ set to 13107, _TransitionTime_ field set to 150 and remaining fields set to 0", verify_success()),
-                TestStep(33, "Wait for 20 seconds"),
-                TestStep(34, "TH verifies _reportedRemainingTimeValuesList_ contains three entries",
+                    19, f"{THcommand} MoveToSaturation with _Saturation_ field set to 254, _TransitionTime_ field set to 100 and remaining fields set to 0"),
+                TestStep(20, store_values('reportedCurrentSaturationValuesList', 'CurrentSaturation')),
+                TestStep(21, verify_entry_count('reportedCurrentSaturationValuesList',
+                         'CurrentSaturation'), entry_count_verification('reportedCurrentSaturationValuesList')),
+                TestStep(22, 'If XY feature is not supported, skip steps 23-28'),
+                TestStep(
+                    23, f"{THcommand} MoveToColor with _ColorX_ field set to 32768, _ColorY_ set to 19660, _TransitionTime_ field set to 0 and remaining fields set to 0"),
+                TestStep(
+                    24, f"{THcommand} MoveToColor with _ColorX_ field set to 13107, _ColorY_ set to 13107, _TransitionTime_ field set to 100 and remaining fields set to 0"),
+                TestStep(25, store_values('reportedCurrentXValuesList', 'CurrentX')),
+                TestStep(26, store_values('reportedCurrentYValuesList', 'CurrentY')),
+                TestStep(27, verify_entry_count('reportedCurrentXValuesList', 'CurrentX'),
+                         entry_count_verification('reportedCurrentXValuesList')),
+                TestStep(28, verify_entry_count('reportedCurrentYValuesList', 'CurrentY'),
+                         entry_count_verification('reportedCurrentYValuesList')),
+                TestStep(29, "If the EHUE feature is not supported, skip steps 30 to 32"),
+                TestStep(30, f"{THcommand} EnhancedMoveToHue with _EnhancedHue_ field set to 0, _TransitionTime_ field set to 100, _Direction_ field set to Shortest and remaining fields set to 0", verify_success()),
+                TestStep(31, store_values('reportedEnhancedCurrentHueValuesList', 'EnhancedCurrentHue')),
+                TestStep(32, verify_entry_count('reportedEnhancedCurrentHueValuesList',
+                         'EnhancedCurrentHue'), entry_count_verification('reportedEnhancedCurrentHueValuesList')),
+                TestStep(
+                    33, 'If the RemainingTime attribute is not supported or the CT feature is not supported, skip the remaining steps and end test case'),
+                TestStep(
+                    34, f'{THcommand} MoveColorTemperature with MoveMode field set to Down, Rate field set to 65535 and remaining fields set to 0', verify_success()),
+                TestStep(35, 'TH stores the reported values of RemainingTime in all incoming reports for RemainingTime attribute, for steps 36 to 39 that contains data in reportedRemainingTimeValuesList.'),
+                TestStep(
+                    36, f'{THcommand} MoveToColorTemperature with ColorTemperatureMireds field set to the value of colorTempPhysicalMaxMireds / 2, TransitionTime field set to 100, remaining fields set to 0', verify_success()),
+                TestStep(37, "Wait for 5 seconds"),
+                TestStep(
+                    38, f'{THcommand} MoveToColorTemperature with ColorTemperatureMireds field set to the value of colorTempPhysicalMaxMireds, TransitionTime field set to 150, remaining fields set to 0', verify_success()),
+                TestStep(39, "Wait for 20 seconds"),
+                TestStep(40, "TH verifies _reportedRemainingTimeValuesList_ contains three entries",
                          "_reportedRemainingTimeValuesList_ has 3 entries in the list"),
-                TestStep(35, "TH verifies the first entry in _reportedRemainingTimeValuesList_ is 100",
-                         "The first entry in _reportedRemainingTimeValuesList_ is equal to 100"),
-                TestStep(36, "TH verifies the second entry in _reportedRemainingTimeValuesList_ is approximately 150",
-                         "The second entry in _reportedRemainingTimeValuesList_ is approximately equal to 150"),
-                TestStep(37, "TH verifies the third entry in _reportedRemainingTimeValuesList_ is 0",
+                TestStep(41, "TH verifies the first entry in _reportedRemainingTimeValuesList_ is 100",
+                         "The first entry in reportedRemainingTimeValuesList is in the range of 95 to 100"),
+                TestStep(42, "TH verifies the second entry in _reportedRemainingTimeValuesList_ is approximately 150",
+                         "The second entry in reportedRemainingTimeValuesList is in the range of 145 to 150"),
+                TestStep(43, "TH verifies the third entry in _reportedRemainingTimeValuesList_ is 0",
                          "The third entry in _reportedRemainingTimeValuesList_ is equal to 0")
                 ]
 
@@ -118,6 +136,7 @@
 
         self.step(2)
         feature_map = await self.read_single_attribute_check_success(cluster=cc, attribute=cc.Attributes.FeatureMap)
+        supports_ct = (feature_map & cc.Bitmaps.Feature.kColorTemperature) != 0
         supports_hs = (feature_map & cc.Bitmaps.Feature.kHueAndSaturation) != 0
         supports_xy = (feature_map & cc.Bitmaps.Feature.kXy) != 0
         supports_ehue = (feature_map & cc.Bitmaps.Feature.kEnhancedHue) != 0
@@ -136,20 +155,6 @@
             self.mark_current_step_skipped()
 
         self.step(6)
-        if supports_hs:
-            cmd = cc.Commands.MoveHue(moveMode=cc.Enums.MoveModeEnum.kDown, rate=225)
-            await self.send_single_cmd(cmd)
-        else:
-            self.mark_current_step_skipped()
-
-        self.step(7)
-        if supports_hs:
-            cmd = cc.Commands.MoveSaturation(moveMode=cc.Enums.MoveModeEnum.kDown, rate=225)
-            await self.send_single_cmd(cmd)
-        else:
-            self.mark_current_step_skipped()
-
-        self.step(8)
         sub_handler = ClusterAttributeChangeAccumulator(cc)
         await sub_handler.start(self.default_controller, self.dut_node_id, self.matter_test_config.endpoint)
 
@@ -163,124 +168,162 @@
             asserts.assert_less_equal(count, 12, "More than 12 reports received")
             asserts.assert_less_equal(count, gather_time, f"More than {gather_time} reports received")
 
-        self.step(9)
-        if not supports_hs:
+        self.step(7)
+        if not supports_ct:
+            self.skip_step(8)
+            self.skip_step(9)
             self.skip_step(10)
             self.skip_step(11)
             self.skip_step(12)
-            self.skip_step(13)
-            self.skip_step(14)
-            self.skip_step(15)
         else:
+            self.step(8)
+            cmd = cc.Commands.MoveColorTemperature(moveMode=cc.Enums.MoveModeEnum.kDown, rate=65535)
+            await self.send_single_cmd(cmd)
+
+            self.step(9)
+            colorTempPhysicalMaxMireds = await self.read_single_attribute_check_success(cluster=cc, attribute=cc.Attributes.ColorTempPhysicalMaxMireds)
+
             self.step(10)
-            cmd = cc.Commands.MoveToHue(hue=254, transitionTime=100, direction=cc.Enums.DirectionEnum.kShortest)
+            cmd = cc.Commands.MoveToColorTemperature(colorTemperatureMireds=colorTempPhysicalMaxMireds, transitionTime=100)
             await self.send_single_cmd(cmd)
 
             self.step(11)
             accumulate_reports()
 
             self.step(12)
-            check_report_counts(cc.Attributes.CurrentHue)
+            check_report_counts(cc.Attributes.ColorTemperatureMireds)
 
-            self.step(13)
-            cmd = cc.Commands.MoveToSaturation(saturation=254, transitionTime=100)
-            await self.send_single_cmd(cmd)
-
-            self.step(14)
-            accumulate_reports()
-
-            self.step(15)
-            check_report_counts(cc.Attributes.CurrentSaturation)
-
-        self.step(16)
-        if not supports_xy:
+        self.step(13)
+        if not supports_hs:
+            self.skip_step(14)
+            self.skip_step(15)
+            self.skip_step(16)
             self.skip_step(17)
             self.skip_step(18)
             self.skip_step(19)
             self.skip_step(20)
             self.skip_step(21)
         else:
-            self.step("17a")
-            cmd = cc.Commands.MoveToColor(colorX=32768, colorY=19660, transitionTime=0)
+            self.step(14)
+            cmd = cc.Commands.MoveHue(moveMode=cc.Enums.MoveModeEnum.kDown, rate=225)
             await self.send_single_cmd(cmd)
 
-            self.step("17b")
-            cmd = cc.Commands.MoveToColor(colorX=13107, colorY=13107, transitionTime=0)
+            self.step(15)
+            cmd = cc.Commands.MoveSaturation(moveMode=cc.Enums.MoveModeEnum.kDown, rate=225)
             await self.send_single_cmd(cmd)
 
-            self.step(18)
+            self.step(16)
+            cmd = cc.Commands.MoveToHue(hue=254, transitionTime=100, direction=cc.Enums.DirectionEnum.kShortest)
+            await self.send_single_cmd(cmd)
+
+            self.step(17)
             accumulate_reports()
 
+            self.step(18)
+            check_report_counts(cc.Attributes.CurrentHue)
+
             self.step(19)
-            # reports for x and y are both accumulated in a dict - done above
+            cmd = cc.Commands.MoveToSaturation(saturation=254, transitionTime=100)
+            await self.send_single_cmd(cmd)
 
             self.step(20)
-            check_report_counts(cc.Attributes.CurrentX)
+            accumulate_reports()
 
             self.step(21)
-            check_report_counts(cc.Attributes.CurrentY)
+            check_report_counts(cc.Attributes.CurrentSaturation)
 
         self.step(22)
-        if not supports_ehue:
+        if not supports_xy:
             self.skip_step(23)
             self.skip_step(24)
             self.skip_step(25)
+            self.skip_step(26)
+            self.skip_step(27)
+            self.skip_step(28)
         else:
             self.step(23)
+            cmd = cc.Commands.MoveToColor(colorX=32768, colorY=19660, transitionTime=0)
+            await self.send_single_cmd(cmd)
+
+            self.step(24)
+            cmd = cc.Commands.MoveToColor(colorX=13107, colorY=13107, transitionTime=100)
+            await self.send_single_cmd(cmd)
+
+            self.step(25)
+            accumulate_reports()
+
+            self.step(26)
+            # reports for x and y are both accumulated in a dict - done above
+
+            self.step(27)
+            check_report_counts(cc.Attributes.CurrentX)
+
+            self.step(28)
+            check_report_counts(cc.Attributes.CurrentY)
+
+        self.step(29)
+        if not supports_ehue:
+            self.skip_step(30)
+            self.skip_step(31)
+            self.skip_step(32)
+        else:
+            self.step(30)
             cmd = cc.Commands.EnhancedMoveToHue(enhancedHue=0, transitionTime=100,
                                                 direction=cc.Enums.DirectionEnum.kShortest)
             await self.send_single_cmd(cmd)
 
-            self.step(24)
+            self.step(31)
             accumulate_reports()
 
-            self.step(25)
+            self.step(32)
             check_report_counts(cc.Attributes.EnhancedCurrentHue)
 
-        self.step(26)
-        if cc.Attributes.RemainingTime.attribute_id not in attribute_list:
-            self.skip_all_remaining_steps(27)
+        self.step(33)
+        if cc.Attributes.RemainingTime.attribute_id not in attribute_list or not supports_ct:
+            self.skip_all_remaining_steps(34)
             return
 
-        self.step(27)
+        self.step(34)
+        cmd = cc.Commands.MoveColorTemperature(moveMode=cc.Enums.MoveModeEnum.kDown, rate=65535)
+        await self.send_single_cmd(cmd)
+
+        self.step(35)
         accumulate_reports()
 
-        self.step(29)
-        # TODO: If this is mandatory, we should just omit this
-        if supports_xy:
-            cmd = cc.Commands.MoveToColor(colorX=32768, colorY=19660, transitionTime=100)
-            await self.send_single_cmd(cmd)
-        else:
-            self.mark_current_step_skipped()
+        self.step(36)
+        cmd = cc.Commands.MoveToColorTemperature(colorTemperatureMireds=colorTempPhysicalMaxMireds/2, transitionTime=100)
+        await self.send_single_cmd(cmd)
 
-        self.step(30)
+        self.step(37)
         logging.info("Test will now wait for 5 seconds")
         time.sleep(5)
 
-        self.step(32)
-        if supports_xy:
-            cmd = cc.Commands.MoveToColor(colorX=13107, colorY=13107, transitionTime=150)
-            await self.send_single_cmd(cmd)
-        else:
-            self.mark_current_step_skipped()
+        self.step(38)
+        cmd = cc.Commands.MoveToColorTemperature(colorTemperatureMireds=colorTempPhysicalMaxMireds, transitionTime=150)
+        await self.send_single_cmd(cmd)
 
-        self.step(33)
+        self.step(39)
         logging.info("Test will now wait for 20 seconds")
         time.sleep(20)
 
-        self.step(34)
+        self.step(40)
         logging.info(f'received reports: {sub_handler.attribute_reports[cc.Attributes.RemainingTime]}')
         count = sub_handler.attribute_report_counts[cc.Attributes.RemainingTime]
         asserts.assert_equal(count, 3, "Unexpected number of reports received")
 
-        self.step(35)
-        asserts.assert_equal(sub_handler.attribute_reports[cc.Attributes.RemainingTime][0].value, 100, "Unexpected first report")
+        self.step(41)
+        asserts.assert_less_equal(
+            sub_handler.attribute_reports[cc.Attributes.RemainingTime][0].value, 100, "Unexpected first report")
+        asserts.assert_almost_equal(
+            sub_handler.attribute_reports[cc.Attributes.RemainingTime][0].value, 100, delta=10, msg="Unexpected first report")
 
-        self.step(36)
+        self.step(42)
+        asserts.assert_less_equal(
+            sub_handler.attribute_reports[cc.Attributes.RemainingTime][1].value, 150, "Unexpected second report")
         asserts.assert_almost_equal(
             sub_handler.attribute_reports[cc.Attributes.RemainingTime][1].value, 150, delta=10, msg="Unexpected second report")
 
-        self.step(37)
+        self.step(43)
         asserts.assert_equal(sub_handler.attribute_reports[cc.Attributes.RemainingTime][-1].value, 0, "Unexpected last report")