138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {provide, Provider, Component, View} from 'angular2/core';
 | 
						|
import {Type, isBlank} from 'angular2/src/facade/lang';
 | 
						|
import {BaseException} from 'angular2/src/facade/exceptions';
 | 
						|
 | 
						|
import {
 | 
						|
  ComponentFixture,
 | 
						|
  AsyncTestCompleter,
 | 
						|
  TestComponentBuilder,
 | 
						|
  beforeEach,
 | 
						|
  ddescribe,
 | 
						|
  xdescribe,
 | 
						|
  describe,
 | 
						|
  el,
 | 
						|
  inject,
 | 
						|
  beforeEachProviders,
 | 
						|
  it,
 | 
						|
  xit
 | 
						|
} from 'angular2/testing_internal';
 | 
						|
 | 
						|
import {RootRouter} from 'angular2/src/router/router';
 | 
						|
import {Router, ROUTER_DIRECTIVES, ROUTER_PRIMARY_COMPONENT} from 'angular2/router';
 | 
						|
 | 
						|
import {SpyLocation} from 'angular2/src/mock/location_mock';
 | 
						|
import {Location} from 'angular2/src/router/location';
 | 
						|
import {RouteRegistry} from 'angular2/src/router/route_registry';
 | 
						|
import {DirectiveResolver} from 'angular2/src/core/linker/directive_resolver';
 | 
						|
import {DOM} from 'angular2/src/platform/dom/dom_adapter';
 | 
						|
export {ComponentFixture} from 'angular2/testing_internal';
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Router test helpers and fixtures
 | 
						|
 */
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'root-comp',
 | 
						|
  template: `<router-outlet></router-outlet>`,
 | 
						|
  directives: [ROUTER_DIRECTIVES]
 | 
						|
})
 | 
						|
export class RootCmp {
 | 
						|
  name: string;
 | 
						|
}
 | 
						|
 | 
						|
export function compile(tcb: TestComponentBuilder,
 | 
						|
                        template: string = "<router-outlet></router-outlet>") {
 | 
						|
  return tcb.overrideTemplate(RootCmp, ('<div>' + template + '</div>')).createAsync(RootCmp);
 | 
						|
}
 | 
						|
 | 
						|
export var TEST_ROUTER_PROVIDERS = [
 | 
						|
  RouteRegistry,
 | 
						|
  DirectiveResolver,
 | 
						|
  provide(Location, {useClass: SpyLocation}),
 | 
						|
  provide(ROUTER_PRIMARY_COMPONENT, {useValue: RootCmp}),
 | 
						|
  provide(Router, {useClass: RootRouter})
 | 
						|
];
 | 
						|
 | 
						|
export function clickOnElement(anchorEl) {
 | 
						|
  var dispatchedEvent = DOM.createMouseEvent('click');
 | 
						|
  DOM.dispatchEvent(anchorEl, dispatchedEvent);
 | 
						|
  return dispatchedEvent;
 | 
						|
}
 | 
						|
 | 
						|
export function getHref(elt) {
 | 
						|
  return DOM.getAttribute(elt, 'href');
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Router integration suite DSL
 | 
						|
 */
 | 
						|
 | 
						|
var specNameBuilder = [];
 | 
						|
 | 
						|
// we add the specs themselves onto this map
 | 
						|
export var specs = {};
 | 
						|
 | 
						|
export function describeRouter(description: string, fn: Function, exclusive = false): void {
 | 
						|
  var specName = descriptionToSpecName(description);
 | 
						|
  specNameBuilder.push(specName);
 | 
						|
  if (exclusive) {
 | 
						|
    ddescribe(description, fn);
 | 
						|
  } else {
 | 
						|
    describe(description, fn);
 | 
						|
  }
 | 
						|
  specNameBuilder.pop();
 | 
						|
}
 | 
						|
 | 
						|
export function ddescribeRouter(description: string, fn: Function, exclusive = false): void {
 | 
						|
  describeRouter(description, fn, true);
 | 
						|
}
 | 
						|
 | 
						|
export function describeWithAndWithout(description: string, fn: Function): void {
 | 
						|
  // the "without" case is usually simpler, so we opt to run this spec first
 | 
						|
  describeWithout(description, fn);
 | 
						|
  describeWith(description, fn);
 | 
						|
}
 | 
						|
 | 
						|
export function describeWith(description: string, fn: Function): void {
 | 
						|
  var specName = 'with ' + description;
 | 
						|
  specNameBuilder.push(specName);
 | 
						|
  describe(specName, fn);
 | 
						|
  specNameBuilder.pop();
 | 
						|
}
 | 
						|
 | 
						|
export function describeWithout(description: string, fn: Function): void {
 | 
						|
  var specName = 'without ' + description;
 | 
						|
  specNameBuilder.push(specName);
 | 
						|
  describe(specName, fn);
 | 
						|
  specNameBuilder.pop();
 | 
						|
}
 | 
						|
 | 
						|
function descriptionToSpecName(description: string): string {
 | 
						|
  return spaceCaseToCamelCase(description);
 | 
						|
}
 | 
						|
 | 
						|
// this helper looks up the suite registered from the "impl" folder in this directory
 | 
						|
export function itShouldRoute() {
 | 
						|
  var specSuiteName = spaceCaseToCamelCase(specNameBuilder.join(' '));
 | 
						|
 | 
						|
  var spec = specs[specSuiteName];
 | 
						|
  if (isBlank(spec)) {
 | 
						|
    throw new BaseException(`Router integration spec suite "${specSuiteName}" was not found.`);
 | 
						|
  } else {
 | 
						|
    // todo: remove spec from map, throw if there are extra left over??
 | 
						|
    spec();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function spaceCaseToCamelCase(str: string): string {
 | 
						|
  var words = str.split(' ');
 | 
						|
  var first = words.shift();
 | 
						|
  return first + words.map(title).join('');
 | 
						|
}
 | 
						|
 | 
						|
function title(str: string): string {
 | 
						|
  return str[0].toUpperCase() + str.substring(1);
 | 
						|
}
 |