Ariver
2026-06-09 6a49b26ff3ef989844673cb77d2700404242c424
C3.tools/round1-waterfall-fixture-qa.sh
@@ -119,6 +119,18 @@
    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")
@@ -131,6 +143,10 @@
    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")
@@ -142,9 +158,9 @@
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")