|  | // Copyright 2016 The Chromium 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. | 
|  |  | 
|  | /// 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 StringBuffer | 
|  | /// with the precise file and line number that called that function. | 
|  | int reportExpectCall(StackTrace stack, StringBuffer information) { | 
|  | final RegExp line0 = new RegExp(r'^#0 +fail \(.+\)$'); | 
|  | final RegExp line1 = new RegExp(r'^#1 +_expect \(.+\)$'); | 
|  | final RegExp line2 = new RegExp(r'^#2 +expect \(.+\)$'); | 
|  | final RegExp line3 = new RegExp(r'^#3 +expect \(.+\)$'); | 
|  | final RegExp line4 = new 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.writeln('This was caught by the test expectation on the following line:'); | 
|  | information.writeln('  ${expectMatch.group(1)} line ${expectMatch.group(2)}'); | 
|  | return 4; | 
|  | } | 
|  | return 0; | 
|  | } |