From ac0769717820fdc8c3209b94fb053f73fce00681 Mon Sep 17 00:00:00 2001 From: Ambroise Leclerc Date: Mon, 7 Sep 2026 15:08:12 +0200 Subject: [PATCH 1/2] Define candidate interaction, binding and presentation profiles --- conformance/contracts/binding-clock.json | 27 ++ .../contracts/binding-numericdisplay.json | 25 ++ .../contracts/binding-signaltrace.json | 23 ++ .../contracts/binding-statusindicator.json | 20 + conformance/contracts/binding-textinput.json | 20 + .../contracts/binding-vulkanviewport.json | 30 ++ .../contracts/binding-wrong-clock.json | 20 + .../binding-wrong-numericdisplay.json | 20 + .../contracts/binding-wrong-signaltrace.json | 20 + .../binding-wrong-statusindicator.json | 20 + .../contracts/binding-wrong-textinput.json | 20 + .../binding-wrong-vulkanviewport.json | 20 + conformance/contracts/manifest-profiles.json | 12 + .../contracts/presentation-channel-range.json | 38 ++ .../presentation-missing-assets.json | 317 +++++++++++++++ .../presentation-missing-backend.json | 317 +++++++++++++++ .../contracts/presentation-missing-font.json | 317 +++++++++++++++ .../presentation-missing-surface.json | 314 +++++++++++++++ .../contracts/presentation-missing-theme.json | 317 +++++++++++++++ .../presentation-missing-variants.json | 16 + .../presentation-unknown-component.json | 38 ++ conformance/contracts/presentation-valid.json | 318 +++++++++++++++ conformance/profiles/activation-activate.json | 64 +++ conformance/profiles/activation-cancel.json | 61 +++ conformance/profiles/activation-disabled.json | 63 +++ .../profiles/activation-focus-loss.json | 61 +++ .../profiles/activation-release-outside.json | 58 +++ conformance/profiles/activation-removed.json | 62 +++ .../profiles/activation-repeated-press.json | 71 ++++ .../profiles/activation-repress-outside.json | 65 ++++ conformance/profiles/activation-unarmed.json | 51 +++ .../profiles/clock-datetimeseconds.json | 34 ++ conformance/profiles/clock-invalid-date.json | 32 ++ conformance/profiles/clock-leap-second.json | 32 ++ conformance/profiles/clock-timeseconds.json | 34 ++ conformance/profiles/clock-year-bound.json | 32 ++ conformance/profiles/critical-noop.json | 66 ++++ .../profiles/critical-triggerhalt.json | 66 ++++ conformance/profiles/different-control.json | 76 ++++ conformance/profiles/edit-delete.json | 62 +++ conformance/profiles/edit-edge.json | 62 +++ conformance/profiles/edit-end-edge.json | 65 ++++ conformance/profiles/edit-end.json | 62 +++ conformance/profiles/edit-home.json | 62 +++ conformance/profiles/edit-left.json | 62 +++ conformance/profiles/edit-paste.json | 63 +++ .../profiles/edit-reject-encoding.json | 72 ++++ conformance/profiles/edit-reject-glyph.json | 69 ++++ .../profiles/edit-reject-overlong.json | 72 ++++ .../profiles/edit-reject-oversize.json | 69 ++++ .../profiles/edit-reject-repeat-insert.json | 70 ++++ .../profiles/edit-reject-repeat-paste.json | 70 ++++ .../profiles/edit-reject-selection.json | 69 ++++ .../profiles/edit-reject-surrogate.json | 73 ++++ .../profiles/edit-repeat-deletion.json | 63 +++ .../profiles/edit-repeat-navigation.json | 63 +++ conformance/profiles/edit-right.json | 62 +++ conformance/profiles/edit-scalar.json | 62 +++ .../profiles/edit-selection-backspace.json | 66 ++++ .../profiles/edit-selection-delete.json | 66 ++++ conformance/profiles/edit-selection-left.json | 66 ++++ .../profiles/edit-selection-right.json | 66 ++++ conformance/profiles/edit-selection.json | 63 +++ conformance/profiles/edit-unfocused.json | 63 +++ conformance/profiles/focus-initial.json | 71 ++++ conformance/profiles/focus-loss-editing.json | 48 +++ conformance/profiles/focus-outside.json | 52 +++ conformance/profiles/focus-press.json | 56 +++ conformance/profiles/focus-traversal.json | 71 ++++ conformance/profiles/hit-bottom.json | 46 +++ conformance/profiles/hit-interior.json | 46 +++ conformance/profiles/hit-negative.json | 46 +++ conformance/profiles/hit-origin.json | 46 +++ conformance/profiles/hit-right.json | 46 +++ conformance/profiles/hit-surface.json | 46 +++ conformance/profiles/mapping-duplicate.json | 46 +++ conformance/profiles/mapping-missing.json | 31 ++ conformance/profiles/mapping-screen.json | 39 ++ conformance/profiles/mapping-snapshot.json | 39 ++ conformance/profiles/mapping-source.json | 39 ++ conformance/profiles/mapping-type.json | 39 ++ conformance/profiles/mapping-unknown.json | 39 ++ conformance/profiles/normalize-fraction.json | 34 ++ .../normalize-invalid-scaledenominator.json | 31 ++ .../normalize-invalid-scalenumerator.json | 31 ++ .../profiles/normalize-negative-floor.json | 34 ++ conformance/profiles/normalize-origin.json | 34 ++ conformance/profiles/numeric-digit-bound.json | 32 ++ conformance/profiles/numeric-float.json | 31 ++ conformance/profiles/numeric-fraction.json | 33 ++ conformance/profiles/numeric-integer.json | 33 ++ .../profiles/numeric-leading-zero.json | 31 ++ .../profiles/numeric-negative-scale.json | 32 ++ .../profiles/numeric-negative-zero.json | 31 ++ conformance/profiles/numeric-padding.json | 33 ++ conformance/profiles/numeric-scale-bound.json | 32 ++ conformance/profiles/numeric-template.json | 33 ++ conformance/profiles/occlusion-clipped.json | 63 +++ conformance/profiles/occlusion-control.json | 63 +++ .../profiles/occlusion-decoration.json | 63 +++ conformance/profiles/occlusion-disabled.json | 63 +++ conformance/profiles/pixel-different.json | 57 +++ conformance/profiles/pixel-equal.json | 57 +++ .../profiles/pixel-identity-assets.json | 57 +++ .../profiles/pixel-identity-backend.json | 57 +++ .../profiles/pixel-identity-declaration.json | 57 +++ conformance/profiles/pixel-identity-font.json | 57 +++ .../profiles/pixel-identity-frame.json | 57 +++ .../profiles/pixel-identity-locale.json | 57 +++ .../profiles/pixel-identity-scenario.json | 57 +++ .../profiles/pixel-identity-surface.json | 57 +++ .../profiles/pixel-identity-theme.json | 57 +++ conformance/profiles/presentation-button.json | 361 +++++++++++++++++ conformance/profiles/presentation-caret.json | 365 ++++++++++++++++++ conformance/profiles/presentation-clip.json | 355 +++++++++++++++++ conformance/profiles/presentation-clock.json | 356 +++++++++++++++++ .../profiles/presentation-criticalbutton.json | 361 +++++++++++++++++ conformance/profiles/presentation-image.json | 356 +++++++++++++++++ .../presentation-invalid-duplicate.json | 349 +++++++++++++++++ .../presentation-invalid-identity.json | 328 ++++++++++++++++ ...resentation-invalid-missing-component.json | 309 +++++++++++++++ .../presentation-invalid-negative-extent.json | 329 ++++++++++++++++ conformance/profiles/presentation-label.json | 356 +++++++++++++++++ .../profiles/presentation-missing-state.json | 340 ++++++++++++++++ .../profiles/presentation-numericdisplay.json | 361 +++++++++++++++++ .../profiles/presentation-pressed.json | 360 +++++++++++++++++ conformance/profiles/presentation-row.json | 356 +++++++++++++++++ .../profiles/presentation-signaltrace.json | 356 +++++++++++++++++ .../presentation-statusindicator.json | 361 +++++++++++++++++ .../profiles/presentation-textinput.json | 361 +++++++++++++++++ .../profiles/presentation-unclipped.json | 355 +++++++++++++++++ .../profiles/presentation-vulkanviewport.json | 356 +++++++++++++++++ .../profiles/presentation-zero-extent.json | 356 +++++++++++++++++ conformance/profiles/queue-full.json | 69 ++++ .../profiles/queue-invalid-capacity.json | 61 +++ conformance/profiles/queue-invalid.json | 60 +++ conformance/profiles/queue-overflow.json | 63 +++ .../queue-queued-activation-overflow.json | 70 ++++ conformance/profiles/queue-reset.json | 96 +++++ conformance/profiles/queue-saturate.json | 77 ++++ conformance/profiles/snapshot-boundary.json | 83 ++++ conformance/profiles/snapshot-missing.json | 23 ++ conformance/profiles/snapshot-mixed.json | 31 ++ conformance/profiles/static-button.json | 25 ++ .../profiles/static-criticalbutton.json | 25 ++ conformance/profiles/static-extra-button.json | 33 ++ .../profiles/static-extra-criticalbutton.json | 33 ++ conformance/profiles/static-extra-image.json | 33 ++ conformance/profiles/static-extra-label.json | 33 ++ conformance/profiles/static-extra-row.json | 33 ++ conformance/profiles/static-image.json | 25 ++ conformance/profiles/static-label.json | 25 ++ conformance/profiles/static-row.json | 25 ++ conformance/profiles/status-color-count.json | 31 ++ .../profiles/status-negative-index.json | 33 ++ conformance/profiles/status-order.json | 35 ++ conformance/profiles/status-range.json | 33 ++ conformance/profiles/status-type.json | 33 ++ conformance/profiles/text-invalid-glyph.json | 29 ++ conformance/profiles/text-too-long.json | 29 ++ conformance/profiles/text-value.json | 30 ++ conformance/profiles/trace-capacity.json | 33 ++ conformance/profiles/trace-empty.json | 29 ++ .../profiles/trace-invalid-capacity.json | 32 ++ conformance/profiles/trace-invalid-range.json | 32 ++ conformance/profiles/trace-order.json | 37 ++ conformance/profiles/trace-range.json | 30 ++ conformance/profiles/viewport-dimensions.json | 44 +++ .../profiles/viewport-excess-pixels.json | 48 +++ conformance/profiles/viewport-format.json | 44 +++ .../profiles/viewport-negative-channel.json | 44 +++ conformance/profiles/viewport-opaque.json | 50 +++ conformance/profiles/viewport-range.json | 44 +++ conformance/profiles/viewport-rounding.json | 50 +++ conformance/profiles/viewport-rows.json | 57 +++ conformance/profiles/viewport-short.json | 43 +++ .../profiles/viewport-transparent.json | 50 +++ .../profiles/viewport-zero-dimension.json | 39 ++ .../MEDUI-DEC-008-interaction-profiles.md | 26 +- governance/versioning.md | 2 +- profiles/presentation-fixture.json | 312 +++++++++++++++ profiles/registry.json | 31 ++ schemas/binding.schema.json | 279 +++++++++++++ schemas/consumer-manifest.schema.json | 5 +- schemas/contract-case.schema.json | 4 +- schemas/presentation.schema.json | 147 +++++++ schemas/profile-case.schema.json | 30 +- spec/component-model.md | 7 +- spec/profiles.md | 132 ++++++- tools/validate.py | 5 + 190 files changed, 17272 insertions(+), 26 deletions(-) create mode 100644 conformance/contracts/binding-clock.json create mode 100644 conformance/contracts/binding-numericdisplay.json create mode 100644 conformance/contracts/binding-signaltrace.json create mode 100644 conformance/contracts/binding-statusindicator.json create mode 100644 conformance/contracts/binding-textinput.json create mode 100644 conformance/contracts/binding-vulkanviewport.json create mode 100644 conformance/contracts/binding-wrong-clock.json create mode 100644 conformance/contracts/binding-wrong-numericdisplay.json create mode 100644 conformance/contracts/binding-wrong-signaltrace.json create mode 100644 conformance/contracts/binding-wrong-statusindicator.json create mode 100644 conformance/contracts/binding-wrong-textinput.json create mode 100644 conformance/contracts/binding-wrong-vulkanviewport.json create mode 100644 conformance/contracts/presentation-channel-range.json create mode 100644 conformance/contracts/presentation-missing-assets.json create mode 100644 conformance/contracts/presentation-missing-backend.json create mode 100644 conformance/contracts/presentation-missing-font.json create mode 100644 conformance/contracts/presentation-missing-surface.json create mode 100644 conformance/contracts/presentation-missing-theme.json create mode 100644 conformance/contracts/presentation-missing-variants.json create mode 100644 conformance/contracts/presentation-unknown-component.json create mode 100644 conformance/contracts/presentation-valid.json create mode 100644 conformance/profiles/activation-activate.json create mode 100644 conformance/profiles/activation-cancel.json create mode 100644 conformance/profiles/activation-disabled.json create mode 100644 conformance/profiles/activation-focus-loss.json create mode 100644 conformance/profiles/activation-release-outside.json create mode 100644 conformance/profiles/activation-removed.json create mode 100644 conformance/profiles/activation-repeated-press.json create mode 100644 conformance/profiles/activation-repress-outside.json create mode 100644 conformance/profiles/activation-unarmed.json create mode 100644 conformance/profiles/clock-datetimeseconds.json create mode 100644 conformance/profiles/clock-invalid-date.json create mode 100644 conformance/profiles/clock-leap-second.json create mode 100644 conformance/profiles/clock-timeseconds.json create mode 100644 conformance/profiles/clock-year-bound.json create mode 100644 conformance/profiles/critical-noop.json create mode 100644 conformance/profiles/critical-triggerhalt.json create mode 100644 conformance/profiles/different-control.json create mode 100644 conformance/profiles/edit-delete.json create mode 100644 conformance/profiles/edit-edge.json create mode 100644 conformance/profiles/edit-end-edge.json create mode 100644 conformance/profiles/edit-end.json create mode 100644 conformance/profiles/edit-home.json create mode 100644 conformance/profiles/edit-left.json create mode 100644 conformance/profiles/edit-paste.json create mode 100644 conformance/profiles/edit-reject-encoding.json create mode 100644 conformance/profiles/edit-reject-glyph.json create mode 100644 conformance/profiles/edit-reject-overlong.json create mode 100644 conformance/profiles/edit-reject-oversize.json create mode 100644 conformance/profiles/edit-reject-repeat-insert.json create mode 100644 conformance/profiles/edit-reject-repeat-paste.json create mode 100644 conformance/profiles/edit-reject-selection.json create mode 100644 conformance/profiles/edit-reject-surrogate.json create mode 100644 conformance/profiles/edit-repeat-deletion.json create mode 100644 conformance/profiles/edit-repeat-navigation.json create mode 100644 conformance/profiles/edit-right.json create mode 100644 conformance/profiles/edit-scalar.json create mode 100644 conformance/profiles/edit-selection-backspace.json create mode 100644 conformance/profiles/edit-selection-delete.json create mode 100644 conformance/profiles/edit-selection-left.json create mode 100644 conformance/profiles/edit-selection-right.json create mode 100644 conformance/profiles/edit-selection.json create mode 100644 conformance/profiles/edit-unfocused.json create mode 100644 conformance/profiles/focus-initial.json create mode 100644 conformance/profiles/focus-loss-editing.json create mode 100644 conformance/profiles/focus-outside.json create mode 100644 conformance/profiles/focus-press.json create mode 100644 conformance/profiles/focus-traversal.json create mode 100644 conformance/profiles/hit-bottom.json create mode 100644 conformance/profiles/hit-interior.json create mode 100644 conformance/profiles/hit-negative.json create mode 100644 conformance/profiles/hit-origin.json create mode 100644 conformance/profiles/hit-right.json create mode 100644 conformance/profiles/hit-surface.json create mode 100644 conformance/profiles/mapping-duplicate.json create mode 100644 conformance/profiles/mapping-missing.json create mode 100644 conformance/profiles/mapping-screen.json create mode 100644 conformance/profiles/mapping-snapshot.json create mode 100644 conformance/profiles/mapping-source.json create mode 100644 conformance/profiles/mapping-type.json create mode 100644 conformance/profiles/mapping-unknown.json create mode 100644 conformance/profiles/normalize-fraction.json create mode 100644 conformance/profiles/normalize-invalid-scaledenominator.json create mode 100644 conformance/profiles/normalize-invalid-scalenumerator.json create mode 100644 conformance/profiles/normalize-negative-floor.json create mode 100644 conformance/profiles/normalize-origin.json create mode 100644 conformance/profiles/numeric-digit-bound.json create mode 100644 conformance/profiles/numeric-float.json create mode 100644 conformance/profiles/numeric-fraction.json create mode 100644 conformance/profiles/numeric-integer.json create mode 100644 conformance/profiles/numeric-leading-zero.json create mode 100644 conformance/profiles/numeric-negative-scale.json create mode 100644 conformance/profiles/numeric-negative-zero.json create mode 100644 conformance/profiles/numeric-padding.json create mode 100644 conformance/profiles/numeric-scale-bound.json create mode 100644 conformance/profiles/numeric-template.json create mode 100644 conformance/profiles/occlusion-clipped.json create mode 100644 conformance/profiles/occlusion-control.json create mode 100644 conformance/profiles/occlusion-decoration.json create mode 100644 conformance/profiles/occlusion-disabled.json create mode 100644 conformance/profiles/pixel-different.json create mode 100644 conformance/profiles/pixel-equal.json create mode 100644 conformance/profiles/pixel-identity-assets.json create mode 100644 conformance/profiles/pixel-identity-backend.json create mode 100644 conformance/profiles/pixel-identity-declaration.json create mode 100644 conformance/profiles/pixel-identity-font.json create mode 100644 conformance/profiles/pixel-identity-frame.json create mode 100644 conformance/profiles/pixel-identity-locale.json create mode 100644 conformance/profiles/pixel-identity-scenario.json create mode 100644 conformance/profiles/pixel-identity-surface.json create mode 100644 conformance/profiles/pixel-identity-theme.json create mode 100644 conformance/profiles/presentation-button.json create mode 100644 conformance/profiles/presentation-caret.json create mode 100644 conformance/profiles/presentation-clip.json create mode 100644 conformance/profiles/presentation-clock.json create mode 100644 conformance/profiles/presentation-criticalbutton.json create mode 100644 conformance/profiles/presentation-image.json create mode 100644 conformance/profiles/presentation-invalid-duplicate.json create mode 100644 conformance/profiles/presentation-invalid-identity.json create mode 100644 conformance/profiles/presentation-invalid-missing-component.json create mode 100644 conformance/profiles/presentation-invalid-negative-extent.json create mode 100644 conformance/profiles/presentation-label.json create mode 100644 conformance/profiles/presentation-missing-state.json create mode 100644 conformance/profiles/presentation-numericdisplay.json create mode 100644 conformance/profiles/presentation-pressed.json create mode 100644 conformance/profiles/presentation-row.json create mode 100644 conformance/profiles/presentation-signaltrace.json create mode 100644 conformance/profiles/presentation-statusindicator.json create mode 100644 conformance/profiles/presentation-textinput.json create mode 100644 conformance/profiles/presentation-unclipped.json create mode 100644 conformance/profiles/presentation-vulkanviewport.json create mode 100644 conformance/profiles/presentation-zero-extent.json create mode 100644 conformance/profiles/queue-full.json create mode 100644 conformance/profiles/queue-invalid-capacity.json create mode 100644 conformance/profiles/queue-invalid.json create mode 100644 conformance/profiles/queue-overflow.json create mode 100644 conformance/profiles/queue-queued-activation-overflow.json create mode 100644 conformance/profiles/queue-reset.json create mode 100644 conformance/profiles/queue-saturate.json create mode 100644 conformance/profiles/snapshot-boundary.json create mode 100644 conformance/profiles/snapshot-missing.json create mode 100644 conformance/profiles/snapshot-mixed.json create mode 100644 conformance/profiles/static-button.json create mode 100644 conformance/profiles/static-criticalbutton.json create mode 100644 conformance/profiles/static-extra-button.json create mode 100644 conformance/profiles/static-extra-criticalbutton.json create mode 100644 conformance/profiles/static-extra-image.json create mode 100644 conformance/profiles/static-extra-label.json create mode 100644 conformance/profiles/static-extra-row.json create mode 100644 conformance/profiles/static-image.json create mode 100644 conformance/profiles/static-label.json create mode 100644 conformance/profiles/static-row.json create mode 100644 conformance/profiles/status-color-count.json create mode 100644 conformance/profiles/status-negative-index.json create mode 100644 conformance/profiles/status-order.json create mode 100644 conformance/profiles/status-range.json create mode 100644 conformance/profiles/status-type.json create mode 100644 conformance/profiles/text-invalid-glyph.json create mode 100644 conformance/profiles/text-too-long.json create mode 100644 conformance/profiles/text-value.json create mode 100644 conformance/profiles/trace-capacity.json create mode 100644 conformance/profiles/trace-empty.json create mode 100644 conformance/profiles/trace-invalid-capacity.json create mode 100644 conformance/profiles/trace-invalid-range.json create mode 100644 conformance/profiles/trace-order.json create mode 100644 conformance/profiles/trace-range.json create mode 100644 conformance/profiles/viewport-dimensions.json create mode 100644 conformance/profiles/viewport-excess-pixels.json create mode 100644 conformance/profiles/viewport-format.json create mode 100644 conformance/profiles/viewport-negative-channel.json create mode 100644 conformance/profiles/viewport-opaque.json create mode 100644 conformance/profiles/viewport-range.json create mode 100644 conformance/profiles/viewport-rounding.json create mode 100644 conformance/profiles/viewport-rows.json create mode 100644 conformance/profiles/viewport-short.json create mode 100644 conformance/profiles/viewport-transparent.json create mode 100644 conformance/profiles/viewport-zero-dimension.json create mode 100644 profiles/presentation-fixture.json create mode 100644 schemas/binding.schema.json create mode 100644 schemas/presentation.schema.json diff --git a/conformance/contracts/binding-clock.json b/conformance/contracts/binding-clock.json new file mode 100644 index 0000000..892770b --- /dev/null +++ b/conformance/contracts/binding-clock.json @@ -0,0 +1,27 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-CLOCK", + "schema": "binding", + "description": "binding clock", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "clock", + "snapshot": "s1", + "component": "Clock", + "value": [ + 2026, + 9, + 7, + 12, + 0, + 0 + ] + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/binding-numericdisplay.json b/conformance/contracts/binding-numericdisplay.json new file mode 100644 index 0000000..b24e3dc --- /dev/null +++ b/conformance/contracts/binding-numericdisplay.json @@ -0,0 +1,25 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-NUMERICDISPLAY", + "schema": "binding", + "description": "binding numericdisplay", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "NumericDisplay", + "value": { + "integer": "-1", + "scale": 2, + "prefix": "", + "suffix": "" + } + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/binding-signaltrace.json b/conformance/contracts/binding-signaltrace.json new file mode 100644 index 0000000..99febec --- /dev/null +++ b/conformance/contracts/binding-signaltrace.json @@ -0,0 +1,23 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-SIGNALTRACE", + "schema": "binding", + "description": "binding signaltrace", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "SignalTrace", + "value": [ + 1, + 2 + ] + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/binding-statusindicator.json b/conformance/contracts/binding-statusindicator.json new file mode 100644 index 0000000..15280ed --- /dev/null +++ b/conformance/contracts/binding-statusindicator.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-STATUSINDICATOR", + "schema": "binding", + "description": "binding statusindicator", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "StatusIndicator", + "value": 0 + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/binding-textinput.json b/conformance/contracts/binding-textinput.json new file mode 100644 index 0000000..2c7d050 --- /dev/null +++ b/conformance/contracts/binding-textinput.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-TEXTINPUT", + "schema": "binding", + "description": "binding textinput", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "TextInput", + "value": "a\ud83d\ude00" + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/binding-vulkanviewport.json b/conformance/contracts/binding-vulkanviewport.json new file mode 100644 index 0000000..dce789e --- /dev/null +++ b/conformance/contracts/binding-vulkanviewport.json @@ -0,0 +1,30 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-VULKANVIEWPORT", + "schema": "binding", + "description": "binding vulkanviewport", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "VulkanViewport", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 1, + 2, + 3, + 255 + ] + } + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/binding-wrong-clock.json b/conformance/contracts/binding-wrong-clock.json new file mode 100644 index 0000000..6ddf15f --- /dev/null +++ b/conformance/contracts/binding-wrong-clock.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-WRONG-CLOCK", + "schema": "binding", + "description": "binding wrong clock", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "clock", + "snapshot": "s1", + "component": "Clock", + "value": null + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/binding-wrong-numericdisplay.json b/conformance/contracts/binding-wrong-numericdisplay.json new file mode 100644 index 0000000..2877880 --- /dev/null +++ b/conformance/contracts/binding-wrong-numericdisplay.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-WRONG-NUMERICDISPLAY", + "schema": "binding", + "description": "binding wrong numericdisplay", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "NumericDisplay", + "value": null + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/binding-wrong-signaltrace.json b/conformance/contracts/binding-wrong-signaltrace.json new file mode 100644 index 0000000..89a3fbe --- /dev/null +++ b/conformance/contracts/binding-wrong-signaltrace.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-WRONG-SIGNALTRACE", + "schema": "binding", + "description": "binding wrong signaltrace", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "SignalTrace", + "value": null + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/binding-wrong-statusindicator.json b/conformance/contracts/binding-wrong-statusindicator.json new file mode 100644 index 0000000..d921563 --- /dev/null +++ b/conformance/contracts/binding-wrong-statusindicator.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-WRONG-STATUSINDICATOR", + "schema": "binding", + "description": "binding wrong statusindicator", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "StatusIndicator", + "value": null + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/binding-wrong-textinput.json b/conformance/contracts/binding-wrong-textinput.json new file mode 100644 index 0000000..e49f2b4 --- /dev/null +++ b/conformance/contracts/binding-wrong-textinput.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-WRONG-TEXTINPUT", + "schema": "binding", + "description": "binding wrong textinput", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "TextInput", + "value": null + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/binding-wrong-vulkanviewport.json b/conformance/contracts/binding-wrong-vulkanviewport.json new file mode 100644 index 0000000..1d6443d --- /dev/null +++ b/conformance/contracts/binding-wrong-vulkanviewport.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-BINDING-WRONG-VULKANVIEWPORT", + "schema": "binding", + "description": "binding wrong vulkanviewport", + "document": { + "screen": "screen", + "snapshot": "s1", + "frame": 0, + "entries": [ + { + "node": "node", + "source": "value", + "snapshot": "s1", + "component": "VulkanViewport", + "value": null + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/manifest-profiles.json b/conformance/contracts/manifest-profiles.json index b00aee3..5f5bccf 100644 --- a/conformance/contracts/manifest-profiles.json +++ b/conformance/contracts/manifest-profiles.json @@ -17,6 +17,18 @@ { "id": "MEDUI-PROFILE-EVIDENCE", "version": 1 + }, + { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 } ] }, diff --git a/conformance/contracts/presentation-channel-range.json b/conformance/contracts/presentation-channel-range.json new file mode 100644 index 0000000..443d513 --- /dev/null +++ b/conformance/contracts/presentation-channel-range.json @@ -0,0 +1,38 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-CHANNEL-RANGE", + "schema": "presentation", + "description": "presentation channel range", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 256, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-missing-assets.json b/conformance/contracts/presentation-missing-assets.json new file mode 100644 index 0000000..2d81381 --- /dev/null +++ b/conformance/contracts/presentation-missing-assets.json @@ -0,0 +1,317 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-MISSING-ASSETS", + "schema": "presentation", + "description": "presentation missing assets", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-missing-backend.json b/conformance/contracts/presentation-missing-backend.json new file mode 100644 index 0000000..26cc0b8 --- /dev/null +++ b/conformance/contracts/presentation-missing-backend.json @@ -0,0 +1,317 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-MISSING-BACKEND", + "schema": "presentation", + "description": "presentation missing backend", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-missing-font.json b/conformance/contracts/presentation-missing-font.json new file mode 100644 index 0000000..7477264 --- /dev/null +++ b/conformance/contracts/presentation-missing-font.json @@ -0,0 +1,317 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-MISSING-FONT", + "schema": "presentation", + "description": "presentation missing font", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-missing-surface.json b/conformance/contracts/presentation-missing-surface.json new file mode 100644 index 0000000..7ff3cca --- /dev/null +++ b/conformance/contracts/presentation-missing-surface.json @@ -0,0 +1,314 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-MISSING-SURFACE", + "schema": "presentation", + "description": "presentation missing surface", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-missing-theme.json b/conformance/contracts/presentation-missing-theme.json new file mode 100644 index 0000000..d10e898 --- /dev/null +++ b/conformance/contracts/presentation-missing-theme.json @@ -0,0 +1,317 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-MISSING-THEME", + "schema": "presentation", + "description": "presentation missing theme", + "document": { + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-missing-variants.json b/conformance/contracts/presentation-missing-variants.json new file mode 100644 index 0000000..21af705 --- /dev/null +++ b/conformance/contracts/presentation-missing-variants.json @@ -0,0 +1,16 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-MISSING-VARIANTS", + "schema": "presentation", + "description": "presentation missing variants", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-unknown-component.json b/conformance/contracts/presentation-unknown-component.json new file mode 100644 index 0000000..482ffa2 --- /dev/null +++ b/conformance/contracts/presentation-unknown-component.json @@ -0,0 +1,38 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-UNKNOWN-COMPONENT", + "schema": "presentation", + "description": "presentation unknown component", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Unknown", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } + ] + }, + "valid": false +} diff --git a/conformance/contracts/presentation-valid.json b/conformance/contracts/presentation-valid.json new file mode 100644 index 0000000..b71a60d --- /dev/null +++ b/conformance/contracts/presentation-valid.json @@ -0,0 +1,318 @@ +{ + "id": "MEDUI-CONTRACT-CASE-PRESENTATION-VALID", + "schema": "presentation", + "description": "presentation valid", + "document": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "valid": true +} diff --git a/conformance/profiles/activation-activate.json b/conformance/profiles/activation-activate.json new file mode 100644 index 0000000..da6e7e8 --- /dev/null +++ b/conformance/profiles/activation-activate.json @@ -0,0 +1,64 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-ACTIVATE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation activate", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [ + { + "kind": "source", + "node": "button", + "source": "confirm" + } + ], + "armed": null + } +} diff --git a/conformance/profiles/activation-cancel.json b/conformance/profiles/activation-cancel.json new file mode 100644 index 0000000..4ac6a14 --- /dev/null +++ b/conformance/profiles/activation-cancel.json @@ -0,0 +1,61 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-CANCEL", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation cancel", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "cancel" + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/activation-disabled.json b/conformance/profiles/activation-disabled.json new file mode 100644 index 0000000..b983d62 --- /dev/null +++ b/conformance/profiles/activation-disabled.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-DISABLED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation disabled", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "eligibility", + "node": "button", + "eligible": false + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/activation-focus-loss.json b/conformance/profiles/activation-focus-loss.json new file mode 100644 index 0000000..9d3fd7f --- /dev/null +++ b/conformance/profiles/activation-focus-loss.json @@ -0,0 +1,61 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-FOCUS-LOSS", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation focus loss", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "focus-loss" + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/activation-release-outside.json b/conformance/profiles/activation-release-outside.json new file mode 100644 index 0000000..af53a99 --- /dev/null +++ b/conformance/profiles/activation-release-outside.json @@ -0,0 +1,58 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-RELEASE-OUTSIDE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation release outside", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 12, + 12 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/activation-removed.json b/conformance/profiles/activation-removed.json new file mode 100644 index 0000000..dbd8ad2 --- /dev/null +++ b/conformance/profiles/activation-removed.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-REMOVED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation removed", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "remove", + "node": "button" + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/activation-repeated-press.json b/conformance/profiles/activation-repeated-press.json new file mode 100644 index 0000000..d411377 --- /dev/null +++ b/conformance/profiles/activation-repeated-press.json @@ -0,0 +1,71 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-REPEATED-PRESS", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation repeated press", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [ + { + "kind": "source", + "node": "button", + "source": "confirm" + } + ], + "armed": null + } +} diff --git a/conformance/profiles/activation-repress-outside.json b/conformance/profiles/activation-repress-outside.json new file mode 100644 index 0000000..9267f49 --- /dev/null +++ b/conformance/profiles/activation-repress-outside.json @@ -0,0 +1,65 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-REPRESS-OUTSIDE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation repress outside", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "press", + "point": [ + 12, + 12 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/activation-unarmed.json b/conformance/profiles/activation-unarmed.json new file mode 100644 index 0000000..7dd66c4 --- /dev/null +++ b/conformance/profiles/activation-unarmed.json @@ -0,0 +1,51 @@ +{ + "id": "MEDUI-PROFILE-CASE-ACTIVATION-UNARMED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "activation unarmed", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/clock-datetimeseconds.json b/conformance/profiles/clock-datetimeseconds.json new file mode 100644 index 0000000..801f25a --- /dev/null +++ b/conformance/profiles/clock-datetimeseconds.json @@ -0,0 +1,34 @@ +{ + "id": "MEDUI-PROFILE-CASE-CLOCK-DATETIMESECONDS", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "clock datetimeseconds", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Clock", + "declaredSource": "clock", + "value": [ + 2024, + 2, + 29, + 1, + 2, + 3 + ], + "format": "DateTimeSeconds" + }, + "expected": { + "valid": true, + "text": "2024-02-29 01:02:03" + } +} diff --git a/conformance/profiles/clock-invalid-date.json b/conformance/profiles/clock-invalid-date.json new file mode 100644 index 0000000..8440628 --- /dev/null +++ b/conformance/profiles/clock-invalid-date.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-CLOCK-INVALID-DATE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "clock invalid date", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Clock", + "declaredSource": "clock", + "value": [ + 2025, + 2, + 29, + 1, + 2, + 3 + ], + "format": "TimeSeconds" + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/clock-leap-second.json b/conformance/profiles/clock-leap-second.json new file mode 100644 index 0000000..b3a549c --- /dev/null +++ b/conformance/profiles/clock-leap-second.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-CLOCK-LEAP-SECOND", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "clock leap second", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Clock", + "declaredSource": "clock", + "value": [ + 2024, + 2, + 29, + 1, + 2, + 60 + ], + "format": "TimeSeconds" + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/clock-timeseconds.json b/conformance/profiles/clock-timeseconds.json new file mode 100644 index 0000000..ee8cac8 --- /dev/null +++ b/conformance/profiles/clock-timeseconds.json @@ -0,0 +1,34 @@ +{ + "id": "MEDUI-PROFILE-CASE-CLOCK-TIMESECONDS", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "clock timeseconds", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Clock", + "declaredSource": "clock", + "value": [ + 2024, + 2, + 29, + 1, + 2, + 3 + ], + "format": "TimeSeconds" + }, + "expected": { + "valid": true, + "text": "01:02:03" + } +} diff --git a/conformance/profiles/clock-year-bound.json b/conformance/profiles/clock-year-bound.json new file mode 100644 index 0000000..2dfa3c0 --- /dev/null +++ b/conformance/profiles/clock-year-bound.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-CLOCK-YEAR-BOUND", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "clock year bound", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Clock", + "declaredSource": "clock", + "value": [ + 10000, + 1, + 1, + 0, + 0, + 0 + ], + "format": "TimeSeconds" + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/critical-noop.json b/conformance/profiles/critical-noop.json new file mode 100644 index 0000000..6f78925 --- /dev/null +++ b/conformance/profiles/critical-noop.json @@ -0,0 +1,66 @@ +{ + "id": "MEDUI-PROFILE-CASE-CRITICAL-NOOP", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "critical noop", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "critical", + "component": "CriticalButton", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "action": "NoOp", + "requirement": "REQ-1" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [ + { + "kind": "action", + "node": "critical", + "action": "NoOp", + "requirement": "REQ-1" + } + ], + "armed": null + } +} diff --git a/conformance/profiles/critical-triggerhalt.json b/conformance/profiles/critical-triggerhalt.json new file mode 100644 index 0000000..99c7ec4 --- /dev/null +++ b/conformance/profiles/critical-triggerhalt.json @@ -0,0 +1,66 @@ +{ + "id": "MEDUI-PROFILE-CASE-CRITICAL-TRIGGERHALT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "critical triggerhalt", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "critical", + "component": "CriticalButton", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "action": "TriggerHalt", + "requirement": "REQ-1" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [ + { + "kind": "action", + "node": "critical", + "action": "TriggerHalt", + "requirement": "REQ-1" + } + ], + "armed": null + } +} diff --git a/conformance/profiles/different-control.json b/conformance/profiles/different-control.json new file mode 100644 index 0000000..caf662a --- /dev/null +++ b/conformance/profiles/different-control.json @@ -0,0 +1,76 @@ +{ + "id": "MEDUI-PROFILE-CASE-DIFFERENT-CONTROL", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03" + ], + "description": "different control", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + }, + { + "id": "second", + "component": "Button", + "rect": [ + 10, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 12, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null + } +} diff --git a/conformance/profiles/edit-delete.json b/conformance/profiles/edit-delete.json new file mode 100644 index 0000000..da37555 --- /dev/null +++ b/conformance/profiles/edit-delete.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-DELETE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit delete", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "a\ud83d\ude00b", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "delete" + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-edge.json b/conformance/profiles/edit-edge.json new file mode 100644 index 0000000..7e52445 --- /dev/null +++ b/conformance/profiles/edit-edge.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-EDGE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit edge", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 0 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "backspace" + } + ] + }, + "expected": { + "text": "ab", + "caret": 0, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-end-edge.json b/conformance/profiles/edit-end-edge.json new file mode 100644 index 0000000..f6c6d4f --- /dev/null +++ b/conformance/profiles/edit-end-edge.json @@ -0,0 +1,65 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-END-EDGE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit end edge", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 2, + "selection": [ + 2, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "right" + }, + { + "type": "delete" + } + ] + }, + "expected": { + "text": "ab", + "caret": 2, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-end.json b/conformance/profiles/edit-end.json new file mode 100644 index 0000000..894a988 --- /dev/null +++ b/conformance/profiles/edit-end.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-END", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit end", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 0 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "end" + } + ] + }, + "expected": { + "text": "ab", + "caret": 2, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-home.json b/conformance/profiles/edit-home.json new file mode 100644 index 0000000..abfe424 --- /dev/null +++ b/conformance/profiles/edit-home.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-HOME", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit home", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 2, + "selection": [ + 2, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "home" + } + ] + }, + "expected": { + "text": "ab", + "caret": 0, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-left.json b/conformance/profiles/edit-left.json new file mode 100644 index 0000000..c853d20 --- /dev/null +++ b/conformance/profiles/edit-left.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-LEFT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit left", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "a\ud83d\ude00b", + "caret": 2, + "selection": [ + 2, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "left" + } + ] + }, + "expected": { + "text": "a\ud83d\ude00b", + "caret": 1, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-paste.json b/conformance/profiles/edit-paste.json new file mode 100644 index 0000000..f8cc8bb --- /dev/null +++ b/conformance/profiles/edit-paste.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-PASTE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit paste", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "paste", + "text": "\u00e9\ud83d\ude00" + } + ] + }, + "expected": { + "text": "a\u00e9\ud83d\ude00b", + "caret": 3, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-reject-encoding.json b/conformance/profiles/edit-reject-encoding.json new file mode 100644 index 0000000..b1cc05d --- /dev/null +++ b/conformance/profiles/edit-reject-encoding.json @@ -0,0 +1,72 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-ENCODING", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject encoding", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "paste", + "utf8": [ + 195, + 40 + ] + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-glyph.json b/conformance/profiles/edit-reject-glyph.json new file mode 100644 index 0000000..04b1523 --- /dev/null +++ b/conformance/profiles/edit-reject-glyph.json @@ -0,0 +1,69 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-GLYPH", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject glyph", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "insert", + "text": "z" + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-overlong.json b/conformance/profiles/edit-reject-overlong.json new file mode 100644 index 0000000..8ac7e75 --- /dev/null +++ b/conformance/profiles/edit-reject-overlong.json @@ -0,0 +1,72 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-OVERLONG", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject overlong", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "paste", + "utf8": [ + 192, + 175 + ] + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-oversize.json b/conformance/profiles/edit-reject-oversize.json new file mode 100644 index 0000000..b3c6e08 --- /dev/null +++ b/conformance/profiles/edit-reject-oversize.json @@ -0,0 +1,69 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-OVERSIZE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject oversize", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "paste", + "text": "aaaa" + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-repeat-insert.json b/conformance/profiles/edit-reject-repeat-insert.json new file mode 100644 index 0000000..72d47bd --- /dev/null +++ b/conformance/profiles/edit-reject-repeat-insert.json @@ -0,0 +1,70 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-REPEAT-INSERT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject repeat insert", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "insert", + "text": "a", + "repeat": true + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-repeat-paste.json b/conformance/profiles/edit-reject-repeat-paste.json new file mode 100644 index 0000000..00ecdb2 --- /dev/null +++ b/conformance/profiles/edit-reject-repeat-paste.json @@ -0,0 +1,70 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-REPEAT-PASTE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject repeat paste", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "paste", + "text": "a", + "repeat": true + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-selection.json b/conformance/profiles/edit-reject-selection.json new file mode 100644 index 0000000..9d2a8fa --- /dev/null +++ b/conformance/profiles/edit-reject-selection.json @@ -0,0 +1,69 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-SELECTION", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject selection", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 0, + 5 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "insert", + "text": "a" + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 0, + 5 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-reject-surrogate.json b/conformance/profiles/edit-reject-surrogate.json new file mode 100644 index 0000000..481a923 --- /dev/null +++ b/conformance/profiles/edit-reject-surrogate.json @@ -0,0 +1,73 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REJECT-SURROGATE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit reject surrogate", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "paste", + "utf8": [ + 237, + 160, + 128 + ] + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "rejectedEvents": [ + 0 + ] + } +} diff --git a/conformance/profiles/edit-repeat-deletion.json b/conformance/profiles/edit-repeat-deletion.json new file mode 100644 index 0000000..c48b979 --- /dev/null +++ b/conformance/profiles/edit-repeat-deletion.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REPEAT-DELETION", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit repeat deletion", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "backspace", + "repeat": true + } + ] + }, + "expected": { + "text": "b", + "caret": 0, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-repeat-navigation.json b/conformance/profiles/edit-repeat-navigation.json new file mode 100644 index 0000000..8de825e --- /dev/null +++ b/conformance/profiles/edit-repeat-navigation.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-REPEAT-NAVIGATION", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit repeat navigation", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "left", + "repeat": true + } + ] + }, + "expected": { + "text": "ab", + "caret": 0, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-right.json b/conformance/profiles/edit-right.json new file mode 100644 index 0000000..8ad75bf --- /dev/null +++ b/conformance/profiles/edit-right.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-RIGHT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit right", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "a\ud83d\ude00b", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "right" + } + ] + }, + "expected": { + "text": "a\ud83d\ude00b", + "caret": 2, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-scalar.json b/conformance/profiles/edit-scalar.json new file mode 100644 index 0000000..0ca4e73 --- /dev/null +++ b/conformance/profiles/edit-scalar.json @@ -0,0 +1,62 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-SCALAR", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit scalar", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "a\ud83d\ude00b", + "caret": 2, + "selection": [ + 2, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "backspace" + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-selection-backspace.json b/conformance/profiles/edit-selection-backspace.json new file mode 100644 index 0000000..8af02d6 --- /dev/null +++ b/conformance/profiles/edit-selection-backspace.json @@ -0,0 +1,66 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-SELECTION-BACKSPACE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit selection backspace", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "backspace" + } + ] + }, + "expected": { + "text": "", + "caret": 0, + "selection": [ + 0, + 0 + ], + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-selection-delete.json b/conformance/profiles/edit-selection-delete.json new file mode 100644 index 0000000..b648ac1 --- /dev/null +++ b/conformance/profiles/edit-selection-delete.json @@ -0,0 +1,66 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-SELECTION-DELETE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit selection delete", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "delete" + } + ] + }, + "expected": { + "text": "", + "caret": 0, + "selection": [ + 0, + 0 + ], + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-selection-left.json b/conformance/profiles/edit-selection-left.json new file mode 100644 index 0000000..105bb5b --- /dev/null +++ b/conformance/profiles/edit-selection-left.json @@ -0,0 +1,66 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-SELECTION-LEFT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit selection left", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "left" + } + ] + }, + "expected": { + "text": "ab", + "caret": 0, + "selection": [ + 0, + 0 + ], + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-selection-right.json b/conformance/profiles/edit-selection-right.json new file mode 100644 index 0000000..15bb078 --- /dev/null +++ b/conformance/profiles/edit-selection-right.json @@ -0,0 +1,66 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-SELECTION-RIGHT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit selection right", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "right" + } + ] + }, + "expected": { + "text": "ab", + "caret": 2, + "selection": [ + 2, + 2 + ], + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-selection.json b/conformance/profiles/edit-selection.json new file mode 100644 index 0000000..4dc1876 --- /dev/null +++ b/conformance/profiles/edit-selection.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-SELECTION", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit selection", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "text": "ab", + "caret": 0, + "selection": [ + 0, + 2 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "insert", + "text": "\ud83d\ude00" + } + ] + }, + "expected": { + "text": "\ud83d\ude00", + "caret": 1, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/edit-unfocused.json b/conformance/profiles/edit-unfocused.json new file mode 100644 index 0000000..e31f0bb --- /dev/null +++ b/conformance/profiles/edit-unfocused.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-EDIT-UNFOCUSED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "edit unfocused", + "inputs": { + "operation": "edit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": null, + "text": "ab", + "caret": 1, + "selection": [ + 1, + 1 + ], + "glyphs": [ + "a", + "b", + "\u00e9", + "\ud83d\ude00" + ], + "maxLength": 4, + "events": [ + { + "type": "insert", + "text": "a" + } + ] + }, + "expected": { + "text": "ab", + "caret": 1, + "rejectedEvents": [] + } +} diff --git a/conformance/profiles/focus-initial.json b/conformance/profiles/focus-initial.json new file mode 100644 index 0000000..c0494ce --- /dev/null +++ b/conformance/profiles/focus-initial.json @@ -0,0 +1,71 @@ +{ + "id": "MEDUI-PROFILE-CASE-FOCUS-INITIAL", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "focus initial", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + }, + { + "id": "second", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focusOrder": [ + "text", + "second" + ], + "focused": null, + "armed": "button", + "events": [ + { + "type": "focus-next" + } + ] + }, + "expected": { + "focused": "text", + "armed": null + } +} diff --git a/conformance/profiles/focus-loss-editing.json b/conformance/profiles/focus-loss-editing.json new file mode 100644 index 0000000..8d5a0da --- /dev/null +++ b/conformance/profiles/focus-loss-editing.json @@ -0,0 +1,48 @@ +{ + "id": "MEDUI-PROFILE-CASE-FOCUS-LOSS-EDITING", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "focus loss editing", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "events": [ + { + "type": "focus-loss" + } + ] + }, + "expected": { + "focused": null, + "armed": null + } +} diff --git a/conformance/profiles/focus-outside.json b/conformance/profiles/focus-outside.json new file mode 100644 index 0000000..f872b74 --- /dev/null +++ b/conformance/profiles/focus-outside.json @@ -0,0 +1,52 @@ +{ + "id": "MEDUI-PROFILE-CASE-FOCUS-OUTSIDE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "focus outside", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": "text", + "events": [ + { + "type": "press", + "point": [ + 15, + 15 + ] + } + ] + }, + "expected": { + "focused": null, + "armed": null + } +} diff --git a/conformance/profiles/focus-press.json b/conformance/profiles/focus-press.json new file mode 100644 index 0000000..6f47f9b --- /dev/null +++ b/conformance/profiles/focus-press.json @@ -0,0 +1,56 @@ +{ + "id": "MEDUI-PROFILE-CASE-FOCUS-PRESS", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "focus press", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focused": null, + "carets": { + "text": 1 + }, + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "focused": "text", + "caret": 1, + "armed": null + } +} diff --git a/conformance/profiles/focus-traversal.json b/conformance/profiles/focus-traversal.json new file mode 100644 index 0000000..cb0750d --- /dev/null +++ b/conformance/profiles/focus-traversal.json @@ -0,0 +1,71 @@ +{ + "id": "MEDUI-PROFILE-CASE-FOCUS-TRAVERSAL", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I06" + ], + "description": "focus traversal", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "text", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + }, + { + "id": "second", + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "name" + } + ], + "focusOrder": [ + "text", + "second" + ], + "focused": "second", + "armed": "button", + "events": [ + { + "type": "focus-next" + } + ] + }, + "expected": { + "focused": "text", + "armed": null + } +} diff --git a/conformance/profiles/hit-bottom.json b/conformance/profiles/hit-bottom.json new file mode 100644 index 0000000..5080b5a --- /dev/null +++ b/conformance/profiles/hit-bottom.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-HIT-BOTTOM", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01", + "I02" + ], + "description": "hit bottom", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 5, + 10 + ] + }, + "expected": { + "target": null + } +} diff --git a/conformance/profiles/hit-interior.json b/conformance/profiles/hit-interior.json new file mode 100644 index 0000000..8751384 --- /dev/null +++ b/conformance/profiles/hit-interior.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-HIT-INTERIOR", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01", + "I02" + ], + "description": "hit interior", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 9, + 9 + ] + }, + "expected": { + "target": "button" + } +} diff --git a/conformance/profiles/hit-negative.json b/conformance/profiles/hit-negative.json new file mode 100644 index 0000000..b12dd5d --- /dev/null +++ b/conformance/profiles/hit-negative.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-HIT-NEGATIVE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01", + "I02" + ], + "description": "hit negative", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + -1, + 0 + ] + }, + "expected": { + "target": null + } +} diff --git a/conformance/profiles/hit-origin.json b/conformance/profiles/hit-origin.json new file mode 100644 index 0000000..6aab0fb --- /dev/null +++ b/conformance/profiles/hit-origin.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-HIT-ORIGIN", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01", + "I02" + ], + "description": "hit origin", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 0, + 0 + ] + }, + "expected": { + "target": "button" + } +} diff --git a/conformance/profiles/hit-right.json b/conformance/profiles/hit-right.json new file mode 100644 index 0000000..036720f --- /dev/null +++ b/conformance/profiles/hit-right.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-HIT-RIGHT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01", + "I02" + ], + "description": "hit right", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 10, + 5 + ] + }, + "expected": { + "target": null + } +} diff --git a/conformance/profiles/hit-surface.json b/conformance/profiles/hit-surface.json new file mode 100644 index 0000000..0afef76 --- /dev/null +++ b/conformance/profiles/hit-surface.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-HIT-SURFACE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01", + "I02" + ], + "description": "hit surface", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 20, + 0 + ] + }, + "expected": { + "target": null + } +} diff --git a/conformance/profiles/mapping-duplicate.json b/conformance/profiles/mapping-duplicate.json new file mode 100644 index 0000000..2e6ec60 --- /dev/null +++ b/conformance/profiles/mapping-duplicate.json @@ -0,0 +1,46 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-DUPLICATE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping duplicate", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + }, + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/mapping-missing.json b/conformance/profiles/mapping-missing.json new file mode 100644 index 0000000..305c032 --- /dev/null +++ b/conformance/profiles/mapping-missing.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-MISSING", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping missing", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/mapping-screen.json b/conformance/profiles/mapping-screen.json new file mode 100644 index 0000000..7d2e2cb --- /dev/null +++ b/conformance/profiles/mapping-screen.json @@ -0,0 +1,39 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-SCREEN", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping screen", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "other", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/mapping-snapshot.json b/conformance/profiles/mapping-snapshot.json new file mode 100644 index 0000000..743b6f1 --- /dev/null +++ b/conformance/profiles/mapping-snapshot.json @@ -0,0 +1,39 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-SNAPSHOT", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping snapshot", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s2", + "value": "ab" + } + ], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/mapping-source.json b/conformance/profiles/mapping-source.json new file mode 100644 index 0000000..b043538 --- /dev/null +++ b/conformance/profiles/mapping-source.json @@ -0,0 +1,39 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-SOURCE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping source", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "wrong", + "snapshot": "s1", + "value": "ab" + } + ], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/mapping-type.json b/conformance/profiles/mapping-type.json new file mode 100644 index 0000000..65dcb76 --- /dev/null +++ b/conformance/profiles/mapping-type.json @@ -0,0 +1,39 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-TYPE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping type", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": 42 + } + ], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/mapping-unknown.json b/conformance/profiles/mapping-unknown.json new file mode 100644 index 0000000..c78871d --- /dev/null +++ b/conformance/profiles/mapping-unknown.json @@ -0,0 +1,39 @@ +{ + "id": "MEDUI-PROFILE-CASE-MAPPING-UNKNOWN", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "mapping unknown", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "unknown", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ], + "glyphs": [ + "a", + "b" + ], + "maxLength": 4 + }, + "expected": { + "valid": false, + "publishedSnapshot": null + } +} diff --git a/conformance/profiles/normalize-fraction.json b/conformance/profiles/normalize-fraction.json new file mode 100644 index 0000000..a7e06e0 --- /dev/null +++ b/conformance/profiles/normalize-fraction.json @@ -0,0 +1,34 @@ +{ + "id": "MEDUI-PROFILE-CASE-NORMALIZE-FRACTION", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01" + ], + "description": "normalize fraction", + "inputs": { + "operation": "normalize", + "surface": [ + 20, + 20 + ], + "devicePoint": [ + 3, + 3 + ], + "origin": [ + 0, + 0 + ], + "scaleNumerator": 2, + "scaleDenominator": 1 + }, + "expected": { + "point": [ + 1, + 1 + ] + } +} diff --git a/conformance/profiles/normalize-invalid-scaledenominator.json b/conformance/profiles/normalize-invalid-scaledenominator.json new file mode 100644 index 0000000..2d6ddde --- /dev/null +++ b/conformance/profiles/normalize-invalid-scaledenominator.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-NORMALIZE-INVALID-SCALEDENOMINATOR", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01" + ], + "description": "normalize invalid scaledenominator", + "inputs": { + "operation": "normalize", + "surface": [ + 20, + 20 + ], + "devicePoint": [ + 3, + 3 + ], + "origin": [ + 0, + 0 + ], + "scaleNumerator": 2, + "scaleDenominator": -1 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/normalize-invalid-scalenumerator.json b/conformance/profiles/normalize-invalid-scalenumerator.json new file mode 100644 index 0000000..605313f --- /dev/null +++ b/conformance/profiles/normalize-invalid-scalenumerator.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-NORMALIZE-INVALID-SCALENUMERATOR", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01" + ], + "description": "normalize invalid scalenumerator", + "inputs": { + "operation": "normalize", + "surface": [ + 20, + 20 + ], + "devicePoint": [ + 3, + 3 + ], + "origin": [ + 0, + 0 + ], + "scaleNumerator": 0, + "scaleDenominator": 1 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/normalize-negative-floor.json b/conformance/profiles/normalize-negative-floor.json new file mode 100644 index 0000000..eb92af0 --- /dev/null +++ b/conformance/profiles/normalize-negative-floor.json @@ -0,0 +1,34 @@ +{ + "id": "MEDUI-PROFILE-CASE-NORMALIZE-NEGATIVE-FLOOR", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01" + ], + "description": "normalize negative floor", + "inputs": { + "operation": "normalize", + "surface": [ + 20, + 20 + ], + "devicePoint": [ + -1, + -1 + ], + "origin": [ + 0, + 0 + ], + "scaleNumerator": 2, + "scaleDenominator": 1 + }, + "expected": { + "point": [ + -1, + -1 + ] + } +} diff --git a/conformance/profiles/normalize-origin.json b/conformance/profiles/normalize-origin.json new file mode 100644 index 0000000..799392f --- /dev/null +++ b/conformance/profiles/normalize-origin.json @@ -0,0 +1,34 @@ +{ + "id": "MEDUI-PROFILE-CASE-NORMALIZE-ORIGIN", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01" + ], + "description": "normalize origin", + "inputs": { + "operation": "normalize", + "surface": [ + 20, + 20 + ], + "devicePoint": [ + 13, + 13 + ], + "origin": [ + 10, + 10 + ], + "scaleNumerator": 3, + "scaleDenominator": 2 + }, + "expected": { + "point": [ + 2, + 2 + ] + } +} diff --git a/conformance/profiles/numeric-digit-bound.json b/conformance/profiles/numeric-digit-bound.json new file mode 100644 index 0000000..ce284c3 --- /dev/null +++ b/conformance/profiles/numeric-digit-bound.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-DIGIT-BOUND", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric digit bound", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "1234567", + "scale": 0, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/numeric-float.json b/conformance/profiles/numeric-float.json new file mode 100644 index 0000000..99dbb5a --- /dev/null +++ b/conformance/profiles/numeric-float.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-FLOAT", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B02" + ], + "description": "numeric float", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "1.5", + "scale": 2, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/numeric-fraction.json b/conformance/profiles/numeric-fraction.json new file mode 100644 index 0000000..454ba37 --- /dev/null +++ b/conformance/profiles/numeric-fraction.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-FRACTION", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric fraction", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "-5", + "scale": 2, + "prefix": "", + "suffix": " V" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": true, + "text": "-0.05 V" + } +} diff --git a/conformance/profiles/numeric-integer.json b/conformance/profiles/numeric-integer.json new file mode 100644 index 0000000..26345cd --- /dev/null +++ b/conformance/profiles/numeric-integer.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-INTEGER", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric integer", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "123", + "scale": 0, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": true, + "text": "123" + } +} diff --git a/conformance/profiles/numeric-leading-zero.json b/conformance/profiles/numeric-leading-zero.json new file mode 100644 index 0000000..7585d95 --- /dev/null +++ b/conformance/profiles/numeric-leading-zero.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-LEADING-ZERO", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B02" + ], + "description": "numeric leading zero", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "01", + "scale": 2, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/numeric-negative-scale.json b/conformance/profiles/numeric-negative-scale.json new file mode 100644 index 0000000..59bc6f1 --- /dev/null +++ b/conformance/profiles/numeric-negative-scale.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-NEGATIVE-SCALE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric negative scale", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "1", + "scale": -1, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/numeric-negative-zero.json b/conformance/profiles/numeric-negative-zero.json new file mode 100644 index 0000000..f9e04ed --- /dev/null +++ b/conformance/profiles/numeric-negative-zero.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-NEGATIVE-ZERO", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B02" + ], + "description": "numeric negative zero", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "-0", + "scale": 2, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/numeric-padding.json b/conformance/profiles/numeric-padding.json new file mode 100644 index 0000000..7f6f018 --- /dev/null +++ b/conformance/profiles/numeric-padding.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-PADDING", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric padding", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "0", + "scale": 3, + "prefix": "[", + "suffix": "]" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": true, + "text": "[0.000]" + } +} diff --git a/conformance/profiles/numeric-scale-bound.json b/conformance/profiles/numeric-scale-bound.json new file mode 100644 index 0000000..c91127a --- /dev/null +++ b/conformance/profiles/numeric-scale-bound.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-SCALE-BOUND", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric scale bound", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "1", + "scale": 4, + "prefix": "", + "suffix": "" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/numeric-template.json b/conformance/profiles/numeric-template.json new file mode 100644 index 0000000..7c2ddd5 --- /dev/null +++ b/conformance/profiles/numeric-template.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-TEMPLATE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "numeric template", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "123", + "scale": 2, + "prefix": "dose: ", + "suffix": " mg" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": true, + "text": "dose: 1.23 mg" + } +} diff --git a/conformance/profiles/occlusion-clipped.json b/conformance/profiles/occlusion-clipped.json new file mode 100644 index 0000000..43799b0 --- /dev/null +++ b/conformance/profiles/occlusion-clipped.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-OCCLUSION-CLIPPED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I02" + ], + "description": "occlusion clipped", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + }, + { + "id": "top", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 5, + 5, + 5, + 5 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 2, + 2 + ] + }, + "expected": { + "target": "button" + } +} diff --git a/conformance/profiles/occlusion-control.json b/conformance/profiles/occlusion-control.json new file mode 100644 index 0000000..f559f79 --- /dev/null +++ b/conformance/profiles/occlusion-control.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-OCCLUSION-CONTROL", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I02" + ], + "description": "occlusion control", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + }, + { + "id": "top", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 2, + 2 + ] + }, + "expected": { + "target": "top" + } +} diff --git a/conformance/profiles/occlusion-decoration.json b/conformance/profiles/occlusion-decoration.json new file mode 100644 index 0000000..8c34023 --- /dev/null +++ b/conformance/profiles/occlusion-decoration.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-OCCLUSION-DECORATION", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I02" + ], + "description": "occlusion decoration", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + }, + { + "id": "label", + "component": "Label", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "point": [ + 2, + 2 + ] + }, + "expected": { + "target": null + } +} diff --git a/conformance/profiles/occlusion-disabled.json b/conformance/profiles/occlusion-disabled.json new file mode 100644 index 0000000..185629a --- /dev/null +++ b/conformance/profiles/occlusion-disabled.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-OCCLUSION-DISABLED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I02" + ], + "description": "occlusion disabled", + "inputs": { + "operation": "hit", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + }, + { + "id": "disabled", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": false, + "source": "confirm" + } + ], + "point": [ + 2, + 2 + ] + }, + "expected": { + "target": null + } +} diff --git a/conformance/profiles/pixel-different.json b/conformance/profiles/pixel-different.json new file mode 100644 index 0000000..908287a --- /dev/null +++ b/conformance/profiles/pixel-different.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-DIFFERENT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel different", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 1, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-equal.json b/conformance/profiles/pixel-equal.json new file mode 100644 index 0000000..3857631 --- /dev/null +++ b/conformance/profiles/pixel-equal.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-EQUAL", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel equal", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "pass" + } +} diff --git a/conformance/profiles/pixel-identity-assets.json b/conformance/profiles/pixel-identity-assets.json new file mode 100644 index 0000000..f3167ed --- /dev/null +++ b/conformance/profiles/pixel-identity-assets.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-ASSETS", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity assets", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "0000000000000000000000000000000000000000000000000000000000000000", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-backend.json b/conformance/profiles/pixel-identity-backend.json new file mode 100644 index 0000000..28626d9 --- /dev/null +++ b/conformance/profiles/pixel-identity-backend.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-BACKEND", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity backend", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "other", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-declaration.json b/conformance/profiles/pixel-identity-declaration.json new file mode 100644 index 0000000..d9d5647 --- /dev/null +++ b/conformance/profiles/pixel-identity-declaration.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-DECLARATION", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity declaration", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "0000000000000000000000000000000000000000000000000000000000000000", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-font.json b/conformance/profiles/pixel-identity-font.json new file mode 100644 index 0000000..a908926 --- /dev/null +++ b/conformance/profiles/pixel-identity-font.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-FONT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity font", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "0000000000000000000000000000000000000000000000000000000000000000", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-frame.json b/conformance/profiles/pixel-identity-frame.json new file mode 100644 index 0000000..80f9da8 --- /dev/null +++ b/conformance/profiles/pixel-identity-frame.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-FRAME", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity frame", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 1 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-locale.json b/conformance/profiles/pixel-identity-locale.json new file mode 100644 index 0000000..b8b68f7 --- /dev/null +++ b/conformance/profiles/pixel-identity-locale.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-LOCALE", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity locale", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": "other", + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-scenario.json b/conformance/profiles/pixel-identity-scenario.json new file mode 100644 index 0000000..31a9b83 --- /dev/null +++ b/conformance/profiles/pixel-identity-scenario.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-SCENARIO", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity scenario", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "0000000000000000000000000000000000000000000000000000000000000000", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-surface.json b/conformance/profiles/pixel-identity-surface.json new file mode 100644 index 0000000..1930411 --- /dev/null +++ b/conformance/profiles/pixel-identity-surface.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-SURFACE", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity surface", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 10, + 10 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/pixel-identity-theme.json b/conformance/profiles/pixel-identity-theme.json new file mode 100644 index 0000000..b314377 --- /dev/null +++ b/conformance/profiles/pixel-identity-theme.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-THEME", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P03" + ], + "description": "pixel identity theme", + "inputs": { + "operation": "pixels", + "captureIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "baselineIdentity": { + "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "theme": "0000000000000000000000000000000000000000000000000000000000000000", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 1, + 1 + ], + "locale": null, + "scenario": "static", + "frame": 0 + }, + "pixels": [ + 0, + 0, + 0, + 255 + ], + "baselinePixels": [ + 0, + 0, + 0, + 255 + ] + }, + "expected": { + "outcome": "fail" + } +} diff --git a/conformance/profiles/presentation-button.json b/conformance/profiles/presentation-button.json new file mode 100644 index 0000000..f260256 --- /dev/null +++ b/conformance/profiles/presentation-button.json @@ -0,0 +1,361 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-BUTTON", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation button", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Button", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-caret.json b/conformance/profiles/presentation-caret.json new file mode 100644 index 0000000..4746f06 --- /dev/null +++ b/conformance/profiles/presentation-caret.json @@ -0,0 +1,365 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-CARET", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P02" + ], + "description": "presentation caret", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "TextInput", + "rect": [ + 0, + 0, + 10, + 10 + ], + "pressed": false, + "focused": true + } + }, + "expected": { + "valid": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } +} diff --git a/conformance/profiles/presentation-clip.json b/conformance/profiles/presentation-clip.json new file mode 100644 index 0000000..5ece8f1 --- /dev/null +++ b/conformance/profiles/presentation-clip.json @@ -0,0 +1,355 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-CLIP", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P02" + ], + "description": "presentation clip", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Row", + "rect": [ + 18, + 18, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 18, + 18, + 2, + 2 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-clock.json b/conformance/profiles/presentation-clock.json new file mode 100644 index 0000000..e8203c8 --- /dev/null +++ b/conformance/profiles/presentation-clock.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-CLOCK", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation clock", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Clock", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": null, + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-criticalbutton.json b/conformance/profiles/presentation-criticalbutton.json new file mode 100644 index 0000000..ad7043e --- /dev/null +++ b/conformance/profiles/presentation-criticalbutton.json @@ -0,0 +1,361 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-CRITICALBUTTON", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation criticalbutton", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "CriticalButton", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-image.json b/conformance/profiles/presentation-image.json new file mode 100644 index 0000000..7cac773 --- /dev/null +++ b/conformance/profiles/presentation-image.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-IMAGE", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation image", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Image", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-invalid-duplicate.json b/conformance/profiles/presentation-invalid-duplicate.json new file mode 100644 index 0000000..726c32d --- /dev/null +++ b/conformance/profiles/presentation-invalid-duplicate.json @@ -0,0 +1,349 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-INVALID-DUPLICATE", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01" + ], + "description": "presentation invalid duplicate", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + }, + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } + ] + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-invalid-identity.json b/conformance/profiles/presentation-invalid-identity.json new file mode 100644 index 0000000..4e34758 --- /dev/null +++ b/conformance/profiles/presentation-invalid-identity.json @@ -0,0 +1,328 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-INVALID-IDENTITY", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01" + ], + "description": "presentation invalid identity", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-invalid-missing-component.json b/conformance/profiles/presentation-invalid-missing-component.json new file mode 100644 index 0000000..abc3797 --- /dev/null +++ b/conformance/profiles/presentation-invalid-missing-component.json @@ -0,0 +1,309 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-INVALID-MISSING-COMPONENT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01" + ], + "description": "presentation invalid missing component", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-invalid-negative-extent.json b/conformance/profiles/presentation-invalid-negative-extent.json new file mode 100644 index 0000000..36e9630 --- /dev/null +++ b/conformance/profiles/presentation-invalid-negative-extent.json @@ -0,0 +1,329 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-INVALID-NEGATIVE-EXTENT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01" + ], + "description": "presentation invalid negative extent", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + -1, + 1 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-label.json b/conformance/profiles/presentation-label.json new file mode 100644 index 0000000..69a9706 --- /dev/null +++ b/conformance/profiles/presentation-label.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-LABEL", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation label", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Label", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": null, + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-missing-state.json b/conformance/profiles/presentation-missing-state.json new file mode 100644 index 0000000..f655d04 --- /dev/null +++ b/conformance/profiles/presentation-missing-state.json @@ -0,0 +1,340 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-MISSING-STATE", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01" + ], + "description": "presentation missing state", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "pressed": true, + "focused": true + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-numericdisplay.json b/conformance/profiles/presentation-numericdisplay.json new file mode 100644 index 0000000..6b9a8fa --- /dev/null +++ b/conformance/profiles/presentation-numericdisplay.json @@ -0,0 +1,361 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-NUMERICDISPLAY", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation numericdisplay", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "NumericDisplay", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-pressed.json b/conformance/profiles/presentation-pressed.json new file mode 100644 index 0000000..1efac75 --- /dev/null +++ b/conformance/profiles/presentation-pressed.json @@ -0,0 +1,360 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-PRESSED", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P02" + ], + "description": "presentation pressed", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "pressed": true, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-row.json b/conformance/profiles/presentation-row.json new file mode 100644 index 0000000..b5eb4ec --- /dev/null +++ b/conformance/profiles/presentation-row.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-ROW", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation row", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Row", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-signaltrace.json b/conformance/profiles/presentation-signaltrace.json new file mode 100644 index 0000000..f7514b1 --- /dev/null +++ b/conformance/profiles/presentation-signaltrace.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-SIGNALTRACE", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation signaltrace", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "SignalTrace", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-statusindicator.json b/conformance/profiles/presentation-statusindicator.json new file mode 100644 index 0000000..acf2207 --- /dev/null +++ b/conformance/profiles/presentation-statusindicator.json @@ -0,0 +1,361 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-STATUSINDICATOR", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation statusindicator", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "StatusIndicator", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-textinput.json b/conformance/profiles/presentation-textinput.json new file mode 100644 index 0000000..c965a82 --- /dev/null +++ b/conformance/profiles/presentation-textinput.json @@ -0,0 +1,361 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-TEXTINPUT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation textinput", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "TextInput", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": [ + 4, + 6, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-unclipped.json b/conformance/profiles/presentation-unclipped.json new file mode 100644 index 0000000..89e9dbb --- /dev/null +++ b/conformance/profiles/presentation-unclipped.json @@ -0,0 +1,355 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-UNCLIPPED", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P02" + ], + "description": "presentation unclipped", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": false + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Row", + "rect": [ + 18, + 18, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 18, + 18, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": false + } +} diff --git a/conformance/profiles/presentation-vulkanviewport.json b/conformance/profiles/presentation-vulkanviewport.json new file mode 100644 index 0000000..2bbf439 --- /dev/null +++ b/conformance/profiles/presentation-vulkanviewport.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-VULKANVIEWPORT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation vulkanviewport", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "VulkanViewport", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/presentation-zero-extent.json b/conformance/profiles/presentation-zero-extent.json new file mode 100644 index 0000000..724c7a5 --- /dev/null +++ b/conformance/profiles/presentation-zero-extent.json @@ -0,0 +1,356 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-ZERO-EXTENT", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "presentation zero extent", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 0, + 0 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Row", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": true, + "face": [ + 3, + 4, + 0, + 0 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + } +} diff --git a/conformance/profiles/queue-full.json b/conformance/profiles/queue-full.json new file mode 100644 index 0000000..c38c24d --- /dev/null +++ b/conformance/profiles/queue-full.json @@ -0,0 +1,69 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-FULL", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03", + "I04" + ], + "description": "queue full", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 2, + "droppedLimit": 3, + "initialDropped": 0, + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [ + { + "kind": "source", + "node": "button", + "source": "confirm" + } + ], + "armed": null, + "dropped": 0 + } +} diff --git a/conformance/profiles/queue-invalid-capacity.json b/conformance/profiles/queue-invalid-capacity.json new file mode 100644 index 0000000..a3122ce --- /dev/null +++ b/conformance/profiles/queue-invalid-capacity.json @@ -0,0 +1,61 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-INVALID-CAPACITY", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03", + "I04" + ], + "description": "queue invalid capacity", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 0, + "droppedLimit": 3, + "initialDropped": 0, + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/queue-invalid.json b/conformance/profiles/queue-invalid.json new file mode 100644 index 0000000..ae66316 --- /dev/null +++ b/conformance/profiles/queue-invalid.json @@ -0,0 +1,60 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-INVALID", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I04" + ], + "description": "queue invalid", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 1, + "droppedLimit": 3, + "events": [ + { + "type": "unknown" + }, + { + "type": "press", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "rejectedEvents": [ + 0 + ], + "dropped": 0, + "armed": "button", + "outputs": [] + } +} diff --git a/conformance/profiles/queue-overflow.json b/conformance/profiles/queue-overflow.json new file mode 100644 index 0000000..02bc828 --- /dev/null +++ b/conformance/profiles/queue-overflow.json @@ -0,0 +1,63 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-OVERFLOW", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03", + "I04" + ], + "description": "queue overflow", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 1, + "droppedLimit": 3, + "initialDropped": 0, + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null, + "dropped": 1 + } +} diff --git a/conformance/profiles/queue-queued-activation-overflow.json b/conformance/profiles/queue-queued-activation-overflow.json new file mode 100644 index 0000000..84a04e4 --- /dev/null +++ b/conformance/profiles/queue-queued-activation-overflow.json @@ -0,0 +1,70 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-QUEUED-ACTIVATION-OVERFLOW", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03", + "I04" + ], + "description": "queue queued activation overflow", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 2, + "droppedLimit": 3, + "initialDropped": 0, + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + }, + { + "type": "press", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null, + "dropped": 1 + } +} diff --git a/conformance/profiles/queue-reset.json b/conformance/profiles/queue-reset.json new file mode 100644 index 0000000..e28e3ef --- /dev/null +++ b/conformance/profiles/queue-reset.json @@ -0,0 +1,96 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-RESET", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03", + "I04" + ], + "description": "queue reset", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 2, + "droppedLimit": 3, + "batches": [ + [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + }, + { + "type": "press", + "point": [ + 2, + 2 + ] + } + ], + [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + ] + }, + "expected": { + "batchOutputs": [ + [], + [ + { + "kind": "source", + "node": "button", + "source": "confirm" + } + ] + ], + "armed": null, + "dropped": 1 + } +} diff --git a/conformance/profiles/queue-saturate.json b/conformance/profiles/queue-saturate.json new file mode 100644 index 0000000..9921f6e --- /dev/null +++ b/conformance/profiles/queue-saturate.json @@ -0,0 +1,77 @@ +{ + "id": "MEDUI-PROFILE-CASE-QUEUE-SATURATE", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I03", + "I04" + ], + "description": "queue saturate", + "inputs": { + "operation": "events", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "capacity": 1, + "droppedLimit": 2, + "initialDropped": 1, + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ] + }, + "expected": { + "outputs": [], + "armed": null, + "dropped": 2 + } +} diff --git a/conformance/profiles/snapshot-boundary.json b/conformance/profiles/snapshot-boundary.json new file mode 100644 index 0000000..44e1197 --- /dev/null +++ b/conformance/profiles/snapshot-boundary.json @@ -0,0 +1,83 @@ +{ + "id": "MEDUI-PROFILE-CASE-SNAPSHOT-BOUNDARY", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I05" + ], + "description": "snapshot boundary", + "inputs": { + "operation": "boundary", + "surface": [ + 20, + 20 + ], + "nodes": [ + { + "id": "button", + "component": "Button", + "rect": [ + 0, + 0, + 10, + 10 + ], + "clip": [ + 0, + 0, + 20, + 20 + ], + "eligible": true, + "source": "confirm" + } + ], + "events": [ + { + "type": "press", + "point": [ + 2, + 2 + ] + }, + { + "type": "release", + "point": [ + 2, + 2 + ] + } + ], + "snapshot": { + "id": "s1", + "frame": 1, + "time": [ + 2026, + 9, + 7, + 12, + 34, + 56 + ] + } + }, + "expected": { + "order": [ + "consume", + "update", + "bind:s1", + "render:1", + "capture:1" + ], + "outputs": [ + { + "kind": "source", + "node": "button", + "source": "confirm" + } + ], + "timeText": "12:34:56" + } +} diff --git a/conformance/profiles/snapshot-missing.json b/conformance/profiles/snapshot-missing.json new file mode 100644 index 0000000..1fcda4c --- /dev/null +++ b/conformance/profiles/snapshot-missing.json @@ -0,0 +1,23 @@ +{ + "id": "MEDUI-PROFILE-CASE-SNAPSHOT-MISSING", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I05" + ], + "description": "snapshot missing", + "inputs": { + "operation": "boundary", + "surface": [ + 20, + 20 + ], + "snapshot": null + }, + "expected": { + "binding": "fail", + "capture": null + } +} diff --git a/conformance/profiles/snapshot-mixed.json b/conformance/profiles/snapshot-mixed.json new file mode 100644 index 0000000..75f6008 --- /dev/null +++ b/conformance/profiles/snapshot-mixed.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-SNAPSHOT-MIXED", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I05" + ], + "description": "snapshot mixed", + "inputs": { + "operation": "boundary", + "surface": [ + 20, + 20 + ], + "snapshot": { + "id": "s1", + "frame": 1, + "values": [ + { + "snapshot": "s2" + } + ] + } + }, + "expected": { + "binding": "fail", + "capture": null + } +} diff --git a/conformance/profiles/static-button.json b/conformance/profiles/static-button.json new file mode 100644 index 0000000..ce3dd4c --- /dev/null +++ b/conformance/profiles/static-button.json @@ -0,0 +1,25 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-BUTTON", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static button", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Button", + "declaredSource": "value", + "value": null, + "entries": [] + }, + "expected": { + "valid": true + } +} diff --git a/conformance/profiles/static-criticalbutton.json b/conformance/profiles/static-criticalbutton.json new file mode 100644 index 0000000..df6c464 --- /dev/null +++ b/conformance/profiles/static-criticalbutton.json @@ -0,0 +1,25 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-CRITICALBUTTON", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static criticalbutton", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "CriticalButton", + "declaredSource": "value", + "value": null, + "entries": [] + }, + "expected": { + "valid": true + } +} diff --git a/conformance/profiles/static-extra-button.json b/conformance/profiles/static-extra-button.json new file mode 100644 index 0000000..18ea2b6 --- /dev/null +++ b/conformance/profiles/static-extra-button.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-EXTRA-BUTTON", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static extra button", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Button", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/static-extra-criticalbutton.json b/conformance/profiles/static-extra-criticalbutton.json new file mode 100644 index 0000000..aab46f2 --- /dev/null +++ b/conformance/profiles/static-extra-criticalbutton.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-EXTRA-CRITICALBUTTON", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static extra criticalbutton", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "CriticalButton", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/static-extra-image.json b/conformance/profiles/static-extra-image.json new file mode 100644 index 0000000..99f762d --- /dev/null +++ b/conformance/profiles/static-extra-image.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-EXTRA-IMAGE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static extra image", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Image", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/static-extra-label.json b/conformance/profiles/static-extra-label.json new file mode 100644 index 0000000..18cddac --- /dev/null +++ b/conformance/profiles/static-extra-label.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-EXTRA-LABEL", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static extra label", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Label", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/static-extra-row.json b/conformance/profiles/static-extra-row.json new file mode 100644 index 0000000..343be1d --- /dev/null +++ b/conformance/profiles/static-extra-row.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-EXTRA-ROW", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static extra row", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Row", + "declaredSource": "value", + "value": null, + "entries": [ + { + "screen": "screen", + "node": "node", + "source": "value", + "snapshot": "s1", + "value": "ab" + } + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/static-image.json b/conformance/profiles/static-image.json new file mode 100644 index 0000000..6712d37 --- /dev/null +++ b/conformance/profiles/static-image.json @@ -0,0 +1,25 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-IMAGE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static image", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Image", + "declaredSource": "value", + "value": null, + "entries": [] + }, + "expected": { + "valid": true + } +} diff --git a/conformance/profiles/static-label.json b/conformance/profiles/static-label.json new file mode 100644 index 0000000..034115e --- /dev/null +++ b/conformance/profiles/static-label.json @@ -0,0 +1,25 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-LABEL", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static label", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Label", + "declaredSource": "value", + "value": null, + "entries": [] + }, + "expected": { + "valid": true + } +} diff --git a/conformance/profiles/static-row.json b/conformance/profiles/static-row.json new file mode 100644 index 0000000..9e83b5e --- /dev/null +++ b/conformance/profiles/static-row.json @@ -0,0 +1,25 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATIC-ROW", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "static row", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "Row", + "declaredSource": "value", + "value": null, + "entries": [] + }, + "expected": { + "valid": true + } +} diff --git a/conformance/profiles/status-color-count.json b/conformance/profiles/status-color-count.json new file mode 100644 index 0000000..82a69c1 --- /dev/null +++ b/conformance/profiles/status-color-count.json @@ -0,0 +1,31 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATUS-COLOR-COUNT", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B02" + ], + "description": "status color count", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "StatusIndicator", + "declaredSource": "value", + "value": 0, + "states": [ + "first", + "second" + ], + "colors": [ + "red" + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/status-negative-index.json b/conformance/profiles/status-negative-index.json new file mode 100644 index 0000000..8520271 --- /dev/null +++ b/conformance/profiles/status-negative-index.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATUS-NEGATIVE-INDEX", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "status negative index", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "StatusIndicator", + "declaredSource": "value", + "value": -1, + "states": [ + "first", + "second" + ], + "colors": [ + "red", + "green" + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/status-order.json b/conformance/profiles/status-order.json new file mode 100644 index 0000000..347ec08 --- /dev/null +++ b/conformance/profiles/status-order.json @@ -0,0 +1,35 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATUS-ORDER", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "status order", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "StatusIndicator", + "declaredSource": "value", + "value": 1, + "states": [ + "first", + "second" + ], + "colors": [ + "red", + "green" + ] + }, + "expected": { + "valid": true, + "state": "second", + "color": "green" + } +} diff --git a/conformance/profiles/status-range.json b/conformance/profiles/status-range.json new file mode 100644 index 0000000..8735ce6 --- /dev/null +++ b/conformance/profiles/status-range.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATUS-RANGE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "status range", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "StatusIndicator", + "declaredSource": "value", + "value": 2, + "states": [ + "first", + "second" + ], + "colors": [ + "red", + "green" + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/status-type.json b/conformance/profiles/status-type.json new file mode 100644 index 0000000..e6138b5 --- /dev/null +++ b/conformance/profiles/status-type.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-STATUS-TYPE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "status type", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "StatusIndicator", + "declaredSource": "value", + "value": "1", + "states": [ + "first", + "second" + ], + "colors": [ + "red", + "green" + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/text-invalid-glyph.json b/conformance/profiles/text-invalid-glyph.json new file mode 100644 index 0000000..81c429b --- /dev/null +++ b/conformance/profiles/text-invalid-glyph.json @@ -0,0 +1,29 @@ +{ + "id": "MEDUI-PROFILE-CASE-TEXT-INVALID-GLYPH", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "text invalid glyph", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": "z", + "glyphs": [ + "a", + "\ud83d\ude00" + ], + "maxLength": 2 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/text-too-long.json b/conformance/profiles/text-too-long.json new file mode 100644 index 0000000..d8a2d29 --- /dev/null +++ b/conformance/profiles/text-too-long.json @@ -0,0 +1,29 @@ +{ + "id": "MEDUI-PROFILE-CASE-TEXT-TOO-LONG", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "text too long", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": "a\ud83d\ude00a", + "glyphs": [ + "a", + "\ud83d\ude00" + ], + "maxLength": 2 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/text-value.json b/conformance/profiles/text-value.json new file mode 100644 index 0000000..92c29c5 --- /dev/null +++ b/conformance/profiles/text-value.json @@ -0,0 +1,30 @@ +{ + "id": "MEDUI-PROFILE-CASE-TEXT-VALUE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01" + ], + "description": "text value", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "TextInput", + "declaredSource": "value", + "value": "a\ud83d\ude00", + "glyphs": [ + "a", + "\ud83d\ude00" + ], + "maxLength": 2 + }, + "expected": { + "valid": true, + "text": "a\ud83d\ude00" + } +} diff --git a/conformance/profiles/trace-capacity.json b/conformance/profiles/trace-capacity.json new file mode 100644 index 0000000..7f51308 --- /dev/null +++ b/conformance/profiles/trace-capacity.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-TRACE-CAPACITY", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B03" + ], + "description": "trace capacity", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "SignalTrace", + "declaredSource": "value", + "value": [ + 0, + 1, + 2, + 3 + ], + "capacity": 3, + "minimum": -2, + "maximum": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/trace-empty.json b/conformance/profiles/trace-empty.json new file mode 100644 index 0000000..47c191f --- /dev/null +++ b/conformance/profiles/trace-empty.json @@ -0,0 +1,29 @@ +{ + "id": "MEDUI-PROFILE-CASE-TRACE-EMPTY", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B03" + ], + "description": "trace empty", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "SignalTrace", + "declaredSource": "value", + "value": [], + "capacity": 3, + "minimum": -2, + "maximum": 3 + }, + "expected": { + "valid": true, + "samples": [] + } +} diff --git a/conformance/profiles/trace-invalid-capacity.json b/conformance/profiles/trace-invalid-capacity.json new file mode 100644 index 0000000..06fe5af --- /dev/null +++ b/conformance/profiles/trace-invalid-capacity.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-TRACE-INVALID-CAPACITY", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B03" + ], + "description": "trace invalid capacity", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "SignalTrace", + "declaredSource": "value", + "value": [ + 2, + -1, + 3 + ], + "capacity": 0, + "minimum": -2, + "maximum": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/trace-invalid-range.json b/conformance/profiles/trace-invalid-range.json new file mode 100644 index 0000000..93abecc --- /dev/null +++ b/conformance/profiles/trace-invalid-range.json @@ -0,0 +1,32 @@ +{ + "id": "MEDUI-PROFILE-CASE-TRACE-INVALID-RANGE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B03" + ], + "description": "trace invalid range", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "SignalTrace", + "declaredSource": "value", + "value": [ + 2, + -1, + 3 + ], + "capacity": 3, + "minimum": 4, + "maximum": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/trace-order.json b/conformance/profiles/trace-order.json new file mode 100644 index 0000000..9474743 --- /dev/null +++ b/conformance/profiles/trace-order.json @@ -0,0 +1,37 @@ +{ + "id": "MEDUI-PROFILE-CASE-TRACE-ORDER", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B03" + ], + "description": "trace order", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "SignalTrace", + "declaredSource": "value", + "value": [ + 2, + -1, + 3 + ], + "capacity": 3, + "minimum": -2, + "maximum": 3 + }, + "expected": { + "valid": true, + "samples": [ + 2, + -1, + 3 + ] + } +} diff --git a/conformance/profiles/trace-range.json b/conformance/profiles/trace-range.json new file mode 100644 index 0000000..9accacb --- /dev/null +++ b/conformance/profiles/trace-range.json @@ -0,0 +1,30 @@ +{ + "id": "MEDUI-PROFILE-CASE-TRACE-RANGE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B03" + ], + "description": "trace range", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "SignalTrace", + "declaredSource": "value", + "value": [ + 4 + ], + "capacity": 3, + "minimum": -2, + "maximum": 3 + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-dimensions.json b/conformance/profiles/viewport-dimensions.json new file mode 100644 index 0000000..b6c2ef3 --- /dev/null +++ b/conformance/profiles/viewport-dimensions.json @@ -0,0 +1,44 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-DIMENSIONS", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport dimensions", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 2, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 0, + 0, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-excess-pixels.json b/conformance/profiles/viewport-excess-pixels.json new file mode 100644 index 0000000..8d3ca18 --- /dev/null +++ b/conformance/profiles/viewport-excess-pixels.json @@ -0,0 +1,48 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-EXCESS-PIXELS", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport excess pixels", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 0, + 0, + 0, + 255, + 0, + 0, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-format.json b/conformance/profiles/viewport-format.json new file mode 100644 index 0000000..ffa2485 --- /dev/null +++ b/conformance/profiles/viewport-format.json @@ -0,0 +1,44 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-FORMAT", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport format", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "BGRA8", + "rgba8": [ + 0, + 0, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-negative-channel.json b/conformance/profiles/viewport-negative-channel.json new file mode 100644 index 0000000..942d27c --- /dev/null +++ b/conformance/profiles/viewport-negative-channel.json @@ -0,0 +1,44 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-NEGATIVE-CHANNEL", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport negative channel", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + -1, + 0, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-opaque.json b/conformance/profiles/viewport-opaque.json new file mode 100644 index 0000000..50edb0d --- /dev/null +++ b/conformance/profiles/viewport-opaque.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-OPAQUE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport opaque", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 255, + 0, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 255, + 0, + 0, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-range.json b/conformance/profiles/viewport-range.json new file mode 100644 index 0000000..f20bc4b --- /dev/null +++ b/conformance/profiles/viewport-range.json @@ -0,0 +1,44 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-RANGE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport range", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 256, + 0, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-rounding.json b/conformance/profiles/viewport-rounding.json new file mode 100644 index 0000000..5b03007 --- /dev/null +++ b/conformance/profiles/viewport-rounding.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport rounding", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 255, + 0, + 0, + 128 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 128, + 0, + 50, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-rows.json b/conformance/profiles/viewport-rows.json new file mode 100644 index 0000000..ecac992 --- /dev/null +++ b/conformance/profiles/viewport-rows.json @@ -0,0 +1,57 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROWS", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B04" + ], + "description": "viewport rows", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 2, + "format": "RGBA8", + "rgba8": [ + 255, + 0, + 0, + 255, + 0, + 255, + 0, + 255 + ] + }, + "declaredSize": [ + 1, + 2 + ], + "background": [ + 0, + 0, + 0 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 255, + 0, + 0, + 255, + 0, + 255, + 0, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-short.json b/conformance/profiles/viewport-short.json new file mode 100644 index 0000000..06ffaab --- /dev/null +++ b/conformance/profiles/viewport-short.json @@ -0,0 +1,43 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-SHORT", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport short", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 0, + 0, + 0 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/viewport-transparent.json b/conformance/profiles/viewport-transparent.json new file mode 100644 index 0000000..bc90b9c --- /dev/null +++ b/conformance/profiles/viewport-transparent.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-TRANSPARENT", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport transparent", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 255, + 0, + 0, + 0 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 0, + 0, + 100, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-zero-dimension.json b/conformance/profiles/viewport-zero-dimension.json new file mode 100644 index 0000000..3e870d7 --- /dev/null +++ b/conformance/profiles/viewport-zero-dimension.json @@ -0,0 +1,39 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ZERO-DIMENSION", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "viewport zero dimension", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 0, + "height": 1, + "format": "RGBA8", + "rgba8": [] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 100 + ] + }, + "expected": { + "valid": false + } +} diff --git a/decisions/MEDUI-DEC-008-interaction-profiles.md b/decisions/MEDUI-DEC-008-interaction-profiles.md index 53495eb..a473e6c 100644 --- a/decisions/MEDUI-DEC-008-interaction-profiles.md +++ b/decisions/MEDUI-DEC-008-interaction-profiles.md @@ -3,13 +3,14 @@ Status: Accepted Accepted on 2026-09-07 by Ambroise Leclerc, maintainer, by explicit instruction. -Acceptance records the architectural direction below. Profile identifiers, schemas and the -candidate conformance corpus remain delivery work; no consumer support is asserted. +Acceptance records the architectural direction below. The profile identifiers, schemas and candidate +conformance corpus are specified in [the 0.3.0 profile contract](../spec/profiles.md); no consumer +support is asserted. Raised by [MedUI #16](https://github.com/Compliatory/MedUI/issues/16) from a comparison of the MduX and TrustSC runtimes for [MduX #312](https://github.com/ambroise-leclerc/MduX/issues/312). -This record accepts the architectural direction and behavioral defaults below. Detailed -profile definitions and their conformance cases remain prerequisites for consumer claims. +This record accepts the architectural direction and behavioral defaults below. The linked detailed +profile definitions and conformance cases are candidate inputs, not consumer conformance evidence. ## Problem @@ -48,15 +49,16 @@ Accepted direction for the profile definitions: pixels; an exact-pixel corpus case identifies profile, theme, fonts, assets, surface and backend. -## Delivery decisions remaining +## Candidate delivery -- Does an interaction profile belong in MedUI at all, or does the contract stay layout-only and - point at a separate runtime contract? -- Which of the proposed defaults are actually shared, versus a starting point for negotiation - between the two implementations? -- What is the smallest first profile — hit testing and press/release only — that both - implementations could pass without changing observable behaviour? -- How do capability and manifest schemas carry a profile claim, and under which minor? +The optional logical observations belong to MedUI; device-runtime implementations remain outside +this repository. 0.3.0 adds independent `MEDUI-PROFILE-INTERACTION/1`, +`MEDUI-PROFILE-BINDING/1`, and `MEDUI-PROFILE-PRESENTATION/1` claims. The accepted defaults above +are made explicit in [profiles](../spec/profiles.md), including whole-batch activation suppression +on overflow. Presentation describes declared appearances rather than imposing either consumer's +widget style. Synthetic cases cover every component and the logical input/update boundaries. +No unchanged-behaviour parity is claimed; consumers must evaluate their migration against the +candidate corpus before claiming any profile. ## Rollout diff --git a/governance/versioning.md b/governance/versioning.md index 5d65db7..ab13e0e 100644 --- a/governance/versioning.md +++ b/governance/versioning.md @@ -11,7 +11,7 @@ claims are independently versioned and tested as specified in [profiles](../spec ## Current line: 0.3.0 (candidate) `VERSION` is `0.3.0`. This candidate extends the accepted manifest shape with optional `profiles` -and adds observation contracts, evidence schemas and synthetic cases for MEDUI-DEC-007. +and adds observation contracts, evidence schemas and synthetic cases for MEDUI-DEC-007/008. Existing compiler outcomes are unchanged from 0.2.0. Each implementation claiming an affected capability/profile must pass the exact candidate SHA before release or advertising support. Use `0.3.0-candidate` for an informational pin label and `v0.3.0-rc.N` for candidate tags; diff --git a/profiles/presentation-fixture.json b/profiles/presentation-fixture.json new file mode 100644 index 0000000..170428d --- /dev/null +++ b/profiles/presentation-fixture.json @@ -0,0 +1,312 @@ +{ + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] +} diff --git a/profiles/registry.json b/profiles/registry.json index c6b00cb..0379edb 100644 --- a/profiles/registry.json +++ b/profiles/registry.json @@ -19,6 +19,37 @@ "E02", "E03" ] + }, + { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1, + "rules": [ + "I01", + "I02", + "I03", + "I04", + "I05", + "I06" + ] + }, + { + "id": "MEDUI-PROFILE-BINDING", + "version": 1, + "rules": [ + "B01", + "B02", + "B03", + "B04" + ] + }, + { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1, + "rules": [ + "P01", + "P02", + "P03" + ] } ] } diff --git a/schemas/binding.schema.json b/schemas/binding.schema.json new file mode 100644 index 0000000..9389376 --- /dev/null +++ b/schemas/binding.schema.json @@ -0,0 +1,279 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/Compliatory/MedUI/schemas/0.3/binding.schema.json", + "type": "object", + "additionalProperties": false, + "required": [ + "screen", + "snapshot", + "frame", + "entries" + ], + "properties": { + "screen": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "frame": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "node", + "source", + "snapshot", + "component", + "value" + ], + "properties": { + "node": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "component": { + "const": "TextInput" + }, + "value": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "node", + "source", + "snapshot", + "component", + "value" + ], + "properties": { + "node": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "component": { + "const": "Clock" + }, + "value": { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 6, + "maxItems": 6 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "node", + "source", + "snapshot", + "component", + "value" + ], + "properties": { + "node": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "component": { + "const": "StatusIndicator" + }, + "value": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "node", + "source", + "snapshot", + "component", + "value" + ], + "properties": { + "node": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "component": { + "const": "NumericDisplay" + }, + "value": { + "type": "object", + "additionalProperties": false, + "required": [ + "integer", + "scale", + "prefix", + "suffix" + ], + "properties": { + "integer": { + "type": "string", + "pattern": "^(0|-?[1-9][0-9]*)$" + }, + "scale": { + "type": "integer", + "minimum": 0 + }, + "prefix": { + "type": "string" + }, + "suffix": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "node", + "source", + "snapshot", + "component", + "value" + ], + "properties": { + "node": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "component": { + "const": "SignalTrace" + }, + "value": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "node", + "source", + "snapshot", + "component", + "value" + ], + "properties": { + "node": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "snapshot": { + "type": "string", + "minLength": 1 + }, + "component": { + "const": "VulkanViewport" + }, + "value": { + "type": "object", + "additionalProperties": false, + "required": [ + "width", + "height", + "format", + "rgba8" + ], + "properties": { + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + }, + "format": { + "const": "RGBA8" + }, + "rgba8": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + } + } + } + } + } + ] + } + } + } +} diff --git a/schemas/consumer-manifest.schema.json b/schemas/consumer-manifest.schema.json index 6a9643b..6fb291f 100644 --- a/schemas/consumer-manifest.schema.json +++ b/schemas/consumer-manifest.schema.json @@ -58,7 +58,10 @@ "id": { "enum": [ "MEDUI-PROFILE-RENDERED", - "MEDUI-PROFILE-EVIDENCE" + "MEDUI-PROFILE-EVIDENCE", + "MEDUI-PROFILE-INTERACTION", + "MEDUI-PROFILE-BINDING", + "MEDUI-PROFILE-PRESENTATION" ] }, "version": { diff --git a/schemas/contract-case.schema.json b/schemas/contract-case.schema.json index bcc6038..ca3b432 100644 --- a/schemas/contract-case.schema.json +++ b/schemas/contract-case.schema.json @@ -18,7 +18,9 @@ "schema": { "enum": [ "consumer-manifest", - "evidence" + "evidence", + "presentation", + "binding" ] }, "description": { diff --git a/schemas/presentation.schema.json b/schemas/presentation.schema.json new file mode 100644 index 0000000..0b203ea --- /dev/null +++ b/schemas/presentation.schema.json @@ -0,0 +1,147 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/Compliatory/MedUI/schemas/0.3/presentation.schema.json", + "type": "object", + "additionalProperties": false, + "required": [ + "theme", + "font", + "assets", + "backend", + "surface", + "variants" + ], + "properties": { + "theme": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "font": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "assets": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "backend": { + "type": "string", + "minLength": 1 + }, + "surface": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + }, + "minItems": 2, + "maxItems": 2 + }, + "variants": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "component", + "pressed", + "focused", + "face", + "label", + "tint", + "caret", + "clip" + ], + "properties": { + "component": { + "enum": [ + "Row", + "CriticalButton", + "Button", + "VulkanViewport", + "SignalTrace", + "NumericDisplay", + "StatusIndicator", + "Label", + "Clock", + "Image", + "TextInput" + ] + }, + "pressed": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "face": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 4, + "maxItems": 4 + }, + { + "type": "null" + } + ] + }, + "label": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 4, + "maxItems": 4 + }, + { + "type": "null" + } + ] + }, + "tint": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "minItems": 4, + "maxItems": 4 + }, + { + "type": "null" + } + ] + }, + "caret": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 4, + "maxItems": 4 + }, + { + "type": "null" + } + ] + }, + "clip": { + "type": "boolean" + } + } + }, + "minItems": 1 + } + } +} diff --git a/schemas/profile-case.schema.json b/schemas/profile-case.schema.json index b585982..13d4128 100644 --- a/schemas/profile-case.schema.json +++ b/schemas/profile-case.schema.json @@ -27,7 +27,10 @@ "id": { "enum": [ "MEDUI-PROFILE-RENDERED", - "MEDUI-PROFILE-EVIDENCE" + "MEDUI-PROFILE-EVIDENCE", + "MEDUI-PROFILE-INTERACTION", + "MEDUI-PROFILE-BINDING", + "MEDUI-PROFILE-PRESENTATION" ] }, "version": { @@ -45,7 +48,20 @@ "R04", "E01", "E02", - "E03" + "E03", + "I01", + "I02", + "I03", + "I04", + "I05", + "I06", + "B01", + "B02", + "B03", + "B04", + "P01", + "P02", + "P03" ] }, "minItems": 1, @@ -64,7 +80,15 @@ "operation": { "enum": [ "rendered-check", - "aggregate-evidence" + "aggregate-evidence", + "normalize", + "hit", + "edit", + "boundary", + "events", + "bind", + "pixels", + "present" ] } } diff --git a/spec/component-model.md b/spec/component-model.md index 93c671a..604fc32 100644 --- a/spec/component-model.md +++ b/spec/component-model.md @@ -49,9 +49,10 @@ a member reports `MEDUI-E034`; a value of the wrong *kind* still reports `MEDUI- Every member above is pinned by a positive conformance case as well as a negative one: a closed set whose members are all rejected would otherwise satisfy the rejection cases while implementing an -empty vocabulary. The renderings are normative but not yet mechanically checkable — there is no -text-budget case and no font model in this contract — so `clock-format-members` carries them as an -`observations` entry, which records the fact without yet asserting it. +empty vocabulary. The compiler corpus has no text-budget case or font model, so +`clock-format-members` carries the renderings as an `observations` entry. The optional candidate +[binding profile](profiles.md) separately asserts formatted text from injected civil time; those +string observations do not establish font measurement or pixel output. Closing `format` is what makes a clock measurable. Because the rendering of each member is fixed here, a text-budget pass knows a `TimeSeconds` clock draws eight glyphs and can check them against diff --git a/spec/profiles.md b/spec/profiles.md index c675e87..72e3cf0 100644 --- a/spec/profiles.md +++ b/spec/profiles.md @@ -1,6 +1,6 @@ # Optional observation profiles (0.3.0 candidate) -This is the candidate delivery of MEDUI-DEC-007. Profiles belong to this +This is the candidate delivery of MEDUI-DEC-007 and MEDUI-DEC-008. Profiles belong to this implementation-neutral contract; platform adapters, event loops, rendering algorithms and device actions remain in consumer repositories. Compiler capabilities and diagnostics retain their meanings. No existing consumer is asserted to support these profiles. @@ -10,7 +10,7 @@ is immutable once released; changed outcomes require a new version and a contrac are optional, independent of compiler phases, and require every case for the claimed profile. `profiles` is an optional, nonempty array in the consumer manifest; duplicate claims are rejected. An absent array claims nothing. An unknown ID/version or unknown manifest key is rejected. -Interaction, binding and presentation profile delivery remains separate under MEDUI-DEC-008. +Presentation and binding claims do not imply interaction or exact-pixel equivalence. Each `conformance/profiles/*.json` file is a portable observation vector. `inputs` describes public observations or a logical scenario, and `expected` is the required observable result. @@ -26,9 +26,31 @@ cases nor change their outcomes. ### Vector protocol -`inputs.operation` selects `rendered-check` or `aggregate-evidence`. Each operates on the supplied -public data and returns the members asserted in `expected`; omitted expected members impose no -assertion. Fixture SHA strings identify synthetic inputs; they do not attest to real consumer builds. +`inputs.operation` selects `rendered-check`, `aggregate-evidence`, `normalize`, `hit`, `events`, +`edit`, `boundary`, `bind`, `present`, or `pixels`. Each operates on the supplied public data and +returns the members asserted in `expected`; omitted expected members impose no assertion. +Malformed scenario inputs return `valid:false` (or the specified operation's failure outcome), +without partial publication. The following fixture defaults are part of vector interpretation: + +- `hit` points are already normalized; only `normalize` takes device coordinates. Omitted origins + are zero and omitted scale ratios are 1/1. Omitted clips equal the surface. +- `events` starts unarmed, unfocused, with an empty queue and a zero dropped counter unless an + initial value is supplied. Omitted capacity accepts the whole batch and the counter limit is + 255. `events` is one batch; `batches` explicitly separates batches and preserves visible state. + `remove` and `eligibility` are logical scene changes, not platform event types. An absent + `repeat` is false. `focus-next` follows `focusOrder`, beginning at its first node if unfocused. +- `edit` starts with the explicit text, scalar caret and selection; selection is a half-open + `[start,end]` scalar range. A successful edit collapses selection at the resulting caret. + Left/right with a nonempty selection collapse to its start/end without an additional move; + backspace/delete delete the selected range. Rejected event indices are zero-based. +- `bind` describes one dynamic node. Unless `entries` is explicit, a non-null `value` is shorthand + for exactly one entry with the supplied screen/node/declaredSource/snapshot and that value; + `null` supplies no entry. Static components with no entries are valid. Formatting parameters, + glyph set/length, trace bounds and viewport dimensions are explicit declaration inputs, not + values inferred from a producer's representation. `format` names the authored Clock format. +- `present` with just a configuration validates the declaration; with a node it additionally + resolves and observes the indicated variant. `pixels` compares the entire stated surface. + Fixture SHA strings identify synthetic inputs; they do not attest to real consumer builds. ## MEDUI-PROFILE-RENDERED, version 1 @@ -119,6 +141,106 @@ Consumers may retain their own canonical committed reports and emit this envelop artifact. The schema's rendered profile/check IDs and versions track the candidate registry and R01–R04; adding a released version requires updating the schema identity under the minor policy. +## MEDUI-PROFILE-INTERACTION, version 1 + +Scenarios supply a surface, a back-to-front ordered list of nodes, eligibility, output mappings, +host queue capacity, dropped-counter limit, editable values and accepted Unicode scalar sets. +Rectangles and pointer coordinates use authored pixels. This describes logical observations, +not a platform input API or device-runtime policy. + +- **I01 — coordinates.** Input coordinates and origin are integers; positive integer `scaleNumerator` + and `scaleDenominator` give device pixels per authored pixel. Normalize each axis exactly once + with `floor((device-origin)*scaleDenominator/scaleNumerator)`, including negative values. Points + outside `[0,width) × [0,height)` hit nothing; they are never clamped to an edge control. +- **I02 — hit.** Search reverse paint order using half-open rectangles intersected with the + surface and explicit ancestor clip. The first containing node occludes every node below it, + including if it is decorative, disabled or ineligible. Only an eligible Button, CriticalButton + or TextInput is a target. A disabled foreground node is not transparent to input. +- **I03 — activation.** A primary press replaces any prior arm with the hit eligible Button or + CriticalButton, or clears it when neither is hit. Release clears the arm and emits an output + only if the hit is that same still-eligible node. Repeated presses are ordinary presses; a + release without an arm does nothing. Cancel, focus loss, removal, or loss of eligibility clears + the arm immediately. Button emits `{kind:"source",node,source}`; CriticalButton emits + `{kind:"action",node,action,requirement}` even for `NoOp`. Neither output executes an action. +- **I04 — queue.** Capacity and dropped-counter limit are positive integers. Enqueue valid events + in order until capacity; drop newest on saturation and increment a saturating dropped counter. + Any saturation clears the existing arm and suppresses all activation for the entire accepted + batch, including a queued press consumed after the overflow. Suppression resets at the next + batch boundary; an overflow batch ends unarmed. Invalid events are rejected atomically before + queue admission and do not increment the dropped counter. The rejection is observable. +- **I05 — boundary.** Consume the accepted batch in order, then update application state from + emitted outputs, bind exactly one complete snapshot, render, and capture that snapshot's frame. + Missing or mixed snapshot identities fail binding and yield no successful capture. Injected + time belongs to the same snapshot; no wall-clock read is an input to replay. +- **I06 — editing.** A primary press focuses an eligible TextInput at its current caret; pressing + elsewhere or losing focus clears focus. Focus traversal follows explicit eligible TextInput + order, wraps, and clears the arm. Left/right move one Unicode scalar; home/end select the first/ + last boundary; backspace/delete remove one adjacent scalar if present. Insert and paste replace + the selection atomically. All inserted values must be valid Unicode scalar strings in the + declared finite glyph set; resulting scalar length must not exceed `maxLength`. Reject invalid + UTF-8 (vectors use byte arrays), disallowed glyphs, invalid selection boundaries or oversize + replacements without changing text/caret/selection. No normalization or grapheme shaping is + implied. Navigation and deletion at an edge do nothing. Repeats apply only to navigation and + deletion; repeated insert/paste is rejected. Editing without focus has no effect. + +## MEDUI-PROFILE-BINDING, version 1 + +Each snapshot supplies screen, frame, snapshot ID and an array keyed by node and declared source. +Bindings are already resolved data, independent of any native storage or callback mechanism. +`schemas/binding.schema.json` describes the snapshot envelope and typed values; screen is inherited +by each entry. Declaration-dependent resolution, lengths, dates and ranges are additional semantic +checks. `bind` vectors isolate a single node and may repeat screen in entries to test mismatches. + +- **B01 — mapping.** Each dynamic node has exactly one value matching screen, node, declared + source and snapshot ID. Duplicate, missing, unknown or mistyped entries fail the whole snapshot + without partial publication. Static Row, Label, Image, Button and CriticalButton need no dynamic + values; supplying one is an error. TextInput uses a scalar string bounded as in I06. Clock uses + source `clock` and an injected `[year,month,day,hour,minute,second]` Gregorian civil time (years + 1–9999, seconds 0–59), with no timezone conversion or leap-second inference. +- **B02 — formatting.** NumericDisplay receives a signed decimal integer string without leading + zeros (except `0`), a nonnegative decimal scale, and explicit prefix/suffix. It inserts a decimal + point `scale` digits from the right, zero-padding as needed, with ASCII digits, `.` separator, + no grouping and no rounding. Declarations supply positive `maxDigits` (excluding sign) and + nonnegative `maxScale`; exceeding either fails. Prefix/suffix are baked template strings, not + arbitrary application text. Negative zero is invalid. Clock renders `HH:MM:SS` or + `YYYY-MM-DD HH:MM:SS`, zero-padded. StatusIndicator receives a zero-based integer index into + authored state order; out-of-range fails. If colours are supplied there is one per state. +- **B03 — trace.** SignalTrace receives integer samples in chronological order (oldest first), + positive capacity, and explicit integer minimum/maximum. Empty input is allowed. Values outside + the inclusive range fail; excess samples fail, with no truncation, reordering or clamping. +- **B04 — viewport.** VulkanViewport receives positive width/height matching its declared pixel + surface and exactly `width*height*4` integers in `[0,255]`. Format is straight RGBA8, rows top to + bottom and pixels left to right, no padding. Invalid dimensions, lengths, format or channels + fail atomically; no inferred resizing, wraparound or clamping. Composition over opaque RGB8 + background is per channel `floor((src*alpha + bg*(255-alpha) + 127)/255)` with output alpha 255. + Transparent source leaves background unchanged. Geometry for traces and all widget appearance + are supplied by the independently declared presentation configuration. + +## MEDUI-PROFILE-PRESENTATION, version 1 + +This is a presentation-description and observation profile, not a universal widget theme. It +makes each appearance choice explicit; equality is claimed only for the same configuration. +`schemas/presentation.schema.json` defines the declaration shape. Rectangle extent checks and +complete, unique variant resolution are additional semantic checks; schema validity alone does +not establish them. + +- **P01 — configuration.** The declaration identifies theme/font/asset digests, backend, surface, + and a finite set of variants for every component in `spec/component-model.md`. Each variant + names component, pressed/focused state, face and label rectangles relative to the node (or + `null` when absent), RGBA8 tint (or `null`), caret rectangle (or `null`), and explicit clipping. + Every supplied node/state must resolve exactly one variant. Duplicate or missing variants, + missing component coverage or missing configuration identity fail. Zero-area rectangles are + allowed; negative extents are not. This descriptor does not prescribe rasterization. +- **P02 — observation.** Resolved face/label/tint/caret/clip observations must equal the selected + variant, translated by node origin for rectangles, and clipped to node/surface when clipping + is true. All component kinds, including Row, have observation vectors. State-dependent button + face and TextInput caret are independently observable. +- **P03 — pixel evidence.** An exact-pixel comparison requires identical presentation declaration + digest, theme/font/assets, backend, surface, locale, scenario and frame. Any mismatch fails + identity before pixel comparison, even if byte arrays happen to match. Once identities agree, + bytes compare exactly. Product-specific captured corpora must carry these declarations; + synthetic geometry and colour vectors assert no cross-backend pixel parity. + ## Adoption 0.2.0 compiler outcomes remain the baseline. New schemas and optional profiles are a 0.3.0 diff --git a/tools/validate.py b/tools/validate.py index 88f2a13..9e31e57 100644 --- a/tools/validate.py +++ b/tools/validate.py @@ -223,6 +223,11 @@ def main() -> None: for check in evidence_check["id"]["enum"]} if evidence_key not in declared or schema_checks != documented_checks: fail("evidence profile/check identities differ from the registry or specification") + fixture_problems = validate( + load_json(ROOT / "profiles/presentation-fixture.json"), schemas["presentation"] + ) + if fixture_problems: + fail(f"invalid synthetic presentation fixture: {fixture_problems}") claim_schema = properties["profiles"]["items"] schema_claims = { (identifier, claim_schema["properties"]["version"]["const"]) From eb385b6cd1faff5f4d0506f88103797ace919539 Mon Sep 17 00:00:00 2001 From: Ambroise Leclerc Date: Mon, 7 Sep 2026 16:03:16 +0200 Subject: [PATCH 2/2] Address interaction profile review and separate pixel claims --- conformance/README.md | 5 + .../contracts/manifest-pixels-only.json | 20 + .../contracts/manifest-presentation-only.json | 20 + conformance/contracts/manifest-profiles.json | 4 + .../contracts/presentation-channel-range.json | 7 +- .../presentation-missing-backend.json | 7 +- .../contracts/presentation-missing-font.json | 7 +- .../presentation-missing-surface.json | 7 +- .../contracts/presentation-missing-theme.json | 7 +- .../presentation-missing-variants.json | 7 +- .../presentation-unknown-component.json | 7 +- conformance/contracts/presentation-valid.json | 7 +- .../profiles/normalize-negative-nonunit.json | 34 ++ .../profiles/numeric-scale-zero-negative.json | 33 ++ .../profiles/numeric-scale-zero-zero.json | 33 ++ conformance/profiles/pixel-different.json | 16 +- conformance/profiles/pixel-equal.json | 16 +- .../profiles/pixel-identity-assets.json | 16 +- .../profiles/pixel-identity-backend.json | 16 +- .../profiles/pixel-identity-declaration.json | 16 +- conformance/profiles/pixel-identity-font.json | 16 +- .../profiles/pixel-identity-frame.json | 16 +- .../profiles/pixel-identity-locale.json | 16 +- .../profiles/pixel-identity-scenario.json | 16 +- .../profiles/pixel-identity-surface.json | 16 +- .../profiles/pixel-identity-theme.json | 16 +- .../presentation-assets-duplicate-id.json | 350 ++++++++++++++++++ .../presentation-assets-unsorted.json | 350 ++++++++++++++++++ conformance/profiles/presentation-button.json | 7 +- conformance/profiles/presentation-caret.json | 7 +- conformance/profiles/presentation-clip.json | 7 +- conformance/profiles/presentation-clock.json | 7 +- .../profiles/presentation-criticalbutton.json | 7 +- conformance/profiles/presentation-image.json | 7 +- .../presentation-invalid-duplicate.json | 7 +- .../presentation-invalid-identity.json | 7 +- ...resentation-invalid-missing-component.json | 7 +- .../presentation-invalid-negative-extent.json | 7 +- conformance/profiles/presentation-label.json | 7 +- .../profiles/presentation-missing-state.json | 7 +- .../profiles/presentation-numericdisplay.json | 7 +- .../profiles/presentation-pressed.json | 7 +- conformance/profiles/presentation-row.json | 7 +- .../profiles/presentation-signaltrace.json | 7 +- .../presentation-statusindicator.json | 7 +- .../profiles/presentation-textinput.json | 7 +- .../profiles/presentation-unclipped.json | 7 +- .../profiles/presentation-vulkanviewport.json | 7 +- .../profiles/presentation-zero-extent.json | 7 +- .../viewport-rounding-ascending-high.json | 50 +++ .../viewport-rounding-ascending-low.json | 50 +++ .../viewport-rounding-descending-high.json | 50 +++ .../viewport-rounding-descending-low.json | 50 +++ .../viewport-rounding-maximum-down.json | 50 +++ .../viewport-rounding-maximum-up.json | 50 +++ .../MEDUI-DEC-008-interaction-profiles.md | 3 +- governance/profile-arithmetic.md | 26 ++ profiles/presentation-fixture.json | 312 ---------------- profiles/registry.json | 8 +- schemas/consumer-manifest.schema.json | 3 +- schemas/presentation.schema.json | 23 +- schemas/profile-case.schema.json | 3 +- spec/profiles.md | 33 +- tools/validate.py | 8 +- 64 files changed, 1557 insertions(+), 390 deletions(-) create mode 100644 conformance/contracts/manifest-pixels-only.json create mode 100644 conformance/contracts/manifest-presentation-only.json create mode 100644 conformance/profiles/normalize-negative-nonunit.json create mode 100644 conformance/profiles/numeric-scale-zero-negative.json create mode 100644 conformance/profiles/numeric-scale-zero-zero.json create mode 100644 conformance/profiles/presentation-assets-duplicate-id.json create mode 100644 conformance/profiles/presentation-assets-unsorted.json create mode 100644 conformance/profiles/viewport-rounding-ascending-high.json create mode 100644 conformance/profiles/viewport-rounding-ascending-low.json create mode 100644 conformance/profiles/viewport-rounding-descending-high.json create mode 100644 conformance/profiles/viewport-rounding-descending-low.json create mode 100644 conformance/profiles/viewport-rounding-maximum-down.json create mode 100644 conformance/profiles/viewport-rounding-maximum-up.json create mode 100644 governance/profile-arithmetic.md delete mode 100644 profiles/presentation-fixture.json diff --git a/conformance/README.md b/conformance/README.md index 6ec1edf..21bef08 100644 --- a/conformance/README.md +++ b/conformance/README.md @@ -36,3 +36,8 @@ vectors. This repository provides no runtime, renderer or native artifact oracle validator executes these schema expectations using the dependency-free schema subset checker. Schema acceptance and profile execution are distinct: a well-formed evidence report can still fail its completeness or identity obligations. + +`contracts/presentation-valid.json` contains the canonical synthetic presentation declaration as +a portable positive schema case. Presentation vectors embed their complete declarations to remain +self-contained; no separate fixture under `profiles/` or special validator path is needed. +P01/P02 vectors belong to PRESENTATION; P03 vectors belong to the separately claimed PIXELS profile. diff --git a/conformance/contracts/manifest-pixels-only.json b/conformance/contracts/manifest-pixels-only.json new file mode 100644 index 0000000..e702b9d --- /dev/null +++ b/conformance/contracts/manifest-pixels-only.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-MANIFEST-PIXELS-ONLY", + "schema": "consumer-manifest", + "description": "A consumer can independently claim pixels-only", + "document": { + "repository": "https://github.com/Compliatory/MedUI", + "commit": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "capabilities": [ + "syntax" + ], + "positions": "full", + "profiles": [ + { + "id": "MEDUI-PROFILE-PIXELS", + "version": 1 + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/manifest-presentation-only.json b/conformance/contracts/manifest-presentation-only.json new file mode 100644 index 0000000..7828280 --- /dev/null +++ b/conformance/contracts/manifest-presentation-only.json @@ -0,0 +1,20 @@ +{ + "id": "MEDUI-CONTRACT-CASE-MANIFEST-PRESENTATION-ONLY", + "schema": "consumer-manifest", + "description": "A consumer can independently claim presentation-only", + "document": { + "repository": "https://github.com/Compliatory/MedUI", + "commit": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "capabilities": [ + "syntax" + ], + "positions": "full", + "profiles": [ + { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + } + ] + }, + "valid": true +} diff --git a/conformance/contracts/manifest-profiles.json b/conformance/contracts/manifest-profiles.json index 5f5bccf..b57e3cc 100644 --- a/conformance/contracts/manifest-profiles.json +++ b/conformance/contracts/manifest-profiles.json @@ -29,6 +29,10 @@ { "id": "MEDUI-PROFILE-PRESENTATION", "version": 1 + }, + { + "id": "MEDUI-PROFILE-PIXELS", + "version": 1 } ] }, diff --git a/conformance/contracts/presentation-channel-range.json b/conformance/contracts/presentation-channel-range.json index 443d513..722c89e 100644 --- a/conformance/contracts/presentation-channel-range.json +++ b/conformance/contracts/presentation-channel-range.json @@ -5,7 +5,12 @@ "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/contracts/presentation-missing-backend.json b/conformance/contracts/presentation-missing-backend.json index 26cc0b8..bb14d19 100644 --- a/conformance/contracts/presentation-missing-backend.json +++ b/conformance/contracts/presentation-missing-backend.json @@ -5,7 +5,12 @@ "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "surface": [ 20, 20 diff --git a/conformance/contracts/presentation-missing-font.json b/conformance/contracts/presentation-missing-font.json index 7477264..8a32273 100644 --- a/conformance/contracts/presentation-missing-font.json +++ b/conformance/contracts/presentation-missing-font.json @@ -4,7 +4,12 @@ "description": "presentation missing font", "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/contracts/presentation-missing-surface.json b/conformance/contracts/presentation-missing-surface.json index 7ff3cca..5c6002f 100644 --- a/conformance/contracts/presentation-missing-surface.json +++ b/conformance/contracts/presentation-missing-surface.json @@ -5,7 +5,12 @@ "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "variants": [ { diff --git a/conformance/contracts/presentation-missing-theme.json b/conformance/contracts/presentation-missing-theme.json index d10e898..b3a9492 100644 --- a/conformance/contracts/presentation-missing-theme.json +++ b/conformance/contracts/presentation-missing-theme.json @@ -4,7 +4,12 @@ "description": "presentation missing theme", "document": { "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/contracts/presentation-missing-variants.json b/conformance/contracts/presentation-missing-variants.json index 21af705..56baef1 100644 --- a/conformance/contracts/presentation-missing-variants.json +++ b/conformance/contracts/presentation-missing-variants.json @@ -5,7 +5,12 @@ "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/contracts/presentation-unknown-component.json b/conformance/contracts/presentation-unknown-component.json index 482ffa2..11fd18f 100644 --- a/conformance/contracts/presentation-unknown-component.json +++ b/conformance/contracts/presentation-unknown-component.json @@ -5,7 +5,12 @@ "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/contracts/presentation-valid.json b/conformance/contracts/presentation-valid.json index b71a60d..4561179 100644 --- a/conformance/contracts/presentation-valid.json +++ b/conformance/contracts/presentation-valid.json @@ -5,7 +5,12 @@ "document": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/normalize-negative-nonunit.json b/conformance/profiles/normalize-negative-nonunit.json new file mode 100644 index 0000000..733907d --- /dev/null +++ b/conformance/profiles/normalize-negative-nonunit.json @@ -0,0 +1,34 @@ +{ + "id": "MEDUI-PROFILE-CASE-NORMALIZE-NEGATIVE-NONUNIT", + "profile": { + "id": "MEDUI-PROFILE-INTERACTION", + "version": 1 + }, + "rules": [ + "I01" + ], + "description": "Mathematical floor of -3/2 and -5/2 differs from truncation toward zero.", + "inputs": { + "operation": "normalize", + "surface": [ + 20, + 20 + ], + "devicePoint": [ + -3, + -5 + ], + "origin": [ + 0, + 0 + ], + "scaleNumerator": 2, + "scaleDenominator": 1 + }, + "expected": { + "point": [ + -2, + -3 + ] + } +} diff --git a/conformance/profiles/numeric-scale-zero-negative.json b/conformance/profiles/numeric-scale-zero-negative.json new file mode 100644 index 0000000..ce7742f --- /dev/null +++ b/conformance/profiles/numeric-scale-zero-negative.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-SCALE-ZERO-NEGATIVE", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "Scale zero omits the decimal point before the suffix.", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "-12", + "scale": 0, + "prefix": "[", + "suffix": "]" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": true, + "text": "[-12]" + } +} diff --git a/conformance/profiles/numeric-scale-zero-zero.json b/conformance/profiles/numeric-scale-zero-zero.json new file mode 100644 index 0000000..5f5adfd --- /dev/null +++ b/conformance/profiles/numeric-scale-zero-zero.json @@ -0,0 +1,33 @@ +{ + "id": "MEDUI-PROFILE-CASE-NUMERIC-SCALE-ZERO-ZERO", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B02" + ], + "description": "Scale zero omits the decimal point before the suffix.", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "NumericDisplay", + "declaredSource": "value", + "value": { + "integer": "0", + "scale": 0, + "prefix": "[", + "suffix": "]" + }, + "maxDigits": 6, + "maxScale": 3 + }, + "expected": { + "valid": true, + "text": "[0]" + } +} diff --git a/conformance/profiles/pixel-different.json b/conformance/profiles/pixel-different.json index 908287a..1c9492f 100644 --- a/conformance/profiles/pixel-different.json +++ b/conformance/profiles/pixel-different.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-DIFFERENT", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-equal.json b/conformance/profiles/pixel-equal.json index 3857631..0f6e9cb 100644 --- a/conformance/profiles/pixel-equal.json +++ b/conformance/profiles/pixel-equal.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-EQUAL", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-assets.json b/conformance/profiles/pixel-identity-assets.json index f3167ed..f6c4376 100644 --- a/conformance/profiles/pixel-identity-assets.json +++ b/conformance/profiles/pixel-identity-assets.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-ASSETS", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "0000000000000000000000000000000000000000000000000000000000000000", + "assets": [ + { + "id": "image/ui", + "digest": "0000000000000000000000000000000000000000000000000000000000000000" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-backend.json b/conformance/profiles/pixel-identity-backend.json index 28626d9..0cdc4bb 100644 --- a/conformance/profiles/pixel-identity-backend.json +++ b/conformance/profiles/pixel-identity-backend.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-BACKEND", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "other", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-declaration.json b/conformance/profiles/pixel-identity-declaration.json index d9d5647..9260acf 100644 --- a/conformance/profiles/pixel-identity-declaration.json +++ b/conformance/profiles/pixel-identity-declaration.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-DECLARATION", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "0000000000000000000000000000000000000000000000000000000000000000", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-font.json b/conformance/profiles/pixel-identity-font.json index a908926..a6b4afe 100644 --- a/conformance/profiles/pixel-identity-font.json +++ b/conformance/profiles/pixel-identity-font.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-FONT", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "0000000000000000000000000000000000000000000000000000000000000000", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-frame.json b/conformance/profiles/pixel-identity-frame.json index 80f9da8..c6e3de7 100644 --- a/conformance/profiles/pixel-identity-frame.json +++ b/conformance/profiles/pixel-identity-frame.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-FRAME", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-locale.json b/conformance/profiles/pixel-identity-locale.json index b8b68f7..b75582a 100644 --- a/conformance/profiles/pixel-identity-locale.json +++ b/conformance/profiles/pixel-identity-locale.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-LOCALE", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-scenario.json b/conformance/profiles/pixel-identity-scenario.json index 31a9b83..26bd0c8 100644 --- a/conformance/profiles/pixel-identity-scenario.json +++ b/conformance/profiles/pixel-identity-scenario.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-SCENARIO", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/pixel-identity-surface.json b/conformance/profiles/pixel-identity-surface.json index 1930411..dfa4c07 100644 --- a/conformance/profiles/pixel-identity-surface.json +++ b/conformance/profiles/pixel-identity-surface.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-SURFACE", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 10, diff --git a/conformance/profiles/pixel-identity-theme.json b/conformance/profiles/pixel-identity-theme.json index b314377..104e7ab 100644 --- a/conformance/profiles/pixel-identity-theme.json +++ b/conformance/profiles/pixel-identity-theme.json @@ -1,7 +1,7 @@ { "id": "MEDUI-PROFILE-CASE-PIXEL-IDENTITY-THEME", "profile": { - "id": "MEDUI-PROFILE-PRESENTATION", + "id": "MEDUI-PROFILE-PIXELS", "version": 1 }, "rules": [ @@ -14,7 +14,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, @@ -28,7 +33,12 @@ "declaration": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "theme": "0000000000000000000000000000000000000000000000000000000000000000", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 1, diff --git a/conformance/profiles/presentation-assets-duplicate-id.json b/conformance/profiles/presentation-assets-duplicate-id.json new file mode 100644 index 0000000..7863510 --- /dev/null +++ b/conformance/profiles/presentation-assets-duplicate-id.json @@ -0,0 +1,350 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-ASSETS-DUPLICATE-ID", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "Presentation asset identities follow E01 ordering and uniqueness.", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": [ + { + "id": "image/ui", + "digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + { + "id": "image/ui", + "digest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + } + ], + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Row", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-assets-unsorted.json b/conformance/profiles/presentation-assets-unsorted.json new file mode 100644 index 0000000..5695772 --- /dev/null +++ b/conformance/profiles/presentation-assets-unsorted.json @@ -0,0 +1,350 @@ +{ + "id": "MEDUI-PROFILE-CASE-PRESENTATION-ASSETS-UNSORTED", + "profile": { + "id": "MEDUI-PROFILE-PRESENTATION", + "version": 1 + }, + "rules": [ + "P01", + "P02" + ], + "description": "Presentation asset identities follow E01 ordering and uniqueness.", + "inputs": { + "operation": "present", + "configuration": { + "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "assets": [ + { + "id": "image/z", + "digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + { + "id": "image/a", + "digest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + } + ], + "backend": "synthetic", + "surface": [ + 20, + 20 + ], + "variants": [ + { + "component": "Row", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "CriticalButton", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "VulkanViewport", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "SignalTrace", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "NumericDisplay", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "StatusIndicator", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Label", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Clock", + "pressed": false, + "focused": false, + "face": null, + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Image", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": null, + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": false, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "Button", + "pressed": true, + "focused": false, + "face": [ + 1, + 1, + 8, + 8 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": null, + "clip": true + }, + { + "component": "TextInput", + "pressed": false, + "focused": true, + "face": [ + 0, + 0, + 10, + 10 + ], + "label": [ + 1, + 2, + 8, + 6 + ], + "tint": [ + 255, + 0, + 0, + 255 + ], + "caret": [ + 2, + 2, + 1, + 6 + ], + "clip": true + } + ] + }, + "node": { + "component": "Row", + "rect": [ + 3, + 4, + 10, + 10 + ], + "pressed": false, + "focused": false + } + }, + "expected": { + "valid": false + } +} diff --git a/conformance/profiles/presentation-button.json b/conformance/profiles/presentation-button.json index f260256..8b72651 100644 --- a/conformance/profiles/presentation-button.json +++ b/conformance/profiles/presentation-button.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-caret.json b/conformance/profiles/presentation-caret.json index 4746f06..b79096b 100644 --- a/conformance/profiles/presentation-caret.json +++ b/conformance/profiles/presentation-caret.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-clip.json b/conformance/profiles/presentation-clip.json index 5ece8f1..01a0b32 100644 --- a/conformance/profiles/presentation-clip.json +++ b/conformance/profiles/presentation-clip.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-clock.json b/conformance/profiles/presentation-clock.json index e8203c8..206b975 100644 --- a/conformance/profiles/presentation-clock.json +++ b/conformance/profiles/presentation-clock.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-criticalbutton.json b/conformance/profiles/presentation-criticalbutton.json index ad7043e..24a1046 100644 --- a/conformance/profiles/presentation-criticalbutton.json +++ b/conformance/profiles/presentation-criticalbutton.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-image.json b/conformance/profiles/presentation-image.json index 7cac773..c276acd 100644 --- a/conformance/profiles/presentation-image.json +++ b/conformance/profiles/presentation-image.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-invalid-duplicate.json b/conformance/profiles/presentation-invalid-duplicate.json index 726c32d..787f826 100644 --- a/conformance/profiles/presentation-invalid-duplicate.json +++ b/conformance/profiles/presentation-invalid-duplicate.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-invalid-identity.json b/conformance/profiles/presentation-invalid-identity.json index 4e34758..fbab63c 100644 --- a/conformance/profiles/presentation-invalid-identity.json +++ b/conformance/profiles/presentation-invalid-identity.json @@ -12,7 +12,12 @@ "operation": "present", "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-invalid-missing-component.json b/conformance/profiles/presentation-invalid-missing-component.json index abc3797..d5d3f52 100644 --- a/conformance/profiles/presentation-invalid-missing-component.json +++ b/conformance/profiles/presentation-invalid-missing-component.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-invalid-negative-extent.json b/conformance/profiles/presentation-invalid-negative-extent.json index 36e9630..8d9d968 100644 --- a/conformance/profiles/presentation-invalid-negative-extent.json +++ b/conformance/profiles/presentation-invalid-negative-extent.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-label.json b/conformance/profiles/presentation-label.json index 69a9706..7313d40 100644 --- a/conformance/profiles/presentation-label.json +++ b/conformance/profiles/presentation-label.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-missing-state.json b/conformance/profiles/presentation-missing-state.json index f655d04..18812ae 100644 --- a/conformance/profiles/presentation-missing-state.json +++ b/conformance/profiles/presentation-missing-state.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-numericdisplay.json b/conformance/profiles/presentation-numericdisplay.json index 6b9a8fa..31d59da 100644 --- a/conformance/profiles/presentation-numericdisplay.json +++ b/conformance/profiles/presentation-numericdisplay.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-pressed.json b/conformance/profiles/presentation-pressed.json index 1efac75..eeb99c7 100644 --- a/conformance/profiles/presentation-pressed.json +++ b/conformance/profiles/presentation-pressed.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-row.json b/conformance/profiles/presentation-row.json index b5eb4ec..00ce0a2 100644 --- a/conformance/profiles/presentation-row.json +++ b/conformance/profiles/presentation-row.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-signaltrace.json b/conformance/profiles/presentation-signaltrace.json index f7514b1..c9b998c 100644 --- a/conformance/profiles/presentation-signaltrace.json +++ b/conformance/profiles/presentation-signaltrace.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-statusindicator.json b/conformance/profiles/presentation-statusindicator.json index acf2207..8f479a5 100644 --- a/conformance/profiles/presentation-statusindicator.json +++ b/conformance/profiles/presentation-statusindicator.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-textinput.json b/conformance/profiles/presentation-textinput.json index c965a82..1626732 100644 --- a/conformance/profiles/presentation-textinput.json +++ b/conformance/profiles/presentation-textinput.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-unclipped.json b/conformance/profiles/presentation-unclipped.json index 89e9dbb..6f64753 100644 --- a/conformance/profiles/presentation-unclipped.json +++ b/conformance/profiles/presentation-unclipped.json @@ -13,7 +13,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-vulkanviewport.json b/conformance/profiles/presentation-vulkanviewport.json index 2bbf439..dd3e5d3 100644 --- a/conformance/profiles/presentation-vulkanviewport.json +++ b/conformance/profiles/presentation-vulkanviewport.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/presentation-zero-extent.json b/conformance/profiles/presentation-zero-extent.json index 724c7a5..9d29f81 100644 --- a/conformance/profiles/presentation-zero-extent.json +++ b/conformance/profiles/presentation-zero-extent.json @@ -14,7 +14,12 @@ "configuration": { "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "assets": [ + { + "id": "image/ui", + "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + } + ], "backend": "synthetic", "surface": [ 20, diff --git a/conformance/profiles/viewport-rounding-ascending-high.json b/conformance/profiles/viewport-rounding-ascending-high.json new file mode 100644 index 0000000..85cc1b6 --- /dev/null +++ b/conformance/profiles/viewport-rounding-ascending-high.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING-ASCENDING-HIGH", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "B04 byte rounding boundary with full additional coverage: ascending-high", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 1, + 1, + 1, + 128 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 0 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 1, + 1, + 1, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-rounding-ascending-low.json b/conformance/profiles/viewport-rounding-ascending-low.json new file mode 100644 index 0000000..6231e0e --- /dev/null +++ b/conformance/profiles/viewport-rounding-ascending-low.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING-ASCENDING-LOW", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "B04 byte rounding boundary with full additional coverage: ascending-low", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 1, + 1, + 1, + 127 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 0 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 0, + 0, + 0, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-rounding-descending-high.json b/conformance/profiles/viewport-rounding-descending-high.json new file mode 100644 index 0000000..3e47afe --- /dev/null +++ b/conformance/profiles/viewport-rounding-descending-high.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING-DESCENDING-HIGH", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "B04 byte rounding boundary with full additional coverage: descending-high", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 0, + 0, + 0, + 128 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 1, + 1, + 1 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 0, + 0, + 0, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-rounding-descending-low.json b/conformance/profiles/viewport-rounding-descending-low.json new file mode 100644 index 0000000..069d219 --- /dev/null +++ b/conformance/profiles/viewport-rounding-descending-low.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING-DESCENDING-LOW", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "B04 byte rounding boundary with full additional coverage: descending-low", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 0, + 0, + 0, + 127 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 1, + 1, + 1 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 1, + 1, + 1, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-rounding-maximum-down.json b/conformance/profiles/viewport-rounding-maximum-down.json new file mode 100644 index 0000000..9665409 --- /dev/null +++ b/conformance/profiles/viewport-rounding-maximum-down.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING-MAXIMUM-DOWN", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "B04 byte rounding boundary with full additional coverage: maximum-down", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 0, + 0, + 0, + 1 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 255, + 255, + 255 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 254, + 254, + 254, + 255 + ] + } +} diff --git a/conformance/profiles/viewport-rounding-maximum-up.json b/conformance/profiles/viewport-rounding-maximum-up.json new file mode 100644 index 0000000..85715f6 --- /dev/null +++ b/conformance/profiles/viewport-rounding-maximum-up.json @@ -0,0 +1,50 @@ +{ + "id": "MEDUI-PROFILE-CASE-VIEWPORT-ROUNDING-MAXIMUM-UP", + "profile": { + "id": "MEDUI-PROFILE-BINDING", + "version": 1 + }, + "rules": [ + "B01", + "B04" + ], + "description": "B04 byte rounding boundary with full additional coverage: maximum-up", + "inputs": { + "operation": "bind", + "screen": "screen", + "snapshot": "s1", + "frame": 1, + "node": "node", + "component": "VulkanViewport", + "declaredSource": "value", + "value": { + "width": 1, + "height": 1, + "format": "RGBA8", + "rgba8": [ + 255, + 255, + 255, + 1 + ] + }, + "declaredSize": [ + 1, + 1 + ], + "background": [ + 0, + 0, + 0 + ] + }, + "expected": { + "valid": true, + "rgba8": [ + 1, + 1, + 1, + 255 + ] + } +} diff --git a/decisions/MEDUI-DEC-008-interaction-profiles.md b/decisions/MEDUI-DEC-008-interaction-profiles.md index a473e6c..038789d 100644 --- a/decisions/MEDUI-DEC-008-interaction-profiles.md +++ b/decisions/MEDUI-DEC-008-interaction-profiles.md @@ -53,7 +53,8 @@ Accepted direction for the profile definitions: The optional logical observations belong to MedUI; device-runtime implementations remain outside this repository. 0.3.0 adds independent `MEDUI-PROFILE-INTERACTION/1`, -`MEDUI-PROFILE-BINDING/1`, and `MEDUI-PROFILE-PRESENTATION/1` claims. The accepted defaults above +`MEDUI-PROFILE-BINDING/1`, `MEDUI-PROFILE-PRESENTATION/1` (P01/P02), and the separately optional +`MEDUI-PROFILE-PIXELS/1` (P03) claims. The accepted defaults above are made explicit in [profiles](../spec/profiles.md), including whole-batch activation suppression on overflow. Presentation describes declared appearances rather than imposing either consumer's widget style. Synthetic cases cover every component and the logical input/update boundaries. diff --git a/governance/profile-arithmetic.md b/governance/profile-arithmetic.md new file mode 100644 index 0000000..c31ba81 --- /dev/null +++ b/governance/profile-arithmetic.md @@ -0,0 +1,26 @@ +# Candidate profile arithmetic audit + +Review of PR #29 compared B04 against +[MduX `blend()` at a3f8b6d](https://github.com/ambroise-leclerc/MduX/blob/a3f8b6daae073472b9a6f6b472ee9818b3faedf8/src/verify/Verify.cpp). +The source snapshot was inspected without modifications to those files. + +B04 supplies an opaque background, a source RGB byte `s`, and source alpha byte `a`. The MduX +helper additionally takes coverage `c`; the equivalent call uses `c = 255`, not `c = a`. +Using alpha twice would incorrectly square the opacity. + +Let `b` be the background channel and `d = s-b`. B04 is +`b + floor((d*a + 127)/255)`. MduX uses a denominator `255*255`, numerator `d*a*255`, and rounds +the signed delta to nearest with half away from zero before adding `b`. Dividing numerator and +denominator by 255 gives the same rational `d*a/255`. Since 255 is odd and `d*a` is integral, +there is no exact half-integer tie. Both rules therefore choose the same nearest integer, including +for negative `d`. Both preserve output alpha 255 for an opaque background. + +An independent temporary arithmetic program enumerated all `256^3 = 16,777,216` `(s,b,a)` channel +triples and found zero differences between those two expressions. It implemented only the two +arithmetic expressions and did not render a frame or execute either consumer. The corpus pins +both sides of the 127/128 rounding boundary, ascending and descending spans, transparency, +opacity and extreme channel values. Consumer execution of the profile corpus remains required. + +I01 deliberately uses mathematical floor. For example, `-1/2` normalizes to `-1`, while C/C++ +integer truncation produces `0`; `normalize-negative-floor.json` and +`normalize-negative-nonunit.json` distinguish them. diff --git a/profiles/presentation-fixture.json b/profiles/presentation-fixture.json deleted file mode 100644 index 170428d..0000000 --- a/profiles/presentation-fixture.json +++ /dev/null @@ -1,312 +0,0 @@ -{ - "theme": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "font": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "assets": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - "backend": "synthetic", - "surface": [ - 20, - 20 - ], - "variants": [ - { - "component": "Row", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": null, - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "CriticalButton", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "Button", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "VulkanViewport", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": null, - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "SignalTrace", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": null, - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "NumericDisplay", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "StatusIndicator", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "Label", - "pressed": false, - "focused": false, - "face": null, - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "Clock", - "pressed": false, - "focused": false, - "face": null, - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "Image", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": null, - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "TextInput", - "pressed": false, - "focused": false, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "Button", - "pressed": true, - "focused": false, - "face": [ - 1, - 1, - 8, - 8 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": null, - "clip": true - }, - { - "component": "TextInput", - "pressed": false, - "focused": true, - "face": [ - 0, - 0, - 10, - 10 - ], - "label": [ - 1, - 2, - 8, - 6 - ], - "tint": [ - 255, - 0, - 0, - 255 - ], - "caret": [ - 2, - 2, - 1, - 6 - ], - "clip": true - } - ] -} diff --git a/profiles/registry.json b/profiles/registry.json index 0379edb..c48db56 100644 --- a/profiles/registry.json +++ b/profiles/registry.json @@ -47,7 +47,13 @@ "version": 1, "rules": [ "P01", - "P02", + "P02" + ] + }, + { + "id": "MEDUI-PROFILE-PIXELS", + "version": 1, + "rules": [ "P03" ] } diff --git a/schemas/consumer-manifest.schema.json b/schemas/consumer-manifest.schema.json index 6fb291f..4b15139 100644 --- a/schemas/consumer-manifest.schema.json +++ b/schemas/consumer-manifest.schema.json @@ -61,7 +61,8 @@ "MEDUI-PROFILE-EVIDENCE", "MEDUI-PROFILE-INTERACTION", "MEDUI-PROFILE-BINDING", - "MEDUI-PROFILE-PRESENTATION" + "MEDUI-PROFILE-PRESENTATION", + "MEDUI-PROFILE-PIXELS" ] }, "version": { diff --git a/schemas/presentation.schema.json b/schemas/presentation.schema.json index 0b203ea..8a518af 100644 --- a/schemas/presentation.schema.json +++ b/schemas/presentation.schema.json @@ -21,8 +21,27 @@ "pattern": "^[0-9a-f]{64}$" }, "assets": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" + "type": "array", + "uniqueItems": true, + "description": "Unique logical artifact IDs in strictly ascending ASCII order; ordering and ID uniqueness are semantic identity constraints.", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "digest" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9./_-]*$" + }, + "digest": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + } + } + } }, "backend": { "type": "string", diff --git a/schemas/profile-case.schema.json b/schemas/profile-case.schema.json index 13d4128..9d8ef54 100644 --- a/schemas/profile-case.schema.json +++ b/schemas/profile-case.schema.json @@ -30,7 +30,8 @@ "MEDUI-PROFILE-EVIDENCE", "MEDUI-PROFILE-INTERACTION", "MEDUI-PROFILE-BINDING", - "MEDUI-PROFILE-PRESENTATION" + "MEDUI-PROFILE-PRESENTATION", + "MEDUI-PROFILE-PIXELS" ] }, "version": { diff --git a/spec/profiles.md b/spec/profiles.md index 72e3cf0..016a884 100644 --- a/spec/profiles.md +++ b/spec/profiles.md @@ -11,6 +11,8 @@ are optional, independent of compiler phases, and require every case for the cla `profiles` is an optional, nonempty array in the consumer manifest; duplicate claims are rejected. An absent array claims nothing. An unknown ID/version or unknown manifest key is rejected. Presentation and binding claims do not imply interaction or exact-pixel equivalence. +`MEDUI-PROFILE-PRESENTATION/1` covers P01/P02 only. Exact-pixel support is a separate optional +`MEDUI-PROFILE-PIXELS/1` claim covering P03; a presentation-only consumer need not claim it. Each `conformance/profiles/*.json` file is a portable observation vector. `inputs` describes public observations or a logical scenario, and `expected` is the required observable result. @@ -140,6 +142,8 @@ report bytes are not conformance outputs; MedUI prescribes no canonical report s Consumers may retain their own canonical committed reports and emit this envelope as a derived artifact. The schema's rendered profile/check IDs and versions track the candidate registry and R01–R04; adding a released version requires updating the schema identity under the minor policy. +This envelope is intentionally rendered-only. Interaction, binding, presentation and pixel +profiles produce their specified operation outputs rather than E01 report rows. ## MEDUI-PROFILE-INTERACTION, version 1 @@ -150,7 +154,9 @@ not a platform input API or device-runtime policy. - **I01 — coordinates.** Input coordinates and origin are integers; positive integer `scaleNumerator` and `scaleDenominator` give device pixels per authored pixel. Normalize each axis exactly once - with `floor((device-origin)*scaleDenominator/scaleNumerator)`, including negative values. Points + with `floor((device-origin)*scaleDenominator/scaleNumerator)`, including negative values. + Floor means rounding toward negative infinity, not integer truncation toward zero: `-1/2` + normalizes to `-1`. Points outside `[0,width) × [0,height)` hit nothing; they are never clamped to an edge control. - **I02 — hit.** Search reverse paint order using half-open rectangles intersected with the surface and explicit ancestor clip. The first containing node occludes every node below it, @@ -200,7 +206,8 @@ checks. `bind` vectors isolate a single node and may repeat screen in entries to - **B02 — formatting.** NumericDisplay receives a signed decimal integer string without leading zeros (except `0`), a nonnegative decimal scale, and explicit prefix/suffix. It inserts a decimal point `scale` digits from the right, zero-padding as needed, with ASCII digits, `.` separator, - no grouping and no rounding. Declarations supply positive `maxDigits` (excluding sign) and + no grouping and no rounding. At `scale = 0`, omit the decimal point entirely; for example, + integer `123` renders `123`, not `123.`. Declarations supply positive `maxDigits` (excluding sign) and nonnegative `maxScale`; exceeding either fails. Prefix/suffix are baked template strings, not arbitrary application text. Negative zero is invalid. Clock renders `HH:MM:SS` or `YYYY-MM-DD HH:MM:SS`, zero-padded. StatusIndicator receives a zero-based integer index into @@ -213,9 +220,15 @@ checks. `bind` vectors isolate a single node and may repeat screen in entries to bottom and pixels left to right, no padding. Invalid dimensions, lengths, format or channels fail atomically; no inferred resizing, wraparound or clamping. Composition over opaque RGB8 background is per channel `floor((src*alpha + bg*(255-alpha) + 127)/255)` with output alpha 255. + Alpha is the source pixel's byte alpha; there is no additional glyph-coverage factor. Thus a + consumer blend with separate source-alpha and coverage inputs uses full coverage (255). Transparent source leaves background unchanged. Geometry for traces and all widget appearance are supplied by the independently declared presentation configuration. +The [arithmetic audit](../governance/profile-arithmetic.md) derives the equivalence of B04 to a +signed-delta nearest-integer blend over an opaque background and records an exhaustive byte-domain +comparison. This does not claim equivalence for a second, non-full coverage factor. + ## MEDUI-PROFILE-PRESENTATION, version 1 This is a presentation-description and observation profile, not a universal widget theme. It @@ -224,7 +237,8 @@ makes each appearance choice explicit; equality is claimed only for the same con complete, unique variant resolution are additional semantic checks; schema validity alone does not establish them. -- **P01 — configuration.** The declaration identifies theme/font/asset digests, backend, surface, +- **P01 — configuration.** The declaration identifies theme/font digests, an asset array using + E01's ID/digest and ordering rules, backend, surface, and a finite set of variants for every component in `spec/component-model.md`. Each variant names component, pressed/focused state, face and label rectangles relative to the node (or `null` when absent), RGBA8 tint (or `null`), caret rectangle (or `null`), and explicit clipping. @@ -235,9 +249,20 @@ not establish them. variant, translated by node origin for rectangles, and clipped to node/surface when clipping is true. All component kinds, including Row, have observation vectors. State-dependent button face and TextInput caret are independently observable. + +## MEDUI-PROFILE-PIXELS, version 1 + +P03 is opt-in per captured product corpus, independent of P01/P02 presentation observations. +A PIXELS support claim requires all synthetic P03 vectors; it does not require publishing or +committing any product capture baseline. Product captures may stay uncommitted and specific to +a declared driver/configuration tuple. Products choose explicitly which captured corpora, if any, +use exact comparison. The presentation declaration and capture identities remain required for +each such comparison. + - **P03 — pixel evidence.** An exact-pixel comparison requires identical presentation declaration digest, theme/font/assets, backend, surface, locale, scenario and frame. Any mismatch fails - identity before pixel comparison, even if byte arrays happen to match. Once identities agree, + identity before pixel comparison, even if byte arrays happen to match. Assets use E01's ordered + array representation. Once identities agree, bytes compare exactly. Product-specific captured corpora must carry these declarations; synthetic geometry and colour vectors assert no cross-backend pixel parity. diff --git a/tools/validate.py b/tools/validate.py index 9e31e57..5470ed3 100644 --- a/tools/validate.py +++ b/tools/validate.py @@ -223,11 +223,6 @@ def main() -> None: for check in evidence_check["id"]["enum"]} if evidence_key not in declared or schema_checks != documented_checks: fail("evidence profile/check identities differ from the registry or specification") - fixture_problems = validate( - load_json(ROOT / "profiles/presentation-fixture.json"), schemas["presentation"] - ) - if fixture_problems: - fail(f"invalid synthetic presentation fixture: {fixture_problems}") claim_schema = properties["profiles"]["items"] schema_claims = { (identifier, claim_schema["properties"]["version"]["const"]) @@ -262,7 +257,8 @@ def main() -> None: else: problems = validate(case["document"], schemas[case["schema"]]) if (not problems) != case["valid"]: - fail(f"{case['id']} schema outcome differs: {problems}") + detail = "; ".join(problems) if problems else "document was accepted" + fail(f"{case['id']} schema outcome differs: {detail}") for key, rules in declared.items(): if rules - coverage[key]: fail(f"{key} has uncovered rules: {sorted(rules - coverage[key])}")