5 #import <Foundation/Foundation.h>
6 #import <Metal/Metal.h>
7 #import <OCMock/OCMock.h>
12 #import "flutter/testing/testing.h"
20 - (nonnull instancetype)initWithImplicitView:(nonnull
FlutterView*)view;
25 - (nonnull instancetype)initWithImplicitView:(nonnull
FlutterView*)view {
45 typedef void (^PresentBlock)(NSArray<FlutterSurfacePresentInfo*>*);
47 id<FlutterViewProvider> MockViewProvider(PresentBlock onPresent = nil) {
51 __block id<MTLTexture> textureMock = OCMProtocolMock(
@protocol(MTLTexture));
53 OCMStub([viewMock surfaceManager]).andReturn(surfaceManagerMock);
55 OCMStub([surfaceManagerMock surfaceForSize:CGSize{}])
56 .ignoringNonObjectArgs()
57 .andDo(^(NSInvocation* invocation) {
59 [invocation getArgument:&size atIndex:2];
60 OCMStub([textureMock width]).andReturn(size.width);
61 OCMStub([textureMock height]).andReturn(size.height);
63 .andReturn(surfaceMock);
65 FlutterMetalTexture texture = {
66 .struct_size =
sizeof(FlutterMetalTexture),
68 .texture = (__bridge
void*)textureMock,
69 .user_data = (__bridge
void*)surfaceMock,
70 .destruction_callback =
nullptr,
73 OCMStub([surfaceManagerMock present:[OCMArg any] notify:[OCMArg any]])
74 .andDo(^(NSInvocation* invocation) {
75 NSArray<FlutterSurfacePresentInfo*>* info;
76 [invocation getArgument:&info atIndex:2];
77 if (onPresent != nil) {
82 OCMStub([surfaceMock asFlutterMetalTexture]).andReturn(texture);
88 TEST(FlutterCompositorTest, TestCreate) {
89 std::unique_ptr<flutter::FlutterCompositor> macos_compositor =
90 std::make_unique<FlutterCompositor>(MockViewProvider(),
93 FlutterBackingStore backing_store;
94 FlutterBackingStoreConfig config;
95 config.struct_size =
sizeof(FlutterBackingStoreConfig);
96 config.size.width = 800;
97 config.size.height = 600;
98 macos_compositor->CreateBackingStore(&config, &backing_store);
100 ASSERT_EQ(backing_store.type, kFlutterBackingStoreTypeMetal);
101 ASSERT_NE(backing_store.metal.texture.texture, nil);
102 id<MTLTexture> texture = (__bridge id<MTLTexture>)backing_store.metal.texture.texture;
103 ASSERT_EQ(texture.width, 800ul);
104 ASSERT_EQ(texture.height, 600ul);
107 TEST(FlutterCompositorTest, TestPresent) {
108 __block NSArray<FlutterSurfacePresentInfo*>* presentedSurfaces = nil;
110 auto onPresent = ^(NSArray<FlutterSurfacePresentInfo*>* info) {
111 presentedSurfaces = info;
114 std::unique_ptr<flutter::FlutterCompositor> macos_compositor =
115 std::make_unique<FlutterCompositor>(MockViewProvider(onPresent),
118 FlutterBackingStore backing_store;
119 FlutterBackingStoreConfig config;
120 config.struct_size =
sizeof(FlutterBackingStoreConfig);
121 config.size.width = 800;
122 config.size.height = 600;
123 macos_compositor->CreateBackingStore(&config, &backing_store);
125 FlutterLayer layers[] = {{
126 .struct_size =
sizeof(FlutterLayer),
127 .type = kFlutterLayerContentTypeBackingStore,
128 .backing_store = &backing_store,
132 const FlutterLayer* layers_ptr = layers;
136 ASSERT_EQ(presentedSurfaces.count, 1ul);