216 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {
 | 
						|
  ddescribe,
 | 
						|
  describe,
 | 
						|
  fakeAsync,
 | 
						|
  flushMicrotasks,
 | 
						|
  it,
 | 
						|
  iit,
 | 
						|
  xit,
 | 
						|
  expect,
 | 
						|
  beforeEach,
 | 
						|
  afterEach,
 | 
						|
  el,
 | 
						|
  AsyncTestCompleter,
 | 
						|
  inject
 | 
						|
} from 'angular2/test_lib';
 | 
						|
 | 
						|
import {QueryList} from 'angular2/angular2';
 | 
						|
 | 
						|
import {
 | 
						|
  ControlGroup,
 | 
						|
  Control,
 | 
						|
  NgControlName,
 | 
						|
  NgControlGroup,
 | 
						|
  NgFormModel,
 | 
						|
  ControlValueAccessor,
 | 
						|
  Validators,
 | 
						|
  NgForm,
 | 
						|
  NgModel,
 | 
						|
  NgFormControl,
 | 
						|
  NgRequiredValidator
 | 
						|
} from 'angular2/forms';
 | 
						|
 | 
						|
class DummyControlValueAccessor implements ControlValueAccessor {
 | 
						|
  writtenValue;
 | 
						|
 | 
						|
  registerOnChange(fn) {}
 | 
						|
  registerOnTouched(fn) {}
 | 
						|
 | 
						|
  writeValue(obj: any): void { this.writtenValue = obj; }
 | 
						|
}
 | 
						|
 | 
						|
