import {ddescribe, describe, it, iit, xit, expect, beforeEach, afterEach} from 'angular2/test_lib';

import {PipeRegistry} from 'angular2/src/change_detection/pipes/pipe_registry';
import {Pipe} from 'angular2/src/change_detection/pipes/pipe';

export function main() {
  describe("pipe registry", () => {
    var firstPipe = new Pipe();
    var secondPipe = new Pipe();

    it("should return the first pipe supporting the data type", () => {
      var r = new PipeRegistry({
        "type": [
          new PipeFactory(false, firstPipe),
          new PipeFactory(true, secondPipe)
        ]
      });

      expect(r.get("type", "some object", null)).toBe(secondPipe);
    });

    it("should throw when no matching type", () => {
      var r = new PipeRegistry({});
      expect(() => r.get("unknown", "some object", null)).toThrowError(
        `Cannot find a pipe for type 'unknown' object 'some object'`
      );
    });

    it("should throw when no matching pipe", () => {
      var r = new PipeRegistry({
        "type" : []
      });

      expect(() => r.get("type", "some object", null)).toThrowError(
        `Cannot find a pipe for type 'type' object 'some object'`
      );
    });
  });
}

class PipeFactory {
  shouldSupport:boolean;
  pipe:any;

  constructor(shouldSupport:boolean, pipe:any) {
    this.shouldSupport = shouldSupport;
    this.pipe = pipe;
  }

  supports(obj):boolean {
    return this.shouldSupport;
  }

  create(bpc):Pipe {
    return this.pipe;
  }
}