// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "FLTIntegrationTestRunner.h" #import "IntegrationTestPlugin.h" @import ObjectiveC.runtime; @import UIKit; @interface FLTIntegrationTestRunner () @property IntegrationTestPlugin *integrationTestPlugin; @end @implementation FLTIntegrationTestRunner - (instancetype)init { self = [super init]; _integrationTestPlugin = [IntegrationTestPlugin instance]; return self; } - (void)testIntegrationTestWithResults:(NS_NOESCAPE FLTIntegrationTestResults)testResult { IntegrationTestPlugin *integrationTestPlugin = self.integrationTestPlugin; // Spin the runloop. while (!integrationTestPlugin.testResults) { [NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; } NSMutableSet<NSString *> *testCaseNames = [[NSMutableSet alloc] init]; [integrationTestPlugin.testResults enumerateKeysAndObjectsUsingBlock:^(NSString *test, NSString *result, BOOL *stop) { NSString *testSelectorName = [[self class] testCaseNameFromDartTestName:test]; // Validate Objective-C test names are unique after sanitization. if ([testCaseNames containsObject:testSelectorName]) { NSString *reason = [NSString stringWithFormat:@"Cannot test \"%@\", duplicate XCTestCase tests named %@", test, testSelectorName]; testResult(NSSelectorFromString(@"testDuplicateTestNames"), NO, reason); *stop = YES; return; } [testCaseNames addObject:testSelectorName]; SEL testSelector = NSSelectorFromString(testSelectorName); if ([result isEqualToString:@"success"]) { testResult(testSelector, YES, nil); } else { testResult(testSelector, NO, result); } }]; } - (NSDictionary<NSString *,UIImage *> *)capturedScreenshotsByName { return self.integrationTestPlugin.capturedScreenshotsByName; } + (NSString *)testCaseNameFromDartTestName:(NSString *)dartTestName { NSString *capitalizedString = dartTestName.localizedCapitalizedString; // Objective-C method names must be alphanumeric. NSCharacterSet *disallowedCharacters = NSCharacterSet.alphanumericCharacterSet.invertedSet; // Remove disallowed characters. NSString *upperCamelTestName = [[capitalizedString componentsSeparatedByCharactersInSet:disallowedCharacters] componentsJoinedByString:@""]; return [NSString stringWithFormat:@"test%@", upperCamelTestName]; } @end