// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import "package:expect/async_helper.dart";
import "package:expect/expect.dart";
import "dart:async";

void main() {
  StackTrace stack;
  try {
    throw 0;
  } catch (e, s) {
    stack = s;
  }
  var string = "$stack";
  StackTrace stringTrace = new StackTrace.fromString(string);
  Expect.isTrue(stringTrace is StackTrace);
  Expect.equals(stack.toString(), stringTrace.toString());

  string = "some random string, nothing like a StackTrace";
  stringTrace = new StackTrace.fromString(string);
  Expect.isTrue(stringTrace is StackTrace);
  Expect.equals(string, stringTrace.toString());

  // Use stacktrace asynchronously.
  asyncStart();
  var c = new Completer();
  c.completeError(0, stringTrace);
  c.future
      .then<Null>(
        (v) {
          throw "Unexpected value: $v";
        },
        onError: (e, s) {
          Expect.equals(string, s.toString());
        },
      )
      .then((_) {
        var c = new StreamController();
        c.stream.listen(
          (v) {
            throw "Unexpected value: $v";
          },
          onError: (e, s) {
            Expect.equals(string, s.toString());
            asyncEnd();
          },
        );
        c.addError(0, stringTrace);
        c.close();
      });
}
