main function
Implementation
Future<void> main() async {
final FlutterDriver driver = await FlutterDriver.connect();
await Future.delayed(Duration(seconds: 1));
while (_running) {
String eventString =
await driver.requestData(null, timeout: const Duration(minutes: 1));
if (eventString.isEmpty) {
await Future.delayed(Duration(milliseconds: 50));
continue;
}
Map<String, dynamic> event = json.decode(eventString);
String eventAction = event[kAction];
Map<String, dynamic> eventData = event[kData];
switch (eventAction) {
case EventActionError:
{
_running = false;
print('An error occurred outside your tests...\n');
print(_redText(eventData[kError]));
print(_redText(eventData[kStacktrace]));
await driver.close();
exit(1);
}
case EventActionSuiteStart:
_handleSuiteStartEvent(eventData);
break;
case EventActionSuiteComplete:
_running = false;
break;
case EventActionTestStart:
_handleTestStartEvent(eventData);
break;
case EventActionTestComplete:
_handleTestCompleteEvent(eventData);
break;
case EventActionPrint:
_handlePrintEvent(eventData);
break;
}
}
await driver.close();
print('');
if (_failedTestEvents.isEmpty) {
print('------------------------------');
print('');
if (testsPassingCount == 0) {
stdout.writeln(_redText(' ✘ ') + 'No tests were ran.');
print('');
exit(1);
} else {
stdout.writeln(_greenText(' ✔ ') +
'$testsPassingCount tests completed successfully.');
print('');
exit(0);
}
} else {
print('');
print('------------------------------');
print('| Test Failures |');
print('------------------------------');
print('');
int failureCount = 1;
_failedTestEvents.values.forEach((testFailureEvent) {
String? groupName = testFailureEvent[kGroupName];
String testName = testFailureEvent[kName];
if (groupName != null) {
stdout.writeln('$failureCount) $groupName > $testName');
} else {
stdout.writeln('$failureCount) $testName');
}
String error = testFailureEvent[kError];
StackTrace stacktrace = StackTrace.fromString(
testFailureEvent[kStacktrace]
.replaceAll(Directory.current.path.replaceFirst('/', ''), '.'));
List<Frame> stackFrames = Trace.from(stacktrace).terse.frames;
bool firstLine = false;
Iterable<String> errorLines = error.split('\n').take(2);
errorLines.forEach((line) {
if (!firstLine) {
stdout.writeln(_redText(' [E]: $line'));
firstLine = true;
} else {
stdout.writeln(_redText(' $line'));
}
});
var longest =
stackFrames.map((frame) => frame.location.length).fold(0, math.max);
stackFrames.take(10).forEach((frame) {
String location = frame.location.replaceAll(' ', ':');
location = location.padRight(longest);
String? member = frame.member;
if (frame.isCore ||
location.contains('package:test_api') ||
location.contains('package:flutter_test') ||
location.contains('package:stack_trace')) {
stdout.writeln(_grayText(' ├─ $location $member'));
} else {
stdout.writeln(_boldText(' ├─ $location $member'));
}
});
print('');
print('');
failureCount++;
});
exit(_failedTestEvents.length);
}
}