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', () {