library angular2.test.core.compiler.directive_lifecycle_spec;

import 'package:angular2/testing_internal.dart';
import 'package:angular2/src/compiler/directive_lifecycle_reflector.dart';
import 'package:angular2/src/core/metadata/lifecycle_hooks.dart';

main() {
  describe('Create DirectiveMetadata', () {
    describe('lifecycle', () {
      describe("ngOnChanges", () {
        it("should be true when the directive has the ngOnChanges method", () {
          expect(hasLifecycleHook(
                  LifecycleHooks.OnChanges, DirectiveImplementingOnChanges))
              .toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(LifecycleHooks.OnChanges, DirectiveNoHooks))
              .toBe(false);
        });
      });

      describe("ngOnDestroy", () {
        it("should be true when the directive has the ngOnDestroy method", () {
          expect(hasLifecycleHook(
                  LifecycleHooks.OnDestroy, DirectiveImplementingOnDestroy))
              .toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(LifecycleHooks.OnDestroy, DirectiveNoHooks))
              .toBe(false);
        });
      });

      describe("ngOnInit", () {
        it("should be true when the directive has the ngOnInit method", () {
          expect(hasLifecycleHook(
              LifecycleHooks.OnInit, DirectiveImplementingOnInit)).toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(LifecycleHooks.OnInit, DirectiveNoHooks))
              .toBe(false);
        });
      });

      describe("ngDoCheck", () {
        it("should be true when the directive has the ngDoCheck method", () {
          expect(hasLifecycleHook(
              LifecycleHooks.DoCheck, DirectiveImplementingOnCheck)).toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(LifecycleHooks.DoCheck, DirectiveNoHooks))
              .toBe(false);
        });
      });

      describe("ngAfterContentInit", () {
        it("should be true when the directive has the ngAfterContentInit method",
            () {
          expect(hasLifecycleHook(LifecycleHooks.AfterContentInit,
              DirectiveImplementingAfterContentInit)).toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(
              LifecycleHooks.AfterContentInit, DirectiveNoHooks)).toBe(false);
        });
      });

      describe("ngAfterContentChecked", () {
        it("should be true when the directive has the ngAfterContentChecked method",
            () {
          expect(hasLifecycleHook(LifecycleHooks.AfterContentChecked,
              DirectiveImplementingAfterContentChecked)).toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(
                  LifecycleHooks.AfterContentChecked, DirectiveNoHooks))
              .toBe(false);
        });
      });

      describe("ngAfterViewInit", () {
        it("should be true when the directive has the ngAfterViewInit method",
            () {
          expect(hasLifecycleHook(LifecycleHooks.AfterViewInit,
              DirectiveImplementingAfterViewInit)).toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(
              LifecycleHooks.AfterViewInit, DirectiveNoHooks)).toBe(false);
        });
      });

      describe("ngAfterViewChecked", () {
        it("should be true when the directive has the ngAfterViewChecked method",
            () {
          expect(hasLifecycleHook(LifecycleHooks.AfterViewChecked,
              DirectiveImplementingAfterViewChecked)).toBe(true);
        });

        it("should be false otherwise", () {
          expect(hasLifecycleHook(
              LifecycleHooks.AfterViewChecked, DirectiveNoHooks)).toBe(false);
        });
      });
    });
  });
}

class DirectiveNoHooks {}

class DirectiveImplementingOnChanges implements OnChanges {
  ngOnChanges(_) {}
}

class DirectiveImplementingOnCheck implements DoCheck {
  ngDoCheck() {}
}

class DirectiveImplementingOnInit implements OnInit {
  ngOnInit() {}
}

class DirectiveImplementingOnDestroy implements OnDestroy {
  ngOnDestroy() {}
}

class DirectiveImplementingAfterContentInit implements AfterContentInit {
  ngAfterContentInit() {}
}

class DirectiveImplementingAfterContentChecked implements AfterContentChecked {
  ngAfterContentChecked() {}
}

class DirectiveImplementingAfterViewInit implements AfterViewInit {
  ngAfterViewInit() {}
}

class DirectiveImplementingAfterViewChecked implements AfterViewChecked {
  ngAfterViewChecked() {}
}