| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 /* | 
|  | 2  *  Copyright 2017 The WebRTC project authors. All Rights Reserved. | 
|  | 3  * | 
|  | 4  *  Use of this source code is governed by a BSD-style license | 
|  | 5  *  that can be found in the LICENSE file in the root of the source | 
|  | 6  *  tree. An additional intellectual property rights grant can be found | 
|  | 7  *  in the file PATENTS.  All contributing project authors may | 
|  | 8  *  be found in the AUTHORS file in the root of the source tree. | 
|  | 9  */ | 
|  | 10 | 
|  | 11 #import <Foundation/Foundation.h> | 
|  | 12 #import <OCMock/OCMock.h> | 
|  | 13 | 
|  | 14 #include "webrtc/base/gunit.h" | 
|  | 15 | 
|  | 16 #include <Metal/RTCMTLNV12Renderer.h> | 
|  | 17 #include <WebRTC/RTCMTLVideoView.h> | 
|  | 18 | 
|  | 19 // Extension of RTCMTLVideoView for testing purposes. | 
|  | 20 @interface RTCMTLVideoView (Testing) | 
|  | 21 @property(nonatomic, strong) id<RTCMTLRenderer> renderer; | 
|  | 22 @property(nonatomic, strong) UIView* metalView; | 
|  | 23 @property(atomic, strong) RTCVideoFrame* videoFrame; | 
|  | 24 | 
|  | 25 + (BOOL)isMetalAvailable; | 
|  | 26 + (UIView*)createMetalView:(CGRect)frame; | 
|  | 27 + (id<RTCMTLRenderer>)createMetalRenderer; | 
|  | 28 - (void)drawInMTKView:(id)view; | 
|  | 29 @end | 
|  | 30 | 
|  | 31 @interface RTCMTLVideoViewTests : NSObject | 
|  | 32 @property(nonatomic, strong) id classMock; | 
|  | 33 @property(nonatomic, strong) id metalViewMock; | 
|  | 34 @property(nonatomic, strong) id rendererMock; | 
|  | 35 @end | 
|  | 36 | 
|  | 37 @implementation RTCMTLVideoViewTests | 
|  | 38 | 
|  | 39 @synthesize classMock = _classMock; | 
|  | 40 @synthesize metalViewMock = _metalViewMock; | 
|  | 41 @synthesize rendererMock = _rendererMock; | 
|  | 42 | 
|  | 43 - (void)setup { | 
|  | 44   self.classMock = OCMClassMock([RTCMTLVideoView class]); | 
|  | 45 | 
|  | 46   self.metalViewMock = OCMClassMock([RTCMTLVideoViewTests class]); | 
|  | 47   // NOTE: OCMock doesen't provide modern syntax for -ignoringNonObjectArgs. | 
|  | 48   [[[[self.classMock stub] ignoringNonObjectArgs] andReturn:self.metalViewMock] | 
|  | 49       createMetalView:CGRectZero]; | 
|  | 50 | 
|  | 51   self.rendererMock = OCMProtocolMock(@protocol(RTCMTLRenderer)); | 
|  | 52   OCMStub([self.classMock createMetalRenderer]).andReturn(self.rendererMock); | 
|  | 53 } | 
|  | 54 | 
|  | 55 - (void)tearDown { | 
|  | 56   [self.classMock stopMocking]; | 
|  | 57   [self.rendererMock stopMocking]; | 
|  | 58   [self.metalViewMock stopMocking]; | 
|  | 59   self.classMock = nil; | 
|  | 60   self.rendererMock = nil; | 
|  | 61   self.metalViewMock = nil; | 
|  | 62 } | 
|  | 63 | 
|  | 64 - (void)testMetalConfigureNotExecuted { | 
|  | 65   // when | 
|  | 66   OCMStub([self.classMock isMetalAvailable]).andReturn(NO); | 
|  | 67   RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init]; | 
|  | 68 | 
|  | 69   // then | 
|  | 70   EXPECT_TRUE(realView.renderer == nil); | 
|  | 71   EXPECT_TRUE(realView.metalView == nil); | 
|  | 72 } | 
|  | 73 | 
|  | 74 - (void)testMetalConfigureExecuted { | 
|  | 75   // given | 
|  | 76   OCMStub([self.classMock isMetalAvailable]).andReturn(YES); | 
|  | 77   OCMStub([self.rendererMock addRenderingDestination:self.metalViewMock]) | 
|  | 78       .andReturn(NO); | 
|  | 79 | 
|  | 80   // when | 
|  | 81   RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init]; | 
|  | 82 | 
|  | 83   // then | 
|  | 84   EXPECT_TRUE(realView.renderer == nil); | 
|  | 85   EXPECT_TRUE(realView.metalView != nil); | 
|  | 86 } | 
|  | 87 | 
|  | 88 - (void)testMetalDrawCallback { | 
|  | 89   // given | 
|  | 90   OCMStub([self.classMock isMetalAvailable]).andReturn(NO); | 
|  | 91   OCMExpect([self.rendererMock drawFrame:[OCMArg any]]); | 
|  | 92   RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init]; | 
|  | 93   realView.metalView = self.metalViewMock; | 
|  | 94   realView.renderer = self.rendererMock; | 
|  | 95 | 
|  | 96   // when | 
|  | 97   [realView drawInMTKView:self.metalViewMock]; | 
|  | 98 | 
|  | 99   // then | 
|  | 100   [self.rendererMock verify]; | 
|  | 101 } | 
|  | 102 | 
|  | 103 - (void)testRTCVideoRenderNilFrameCallback { | 
|  | 104   // given | 
|  | 105   OCMStub([self.classMock isMetalAvailable]).andReturn(NO); | 
|  | 106   RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init]; | 
|  | 107 | 
|  | 108   // when | 
|  | 109   [realView renderFrame:nil]; | 
|  | 110 | 
|  | 111   // then | 
|  | 112   EXPECT_TRUE(realView.videoFrame == nil); | 
|  | 113 } | 
|  | 114 | 
|  | 115 - (void)testRTCVideoRenderFrameCallback { | 
|  | 116   // given | 
|  | 117   OCMStub([self.classMock isMetalAvailable]).andReturn(NO); | 
|  | 118   RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init]; | 
|  | 119   id frame = OCMClassMock([RTCVideoFrame class]); | 
|  | 120   realView.metalView = self.metalViewMock; | 
|  | 121   realView.renderer = self.rendererMock; | 
|  | 122   OCMExpect([self.rendererMock drawFrame:frame]); | 
|  | 123 | 
|  | 124   // when | 
|  | 125   [realView renderFrame:frame]; | 
|  | 126   [realView drawInMTKView:self.metalViewMock]; | 
|  | 127 | 
|  | 128   // then | 
|  | 129   EXPECT_EQ(realView.videoFrame, frame); | 
|  | 130   [self.rendererMock verify]; | 
|  | 131 } | 
|  | 132 @end | 
|  | 133 | 
|  | 134 TEST(RTCMTLVideoViewTests, MetalConfigureNotExecuted) { | 
|  | 135   RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init]; | 
|  | 136   [test setup]; | 
|  | 137   [test testMetalConfigureNotExecuted]; | 
|  | 138   [test tearDown]; | 
|  | 139 } | 
|  | 140 | 
|  | 141 | 
|  | 142 TEST(RTCMTLVideoViewTests, MetalConfigureExecuted) { | 
|  | 143   RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init]; | 
|  | 144   [test setup]; | 
|  | 145   [test testMetalConfigureExecuted]; | 
|  | 146   [test tearDown]; | 
|  | 147 } | 
|  | 148 | 
|  | 149 TEST(RTCMTLVideoViewTests, MetalDrawCallback) { | 
|  | 150   RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init]; | 
|  | 151   [test setup]; | 
|  | 152   [test testMetalDrawCallback]; | 
|  | 153   [test tearDown]; | 
|  | 154 } | 
|  | 155 | 
|  | 156 TEST(RTCMTLVideoViewTests, RTCVideoRenderNilFrameCallback) { | 
|  | 157   RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init]; | 
|  | 158   [test setup]; | 
|  | 159   [test testRTCVideoRenderNilFrameCallback]; | 
|  | 160   [test tearDown]; | 
|  | 161 } | 
|  | 162 | 
|  | 163 TEST(RTCMTLVideoViewTests, RTCVideoRenderFrameCallback) { | 
|  | 164   RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init]; | 
|  | 165   [test setup]; | 
|  | 166   [test testRTCVideoRenderFrameCallback]; | 
|  | 167   [test tearDown]; | 
|  | 168 } | 
| OLD | NEW | 
|---|