|  | @@ -120,20 +120,20 @@
 | 
	
		
			
			| 120 | 120 |  	initialOptions.topBar.title.text = [[Text alloc] initWithValue:@"the title"];
 | 
	
		
			
			| 121 | 121 |  	RNNLayoutInfo* layoutInfo = [RNNLayoutInfo new];
 | 
	
		
			
			| 122 | 122 |  	RNNTestRootViewCreator* creator = [[RNNTestRootViewCreator alloc] init];
 | 
	
		
			
			| 123 |  | -
 | 
	
		
			
			|  | 123 | +	
 | 
	
		
			
			| 124 | 124 |  	RNNViewControllerPresenter* presenter = [[RNNViewControllerPresenter alloc] init];
 | 
	
		
			
			| 125 | 125 |  	RNNRootViewController* vc = [[RNNRootViewController alloc] initWithLayoutInfo:layoutInfo rootViewCreator:creator eventEmitter:nil presenter:presenter options:initialOptions defaultOptions:nil];
 | 
	
		
			
			| 126 |  | -
 | 
	
		
			
			|  | 126 | +	
 | 
	
		
			
			| 127 | 127 |  	RNNNavigationController* nav = [[RNNNavigationController alloc] initWithLayoutInfo:nil creator:creator options:[[RNNNavigationOptions alloc] initEmptyOptions] defaultOptions:nil presenter:[[RNNNavigationControllerPresenter alloc] init] eventEmitter:nil childViewControllers:@[vc]];
 | 
	
		
			
			| 128 | 128 |  	
 | 
	
		
			
			| 129 | 129 |  	[vc viewWillAppear:false];
 | 
	
		
			
			| 130 | 130 |  	XCTAssertTrue([vc.navigationItem.title isEqual:@"the title"]);
 | 
	
		
			
			| 131 |  | -
 | 
	
		
			
			|  | 131 | +	
 | 
	
		
			
			| 132 | 132 |  	[self.uut setReadyToReceiveCommands:true];
 | 
	
		
			
			| 133 |  | -
 | 
	
		
			
			|  | 133 | +	
 | 
	
		
			
			| 134 | 134 |  	NSDictionary* dictFromJs = @{@"topBar": @{@"background" : @{@"color" : @(0xFFFF0000)}}};
 | 
	
		
			
			| 135 | 135 |  	UIColor* expectedColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
 | 
	
		
			
			| 136 |  | -
 | 
	
		
			
			|  | 136 | +	
 | 
	
		
			
			| 137 | 137 |  	[self.uut mergeOptions:@"componentId" options:dictFromJs completion:^{
 | 
	
		
			
			| 138 | 138 |  		XCTAssertTrue([vc.navigationItem.title isEqual:@"the title"]);
 | 
	
		
			
			| 139 | 139 |  		XCTAssertTrue([nav.navigationBar.barTintColor isEqual:expectedColor]);
 | 
	
	
		
			
			|  | @@ -193,7 +193,7 @@
 | 
	
		
			
			| 193 | 193 |  - (void)testShowOverlay_invokeNavigationCommandEventWithLayout {
 | 
	
		
			
			| 194 | 194 |  	[self.uut setReadyToReceiveCommands:true];
 | 
	
		
			
			| 195 | 195 |  	OCMStub([self.overlayManager showOverlayWindow:[OCMArg any]]);
 | 
	
		
			
			| 196 |  | -	id mockedVC = [OCMockObject partialMockForObject:self.vc1];	
 | 
	
		
			
			|  | 196 | +	id mockedVC = [OCMockObject partialMockForObject:self.vc1];
 | 
	
		
			
			| 197 | 197 |  	OCMStub([self.controllerFactory createLayout:[OCMArg any]]).andReturn(mockedVC);
 | 
	
		
			
			| 198 | 198 |  	
 | 
	
		
			
			| 199 | 199 |  	NSDictionary* layout = @{};
 | 
	
	
		
			
			|  | @@ -216,10 +216,10 @@
 | 
	
		
			
			| 216 | 216 |  	[self.uut setReadyToReceiveCommands:true];
 | 
	
		
			
			| 217 | 217 |  	NSString* componentId = @"componentId";
 | 
	
		
			
			| 218 | 218 |  	UIViewController* returnedView = [UIViewController new];
 | 
	
		
			
			| 219 |  | -
 | 
	
		
			
			|  | 219 | +	
 | 
	
		
			
			| 220 | 220 |  	id classMock = OCMClassMock([RNNLayoutManager class]);
 | 
	
		
			
			| 221 | 221 |  	OCMStub(ClassMethod([classMock findComponentForId:componentId])).andReturn(returnedView);
 | 
	
		
			
			| 222 |  | -
 | 
	
		
			
			|  | 222 | +	
 | 
	
		
			
			| 223 | 223 |  	[[self.overlayManager expect] dismissOverlay:returnedView];
 | 
	
		
			
			| 224 | 224 |  	[self.uut dismissOverlay:componentId commandId:@"" completion:^{} rejection:^(NSString *code, NSString *message, NSError *error) {}];
 | 
	
		
			
			| 225 | 225 |  	[self.overlayManager verify];
 | 
	
	
		
			
			|  | @@ -289,6 +289,44 @@
 | 
	
		
			
			| 289 | 289 |  	XCTAssertTrue([_nvc.viewControllers isEqual:newViewControllers]);
 | 
	
		
			
			| 290 | 290 |  }
 | 
	
		
			
			| 291 | 291 |  
 | 
	
		
			
			|  | 292 | +- (void)testSetStackRoot_callRenderTreeAndWaitOnce {
 | 
	
		
			
			|  | 293 | +	id vc1Mock = OCMPartialMock(_vc1);
 | 
	
		
			
			|  | 294 | +	id vc2Mock = OCMPartialMock(_vc2);
 | 
	
		
			
			|  | 295 | +	NSArray* newViewControllers = @[vc1Mock, vc2Mock];
 | 
	
		
			
			|  | 296 | +	id classMock = OCMClassMock([RNNLayoutManager class]);
 | 
	
		
			
			|  | 297 | +	OCMStub(ClassMethod([classMock findComponentForId:@"vc1"])).andReturn(_nvc);
 | 
	
		
			
			|  | 298 | +	OCMStub([self.controllerFactory createChildrenLayout:[OCMArg any]]).andReturn(newViewControllers);
 | 
	
		
			
			|  | 299 | +	[self.uut setReadyToReceiveCommands:true];
 | 
	
		
			
			|  | 300 | +	[self.uut setStackRoot:@"vc1" commandId:@"" children:nil completion:^{
 | 
	
		
			
			|  | 301 | +		
 | 
	
		
			
			|  | 302 | +	} rejection:^(NSString *code, NSString *message, NSError *error) {
 | 
	
		
			
			|  | 303 | +		
 | 
	
		
			
			|  | 304 | +	}];
 | 
	
		
			
			|  | 305 | +	
 | 
	
		
			
			|  | 306 | +	[[vc1Mock expect] renderTreeAndWait:NO perform:[OCMArg any]];
 | 
	
		
			
			|  | 307 | +	[[vc2Mock expect] renderTreeAndWait:NO perform:[OCMArg any]];
 | 
	
		
			
			|  | 308 | +}
 | 
	
		
			
			|  | 309 | +
 | 
	
		
			
			|  | 310 | +- (void)testSetStackRoot_waitForRender {
 | 
	
		
			
			|  | 311 | +	_vc2.options.animations.setStackRoot.waitForRender = [[Bool alloc] initWithBOOL:YES];
 | 
	
		
			
			|  | 312 | +	id vc1Mock = OCMPartialMock(_vc1);
 | 
	
		
			
			|  | 313 | +	id vc2Mock = OCMPartialMock(_vc2);
 | 
	
		
			
			|  | 314 | +	OCMStub([vc2Mock renderTreeAndWait:YES perform:[OCMArg any]]);
 | 
	
		
			
			|  | 315 | +	NSArray* newViewControllers = @[vc1Mock, vc2Mock];
 | 
	
		
			
			|  | 316 | +	id classMock = OCMClassMock([RNNLayoutManager class]);
 | 
	
		
			
			|  | 317 | +	OCMStub(ClassMethod([classMock findComponentForId:@"vc1"])).andReturn(_nvc);
 | 
	
		
			
			|  | 318 | +	OCMStub([self.controllerFactory createChildrenLayout:[OCMArg any]]).andReturn(newViewControllers);
 | 
	
		
			
			|  | 319 | +	[self.uut setReadyToReceiveCommands:true];
 | 
	
		
			
			|  | 320 | +	[self.uut setStackRoot:@"vc1" commandId:@"" children:nil completion:^{
 | 
	
		
			
			|  | 321 | +		
 | 
	
		
			
			|  | 322 | +	} rejection:^(NSString *code, NSString *message, NSError *error) {
 | 
	
		
			
			|  | 323 | +		
 | 
	
		
			
			|  | 324 | +	}];
 | 
	
		
			
			|  | 325 | +	
 | 
	
		
			
			|  | 326 | +	[[vc1Mock expect] renderTreeAndWait:NO perform:[OCMArg any]];
 | 
	
		
			
			|  | 327 | +	[[vc2Mock expect] renderTreeAndWait:YES perform:[OCMArg any]];
 | 
	
		
			
			|  | 328 | +}
 | 
	
		
			
			|  | 329 | +
 | 
	
		
			
			| 292 | 330 |  - (void)testSetRoot_waitForRenderTrue {
 | 
	
		
			
			| 293 | 331 |  	[self.uut setReadyToReceiveCommands:true];
 | 
	
		
			
			| 294 | 332 |  	self.vc1.options = [[RNNNavigationOptions alloc] initEmptyOptions];
 |