116 lines
3.9 KiB
Swift
116 lines
3.9 KiB
Swift
import XCTest
|
|
@testable import Rosetta
|
|
|
|
/// Tests for ChatList bottom inset bug fix.
|
|
/// Bug: Unwanted horizontal strip appears at bottom of ChatList (not in Calls/Settings).
|
|
/// Fix: keep platform-specific bottom inset (72 on iOS < 26 custom tab bar, 0 on iOS 26+).
|
|
final class ChatListBottomInsetTests: XCTestCase {
|
|
|
|
var controller: ChatListCollectionController!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
controller = ChatListCollectionController()
|
|
}
|
|
|
|
override func tearDown() {
|
|
controller = nil
|
|
super.tearDown()
|
|
}
|
|
|
|
private var expectedBottomInset: CGFloat {
|
|
if #available(iOS 26, *) {
|
|
return 0
|
|
} else {
|
|
return 72
|
|
}
|
|
}
|
|
|
|
// MARK: - RED Phase Tests (These FAIL before fix, PASS after fix)
|
|
|
|
/// Test 1: contentInset.bottom should match active tab implementation.
|
|
func testContentInsetBottomMatchesPlatform() {
|
|
// Force view load to trigger setupCollectionView()
|
|
_ = controller.view
|
|
|
|
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
|
|
XCTAssertNotNil(collectionView, "Collection view should be initialized")
|
|
|
|
// iOS 26+: native TabView handles inset automatically (0 here).
|
|
// iOS < 26: custom floating tab bar needs 72pt manual inset.
|
|
XCTAssertEqual(
|
|
collectionView?.contentInset.bottom,
|
|
expectedBottomInset,
|
|
"Bottom inset should match platform-specific tab bar behavior"
|
|
)
|
|
}
|
|
|
|
/// Test 2: Verify automatic safe area adjustment is enabled
|
|
func testContentInsetAdjustmentBehaviorIsAutomatic() {
|
|
_ = controller.view
|
|
|
|
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
|
|
XCTAssertNotNil(collectionView, "Collection view should be initialized")
|
|
|
|
XCTAssertEqual(
|
|
collectionView?.contentInsetAdjustmentBehavior,
|
|
.automatic,
|
|
"Should use automatic adjustment (respects tab bar safe area)"
|
|
)
|
|
}
|
|
|
|
/// Test 3: Verify no excessive bottom inset (must not exceed custom tab bar space).
|
|
func testBottomInsetIsNotExcessive() {
|
|
_ = controller.view
|
|
|
|
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
|
|
XCTAssertNotNil(collectionView, "Collection view should be initialized")
|
|
|
|
let maxReasonableInset: CGFloat = 72
|
|
XCTAssertLessThanOrEqual(
|
|
collectionView?.contentInset.bottom ?? 0,
|
|
maxReasonableInset,
|
|
"Bottom inset should not exceed \(maxReasonableInset)pt"
|
|
)
|
|
}
|
|
|
|
// MARK: - Integration Tests
|
|
|
|
/// Test 4: Verify controller can be instantiated without crashes
|
|
func testControllerInitialization() {
|
|
XCTAssertNotNil(controller, "Controller should initialize successfully")
|
|
_ = controller.view
|
|
XCTAssertNotNil(controller.view, "View should load without crashes")
|
|
}
|
|
|
|
/// Test 5: Verify collection view constraints are properly set
|
|
func testCollectionViewConstraints() {
|
|
_ = controller.view
|
|
|
|
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
|
|
XCTAssertNotNil(collectionView, "Collection view should be initialized")
|
|
|
|
// Collection view should be edge-to-edge (no custom insets)
|
|
XCTAssertFalse(
|
|
collectionView?.translatesAutoresizingMaskIntoConstraints ?? true,
|
|
"Should use Auto Layout constraints"
|
|
)
|
|
}
|
|
|
|
// MARK: - Performance Tests
|
|
|
|
/// Test 6: Verify content inset query is fast (not computed on every access)
|
|
func testContentInsetPerformance() {
|
|
_ = controller.view
|
|
|
|
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
|
|
XCTAssertNotNil(collectionView)
|
|
|
|
measure {
|
|
for _ in 0..<1000 {
|
|
_ = collectionView?.contentInset.bottom
|
|
}
|
|
}
|
|
}
|
|
}
|