Download apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatReaderScrollStateTests.swift from SaylorTwift/openclaw: direct link, hf CLI and curl.
- Browser
- Download file 3.85 kB
-
https://huggingface.co/SaylorTwift/openclaw/resolve/main/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatReaderScrollStateTests.swift
- Command line
-
hf download hf://SaylorTwift/openclaw/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatReaderScrollStateTests.swift
-
curl -L -o ChatReaderScrollStateTests.swift https://huggingface.co/SaylorTwift/openclaw/resolve/main/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatReaderScrollStateTests.swift
3.85 kB
| import Foundation | |
| import SwiftUI | |
| import Testing | |
| @testable import OpenClawChatUI | |
| struct ChatReaderScrollStateTests { | |
| #if os(iOS) | |
| func `iOS initially restores to the live edge`() { | |
| #expect(chatReaderInitialRestorePolicy() == .liveEdge) | |
| } | |
| #elseif os(macOS) | |
| func `macOS initially restores to the latest turn`() { | |
| #expect(chatReaderInitialRestorePolicy() == .latestTurn) | |
| } | |
| #endif | |
| func `optimistic turn removal keeps the older user as the baseline`() { | |
| let olderUserID = UUID() | |
| let optimisticUserID = UUID() | |
| let transition = chatReaderUserTransition( | |
| previousID: optimisticUserID, | |
| visibleIDs: [olderUserID]) | |
| #expect(transition == .removed(latestRemainingID: olderUserID)) | |
| } | |
| func `only user removal clears the user baseline`() { | |
| let optimisticUserID = UUID() | |
| let transition = chatReaderUserTransition( | |
| previousID: optimisticUserID, | |
| visibleIDs: []) | |
| #expect(transition == .removed(latestRemainingID: nil)) | |
| } | |
| func `new user after the existing baseline starts a turn`() { | |
| let previousUserID = UUID() | |
| let newUserID = UUID() | |
| let transition = chatReaderUserTransition( | |
| previousID: previousUserID, | |
| visibleIDs: [previousUserID, newUserID]) | |
| #expect(transition == .added(newUserID)) | |
| } | |
| func `removed transient content does not offer a latest jump`() { | |
| let userID = UUID() | |
| let hasNewerContent = chatReaderHasNewerContent( | |
| after: userID, | |
| visibleIDs: [userID], | |
| hasTransientContent: false) | |
| #expect(!hasNewerContent) | |
| } | |
| func `assistant or transient content after the user offers a latest jump`() { | |
| let userID = UUID() | |
| let assistantID = UUID() | |
| #expect(chatReaderHasNewerContent( | |
| after: userID, | |
| visibleIDs: [userID, assistantID], | |
| hasTransientContent: false)) | |
| #expect(chatReaderHasNewerContent( | |
| after: userID, | |
| visibleIDs: [userID], | |
| hasTransientContent: true)) | |
| } | |
| func `drags and system animated scrolls release the follow target`() { | |
| #expect(chatReaderScrollReleasesFollow(.interacting)) | |
| #expect(chatReaderScrollReleasesFollow(.animating)) | |
| } | |
| func `idle, touch-down, and deceleration phases keep the follow target`() { | |
| #expect(!chatReaderScrollReleasesFollow(.idle)) | |
| #expect(!chatReaderScrollReleasesFollow(.tracking)) | |
| #expect(!chatReaderScrollReleasesFollow(.decelerating)) | |
| } | |
| func `streaming at the live edge never offers a latest jump`() { | |
| // #108693: the first Writing tick of a turn makes structural "newer content" true | |
| // while the reader is still at the bottom; the geometry gate must win. | |
| #expect(!chatReaderShowsJumpToLatest( | |
| hasNewerContentBelow: true, | |
| isAtLiveEdge: true, | |
| hasVisibleContent: true, | |
| isLoading: false)) | |
| } | |
| func `newer content below the viewport offers a latest jump`() { | |
| #expect(chatReaderShowsJumpToLatest( | |
| hasNewerContentBelow: true, | |
| isAtLiveEdge: false, | |
| hasVisibleContent: true, | |
| isLoading: false)) | |
| } | |
| func `loading and empty transcripts suppress the latest jump`() { | |
| #expect(!chatReaderShowsJumpToLatest( | |
| hasNewerContentBelow: true, | |
| isAtLiveEdge: false, | |
| hasVisibleContent: true, | |
| isLoading: true)) | |
| #expect(!chatReaderShowsJumpToLatest( | |
| hasNewerContentBelow: true, | |
| isAtLiveEdge: false, | |
| hasVisibleContent: false, | |
| isLoading: false)) | |
| } | |
| } | |