# Copyright (c) 2021 Project CHIP 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
#
# http://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.

name: 42.2.1. [TC-TSTAT-2.1] Attributes with server as DUT

PICS:
    - TSTAT.S

config:
    nodeId: 0x12344321
    cluster: "Thermostat"
    endpoint: 1

tests:
    - label: "Step 1: Commission DUT to TH"
      cluster: "DelayCommands"
      command: "WaitForCommissionee"
      arguments:
          values:
              - name: "nodeId"
                value: nodeId

    - label:
          "Saving value for comparision in step 5 read AbsMinCoolSetpointLimit
          attribute"
      PICS: TSTAT.S.A0005
      command: "readAttribute"
      attribute: "AbsMinCoolSetpointLimit"
      response:
          saveAs: AbsMinCoolSetpointLimitStep5

    - label:
          "Saving value for comparision in step 5 read attribute
          MinSetpointDeadBand attribute"
      PICS: TSTAT.S.A0019
      command: "readAttribute"
      attribute: "MinSetpointDeadBand"
      response:
          saveAs: MinSetpointDeadBandValue

    - label:
          "Saving value for comparision in step 6 read AbsMaxCoolSetpointLimit
          attribute"
      PICS: TSTAT.S.A0006
      command: "readAttribute"
      attribute: "AbsMaxCoolSetpointLimit"
      response:
          saveAs: AbsMaxCoolSetpointLimitStep6

    - label:
          "Saving value for comparision in step 17 read MinCoolSetpointLimit
          attribute"
      PICS: TSTAT.S.A0017
      command: "readAttribute"
      attribute: "MinCoolSetpointLimit"
      response:
          saveAs: MinCoolSetpointLimitValue

    - label:
          "Saving value for comparision in step 17 read MaxCoolSetpointLimit
          attribute"
      PICS: TSTAT.S.A0018
      command: "readAttribute"
      attribute: "MaxCoolSetpointLimit"
      response:
          saveAs: MaxCoolSetpointLimitValue

    - label: "Saving value for comparision in step 17 read MaxHeatSetpointLimit"
      PICS: TSTAT.S.A0016
      command: "readAttribute"
      attribute: "MaxHeatSetpointLimit"
      response:
          saveAs: MaxHeatSetpointLimitValue

    - label:
          "Saving value for comparision in step 13 read attribute
          OccupiedCoolingSetpoint"
      PICS: TSTAT.S.F01
      command: "readAttribute"
      attribute: "OccupiedCoolingSetpoint"
      response:
          saveAs: OccupiedCoolingSetpointValue

    - label:
          "Saving value for comparision in step 15 read attribute
          AbsMinHeatSetpointLimit"
      PICS: TSTAT.S.A0003
      command: "readAttribute"
      attribute: "AbsMinHeatSetpointLimit"
      response:
          saveAs: AbsMinHeatValue

    - label:
          "Saving value for comparision in step 15 read attribute
          AbsMaxHeatSetpointLimit"
      PICS: TSTAT.S.A0004
      command: "readAttribute"
      attribute: "AbsMaxHeatSetpointLimit"
      response:
          saveAs: AbsMaxHeatValue

    - label:
          "Saving value for comparision in step 16 read
          UnoccupiedCoolingSetpoint attribute"
      PICS: TSTAT.S.A0013
      command: "readAttribute"
      attribute: "UnoccupiedCoolingSetpoint"
      response:
          saveAs: UnoccupiedCoolingSetpointValue

    - label: "Step 2: TH reads the LocalTemperature attribute from the DUT"
      command: "readAttribute"
      attribute: "LocalTemperature"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label: "Step 3: TH reads the OutdoorTemperature attribute from the DUT"
      PICS: TSTAT.S.A0001
      command: "readAttribute"
      attribute: "OutdoorTemperature"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label: "Step 4: TH reads the Occupancy attribute from the DUT"
      PICS: TSTAT.S.F02
      command: "readAttribute"
      attribute: "Occupancy"
      response:
          constraints:
              type: bitmap8
              minValue: 0
              maxValue: 1

    - label:
          "Step 5a: TH reads attribute AbsMinHeatSetpointLimit if TSTAT.S.F05
          feature is supported"
      PICS: TSTAT.S.A0003 && TSTAT.S.A0005 && TSTAT.S.F05
      command: "readAttribute"
      attribute: "AbsMinHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              maxValue: AbsMinCoolSetpointLimitStep5 - MinSetpointDeadBandValue

    - label:
          "Step 5b: TH reads attribute AbsMinHeatSetpointLimit if TSTAT.S.F05
          feature is supported"
      PICS: TSTAT.S.A0003 && !TSTAT.S.A0005 && TSTAT.S.F05
      command: "readAttribute"
      attribute: "AbsMinHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              maxValue: 1575

    - label: "Step 6a: TH reads attribute AbsMinHeatSetpointLimit from DUT"
      PICS: TSTAT.S.A0003 && !TSTAT.S.F05
      command: "readAttribute"
      attribute: "AbsMinHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label:
          "Step 6b: TH reads mandatory attributes from DUT:
          AbsMaxHeatSetpointLimit"
      PICS: TSTAT.S.A0004
      command: "readAttribute"
      attribute: "AbsMaxHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label:
          "Step 7: TH reads the AbsMinCoolSetpointLimit attribute from the DUT"
      PICS: TSTAT.S.A0005
      command: "readAttribute"
      attribute: "AbsMinCoolSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label:
          "Step 8: TH reads the AbsMaxCoolSetpointLimit attribute from the DUT"
      PICS: TSTAT.S.A0006
      command: "readAttribute"
      attribute: "AbsMaxCoolSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label: "Step 9: TH reads the PICoolingDemand attribute from the DUT"
      PICS: TSTAT.S.A0007
      command: "readAttribute"
      attribute: "PICoolingDemand"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 100

    - label: "Step 10: TH reads the PIHeatingDemand attribute from the DUT"
      PICS: TSTAT.S.A0008
      command: "readAttribute"
      attribute: "PIHeatingDemand"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 100

    - label:
          "Step 12: TH reads the LocalTemperatureCalibration attribute from the
          DUT"
      PICS: TSTAT.S.A0010
      command: "readAttribute"
      attribute: "LocalTemperatureCalibration"
      response:
          constraints:
              type: int8s
              minValue: -127
              maxValue: 127

    - label: "Step 13a: TH reads attribute OccupiedCoolingSetpoint from the DUT"
      PICS: TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018
      command: "readAttribute"
      attribute: "OccupiedCoolingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: MinCoolSetpointLimitValue
              maxValue: MaxCoolSetpointLimitValue

    - label: "Step 13b: TH reads attribute OccupiedCoolingSetpoint from the DUT"
      PICS: TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018
      command: "readAttribute"
      attribute: "OccupiedCoolingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: 1600
              maxValue: 3200

    - label:
          "Step 14a: TH reads attribute OccupiedHeatingSetpoint if TSTAT.S.F05
          feature is supported"
      PICS: TSTAT.S.F05 && TSTAT.S.F00
      command: "readAttribute"
      attribute: "OccupiedHeatingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: AbsMinCoolSetpointLimitStep5
              maxValue: OccupiedCoolingSetpointValue - MinSetpointDeadBandValue

    - label: "Step 14b: TH reads attribute OccupiedHeatingSetpoint from the DUT"
      PICS: TSTAT.S.F00 && !TSTAT.S.F05
      command: "readAttribute"
      attribute: "OccupiedHeatingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue: 3000

    - label:
          "Step 15a: TH reads UnoccupiedCoolingSetpoint attribute from the DUT"
      PICS: TSTAT.S.F05 && TSTAT.S.A0013
      command: "readAttribute"
      attribute: "UnoccupiedCoolingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: AbsMinHeatValue
              maxValue: AbsMaxHeatValue

    - label:
          "Step 15b: TH reads UnoccupiedCoolingSetpoint attribute from the DUT"
      PICS: TSTAT.S.F01 && TSTAT.S.F02 && !TSTAT.S.F05
      command: "readAttribute"
      attribute: "UnoccupiedCoolingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: 1600
              maxValue: 3200

    - label:
          "Step 16a: TH reads UnoccupiedHeatingSetpoint attribute from the DUT"
      PICS: TSTAT.S.F00 && TSTAT.S.F02 && TSTAT.S.F05 && TSTAT.S.A0013
      command: "readAttribute"
      attribute: "UnoccupiedHeatingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue:
                  UnoccupiedCoolingSetpointValue - MinSetpointDeadBandValue

    - label:
          "Step 16b: TH reads UnoccupiedHeatingSetpoint attribute from the DUT"
      PICS: TSTAT.S.F00 && TSTAT.S.F02 && !TSTAT.S.F05
      command: "readAttribute"
      attribute: "UnoccupiedHeatingSetpoint"
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue: 3000

    - label: "Step 17a: TH reads attribute from DUT: MinHeatSetpointLimit"
      PICS: TSTAT.S.A0015 && TSTAT.S.F05 && TSTAT.S.A0017 && TSTAT.S.A0019
      command: "readAttribute"
      attribute: "MinHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue: MinCoolSetpointLimitValue - MinSetpointDeadBandValue

    - label:
          "Step 17b: TH reads MinHeatSetpointLimit attribute from Server DUT and
          verifies that the value is within range"
      command: "readAttribute"
      attribute: "MinHeatSetpointLimit"
      PICS: TSTAT.S.A0015 && TSTAT.S.A0016 && TSTAT.S.A0003 && !TSTAT.S.F05
      response:
          constraints:
              type: int16s
              minValue: AbsMinHeatValue
              maxValue: MaxHeatSetpointLimitValue

    #Using hard coded values when optional attributes are not available
    - label:
          "Step 17c: TH reads MinHeatSetpointLimit attribute from Server DUT and
          verifies that the value is within range"
      command: "readAttribute"
      attribute: "MinHeatSetpointLimit"
      PICS: TSTAT.S.A0015 && !TSTAT.S.A0003 && !TSTAT.S.F05
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue: 3000

    - label: "Step 18a: TH reads attribute MaxHeatSetpointLimit from the DUT"
      PICS: TSTAT.S.A0016 && !TSTAT.S.F05
      command: "readAttribute"
      attribute: "MaxHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue: 3000

    - label: "Step 18b: TH reads attribute from DUT: MaxHeatSetpointLimit"
      PICS: TSTAT.S.A0016 && TSTAT.S.F05 && TSTAT.S.A0018
      command: "readAttribute"
      attribute: "MaxHeatSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: 700
              maxValue: MaxCoolSetpointLimitValue - MinSetpointDeadBandValue

    - label: "Step 19a: TH reads attribute MinCoolSetpointLimit from DUT"
      PICS: TSTAT.S.A0017 && TSTAT.S.A0018 && TSTAT.S.A0005
      command: "readAttribute"
      attribute: "MinCoolSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: AbsMinCoolSetpointLimitStep5
              maxValue: MaxCoolSetpointLimitValue

    - label: "Step 19b: TH reads attribute MinCoolSetpointLimit from DUT"
      PICS: TSTAT.S.A0017 && !TSTAT.S.A0018 && !TSTAT.S.A0005
      command: "readAttribute"
      attribute: "MinCoolSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: 1600
              maxValue: 3200

    - label: "Step 20: TH reads the MaxCoolSetpointLimit attribute from the DUT"
      PICS: TSTAT.S.A0018 && TSTAT.S.A0006 && TSTAT.S.A0017
      command: "readAttribute"
      attribute: "MaxCoolSetpointLimit"
      response:
          constraints:
              type: int16s
              minValue: MinCoolSetpointLimitValue
              maxValue: AbsMaxCoolSetpointLimitStep6

    - label: "Step 21: TH reads the MinSetpointDeadBand attribute from the DUT"
      PICS: TSTAT.S.F05
      command: "readAttribute"
      attribute: "MinSetpointDeadBand"
      response:
          constraints:
              type: int8s
              minValue: 0
              maxValue: 25

    - label: "Step 22: TH reads the RemoteSensing attribute from the DUT"
      PICS: TSTAT.S.A001a
      command: "readAttribute"
      attribute: "RemoteSensing"
      response:
          constraints:
              type: bitmap8
              minValue: 0
              maxValue: 7

    - label:
          "Step 23: TH reads the ControlSequenceOfOperation attribute from the
          DUT"
      PICS: TSTAT.S.A001b
      command: "readAttribute"
      attribute: "ControlSequenceOfOperation"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 5

    - label: "Step 24: TH reads the SystemMode attribute from the DUT"
      PICS: TSTAT.S.A001c
      command: "readAttribute"
      attribute: "SystemMode"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 9

    - label:
          "Step 26: TH reads the ThermostatRunningMode attribute from the DUT"
      PICS: TSTAT.S.A001e
      command: "readAttribute"
      attribute: "ThermostatRunningMode"
      response:
          constraints:
              type: enum8
              anyOf:
                  [
                      ThermostatRunningModeEnum.Off(0),
                      ThermostatRunningModeEnum.Cool(3),
                      ThermostatRunningModeEnum.Heat(4),
                  ]

    - label: "Step 27: TH reads the StartOfWeek attribute from the DUT"
      PICS: TSTAT.S.F03
      command: "readAttribute"
      attribute: "StartOfWeek"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 6

    - label:
          "Step 28: TH reads the NumberOfWeeklyTransitions attribute from the
          DUT"
      PICS: TSTAT.S.F03
      command: "readAttribute"
      attribute: "NumberOfWeeklyTransitions"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label:
          "Step 29: TH reads the NumberOfDailyTransitions attribute from the DUT"
      PICS: TSTAT.S.F03
      command: "readAttribute"
      attribute: "NumberOfDailyTransitions"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label:
          "Step 30: TH reads the TemperatureSetpointHold attribute from the DUT"
      PICS: TSTAT.S.A0023
      command: "readAttribute"
      attribute: "TemperatureSetpointHold"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 1

    - label:
          "Step 31: TH reads the TemperatureSetpointHoldDuration attribute from
          the DUT"
      PICS: TSTAT.S.A0024
      command: "readAttribute"
      attribute: "TemperatureSetpointHoldDuration"
      response:
          constraints:
              type: int16u
              minValue: 0
              maxValue: 1440

    - label:
          "Step 32: TH reads the ThermostatProgrammingOperationMode attribute
          from the DUT"
      PICS: TSTAT.S.A0025
      command: "readAttribute"
      attribute: "ThermostatProgrammingOperationMode"
      response:
          constraints:
              type: bitmap8
              minValue: 0
              maxValue: 7

    - label:
          "Step 33: TH reads the ThermostatRunningState attribute from the DUT"
      PICS: TSTAT.S.A0029
      command: "readAttribute"
      attribute: "ThermostatRunningState"
      response:
          constraints:
              type: bitmap16
              minValue: 0
              maxValue: 127

    - label: "Step 34: TH reads the SetpointChangeSource attribute from the DUT"
      PICS: TSTAT.S.A0030
      command: "readAttribute"
      attribute: "SetpointChangeSource"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 2

    - label: "Step 35: TH reads the SetpointChangeAmount attribute from the DUT"
      PICS: TSTAT.S.A0031
      command: "readAttribute"
      attribute: "SetpointChangeAmount"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label:
          "Step 36: TH reads the SetpointChangeSourceTimestamp attribute from
          the DUT"
      PICS: TSTAT.S.A0032
      command: "readAttribute"
      attribute: "SetpointChangeSourceTimestamp"
      response:
          constraints:
              type: epoch_s

    - label: "Step 37: TH reads the OccupiedSetback attribute from the DUT"
      PICS: TSTAT.S.F04
      command: "readAttribute"
      attribute: "OccupiedSetback"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 38: TH reads the OccupiedSetbackMin attribute from the DUT"
      PICS: TSTAT.S.F04
      command: "readAttribute"
      attribute: "OccupiedSetbackMin"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 39: TH reads the OccupiedSetbackMax attribute from the DUT"
      PICS: TSTAT.S.F04
      command: "readAttribute"
      attribute: "OccupiedSetbackMax"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 40: TH reads the UnoccupiedSetback attribute from the DUT"
      PICS: TSTAT.S.F02 && TSTAT.S.F04
      command: "readAttribute"
      attribute: "UnoccupiedSetback"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 41: TH reads the UnoccupiedSetbackMin attribute from the DUT"
      PICS: TSTAT.S.F02 && TSTAT.S.F04
      command: "readAttribute"
      attribute: "UnoccupiedSetbackMin"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 42: TH reads the UnoccupiedSetbackMax attribute from the DUT"
      PICS: TSTAT.S.F02 && TSTAT.S.F04
      command: "readAttribute"
      attribute: "UnoccupiedSetbackMax"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 43: TH reads the EmergencyHeatDelta attribute from the DUT"
      PICS: TSTAT.S.A003a
      command: "readAttribute"
      attribute: "EmergencyHeatDelta"
      response:
          constraints:
              type: int8u
              minValue: 0
              maxValue: 255

    - label: "Step 44: TH reads the ACType attribute from the DUT"
      PICS: TSTAT.S.A0040
      command: "readAttribute"
      attribute: "ACType"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 4

    - label: "Step 45: TH reads the ACCapacity attribute from the DUT"
      PICS: TSTAT.S.A0041
      command: "readAttribute"
      attribute: "ACCapacity"
      response:
          constraints:
              type: int16u
              minValue: 0
              maxValue: 65535

    - label: "Step 46: TH reads the ACRefrigerantType attribute from the DUT"
      PICS: TSTAT.S.A0042
      command: "readAttribute"
      attribute: "ACRefrigerantType"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 3

    - label: "Step 47: TH reads the ACCompressorType attribute from the DUT"
      PICS: TSTAT.S.A0043
      command: "readAttribute"
      attribute: "ACCompressorType"
      response:
          constraints:
              type: enum8
              minValue: 0
              maxValue: 3

    - label: "Step 48: TH reads the ACErrorCode attribute from the DUT"
      PICS: TSTAT.S.A0044
      command: "readAttribute"
      attribute: "ACErrorCode"
      response:
          constraints:
              type: bitmap32

    - label: "Step 49: TH reads the ACLouverPosition attribute from the DUT"
      PICS: TSTAT.S.A0045
      command: "readAttribute"
      attribute: "ACLouverPosition"
      response:
          constraints:
              type: enum8
              minValue: 1
              maxValue: 5

    - label: "Step 50: TH reads the ACCoilTemperature attribute from the DUT"
      PICS: TSTAT.S.A0046
      command: "readAttribute"
      attribute: "ACCoilTemperature"
      response:
          constraints:
              type: int16s
              minValue: -27315
              maxValue: 32767

    - label: "Step 51: TH reads the ACCapacityFormat attribute from the DUT"
      PICS: TSTAT.S.A0047
      command: "readAttribute"
      attribute: "ACCapacityformat"
      response:
          value: 0
          constraints:
              type: enum8
