ZAPP-1695: Enable toggling desc features to fix the TagList feature issue (#1685)
* do not disable toggling on desc features, display warning instead
* add unit test
diff --git a/src-electron/validation/conformance-checker.js b/src-electron/validation/conformance-checker.js
index d210823..d60f7b0 100644
--- a/src-electron/validation/conformance-checker.js
+++ b/src-electron/validation/conformance-checker.js
@@ -90,19 +90,7 @@
}
}
- // Check 2: if the feature conformance contains the operand 'desc'
- let featureContainsDesc = conformEvaluator.checkIfExpressionHasOperand(
- featureData.conformance,
- dbEnum.conformanceTag.described
- )
- if (featureContainsDesc) {
- result.warningMessage.push(
- warningPrefix +
- ` ${updateDisabledString} its conformance is too complex for ZAP to process, or it includes 'desc'.`
- )
- }
-
- // Check 3: if the feature update will change the conformance of other dependent features
+ // Check 2: if the feature update will change the conformance of other dependent features
if (featuresToUpdate && Object.keys(featuresToUpdate).length > 0) {
let featuresToUpdateString = Object.entries(featuresToUpdate)
.map(([feature, isEnabled]) =>
@@ -115,7 +103,7 @@
)
}
- // Check 4: if any elements that conform to the updated feature contain 'desc' in their conformance
+ // Check 3: if any elements that conform to the updated feature contain 'desc' in their conformance
if (
(descElements.attributes && descElements.attributes.length > 0) ||
(descElements.commands && descElements.commands.length > 0) ||
@@ -142,7 +130,6 @@
if (
missingOperands.length == 0 &&
- !featureContainsDesc &&
(Object.keys(descElements).length == 0 ||
(descElements.attributes.length == 0 &&
descElements.commands.length == 0 &&
@@ -203,6 +190,17 @@
: buildNonElementConformMessage('enabled', 'mandatory'))
result.displayWarning = !added
}
+ // if the feature conformance contains the operand 'desc', do not disable toggling, but show warning message
+ let featureContainsDesc = conformEvaluator.checkIfExpressionHasOperand(
+ featureData.conformance,
+ dbEnum.conformanceTag.described
+ )
+ if (featureContainsDesc) {
+ result.warningMessage =
+ warningPrefix +
+ ` is being ${added ? 'enabled' : 'disabled'}, but it has descriptive conformance and requires manual validation from the feature specification to enable/disable the right dependencies in ZAP.`
+ result.displayWarning = true
+ }
// generate patterns for outdated feature warnings to be deleted
let updatedFeatures = [featureData, ...(changedConformFeatures || [])]
diff --git a/test/feature.test.js b/test/feature.test.js
index 179294c..7cd9469 100644
--- a/test/feature.test.js
+++ b/test/feature.test.js
@@ -768,6 +768,56 @@
)
test(
+ 'Check feature with desc conformance allows toggling but shows warning',
+ () => {
+ // Test enabling a feature with 'desc' conformance
+ let elements = {
+ attributes: [],
+ commands: [],
+ events: []
+ }
+ let featureMap = {
+ DESCFEATURE: false
+ }
+ let featureWithDesc = {
+ cluster: 'Test Cluster',
+ name: 'Feature With Desc',
+ code: 'DESCFEATURE',
+ conformance: 'desc',
+ deviceTypes: ['Test Device Type'],
+ bit: 0
+ }
+ let clusterFeatures = [featureWithDesc]
+ let endpointId = 1
+
+ // Enable the feature with 'desc' conformance
+ featureMap['DESCFEATURE'] = true
+ let result = conformChecker.checkElementConformance(
+ elements,
+ featureMap,
+ featureWithDesc,
+ endpointId,
+ clusterFeatures
+ )
+
+ // Should allow toggling (disableChange is false) but show warning
+ let warningPrefix = env.formatEmojiMessage(
+ '⚠️',
+ `Check Feature Compliance on endpoint: ${endpointId}, cluster: ${featureWithDesc.cluster}, ` +
+ `feature: ${featureWithDesc.name} (${featureWithDesc.code}) (bit ${featureWithDesc.bit} in featureMap attribute)`
+ )
+ let expectedWarning =
+ warningPrefix +
+ ` is being enabled, but it has descriptive conformance and requires manual validation from the feature specification to enable/disable the right dependencies in ZAP.`
+
+ expect(result.displayWarning).toBeTruthy()
+ expect(result.disableChange).toBeFalsy()
+ expect(result.warningMessage).toBe(expectedWarning)
+ },
+ testUtil.timeout.short()
+)
+
+test(
'Test API for getting FeatureMap attribute value',
async () => {
// get relevant data from the On/Off cluster and pass it to the API