175 lines
5.2 KiB
Objective-C
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
|