| // 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. |
| |
| // See also test_async_utils.dart which has some stack manipulation code. |
| |
| import 'package:flutter/foundation.dart'; |
| |
| /// Report call site for `expect()` call. Returns the number of frames that |
| /// should be elided if a stack were to be modified to hide the expect call, or |
| /// zero if no such call was found. |
| /// |
| /// If the head of the stack trace consists of a failure as a result of calling |
| /// the test_widgets [expect] function, this will fill the given |
| /// FlutterErrorBuilder with the precise file and line number that called that |
| /// function. |
| int reportExpectCall(StackTrace stack, List<DiagnosticsNode> information) { |
| final RegExp line0 = RegExp(r'^#0 +fail \(.+\)$'); |
| final RegExp line1 = RegExp(r'^#1 +_expect \(.+\)$'); |
| final RegExp line2 = RegExp(r'^#2 +expect \(.+\)$'); |
| final RegExp line3 = RegExp(r'^#3 +expect \(.+\)$'); |
| final RegExp line4 = RegExp(r'^#4 +[^(]+ \((.+?):([0-9]+)(?::[0-9]+)?\)$'); |
| final List<String> stackLines = stack.toString().split('\n'); |
| if (line0.firstMatch(stackLines[0]) != null && |
| line1.firstMatch(stackLines[1]) != null && |
| line2.firstMatch(stackLines[2]) != null && |
| line3.firstMatch(stackLines[3]) != null) { |
| final Match expectMatch = line4.firstMatch(stackLines[4])!; |
| assert(expectMatch != null); |
| assert(expectMatch.groupCount == 2); |
| information.add(DiagnosticsStackTrace.singleFrame( |
| 'This was caught by the test expectation on the following line', |
| frame: '${expectMatch.group(1)} line ${expectMatch.group(2)}', |
| )); |
| |
| return 4; |
| } |
| return 0; |
| } |