main function

Future<void> main()

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);
  }
}