import {ddescribe, describe, it, iit, expect, beforeEach} from 'angular2/testing_internal';
import {ViewResolver} from 'angular2/src/compiler/view_resolver';
import {Component, ViewMetadata} from 'angular2/src/core/metadata';

class SomeDir {}
class SomePipe {}

@Component({
  selector: 'sample',
  template: "some template",
  directives: [SomeDir],
  pipes: [SomePipe],
  styles: ["some styles"]
})
class ComponentWithView {
}

@Component({
  selector: 'sample',
  template: "some template",
  directives: [SomeDir],
  pipes: [SomePipe],
  styles: ["some styles"]
})
class ComponentWithTemplate {
}

@Component({selector: 'sample', template: "some template"})
class ComponentWithViewTemplate {
}

@Component({selector: 'sample', templateUrl: "some template url", template: "some template"})
class ComponentWithViewTemplateUrl {
}

@Component({selector: 'sample'})
class ComponentWithoutView {
}


class SimpleClass {}

export function main() {
  describe("ViewResolver", () => {
    var resolver: ViewResolver;

    beforeEach(() => { resolver = new ViewResolver(); });

    it('should read out the View metadata from the Component metadata', () => {
      var viewMetadata = resolver.resolve(ComponentWithTemplate);
      expect(viewMetadata)
          .toEqual(new ViewMetadata({
            template: "some template",
            directives: [SomeDir],
            pipes: [SomePipe],
            styles: ["some styles"]
          }));
    });

    it('should throw when Component has no View decorator and no template is set', () => {
      expect(() => resolver.resolve(ComponentWithoutView))
          .toThrowErrorWith(
              "Component 'ComponentWithoutView' must have either 'template' or 'templateUrl' set");
    });

    it('should throw when simple class has no View decorator and no template is set', () => {
      expect(() => resolver.resolve(SimpleClass))
          .toThrowErrorWith("Could not compile 'SimpleClass' because it is not a component.");
    });
  });
}