export function main() {
 | 
						|
  describe("Form Directives", () => {
 | 
						|
    describe("NgFormModel", () => {
 | 
						|
      var form;
 | 
						|
      var formModel;
 | 
						|
      var loginControlDir;
 | 
						|
 | 
						|
      beforeEach(() => {
 | 
						|
        form = new NgFormModel();
 | 
						|
        formModel = new ControlGroup({"login": new Control(null)});
 | 
						|
        form.form = formModel;
 | 
						|
 | 
						|
        loginControlDir = new NgControlName(form, new QueryList<any>());
 | 
						|
        loginControlDir.name = "login";
 | 
						|
        loginControlDir.valueAccessor = new DummyControlValueAccessor();
 | 
						|
      });
 | 
						|
 | 
						|
      describe("addControl", () => {
 | 
						|
        it("should throw when no control found", () => {
 | 
						|
          var dir = new NgControlName(form, null);
 | 
						|
          dir.name = "invalidName";
 | 
						|
 | 
						|
          expect(() => form.addControl(dir))
 | 
						|
              .toThrowError(new RegExp("Cannot find control 'invalidName'"));
 | 
						|
        });
 | 
						|
 | 
						|
        it("should throw when no value accessor", () => {
 | 
						|
          var dir = new NgControlName(form, null);
 | 
						|
          dir.name = "login";
 | 
						|
 | 
						|
          expect(() => form.addControl(dir))
 | 
						|
              .toThrowError(new RegExp("No value accessor for 'login'"));
 | 
						|
        });
 | 
						|
 | 
						|
        it("should set up validator", () => {
 | 
						|
          loginControlDir.ngValidators.reset([new NgRequiredValidator()]);
 | 
						|
 | 
						|
          expect(formModel.find(["login"]).valid).toBe(true);
 | 
						|
 | 
						|
          // this will add the required validator and recalculate the validity
 | 
						|
          form.addControl(loginControlDir);
 | 
						|
 | 
						|
          expect(formModel.find(["login"]).valid).toBe(false);
 | 
						|
        });
 | 
						|
 | 
						|
        it("should write value to the DOM", () => {
 | 
						|
          formModel.find(["login"]).updateValue("initValue");
 | 
						|
 | 
						|
          form.addControl(loginControlDir);
 | 
						|
 | 
						|
          expect((<any>loginControlDir.valueAccessor).writtenValue).toEqual("initValue");
 | 
						|
        });
 | 
						|
 | 
						|
        it("should add the directive to the list of directives included in the form", () => {
 | 
						|
          form.addControl(loginControlDir);
 | 
						|
          expect(form.directives).toEqual([loginControlDir]);
 | 
						|
        });
 | 
						|
      });
 | 
						|
 | 
						|
      describe("removeControl", () => {
 | 
						|
        it("should remove the directive to the list of directives included in the form", () => {
 | 
						|
          form.addControl(loginControlDir);
 | 
						|
          form.removeControl(loginControlDir);
 | 
						|
          expect(form.directives).toEqual([]);
 | 
						|
        });
 | 
						|
      });
 | 
						|
 | 
						|
      describe("onChange", () => {
 | 
						|
        it("should update dom values of all the directives", () => {
 | 
						|
          form.addControl(loginControlDir);
 | 
						|
 | 
						|
          formModel.find(["login"]).updateValue("new value");
 | 
						|
 | 
						|
          form.onChange(null);
 | 
						|
 | 
						|
          expect((<any>loginControlDir.valueAccessor).writtenValue).toEqual("new value");
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe("NgForm", () => {
 | 
						|
      var form;
 | 
						|
      var formModel;
 | 
						|
      var loginControlDir;
 | 
						|
      var personControlGroupDir;
 | 
						|
 | 
						|
      beforeEach(() => {
 | 
						|
        form = new NgForm();
 | 
						|
        formModel = form.form;
 | 
						|
 | 
						|
        personControlGroupDir = new NgControlGroup(form);
 | 
						|
        personControlGroupDir.name = "person";
 | 
						|
 | 
						|
        loginControlDir = new NgControlName(personControlGroupDir, null);
 | 
						|
        loginControlDir.name = "login";
 | 
						|
        loginControlDir.valueAccessor = new DummyControlValueAccessor();
 | 
						|
      });
 | 
						|
 | 
						|
      describe("addControl & addControlGroup", () => {
 | 
						|
        it("should create a control with the given name", fakeAsync(() => {
 | 
						|
             form.addControlGroup(personControlGroupDir);
 | 
						|
             form.addControl(loginControlDir);
 | 
						|
 | 
						|
             flushMicrotasks();
 | 
						|
 | 
						|
             expect(formModel.find(["person", "login"])).not.toBeNull;
 | 
						|
           }));
 | 
						|
 | 
						|
        // should update the form's value and validity
 | 
						|
      });
 | 
						|
 | 
						|
      describe("removeControl & removeControlGroup", () => {
 | 
						|
        it("should remove control", fakeAsync(() => {
 | 
						|
             form.addControlGroup(personControlGroupDir);
 | 
						|
             form.addControl(loginControlDir);
 | 
						|
 | 
						|
             form.removeControlGroup(personControlGroupDir);
 | 
						|
             form.removeControl(loginControlDir);
 | 
						|
 | 
						|
             flushMicrotasks();
 | 
						|
 | 
						|
             expect(formModel.find(["person"])).toBeNull();
 | 
						|
             expect(formModel.find(["person", "login"])).toBeNull();
 | 
						|
           }));
 | 
						|
 | 
						|
        // should update the form's value and validity
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe("NgFormControl", () => {
 | 
						|
      var controlDir;
 | 
						|
      var control;
 | 
						|
 | 
						|
      beforeEach(() => {
 | 
						|
        controlDir = new NgFormControl(new QueryList<any>());
 | 
						|
        controlDir.valueAccessor = new DummyControlValueAccessor();
 | 
						|
 | 
						|
        control = new Control(null);
 | 
						|
        controlDir.form = control;
 | 
						|
      });
 | 
						|
 | 
						|
      it("should set up validator", () => {
 | 
						|
        controlDir.ngValidators.reset([new NgRequiredValidator()]);
 | 
						|
 | 
						|
        expect(control.valid).toBe(true);
 | 
						|
 | 
						|
        // this will add the required validator and recalculate the validity
 | 
						|
        controlDir.onChange({});
 | 
						|
 | 
						|
        expect(control.valid).toBe(false);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe("NgModel", () => {
 | 
						|
      var ngModel;
 | 
						|
 | 
						|
      beforeEach(() => {
 | 
						|
        ngModel = new NgModel(new QueryList<any>());
 | 
						|
        ngModel.valueAccessor = new DummyControlValueAccessor();
 | 
						|
      });
 | 
						|
 | 
						|
      it("should set up validator", () => {
 | 
						|
        ngModel.ngValidators.reset([new NgRequiredValidator()]);
 | 
						|
 | 
						|
        expect(ngModel.control.valid).toBe(true);
 | 
						|
 | 
						|
        // this will add the required validator and recalculate the validity
 | 
						|
        ngModel.onChange({});
 | 
						|
 | 
						|
        expect(ngModel.control.valid).toBe(false);
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 |