mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
1f8fdd0b5d
* fix: preserve Maestro clickable-first ordering * test: cover Android Maestro clickable-first path * fix: keep Maestro fixture Android-only * fix: reveal Android Maestro targets in smoke scenario * fix: quote Maestro smoke assertion text * fix: retain Android Maestro clickability evidence
1148 lines
26 KiB
JSON
1148 lines
26 KiB
JSON
{
|
|
"schemaVersion": 2,
|
|
"generatedBy": "scripts/maestro-conformance/regenerate.mjs",
|
|
"upstream": {
|
|
"project": "mobile-dev-inc/Maestro",
|
|
"version": "2.5.1",
|
|
"tag": "v2.5.1",
|
|
"commit": "a4c7c95f5ba1884858f7e35efa6b8e0165db9448",
|
|
"artifacts": [
|
|
{
|
|
"coordinate": "dev.mobile:maestro-orchestra:2.5.1",
|
|
"role": "Layer 1 YAML parser (YamlCommandReader) and Layer 2 retry/erase constants (Orchestra).",
|
|
"sha256": "bbd8e5e35e3c706c6d4760bb1026162474b171155a5fa76f6de1360ab3705468"
|
|
},
|
|
{
|
|
"coordinate": "dev.mobile:maestro-orchestra-models:2.5.1",
|
|
"role": "Command model classes and parser-observed defaults (Layer 2 model defaults).",
|
|
"sha256": "0c147f7dff3704e1e04cb728339f2637a6086c234d7984c1434536680f6749ee"
|
|
},
|
|
{
|
|
"coordinate": "dev.mobile:maestro-client:2.5.1",
|
|
"role": "Layer 2 driver constants (Maestro.SCREENSHOT_DIFF_THRESHOLD/ANIMATION_TIMEOUT_MS, IOSDriver.SCREEN_SETTLE_TIMEOUT_MS).",
|
|
"sha256": "a6b8c63c0858e8e256752f617fd27b35b0be48e78d367f9cbdffa735a6fcc991"
|
|
}
|
|
]
|
|
},
|
|
"layer": 2,
|
|
"description": "Upstream Maestro semantic vectors. Generated by the JVM harness; do not hand-edit.",
|
|
"constants": [
|
|
{
|
|
"id": "retryMaxRetries",
|
|
"symbol": "maestro.orchestra.Orchestra#MAX_RETRIES_ALLOWED",
|
|
"note": "Upper bound Orchestra clamps a retry block's maxRetries to (coerceAtMost).",
|
|
"value": 3
|
|
},
|
|
{
|
|
"id": "maxEraseCharacters",
|
|
"symbol": "maestro.orchestra.Orchestra#MAX_ERASE_CHARACTERS",
|
|
"note": "Upper bound on eraseText character count.",
|
|
"value": 50
|
|
},
|
|
{
|
|
"id": "animationWaitThreshold",
|
|
"symbol": "maestro.Maestro#SCREENSHOT_DIFF_THRESHOLD",
|
|
"note": "Screenshot-diff threshold (romankh3 0-100 scale) for waitForAnimationToEnd stability.",
|
|
"value": 0.005
|
|
},
|
|
{
|
|
"id": "animationWaitTimeoutMs",
|
|
"symbol": "maestro.Maestro#ANIMATION_TIMEOUT_MS",
|
|
"note": "Default waitForAnimationToEnd timeout.",
|
|
"value": 15000
|
|
},
|
|
{
|
|
"id": "iosScreenSettleTimeoutMs",
|
|
"symbol": "maestro.drivers.IOSDriver#SCREEN_SETTLE_TIMEOUT_MS",
|
|
"note": "Upstream iOS pre-tap static-screen gate; agent-device intentionally omits it (expected divergence).",
|
|
"value": 3000
|
|
}
|
|
],
|
|
"modelDefaults": [
|
|
{
|
|
"id": "swipeDurationMs",
|
|
"flow": "- swipe:\n direction: LEFT",
|
|
"accessor": "SwipeCommand.duration",
|
|
"value": 400
|
|
}
|
|
],
|
|
"treeVectors": [
|
|
{
|
|
"id": "containsChild-direct-only",
|
|
"operation": "intersect(id=card, containsChild(id=direct))",
|
|
"selector": {
|
|
"id": "card",
|
|
"containsChild": {
|
|
"id": "direct"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "direct",
|
|
"parentKey": "card",
|
|
"identifier": "direct",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "nested-parent",
|
|
"parentKey": "card",
|
|
"identifier": "nested-parent",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "nested",
|
|
"parentKey": "nested-parent",
|
|
"identifier": "nested",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "outside",
|
|
"identifier": "outside",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "direct-outside",
|
|
"parentKey": "outside",
|
|
"identifier": "direct-outside",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["card"],
|
|
"selected": "card"
|
|
},
|
|
{
|
|
"id": "containsDescendants-any-depth",
|
|
"operation": "intersect(id=card, containsDescendants(id=nested))",
|
|
"selector": {
|
|
"id": "card",
|
|
"containsDescendants": [
|
|
{
|
|
"id": "nested"
|
|
}
|
|
]
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "direct",
|
|
"parentKey": "card",
|
|
"identifier": "direct",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "nested-parent",
|
|
"parentKey": "card",
|
|
"identifier": "nested-parent",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "nested",
|
|
"parentKey": "nested-parent",
|
|
"identifier": "nested",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["card"],
|
|
"selected": "card"
|
|
},
|
|
{
|
|
"id": "containsDescendants-all-clauses",
|
|
"operation": "intersect(id=card, containsDescendants(id=title, text=Badge))",
|
|
"selector": {
|
|
"id": "card",
|
|
"containsDescendants": [
|
|
{
|
|
"id": "title"
|
|
},
|
|
{
|
|
"text": "Badge"
|
|
}
|
|
]
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "complete-card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "title",
|
|
"parentKey": "complete-card",
|
|
"identifier": "title",
|
|
"label": "Title",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "badge",
|
|
"parentKey": "complete-card",
|
|
"identifier": "badge",
|
|
"label": "Badge",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "badge-icon",
|
|
"parentKey": "badge",
|
|
"identifier": "badge-icon",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "partial-card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "title-2",
|
|
"parentKey": "partial-card",
|
|
"identifier": "title",
|
|
"label": "Title",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["complete-card"],
|
|
"selected": "complete-card"
|
|
},
|
|
{
|
|
"id": "clickable-first-tristate-stable",
|
|
"operation": "compose(intersect(id=candidate), clickableFirst()) preserves true/false/absent groups",
|
|
"selector": {
|
|
"id": "candidate"
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "false-first",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
},
|
|
"clickable": false
|
|
},
|
|
{
|
|
"key": "true-first",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
},
|
|
"clickable": true
|
|
},
|
|
{
|
|
"key": "absent",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "true-second",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
},
|
|
"clickable": true
|
|
},
|
|
{
|
|
"key": "false-second",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
},
|
|
"clickable": false
|
|
}
|
|
],
|
|
"matches": ["false-first", "true-first", "absent", "true-second", "false-second"],
|
|
"selected": "true-first",
|
|
"clickableFirstMatches": [
|
|
"true-first",
|
|
"true-second",
|
|
"false-first",
|
|
"false-second",
|
|
"absent"
|
|
]
|
|
},
|
|
{
|
|
"id": "clickable-first-index-bypass",
|
|
"operation": "compose(intersect(id=candidate), index=0) keeps y/x ordering and bypasses clickableFirst",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"index": 0
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "clickable-later",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 200,
|
|
"width": 40,
|
|
"height": 30
|
|
},
|
|
"clickable": true
|
|
},
|
|
{
|
|
"key": "nonclickable-top",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 10,
|
|
"y": 20,
|
|
"width": 40,
|
|
"height": 30
|
|
},
|
|
"clickable": false
|
|
}
|
|
],
|
|
"matches": ["clickable-later", "nonclickable-top"],
|
|
"selected": "nonclickable-top"
|
|
},
|
|
{
|
|
"id": "nested-tree-relations",
|
|
"operation": "intersect(id=card, containsChild(intersect(id=panel, containsChild(id=title), containsDescendants(id=icon))))",
|
|
"selector": {
|
|
"id": "card",
|
|
"containsChild": {
|
|
"id": "panel",
|
|
"containsChild": {
|
|
"id": "title"
|
|
},
|
|
"containsDescendants": [
|
|
{
|
|
"id": "icon"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "panel",
|
|
"parentKey": "card",
|
|
"identifier": "panel",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "title",
|
|
"parentKey": "panel",
|
|
"identifier": "title",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "panel-icon-wrapper",
|
|
"parentKey": "panel",
|
|
"identifier": "panel-icon-wrapper",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "icon",
|
|
"parentKey": "panel-icon-wrapper",
|
|
"identifier": "icon",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "unrelated",
|
|
"parentKey": "card",
|
|
"identifier": "unrelated",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "card-missing-nested",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "panel-missing",
|
|
"parentKey": "card-missing-nested",
|
|
"identifier": "panel",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "title",
|
|
"parentKey": "panel-missing",
|
|
"identifier": "title",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["card"],
|
|
"selected": "card"
|
|
},
|
|
{
|
|
"id": "tree-composition-index-yx",
|
|
"operation": "compose(intersect(id=card, containsChild(id=title), containsDescendants(id=icon)), index=0)",
|
|
"selector": {
|
|
"id": "card",
|
|
"index": 0,
|
|
"containsChild": {
|
|
"id": "title"
|
|
},
|
|
"containsDescendants": [
|
|
{
|
|
"id": "icon"
|
|
}
|
|
]
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "card-low-x",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 220,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "title-low-x",
|
|
"parentKey": "card-low-x",
|
|
"identifier": "title",
|
|
"rect": {
|
|
"x": 8,
|
|
"y": 228,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "icon-low-x",
|
|
"parentKey": "card-low-x",
|
|
"identifier": "icon",
|
|
"rect": {
|
|
"x": 8,
|
|
"y": 260,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "card-high-x",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 160,
|
|
"y": 80,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "title-high-x",
|
|
"parentKey": "card-high-x",
|
|
"identifier": "title",
|
|
"rect": {
|
|
"x": 168,
|
|
"y": 88,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "icon-high-x",
|
|
"parentKey": "card-high-x",
|
|
"identifier": "icon",
|
|
"rect": {
|
|
"x": 168,
|
|
"y": 120,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["card-low-x", "card-high-x"],
|
|
"selected": "card-high-x"
|
|
},
|
|
{
|
|
"id": "position-below-strict-top-left",
|
|
"operation": "intersect(id=candidate, below(id=anchor))",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"below": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "candidate-above",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 40,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-equal",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 100,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-below",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 160,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 100,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["candidate-below"],
|
|
"selected": "candidate-below"
|
|
},
|
|
{
|
|
"id": "position-above-strict-top-left",
|
|
"operation": "intersect(id=candidate, above(id=anchor))",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"above": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "candidate-above",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 40,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-equal",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 100,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-below",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 160,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 100,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["candidate-above"],
|
|
"selected": "candidate-above"
|
|
},
|
|
{
|
|
"id": "position-left-right-strict-top-left",
|
|
"operation": "leftOf/rightOf use strict candidate-vs-anchor bounds.x",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"leftOf": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "left",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "equal",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 100,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "right",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 180,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 100,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["left"],
|
|
"selected": "left"
|
|
},
|
|
{
|
|
"id": "position-right-strict-top-left",
|
|
"operation": "intersect(id=candidate, rightOf(id=anchor))",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"rightOf": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "left",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "equal",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 100,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "right",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 180,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 100,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["right"],
|
|
"selected": "right"
|
|
},
|
|
{
|
|
"id": "position-multiple-anchors-distance-intermediate",
|
|
"operation": "intersect(id=candidate, below(id=anchor)); relativeTo pair order is intermediate",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"below": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "far-candidate",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 300,
|
|
"y": 240,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "near-candidate",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 40,
|
|
"y": 140,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "near-anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 40,
|
|
"y": 40,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "far-anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 300,
|
|
"y": 40,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["far-candidate", "near-candidate"],
|
|
"selected": "far-candidate",
|
|
"intermediateRelation": "below",
|
|
"intermediate": ["near-candidate", "far-candidate", "near-candidate", "far-candidate"]
|
|
},
|
|
{
|
|
"id": "position-unusable-bounds",
|
|
"operation": "intersect(id=candidate, below(id=anchor)) excludes missing bounds",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"below": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "candidate-missing",
|
|
"identifier": "candidate"
|
|
},
|
|
{
|
|
"key": "candidate-valid",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 200,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor-missing",
|
|
"identifier": "anchor"
|
|
},
|
|
{
|
|
"key": "anchor-valid",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 100,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["candidate-valid"],
|
|
"selected": "candidate-valid"
|
|
},
|
|
{
|
|
"id": "position-odd-center-integer-distance",
|
|
"operation": "relativeTo uses Bounds.center integer division and Point.distance Float",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"below": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "candidate-odd",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 1,
|
|
"y": 1,
|
|
"width": 1,
|
|
"height": 1
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-even",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 2,
|
|
"width": 0,
|
|
"height": 0
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 0,
|
|
"height": 0
|
|
}
|
|
}
|
|
],
|
|
"matches": ["candidate-odd", "candidate-even"],
|
|
"selected": "candidate-odd",
|
|
"intermediateRelation": "below",
|
|
"intermediate": ["candidate-odd", "candidate-even"]
|
|
},
|
|
{
|
|
"id": "position-zero-size-finite-bounds",
|
|
"operation": "intersect(id=candidate, below(id=anchor)) keeps zero-sized finite bounds",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"below": {
|
|
"id": "anchor"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "candidate-positive",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 180,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-zero",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 10,
|
|
"y": 200,
|
|
"width": 0,
|
|
"height": 0
|
|
}
|
|
},
|
|
{
|
|
"key": "anchor-zero",
|
|
"identifier": "anchor",
|
|
"rect": {
|
|
"x": 10,
|
|
"y": 100,
|
|
"width": 0,
|
|
"height": 0
|
|
}
|
|
}
|
|
],
|
|
"matches": ["candidate-positive", "candidate-zero"],
|
|
"selected": "candidate-positive"
|
|
},
|
|
{
|
|
"id": "position-composed-intersection-index",
|
|
"operation": "compose(intersect(id=candidate, below(id=lower), above(id=upper)), index=0)",
|
|
"selector": {
|
|
"id": "candidate",
|
|
"index": 0,
|
|
"below": {
|
|
"id": "upper"
|
|
},
|
|
"above": {
|
|
"id": "lower"
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "candidate-low",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 200,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "candidate-high",
|
|
"identifier": "candidate",
|
|
"rect": {
|
|
"x": 100,
|
|
"y": 120,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "lower",
|
|
"identifier": "lower",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 300,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "upper",
|
|
"identifier": "upper",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 80,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["candidate-low", "candidate-high"],
|
|
"selected": "candidate-high"
|
|
},
|
|
{
|
|
"id": "nested-tree-position-relation",
|
|
"operation": "intersect(id=card, containsChild(below(id=caption)))",
|
|
"selector": {
|
|
"id": "card",
|
|
"containsChild": {
|
|
"id": "field",
|
|
"below": {
|
|
"id": "caption"
|
|
}
|
|
}
|
|
},
|
|
"nodes": [
|
|
{
|
|
"key": "card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "caption",
|
|
"parentKey": "card",
|
|
"identifier": "caption",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 40,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "field",
|
|
"parentKey": "card",
|
|
"identifier": "field",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 120,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "bad-card",
|
|
"identifier": "card",
|
|
"rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "bad-field",
|
|
"parentKey": "bad-card",
|
|
"identifier": "field",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 20,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
},
|
|
{
|
|
"key": "bad-caption",
|
|
"parentKey": "bad-card",
|
|
"identifier": "caption",
|
|
"rect": {
|
|
"x": 20,
|
|
"y": 80,
|
|
"width": 40,
|
|
"height": 30
|
|
}
|
|
}
|
|
],
|
|
"matches": ["card"],
|
|
"selected": "card"
|
|
}
|
|
],
|
|
"contentHash": "7061897332fd8ae7c6af126af620dfaf875ebfaa3c3f13df87dee638c4c41bb7"
|
|
}
|