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; }
 | |
| 
 | |
| 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() {
 | |
|   throw 'this is an error';
 | |
| }
 | |
| 
 | |
| void expectFunctionThatThrowsWithStackTrace(
 | |
|     Future future, AsyncTestCompleter async) {
 | |
|   PromiseWrapper.catchError(future, (err, StackTrace stack) {
 | |
|     expect(stack.toString().split('\n')[0]).toEqual(err.message);
 | |
|     async.done();
 | |
|   });
 | |
| }
 | |
| 
 | |
| void expectFunctionThatThrowsWithoutStackTrace(Future future,
 | |
|     AsyncTestCompleter async) {
 | |
|   PromiseWrapper.catchError(future, (err, StackTrace stack) {
 | |
|     expect(stack).toBe(null);
 | |
|     async.done();
 | |
|   });
 | |
| }
 | |
| 
 | |
| main() {
 | |
|   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);
 | |
|       }
 | |
|     }));
 | |
| 
 | |
|     // TODO: We might fix this one day; for now testing it to be explicit
 | |
|     it('CANNOT preserve error stack traces for non-Errors',
 | |
|         inject([AsyncTestCompleter], (async) {
 | |
|       var c = PromiseWrapper.completer();
 | |
| 
 | |
|       expectFunctionThatThrowsWithoutStackTrace(c.promise, async);
 | |
| 
 | |
|       try {
 | |
|         functionThatThrowsNonError();
 | |
|       } catch(e) {
 | |
|         c.reject(e);
 | |
|       }
 | |
|     }));
 | |
| 
 | |
|   });
 | |
| 
 | |
|   describe('PromiseWrapper', () {
 | |
| 
 | |
|     describe('reject', () {
 | |
| 
 | |
|       it('should preserve error stack traces',
 | |
|           inject([AsyncTestCompleter], (async) {
 | |
|         try {
 | |
|           functionThatThrows();
 | |
|         } catch(e) {
 | |
|           var rejectedFuture = PromiseWrapper.reject(e);
 | |
|           expectFunctionThatThrowsWithStackTrace(rejectedFuture, async);
 | |
|         }
 | |
|       }));
 | |
| 
 | |
|       // TODO: We might fix this one day; for now testing it to be explicit
 | |
|       it('CANNOT preserve stack traces for non-Errors',
 | |
|           inject([AsyncTestCompleter], (async) {
 | |
|         try {
 | |
|           functionThatThrowsNonError();
 | |
|         } catch(e) {
 | |
|           var rejectedFuture = PromiseWrapper.reject(e);
 | |
|           expectFunctionThatThrowsWithoutStackTrace(rejectedFuture, async);
 | |
|         }
 | |
|       }));
 | |
| 
 | |
|     });
 | |
| 
 | |
|   });
 | |
| }
 |