| | |
| | | require(column.get("appGroupIndex") == expected_index, "Waterfall appGroupIndex must be sequential") |
| | | require(column.get("appName") == app_names[expected_index], "Waterfall column name must match App Shelf name") |
| | | require(column.get("windowCount") == fixture_windows_per_app, "Waterfall column window count must match fixture") |
| | | require(column.get("appNameAlignment") == "center", "Waterfall column app name must be center aligned") |
| | | column_frame = column.get("frame", {}) |
| | | app_name_frame = column.get("appNameFrame", {}) |
| | | count_frame = column.get("countFrame", {}) |
| | | require(isinstance(app_name_frame, dict), "Waterfall column must expose appNameFrame") |
| | | require(isinstance(count_frame, dict), "Waterfall column must expose countFrame") |
| | | column_width = column_frame.get("width", 0) |
| | | app_name_center_x = app_name_frame.get("x", 0) + app_name_frame.get("width", 0) / 2 |
| | | require(abs(app_name_center_x - column_width / 2) <= 1.0, "Waterfall column app name frame must be horizontally centered") |
| | | require(app_name_frame.get("width", 0) >= column_width * 0.88, "Waterfall column app name frame must span most of the title bar") |
| | | require(count_frame.get("x", 0) + count_frame.get("width", 0) <= column_width + 1.0, "Waterfall count frame must remain inside the title bar") |
| | | require(count_frame.get("x", 0) >= column_width * 0.72, "Waterfall count frame must stay in the right side of the title bar") |
| | | require(column.get("maxVerticalScrollOffset", 0) > 0, "Long Waterfall column must expose vertical scroll overflow") |
| | | require(column.get("verticalScrollOffset") == 0, "Waterfall column should start at top") |
| | | |
| | |
| | | require(all(card.get("screenshotSource") == "notRequested" for card in cards), "Waterfall fixture cards must not start screenshot refresh") |
| | | require(all(card.get("screenshotNotRequestedReason") == "disabledByLaunchOption" for card in cards), "Waterfall fixture screenshot refresh must be disabled explicitly") |
| | | require(all(isinstance(card.get("thumbnailFrame"), dict) for card in cards), "Waterfall cards must expose thumbnail frames") |
| | | require(all(isinstance(card.get("titleBarFrame"), dict) for card in cards), "Waterfall cards must expose title bar frames") |
| | | require(all(card.get("titleBarBorderWidth") == 0 for card in cards), "Waterfall title area must not draw an enclosing rounded rectangle") |
| | | require(all(card.get("thumbnailFrame", {}).get("width", 0) >= card.get("frame", {}).get("width", 0) * 0.82 for card in cards), "Waterfall thumbnails must use most of the card width") |
| | | require(all(card.get("titleBarFrame", {}).get("y", 0) > card.get("thumbnailFrame", {}).get("y", 0) + card.get("thumbnailFrame", {}).get("height", 0) for card in cards), "Waterfall title bars must sit above thumbnails") |
| | | require(all(isinstance(card.get("appIconFrame"), dict) for card in cards), "Waterfall cards must expose App icon frames") |
| | | require(any(card.get("frame", {}).get("y", 0) < 0 for card in cards), "Long Waterfall column must have below-viewport cards at offset zero") |
| | | |
| | |
| | | selected_cards = [card for column in columns for card in column.get("cards", []) if card.get("isSelected") is True] |
| | | require(len(selected_cards) == 1, "Waterfall must expose exactly one selected card") |
| | | selected = selected_cards[0] |
| | | require("selected" in selected.get("visualStates", []), "selected Waterfall card must expose selected visual state") |
| | | require(selected.get("shineVisible") is True, "selected Waterfall card must expose shine layer") |
| | | require(selected.get("zPosition", 0) > 0, "selected Waterfall card must be above normal cards") |
| | | require("selectedVisualSuppressed" in selected.get("visualStates", []), "non-hovered selected Waterfall card must suppress selected visual state") |
| | | require(selected.get("shineVisible") is False, "non-hovered selected Waterfall card must not expose shine layer") |
| | | require(selected.get("zPosition", 0) == 0, "non-hovered selected Waterfall card must not float above normal cards") |
| | | normal_cards = [card for column in columns for card in column.get("cards", []) if card.get("isSelected") is not True] |
| | | require(normal_cards, "Waterfall fixture must include normal cards") |
| | | require(all(card.get("shineVisible") is False for card in normal_cards), "non-selected Waterfall cards must not show shine") |