Files
peko-ios/YuMi/Modules/YMRoom/View/AnimationView/BannerSchedulerTest.m

175 lines
5.2 KiB
Objective-C

//
// BannerSchedulerTest.m
// YuMi
//
// Created by AI Assistant on 2025/1/13.
//
#import <XCTest/XCTest.h>
#import "BannerScheduler.h"
// 模拟的 Banner 数据类
@interface MockBanner : NSObject
@property (nonatomic, assign) NSInteger type;
@property (nonatomic, strong) NSDictionary *data;
@end
@implementation MockBanner
@end
// 模拟的代理类
@interface MockBannerSchedulerDelegate : NSObject <BannerSchedulerDelegate>
@property (nonatomic, strong) NSMutableArray *playedBanners;
@property (nonatomic, strong) NSMutableArray *startedBanners;
@property (nonatomic, assign) NSInteger finishCount;
@end
@implementation MockBannerSchedulerDelegate
- (instancetype)init {
if (self = [super init]) {
_playedBanners = [NSMutableArray array];
_startedBanners = [NSMutableArray array];
_finishCount = 0;
}
return self;
}
- (void)bannerScheduler:(BannerScheduler *)scheduler shouldPlayBanner:(id)banner {
[self.playedBanners addObject:banner];
NSLog(@"🧪 MockDelegate: 收到播放 Banner 请求 - 类型: %@", [banner class]);
// 模拟播放完成后通知调度器
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[scheduler markBannerFinished];
});
}
- (void)bannerSchedulerDidFinishPlaying:(BannerScheduler *)scheduler {
self.finishCount++;
NSLog(@"🧪 MockDelegate: Banner 播放完成 - 完成次数: %ld", (long)self.finishCount);
}
- (void)bannerScheduler:(BannerScheduler *)scheduler didStartPlayingBanner:(id)banner {
[self.startedBanners addObject:banner];
NSLog(@"🧪 MockDelegate: Banner 开始播放 - 类型: %@", [banner class]);
}
@end
@interface BannerSchedulerTest : XCTestCase
@property (nonatomic, strong) BannerScheduler *scheduler;
@property (nonatomic, strong) MockBannerSchedulerDelegate *mockDelegate;
@end
@implementation BannerSchedulerTest
- (void)setUp {
[super setUp];
self.mockDelegate = [[MockBannerSchedulerDelegate alloc] init];
self.scheduler = [[BannerScheduler alloc] initWithDelegate:self.mockDelegate];
}
- (void)tearDown {
self.scheduler = nil;
self.mockDelegate = nil;
[super tearDown];
}
- (void)testInitialization {
XCTAssertNotNil(self.scheduler, @"调度器应该被正确初始化");
XCTAssertEqual(self.scheduler.queueCount, 0, @"初始队列应该为空");
XCTAssertFalse(self.scheduler.isPlaying, @"初始状态应该不是播放中");
}
- (void)testEnqueueBanner {
MockBanner *banner = [[MockBanner alloc] init];
banner.type = 1;
[self.scheduler enqueueBanner:banner];
XCTAssertEqual(self.scheduler.queueCount, 1, @"队列应该包含一个 Banner");
XCTAssertTrue(self.scheduler.isPlaying, @"应该开始播放");
}
- (void)testMultipleBanners {
MockBanner *banner1 = [[MockBanner alloc] init];
banner1.type = 1;
MockBanner *banner2 = [[MockBanner alloc] init];
banner2.type = 2;
[self.scheduler enqueueBanner:banner1];
[self.scheduler enqueueBanner:banner2];
XCTAssertEqual(self.scheduler.queueCount, 2, @"队列应该包含两个 Banner");
}
- (void)testQueueSorting {
// 创建多个 Banner 并测试排序功能
MockBanner *banner1 = [[MockBanner alloc] init];
banner1.type = 1;
banner1.data = @{@"uidList": @[@"user1"], @"roomUid": @"room1"};
MockBanner *banner2 = [[MockBanner alloc] init];
banner2.type = 2;
banner2.data = @{@"uidList": @[@"user2"], @"roomUid": @"room2"};
[self.scheduler enqueueBanner:banner1];
[self.scheduler enqueueBanner:banner2];
// 等待播放完成
XCTestExpectation *expectation = [self expectationWithDescription:@"等待播放完成"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[expectation fulfill];
});
[self waitForExpectationsWithTimeout:2.0 handler:nil];
XCTAssertEqual(self.mockDelegate.playedBanners.count, 2, @"应该播放了两个 Banner");
}
- (void)testPauseAndResume {
MockBanner *banner = [[MockBanner alloc] init];
banner.type = 1;
[self.scheduler enqueueBanner:banner];
// 暂停
[self.scheduler pause];
XCTAssertTrue(self.scheduler.isPaused, @"应该处于暂停状态");
// 恢复
[self.scheduler resume];
XCTAssertFalse(self.scheduler.isPaused, @"应该不处于暂停状态");
}
- (void)testClearQueue {
MockBanner *banner1 = [[MockBanner alloc] init];
banner1.type = 1;
MockBanner *banner2 = [[MockBanner alloc] init];
banner2.type = 2;
[self.scheduler enqueueBanner:banner1];
[self.scheduler enqueueBanner:banner2];
XCTAssertEqual(self.scheduler.queueCount, 2, @"队列应该包含两个 Banner");
[self.scheduler clearQueue];
XCTAssertEqual(self.scheduler.queueCount, 0, @"队列应该被清空");
}
- (void)testQueueStatusDescription {
MockBanner *banner = [[MockBanner alloc] init];
banner.type = 1;
[self.scheduler enqueueBanner:banner];
NSString *status = [self.scheduler queueStatusDescription];
XCTAssertNotNil(status, @"状态描述不应该为空");
XCTAssertTrue([status containsString:@"BannerScheduler 状态"], @"状态描述应该包含标题");
}
@end