Chain.terse shouldn't return an empty chain.
R=rnystrom@google.com
BUG=
Review URL: https://codereview.chromium.org//116913003
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/stack_trace@31177 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/stack_trace/lib/src/chain.dart b/pkgs/stack_trace/lib/src/chain.dart
index f6e2f3f..4055bc8 100644
--- a/pkgs/stack_trace/lib/src/chain.dart
+++ b/pkgs/stack_trace/lib/src/chain.dart
@@ -157,10 +157,19 @@
/// This calls [Trace.terse] on every trace in [traces], and discards any
/// trace that contain only internal frames.
Chain get terse {
- return new Chain(traces.map((trace) => trace.terse).where((trace) {
+ var terseTraces = traces.map((trace) => trace.terse);
+ var nonEmptyTraces = terseTraces.where((trace) {
// Ignore traces that contain only internal processing.
return trace.frames.length > 1;
- }));
+ });
+
+ // If all the traces contain only internal processing, preserve the last
+ // (top-most) one so that the chain isn't empty.
+ if (nonEmptyTraces.isEmpty && terseTraces.isNotEmpty) {
+ return new Chain([terseTraces.last]);
+ }
+
+ return new Chain(nonEmptyTraces);
}
/// Converts [this] to a [Trace].
diff --git a/pkgs/stack_trace/test/chain_test.dart b/pkgs/stack_trace/test/chain_test.dart
index 4d31acb..9c16690 100644
--- a/pkgs/stack_trace/test/chain_test.dart
+++ b/pkgs/stack_trace/test/chain_test.dart
@@ -386,6 +386,21 @@
'$userSlashCode 10:11 Foo.bar\n'
'dart:core Bar.baz\n'));
});
+
+ test("doesn't return in an empty chain", () {
+ var chain = new Chain([
+ new Trace.parse(
+ 'dart:core 10:11 Foo.bar\n'
+ 'package:stack_trace/stack_trace.dart 10:11 Bar.baz\n'
+ 'dart:core 10:11 Zip.zap'),
+ new Trace.parse(
+ 'dart:core 10:11 A.b\n'
+ 'package:stack_trace/stack_trace.dart 10:11 C.d\n'
+ 'dart:core 10:11 E.f')
+ ]);
+
+ expect(chain.terse.toString(), equals('dart:core E.f\n'));
+ });
});
test('Chain.toTrace eliminates asynchronous gaps', () {