From 6983a4ed2137bf1a8377e5d1cf82183e02e617f8 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sat, 13 Jun 2026 14:08:17 +0800
Subject: [PATCH] Fix multi-page targeting and split view tile QA

---
 C1.source/Tests/AlignerCoreTests/AlignerCoreTests.swift |   88 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 87 insertions(+), 1 deletions(-)

diff --git a/C1.source/Tests/AlignerCoreTests/AlignerCoreTests.swift b/C1.source/Tests/AlignerCoreTests/AlignerCoreTests.swift
index e583820..b83efb7 100644
--- a/C1.source/Tests/AlignerCoreTests/AlignerCoreTests.swift
+++ b/C1.source/Tests/AlignerCoreTests/AlignerCoreTests.swift
@@ -873,6 +873,7 @@
                 "schemaVersion",
                 "quickSwitch.showMinimizedWindows",
                 "quickSwitch.showFullscreenWindows",
+                "quickSwitch.waterfallViewMode",
                 "appearance.theme",
                 "appearance.language",
                 "spaces.displayStrategy"
@@ -885,9 +886,10 @@
     }
 
     func testDefaultPreferencesMatchRound0Decisions() {
-        XCTAssertEqual(PreferenceSchema.version, 1)
+        XCTAssertEqual(PreferenceSchema.version, 2)
         XCTAssertEqual(PreferenceSchema.defaults.showMinimizedWindows, true)
         XCTAssertEqual(PreferenceSchema.defaults.showFullscreenWindows, true)
+        XCTAssertEqual(PreferenceSchema.defaults.quickSwitchWaterfallViewMode, .verticalColumns)
         XCTAssertEqual(PreferenceSchema.defaults.theme, .system)
         XCTAssertEqual(PreferenceSchema.defaults.language, .system)
         XCTAssertEqual(PreferenceSchema.defaults.spaceDisplayStrategy, .includeVisibleAndFullscreen)
@@ -908,6 +910,7 @@
         let preferences = AlignerPreferences(
             showMinimizedWindows: false,
             showFullscreenWindows: false,
+            quickSwitchWaterfallViewMode: .horizontalMasonry,
             theme: .dark,
             language: .simplifiedChinese,
             spaceDisplayStrategy: .currentSpaceOnly
@@ -945,12 +948,14 @@
         userDefaults.set("not-a-theme", forKey: PreferenceKey.theme.storageKey)
         userDefaults.set("not-a-language", forKey: PreferenceKey.language.storageKey)
         userDefaults.set("not-a-space-strategy", forKey: PreferenceKey.spaceDisplayStrategy.storageKey)
+        userDefaults.set("not-a-waterfall-mode", forKey: PreferenceKey.quickSwitchWaterfallViewMode.storageKey)
 
         let preferences = UserDefaultsPreferenceStore(userDefaults: userDefaults).read()
 
         XCTAssertEqual(preferences.theme, PreferenceSchema.defaults.theme)
         XCTAssertEqual(preferences.language, PreferenceSchema.defaults.language)
         XCTAssertEqual(preferences.spaceDisplayStrategy, PreferenceSchema.defaults.spaceDisplayStrategy)
+        XCTAssertEqual(preferences.quickSwitchWaterfallViewMode, PreferenceSchema.defaults.quickSwitchWaterfallViewMode)
     }
 
     @MainActor
@@ -1436,6 +1441,87 @@
         XCTAssertNil(QuickSwitchSpaceFilterPolicy.singleFullscreenSelection(inSpaceID: 12, viewModel: viewModel))
     }
 
+    func testQuickSwitchViewModelOrdersSplitViewAppNamesByWindowFrame() {
+        let leftApp = AlignerApp(bundleIdentifier: "com.example.Left", name: "Left App", category: .generic)
+        let rightApp = AlignerApp(bundleIdentifier: "com.example.Right", name: "Right App", category: .generic)
+        let displayUUID = "display-a"
+        let snapshot = QuickSwitchSnapshotBuilder.snapshot(
+            displays: [
+                AlignerDisplay(
+                    uuid: displayUUID,
+                    physical: true,
+                    spaces: [
+                        AlignerSpace(id: 20, type: .fullscreen, displayUUID: displayUUID, index: 1)
+                    ]
+                )
+            ],
+            windows: [
+                AlignerWindow(
+                    id: 2,
+                    app: rightApp,
+                    title: "Right",
+                    isFullscreen: true,
+                    frame: CGRect(x: 960, y: 0, width: 960, height: 1080),
+                    spaceIDs: [20]
+                ),
+                AlignerWindow(
+                    id: 1,
+                    app: leftApp,
+                    title: "Left",
+                    isFullscreen: true,
+                    frame: CGRect(x: 0, y: 0, width: 960, height: 1080),
+                    spaceIDs: [20]
+                )
+            ]
+        )
+
+        let viewModel = QuickSwitchViewModelBuilder.viewModel(from: snapshot)
+        let space = viewModel.displays.single?.spaces.single
+
+        XCTAssertEqual(space?.splitViewAppNames, ["Left App", "Right App"])
+        XCTAssertEqual(space?.appNames, ["Left App", "Right App"])
+    }
+
+    func testQuickSwitchViewModelKeepsDuplicateAppNamesForSameAppSplitView() {
+        let finder = AlignerApp(bundleIdentifier: "com.apple.finder", name: "访达", category: .finder)
+        let displayUUID = "display-a"
+        let snapshot = QuickSwitchSnapshotBuilder.snapshot(
+            displays: [
+                AlignerDisplay(
+                    uuid: displayUUID,
+                    physical: true,
+                    spaces: [
+                        AlignerSpace(id: 21, type: .fullscreen, displayUUID: displayUUID, index: 1)
+                    ]
+                )
+            ],
+            windows: [
+                AlignerWindow(
+                    id: 12,
+                    app: finder,
+                    title: "右侧访达",
+                    isFullscreen: true,
+                    frame: CGRect(x: 900, y: 0, width: 900, height: 1000),
+                    spaceIDs: [21]
+                ),
+                AlignerWindow(
+                    id: 11,
+                    app: finder,
+                    title: "左侧访达",
+                    isFullscreen: true,
+                    frame: CGRect(x: 0, y: 0, width: 900, height: 1000),
+                    spaceIDs: [21]
+                )
+            ]
+        )
+
+        let viewModel = QuickSwitchViewModelBuilder.viewModel(from: snapshot)
+        let space = viewModel.displays.single?.spaces.single
+
+        XCTAssertEqual(space?.splitViewAppNames, ["访达", "访达"])
+        XCTAssertEqual(space?.appNames, ["访达"])
+    }
+
     func testQuickSwitchFocusPolicySelectsFirstStableWindowInitially() {
         let app = makeApp()
         let snapshot = QuickSwitchSnapshotBuilder.snapshot(

--
Gitblit v1.9.3