101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
/// This file contains tests that make sense only in Dart
 | 
						|
library angular2.test.facade.async_dart_spec;
 | 
						|
 | 
						|
import 'package:angular2/test_lib.dart';
 | 
						|
import 'package:angular2/src/facade/async.dart';
 | 
						|
 | 
						|
class MockException implements Error {
 | 
						|
  var message;
 | 
						|
  var stackTrace;
 | 
						|
}
 | 
						|
class NonError {
 | 
						|
  var message;
 | 
						|
}
 | 
						|
 | 
						|
void functionThatThrows() {
 | 
						|
  try {
 | 
						|
    throw new MockException();
 | 
						|
  } catch (e, stack) {
 | 
						|
    // If we lose the stack trace the message will no longer match
 | 
						|
    // the first line in the stack
 | 
						|
    e.message = stack.toString().split('\n')[0];
 | 
						|
    e.stackTrace = stack;
 | 
						|
    rethrow;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void functionThatThrowsNonError() {
 | 
						|
  try {
 | 
						|
    throw new NonError();
 | 
						|
  } catch (e, stack) {
 | 
						|
    // If we lose the stack trace the message will no longer match
 | 
						|
    // the first line in the stack
 | 
						|
    e.message = stack.toString().split('\n')[0];
 | 
						|
    rethrow;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void expectFunctionThatThrowsWithStackTrace(
 | 
						|
    Future future, AsyncTestCompleter async) {
 | 
						|
  PromiseWrapper.catchError(future, (err, StackTrace stack) {
 | 
						|
    expect(stack.toString().split('\n')[0]).toEqual(err.message);
 | 
						|
    async.done();
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
main() {
 | 
						|
  describe('async facade', () {
 | 
						|
    describe('Completer', () {
 | 
						|
      it('should preserve Error stack traces', inject([AsyncTestCompleter],
 | 
						|
          (async) {
 | 
						|
        var c = PromiseWrapper.completer();
 | 
						|
 | 
						|
        expectFunctionThatThrowsWithStackTrace(c.promise, async);
 | 
						|
 | 
						|
        try {
 | 
						|
          functionThatThrows();
 | 
						|
        } catch (e) {
 | 
						|
          c.reject(e, null);
 | 
						|
        }
 | 
						|
      }));
 | 
						|
 | 
						|
      it('should preserve error stack traces for non-Errors', inject(
 | 
						|
          [AsyncTestCompleter], (async) {
 | 
						|
        var c = PromiseWrapper.completer();
 | 
						|
 | 
						|
        expectFunctionThatThrowsWithStackTrace(c.promise, async);
 | 
						|
 | 
						|
        try {
 | 
						|
          functionThatThrowsNonError();
 | 
						|
        } catch (e, s) {
 | 
						|
          c.reject(e, s);
 | 
						|
        }
 | 
						|
      }));
 | 
						|
    });
 | 
						|
 | 
						|
    describe('PromiseWrapper', () {
 | 
						|
      describe('reject', () {
 | 
						|
        it('should preserve Error stack traces', inject([AsyncTestCompleter],
 | 
						|
            (async) {
 | 
						|
          try {
 | 
						|
            functionThatThrows();
 | 
						|
          } catch (e) {
 | 
						|
            var rejectedFuture = PromiseWrapper.reject(e, null);
 | 
						|
            expectFunctionThatThrowsWithStackTrace(rejectedFuture, async);
 | 
						|
          }
 | 
						|
        }));
 | 
						|
 | 
						|
        it('should preserve stack traces for non-Errors', inject(
 | 
						|
            [AsyncTestCompleter], (async) {
 | 
						|
          try {
 | 
						|
            functionThatThrowsNonError();
 | 
						|
          } catch (e, s) {
 | 
						|
            var rejectedFuture = PromiseWrapper.reject(e, s);
 | 
						|
            expectFunctionThatThrowsWithStackTrace(rejectedFuture, async);
 | 
						|
          }
 | 
						|
        }));
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 |