How to use whenStable method in stryker-parent

Best JavaScript code snippet using stryker-parent

timepicker.spec.ts

Source:timepicker.spec.ts Github

copy

Full Screen

...76 const html = `<ngb-timepicker [ngModel]="model"></ngb-timepicker>`;77 const fixture = createTestComponent(html);78 fixture.componentInstance.model = {hour: 13, minute: 30};79 fixture.detectChanges();80 fixture.whenStable()81 .then(() => {82 fixture.detectChanges();83 return fixture.whenStable();84 })85 .then(() => { expectToDisplayTime(fixture.nativeElement, '13:30'); });86 }));87 it('should update inputs value on model change', async(() => {88 const html = `<ngb-timepicker [ngModel]="model"></ngb-timepicker>`;89 const fixture = createTestComponent(html);90 fixture.componentInstance.model = {hour: 13, minute: 30};91 fixture.detectChanges();92 fixture.whenStable()93 .then(() => {94 fixture.detectChanges();95 return fixture.whenStable();96 })97 .then(() => {98 expectToDisplayTime(fixture.nativeElement, '13:30');99 fixture.componentInstance.model = {hour: 14, minute: 40};100 fixture.detectChanges();101 return fixture.whenStable();102 })103 .then(() => {104 fixture.detectChanges();105 return fixture.whenStable();106 })107 .then(() => { expectToDisplayTime(fixture.nativeElement, '14:40'); });108 }));109 it('should render hour and minute inputs with padding', async(() => {110 const html = `<ngb-timepicker [ngModel]="model"></ngb-timepicker>`;111 const fixture = createTestComponent(html);112 fixture.componentInstance.model = {hour: 1, minute: 3};113 fixture.detectChanges();114 fixture.whenStable()115 .then(() => {116 fixture.detectChanges();117 return fixture.whenStable();118 })119 .then(() => { expectToDisplayTime(fixture.nativeElement, '01:03'); });120 }));121 it('should render hour, minute and seconds inputs with padding', async(() => {122 const html = `<ngb-timepicker [ngModel]="model" [seconds]="true"></ngb-timepicker>`;123 const fixture = createTestComponent(html);124 fixture.componentInstance.model = {hour: 10, minute: 3, second: 4};125 fixture.detectChanges();126 fixture.whenStable()127 .then(() => {128 fixture.detectChanges();129 return fixture.whenStable();130 })131 .then(() => { expectToDisplayTime(fixture.nativeElement, '10:03:04'); });132 }));133 it('should render invalid or empty hour and minute as blank string', async(() => {134 const html = `<ngb-timepicker [ngModel]="model"></ngb-timepicker>`;135 const fixture = createTestComponent(html);136 fixture.componentInstance.model = {hour: undefined, minute: 'aaa'};137 fixture.detectChanges();138 fixture.whenStable()139 .then(() => {140 fixture.detectChanges();141 return fixture.whenStable();142 })143 .then(() => { expectToDisplayTime(fixture.nativeElement, ':'); });144 }));145 it('should render invalid or empty second as blank string', async(() => {146 const html = `<ngb-timepicker [ngModel]="model" [seconds]="true"></ngb-timepicker>`;147 const fixture = createTestComponent(html);148 fixture.componentInstance.model = {hour: 10, minute: 20, second: false};149 fixture.detectChanges();150 fixture.whenStable()151 .then(() => {152 fixture.detectChanges();153 return fixture.whenStable();154 })155 .then(() => { expectToDisplayTime(fixture.nativeElement, '10:20:'); });156 }));157 it('should render empty fields on null model', async(() => {158 const html = `<ngb-timepicker [ngModel]="model" [seconds]="true"></ngb-timepicker>`;159 const fixture = createTestComponent(html);160 fixture.componentInstance.model = null;161 fixture.detectChanges();162 fixture.whenStable()163 .then(() => {164 fixture.detectChanges();165 return fixture.whenStable();166 })167 .then(() => { expectToDisplayTime(fixture.nativeElement, '::'); });168 }));169 });170 describe('model updates in response to increment / decrement button clicks', () => {171 it('should increment / decrement hours', async(() => {172 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;173 const fixture = createTestComponent(html);174 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};175 fixture.detectChanges();176 fixture.whenStable()177 .then(() => {178 fixture.detectChanges();179 return fixture.whenStable();180 })181 .then(() => {182 const buttons = getButtons(fixture.nativeElement);183 expectToDisplayTime(fixture.nativeElement, '10:30');184 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});185 (<HTMLButtonElement>buttons[0]).click(); // H+186 fixture.detectChanges();187 expectToDisplayTime(fixture.nativeElement, '11:30');188 expect(fixture.componentInstance.model).toEqual({hour: 11, minute: 30, second: 0});189 (<HTMLButtonElement>buttons[1]).click(); // H-190 fixture.detectChanges();191 expectToDisplayTime(fixture.nativeElement, '10:30');192 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});193 });194 }));195 it('should wrap hours', async(() => {196 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;197 const fixture = createTestComponent(html);198 fixture.componentInstance.model = {hour: 23, minute: 30, second: 0};199 fixture.detectChanges();200 fixture.whenStable()201 .then(() => {202 fixture.detectChanges();203 return fixture.whenStable();204 })205 .then(() => {206 const buttons = getButtons(fixture.nativeElement);207 expectToDisplayTime(fixture.nativeElement, '23:30');208 expect(fixture.componentInstance.model).toEqual({hour: 23, minute: 30, second: 0});209 (<HTMLButtonElement>buttons[0]).click(); // H+210 fixture.detectChanges();211 expectToDisplayTime(fixture.nativeElement, '00:30');212 expect(fixture.componentInstance.model).toEqual({hour: 0, minute: 30, second: 0});213 (<HTMLButtonElement>buttons[1]).click(); // H-214 fixture.detectChanges();215 expectToDisplayTime(fixture.nativeElement, '23:30');216 expect(fixture.componentInstance.model).toEqual({hour: 23, minute: 30, second: 0});217 });218 }));219 it('should increment / decrement minutes', async(() => {220 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;221 const fixture = createTestComponent(html);222 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};223 fixture.detectChanges();224 fixture.whenStable()225 .then(() => {226 fixture.detectChanges();227 return fixture.whenStable();228 })229 .then(() => {230 const buttons = getButtons(fixture.nativeElement);231 expectToDisplayTime(fixture.nativeElement, '10:30');232 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});233 (<HTMLButtonElement>buttons[2]).click(); // M+234 fixture.detectChanges();235 expectToDisplayTime(fixture.nativeElement, '10:31');236 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 31, second: 0});237 (<HTMLButtonElement>buttons[3]).click(); // M-238 fixture.detectChanges();239 expectToDisplayTime(fixture.nativeElement, '10:30');240 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});241 });242 }));243 it('should wrap minutes', async(() => {244 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;245 const fixture = createTestComponent(html);246 fixture.componentInstance.model = {hour: 22, minute: 59, second: 0};247 fixture.detectChanges();248 fixture.whenStable()249 .then(() => {250 fixture.detectChanges();251 return fixture.whenStable();252 })253 .then(() => {254 const buttons = getButtons(fixture.nativeElement);255 expectToDisplayTime(fixture.nativeElement, '22:59');256 expect(fixture.componentInstance.model).toEqual({hour: 22, minute: 59, second: 0});257 (<HTMLButtonElement>buttons[2]).click(); // M+258 fixture.detectChanges();259 expect(fixture.componentInstance.model).toEqual({hour: 23, minute: 0, second: 0});260 (<HTMLButtonElement>buttons[3]).click(); // M-261 fixture.detectChanges();262 expectToDisplayTime(fixture.nativeElement, '22:59');263 expect(fixture.componentInstance.model).toEqual({hour: 22, minute: 59, second: 0});264 });265 }));266 it('should increment / decrement seconds', async(() => {267 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true"></ngb-timepicker>`;268 const fixture = createTestComponent(html);269 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};270 fixture.detectChanges();271 fixture.whenStable()272 .then(() => {273 fixture.detectChanges();274 return fixture.whenStable();275 })276 .then(() => {277 const buttons = getButtons(fixture.nativeElement);278 expectToDisplayTime(fixture.nativeElement, '10:30:00');279 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});280 (<HTMLButtonElement>buttons[4]).click(); // S+281 fixture.detectChanges();282 expectToDisplayTime(fixture.nativeElement, '10:30:01');283 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 1});284 (<HTMLButtonElement>buttons[5]).click(); // S-285 fixture.detectChanges();286 expectToDisplayTime(fixture.nativeElement, '10:30:00');287 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});288 });289 }));290 it('should wrap seconds', async(() => {291 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true"></ngb-timepicker>`;292 const fixture = createTestComponent(html);293 fixture.componentInstance.model = {hour: 10, minute: 30, second: 59};294 fixture.detectChanges();295 fixture.whenStable()296 .then(() => {297 fixture.detectChanges();298 return fixture.whenStable();299 })300 .then(() => {301 const buttons = getButtons(fixture.nativeElement);302 expectToDisplayTime(fixture.nativeElement, '10:30:59');303 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 59});304 (<HTMLButtonElement>buttons[4]).click(); // S+305 fixture.detectChanges();306 expectToDisplayTime(fixture.nativeElement, '10:31:00');307 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 31, second: 0});308 (<HTMLButtonElement>buttons[5]).click(); // S-309 fixture.detectChanges();310 expectToDisplayTime(fixture.nativeElement, '10:30:59');311 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 59});312 });313 }));314 });315 describe('model updates in response to input field changes', () => {316 it('should update hours', async(() => {317 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;318 const fixture = createTestComponent(html);319 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};320 fixture.detectChanges();321 fixture.whenStable()322 .then(() => {323 fixture.detectChanges();324 return fixture.whenStable();325 })326 .then(() => {327 const inputs = fixture.debugElement.queryAll(By.css('input'));328 expectToDisplayTime(fixture.nativeElement, '10:30');329 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});330 inputs[0].triggerEventHandler('change', createChangeEvent('11'));331 fixture.detectChanges();332 expectToDisplayTime(fixture.nativeElement, '11:30');333 expect(fixture.componentInstance.model).toEqual({hour: 11, minute: 30, second: 0});334 inputs[0].triggerEventHandler('change', createChangeEvent(`${24 + 11}`));335 fixture.detectChanges();336 expectToDisplayTime(fixture.nativeElement, '11:30');337 expect(fixture.componentInstance.model).toEqual({hour: 11, minute: 30, second: 0});338 inputs[0].triggerEventHandler('change', createChangeEvent('aa'));339 fixture.detectChanges();340 expectToDisplayTime(fixture.nativeElement, ':30');341 expect(fixture.componentInstance.model).toEqual(null);342 });343 }));344 it('should update minutes', async(() => {345 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;346 const fixture = createTestComponent(html);347 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};348 fixture.detectChanges();349 fixture.whenStable()350 .then(() => {351 fixture.detectChanges();352 return fixture.whenStable();353 })354 .then(() => {355 const inputs = fixture.debugElement.queryAll(By.css('input'));356 expectToDisplayTime(fixture.nativeElement, '10:30');357 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});358 inputs[1].triggerEventHandler('change', createChangeEvent('40'));359 fixture.detectChanges();360 expectToDisplayTime(fixture.nativeElement, '10:40');361 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 40, second: 0});362 inputs[1].triggerEventHandler('change', createChangeEvent('70'));363 fixture.detectChanges();364 expectToDisplayTime(fixture.nativeElement, '11:10');365 expect(fixture.componentInstance.model).toEqual({hour: 11, minute: 10, second: 0});366 inputs[1].triggerEventHandler('change', createChangeEvent('aa'));367 fixture.detectChanges();368 expectToDisplayTime(fixture.nativeElement, '11:');369 expect(fixture.componentInstance.model).toEqual(null);370 });371 }));372 it('should update seconds', async(() => {373 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true"></ngb-timepicker>`;374 const fixture = createTestComponent(html);375 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};376 fixture.detectChanges();377 fixture.whenStable()378 .then(() => {379 fixture.detectChanges();380 return fixture.whenStable();381 })382 .then(() => {383 const inputs = fixture.debugElement.queryAll(By.css('input'));384 expectToDisplayTime(fixture.nativeElement, '10:30:00');385 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});386 inputs[2].triggerEventHandler('change', createChangeEvent('40'));387 fixture.detectChanges();388 expectToDisplayTime(fixture.nativeElement, '10:30:40');389 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 40});390 inputs[2].triggerEventHandler('change', createChangeEvent('70'));391 fixture.detectChanges();392 expectToDisplayTime(fixture.nativeElement, '10:31:10');393 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 31, second: 10});394 inputs[2].triggerEventHandler('change', createChangeEvent('aa'));395 fixture.detectChanges();396 expectToDisplayTime(fixture.nativeElement, '10:31:');397 expect(fixture.componentInstance.model).toEqual(null);398 });399 }));400 });401 describe('meridian', () => {402 it('should render meridian button with proper value', async(() => {403 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [meridian]="true"></ngb-timepicker>`;404 const fixture = createTestComponent(html);405 fixture.componentInstance.model = {hour: 13, minute: 30, second: 0};406 const meridianButton = getMeridianButton(fixture.nativeElement);407 fixture.detectChanges();408 fixture.whenStable()409 .then(() => {410 fixture.detectChanges();411 return fixture.whenStable();412 })413 .then(() => {414 expectToDisplayTime(fixture.nativeElement, '01:30:00');415 expect(meridianButton.textContent).toBe('PM');416 fixture.componentInstance.model = {hour: 1, minute: 30, second: 0};417 fixture.detectChanges();418 return fixture.whenStable();419 })420 .then(() => {421 fixture.detectChanges();422 return fixture.whenStable();423 })424 .then(() => {425 expectToDisplayTime(fixture.nativeElement, '01:30:00');426 expect(meridianButton.textContent).toBe('AM');427 });428 }));429 it('should render 12 PM/AM as 12:mm and meridian button with proper value', async(() => {430 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [meridian]="true"></ngb-timepicker>`;431 const fixture = createTestComponent(html);432 fixture.componentInstance.model = {hour: 12, minute: 30, second: 0};433 const meridianButton = getMeridianButton(fixture.nativeElement);434 fixture.detectChanges();435 fixture.whenStable()436 .then(() => {437 fixture.detectChanges();438 return fixture.whenStable();439 })440 .then(() => {441 expectToDisplayTime(fixture.nativeElement, '12:30:00');442 expect(meridianButton.textContent).toBe('PM');443 fixture.componentInstance.model = {hour: 0, minute: 30, second: 0};444 fixture.detectChanges();445 return fixture.whenStable();446 })447 .then(() => {448 fixture.detectChanges();449 return fixture.whenStable();450 })451 .then(() => {452 expectToDisplayTime(fixture.nativeElement, '12:30:00');453 expect(meridianButton.textContent).toBe('AM');454 });455 }));456 it('should update model on meridian click', async(() => {457 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [meridian]="true"></ngb-timepicker>`;458 const fixture = createTestComponent(html);459 fixture.componentInstance.model = {hour: 13, minute: 30, second: 0};460 const meridianButton = <HTMLButtonElement>getMeridianButton(fixture.nativeElement);461 fixture.detectChanges();462 fixture.whenStable()463 .then(() => {464 fixture.detectChanges();465 return fixture.whenStable();466 })467 .then(() => {468 expectToDisplayTime(fixture.nativeElement, '01:30:00');469 expect(meridianButton.textContent).toBe('PM');470 meridianButton.click();471 fixture.detectChanges();472 return fixture.whenStable();473 })474 .then(() => {475 expectToDisplayTime(fixture.nativeElement, '01:30:00');476 expect(fixture.componentInstance.model).toEqual({hour: 1, minute: 30, second: 0});477 expect(meridianButton.textContent).toBe('AM');478 });479 }));480 it('should respect meridian when propagating model (PM)', async(() => {481 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;482 const fixture = createTestComponent(html);483 fixture.componentInstance.model = {hour: 14, minute: 30};484 fixture.detectChanges();485 const inputs = fixture.debugElement.queryAll(By.css('input'));486 fixture.whenStable()487 .then(() => {488 inputs[0].triggerEventHandler('change', createChangeEvent('3'));489 fixture.detectChanges();490 return fixture.whenStable();491 })492 .then(() => { expect(fixture.componentInstance.model).toEqual({hour: 15, minute: 30, second: 0}); });493 }));494 it('should respect meridian when propagating model (AM)', async(() => {495 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;496 const fixture = createTestComponent(html);497 fixture.componentInstance.model = {hour: 9, minute: 30};498 fixture.detectChanges();499 const inputs = fixture.debugElement.queryAll(By.css('input'));500 fixture.whenStable()501 .then(() => {502 inputs[0].triggerEventHandler('change', createChangeEvent('10'));503 fixture.detectChanges();504 return fixture.whenStable();505 })506 .then(() => { expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0}); });507 }));508 it('should interpret 12 as midnight (00:00) when meridian is set to AM', async(() => {509 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;510 const fixture = createTestComponent(html);511 fixture.componentInstance.model = {hour: 9, minute: 0};512 fixture.detectChanges();513 const inputs = fixture.debugElement.queryAll(By.css('input'));514 fixture.whenStable()515 .then(() => {516 inputs[0].triggerEventHandler('change', createChangeEvent('12'));517 fixture.detectChanges();518 return fixture.whenStable();519 })520 .then(() => { expect(fixture.componentInstance.model).toEqual({hour: 0, minute: 0, second: 0}); });521 }));522 it('should interpret 12 as noon (12:00) when meridian is set to PM', async(() => {523 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;524 const fixture = createTestComponent(html);525 fixture.componentInstance.model = {hour: 18, minute: 0};526 fixture.detectChanges();527 const inputs = fixture.debugElement.queryAll(By.css('input'));528 fixture.whenStable()529 .then(() => {530 inputs[0].triggerEventHandler('change', createChangeEvent('12'));531 fixture.detectChanges();532 return fixture.whenStable();533 })534 .then(() => { expect(fixture.componentInstance.model).toEqual({hour: 12, minute: 0, second: 0}); });535 }));536 it('should interpret hour more than 12 as 24h value (AM)', async(() => {537 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;538 const fixture = createTestComponent(html);539 fixture.componentInstance.model = {hour: 7, minute: 30, second: 0};540 fixture.detectChanges();541 const inputs = fixture.debugElement.queryAll(By.css('input'));542 const meridianButton = <HTMLButtonElement>getMeridianButton(fixture.nativeElement);543 fixture.whenStable()544 .then(() => {545 inputs[0].triggerEventHandler('change', createChangeEvent('22'));546 fixture.detectChanges();547 return fixture.whenStable();548 })549 .then(() => {550 expectToDisplayTime(fixture.nativeElement, '10:30');551 expect(meridianButton.textContent).toBe('PM');552 expect(fixture.componentInstance.model).toEqual({hour: 22, minute: 30, second: 0});553 });554 }));555 it('should interpret hour more than 12 as 24h value (PM)', async(() => {556 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;557 const fixture = createTestComponent(html);558 fixture.componentInstance.model = {hour: 15, minute: 30, second: 0};559 fixture.detectChanges();560 const inputs = fixture.debugElement.queryAll(By.css('input'));561 const meridianButton = <HTMLButtonElement>getMeridianButton(fixture.nativeElement);562 fixture.whenStable()563 .then(() => {564 inputs[0].triggerEventHandler('change', createChangeEvent('22'));565 fixture.detectChanges();566 return fixture.whenStable();567 })568 .then(() => {569 expectToDisplayTime(fixture.nativeElement, '10:30');570 expect(meridianButton.textContent).toBe('PM');571 expect(fixture.componentInstance.model).toEqual({hour: 22, minute: 30, second: 0});572 });573 }));574 it('should use remainder of division by 24 as a value in 24h format when hour > 24 (AM)', async(() => {575 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;576 const fixture = createTestComponent(html);577 fixture.componentInstance.model = {hour: 7, minute: 30, second: 0};578 fixture.detectChanges();579 const inputs = fixture.debugElement.queryAll(By.css('input'));580 const meridianButton = <HTMLButtonElement>getMeridianButton(fixture.nativeElement);581 fixture.whenStable()582 .then(() => {583 inputs[0].triggerEventHandler('change', createChangeEvent(`${24 + 9}`));584 fixture.detectChanges();585 return fixture.whenStable();586 })587 .then(() => {588 expectToDisplayTime(fixture.nativeElement, '09:30');589 expect(meridianButton.textContent).toBe('AM');590 expect(fixture.componentInstance.model).toEqual({hour: 9, minute: 30, second: 0});591 });592 }));593 it('should use remainder of division by 24 as a value in 24h format when hour > 24 (PM)', async(() => {594 const html = `<ngb-timepicker [(ngModel)]="model" [meridian]="true"></ngb-timepicker>`;595 const fixture = createTestComponent(html);596 fixture.componentInstance.model = {hour: 15, minute: 30, second: 0};597 fixture.detectChanges();598 const inputs = fixture.debugElement.queryAll(By.css('input'));599 const meridianButton = <HTMLButtonElement>getMeridianButton(fixture.nativeElement);600 fixture.whenStable()601 .then(() => {602 inputs[0].triggerEventHandler('change', createChangeEvent(`${24 + 9}`));603 fixture.detectChanges();604 return fixture.whenStable();605 })606 .then(() => {607 expectToDisplayTime(fixture.nativeElement, '09:30');608 expect(meridianButton.textContent).toBe('AM');609 expect(fixture.componentInstance.model).toEqual({hour: 9, minute: 30, second: 0});610 });611 }));612 });613 describe('forms', () => {614 it('should work with template-driven form validation', async(() => {615 const html = `616 <form>617 <ngb-timepicker [(ngModel)]="model" name="control" required></ngb-timepicker>618 </form>`;619 const fixture = createTestComponent(html);620 const compiled = fixture.nativeElement;621 fixture.detectChanges();622 fixture.whenStable()623 .then(() => {624 fixture.detectChanges();625 return fixture.whenStable();626 })627 .then(() => {628 expect(getTimepicker(compiled)).toHaveCssClass('ng-invalid');629 expect(getTimepicker(compiled)).not.toHaveCssClass('ng-valid');630 fixture.componentInstance.model = {hour: 12, minute: 0, second: 0};631 fixture.detectChanges();632 return fixture.whenStable();633 })634 .then(() => {635 fixture.detectChanges();636 return fixture.whenStable();637 })638 .then(() => {639 expect(getTimepicker(compiled)).toHaveCssClass('ng-valid');640 expect(getTimepicker(compiled)).not.toHaveCssClass('ng-invalid');641 });642 }));643 it('should work with template-driven form validation when meridian is true', async(() => {644 const html = `645 <form>646 <ngb-timepicker [(ngModel)]="model" name="control"></ngb-timepicker>647 </form>`;648 const fixture = createTestComponent(html);649 const compiled = fixture.nativeElement;650 fixture.detectChanges();651 fixture.whenStable()652 .then(() => {653 fixture.detectChanges();654 return fixture.whenStable();655 })656 .then(() => {657 expect(getTimepicker(compiled)).toHaveCssClass('ng-valid');658 expect(getTimepicker(compiled)).not.toHaveCssClass('ng-invalid');659 fixture.componentInstance.model = {hour: 11, minute: 0, second: 0};660 fixture.detectChanges();661 return fixture.whenStable();662 })663 .then(() => {664 fixture.detectChanges();665 return fixture.whenStable();666 })667 .then(() => {668 expect(getTimepicker(compiled)).toHaveCssClass('ng-valid');669 expect(getTimepicker(compiled)).not.toHaveCssClass('ng-invalid');670 });671 }));672 it('should work with model-driven form validation', async(() => {673 const html = `674 <form [formGroup]="form">675 <ngb-timepicker formControlName="control" required></ngb-timepicker>676 </form>`;677 const fixture = createTestComponent(html);678 const compiled = fixture.nativeElement;679 fixture.detectChanges();680 fixture.whenStable()681 .then(() => {682 const inputs = fixture.debugElement.queryAll(By.css('input'));683 expect(getTimepicker(compiled)).toHaveCssClass('ng-invalid');684 expect(getTimepicker(compiled)).not.toHaveCssClass('ng-valid');685 inputs[0].triggerEventHandler('change', createChangeEvent('12'));686 inputs[1].triggerEventHandler('change', createChangeEvent('15'));687 fixture.detectChanges();688 return fixture.whenStable();689 })690 .then(() => {691 expect(getTimepicker(compiled)).toHaveCssClass('ng-valid');692 expect(getTimepicker(compiled)).not.toHaveCssClass('ng-invalid');693 });694 }));695 it('should propagate model changes only if valid - no seconds', () => {696 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;697 const fixture = createTestComponent(html);698 fixture.componentInstance.model = {hour: 12, minute: 0};699 fixture.detectChanges();700 const inputs = fixture.debugElement.queryAll(By.css('input'));701 inputs[0].triggerEventHandler('change', createChangeEvent('aa'));702 fixture.detectChanges();703 expect(fixture.componentInstance.model).toBeNull();704 });705 it('should propagate model changes only if valid - with seconds', () => {706 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true"></ngb-timepicker>`;707 const fixture = createTestComponent(html);708 fixture.componentInstance.model = {hour: 12, minute: 0, second: 0};709 fixture.detectChanges();710 const inputs = fixture.debugElement.queryAll(By.css('input'));711 inputs[2].triggerEventHandler('change', createChangeEvent('aa'));712 fixture.detectChanges();713 expect(fixture.componentInstance.model).toBeNull();714 });715 it('should not submit form when spinners clicked', async(() => {716 const html = `<form (ngSubmit)="onSubmit()">717 <ngb-timepicker name="control" [(ngModel)]="model"></ngb-timepicker>718 </form>`;719 const fixture = createTestComponent(html);720 const compiled = fixture.nativeElement;721 const buttons = getButtons(compiled);722 const button = buttons[0] as HTMLButtonElement;723 fixture.detectChanges();724 fixture.whenStable()725 .then(() => {726 fixture.detectChanges();727 return fixture.whenStable();728 })729 .then(() => {730 button.click();731 fixture.detectChanges();732 return fixture.whenStable();733 })734 .then(() => { expect(fixture.componentInstance.submitted).toBeFalsy(); });735 }));736 });737 describe('disabled', () => {738 it('should not change the value on button click, when it is disabled', async(() => {739 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [disabled]="disabled"></ngb-timepicker>`;740 const fixture = createTestComponent(html);741 fixture.componentInstance.model = {hour: 13, minute: 30, second: 0};742 fixture.detectChanges();743 fixture.whenStable()744 .then(() => {745 fixture.detectChanges();746 return fixture.whenStable();747 })748 .then(() => {749 const buttons = getButtons(fixture.nativeElement);750 expectToDisplayTime(fixture.nativeElement, '13:30:00');751 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});752 (<HTMLButtonElement>buttons[0]).click(); // H+753 fixture.detectChanges();754 expectToDisplayTime(fixture.nativeElement, '13:30:00');755 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});756 (<HTMLButtonElement>buttons[1]).click(); // H-757 fixture.detectChanges();758 expectToDisplayTime(fixture.nativeElement, '13:30:00');759 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});760 (<HTMLButtonElement>buttons[2]).click(); // M+761 fixture.detectChanges();762 expectToDisplayTime(fixture.nativeElement, '13:30:00');763 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});764 (<HTMLButtonElement>buttons[3]).click(); // M-765 fixture.detectChanges();766 expectToDisplayTime(fixture.nativeElement, '13:30:00');767 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});768 (<HTMLButtonElement>buttons[4]).click(); // S+769 fixture.detectChanges();770 expectToDisplayTime(fixture.nativeElement, '13:30:00');771 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});772 (<HTMLButtonElement>buttons[5]).click(); // S-773 fixture.detectChanges();774 expectToDisplayTime(fixture.nativeElement, '13:30:00');775 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});776 });777 }));778 it('should have disabled class, when it is disabled', async(() => {779 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [disabled]="disabled"></ngb-timepicker>`;780 const fixture = createTestComponent(html);781 fixture.detectChanges();782 fixture.whenStable()783 .then(() => {784 fixture.detectChanges();785 return fixture.whenStable();786 })787 .then(() => {788 let fieldset = getFieldsetElement(fixture.nativeElement);789 expect(fieldset.hasAttribute('disabled')).toBeTruthy();790 fixture.componentInstance.disabled = false;791 fixture.detectChanges();792 fixture.whenStable().then(() => {793 fixture.detectChanges();794 fieldset = getFieldsetElement(fixture.nativeElement);795 expect(fieldset.hasAttribute('disabled')).toBeFalsy();796 });797 });798 }));799 it('should have disabled attribute when it is disabled using reactive forms', async(() => {800 const html = `<form [formGroup]="disabledForm"><ngb-timepicker formControlName="control"></ngb-timepicker></form>`;801 const fixture = createTestComponent(html);802 fixture.detectChanges();803 let fieldset = getFieldsetElement(fixture.nativeElement);804 expect(fieldset.hasAttribute('disabled')).toBeTruthy();805 }));806 });807 describe('readonly', () => {808 it('should change the value on button click, when it is readonly', async(() => {809 const html =810 `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [readonlyInputs]="readonly"></ngb-timepicker>`;811 const fixture = createTestComponent(html);812 fixture.componentInstance.model = {hour: 13, minute: 30, second: 0};813 fixture.detectChanges();814 fixture.whenStable()815 .then(() => {816 fixture.detectChanges();817 return fixture.whenStable();818 })819 .then(() => {820 const buttons = getButtons(fixture.nativeElement);821 expectToDisplayTime(fixture.nativeElement, '13:30:00');822 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});823 (<HTMLButtonElement>buttons[0]).click(); // H+824 fixture.detectChanges();825 expectToDisplayTime(fixture.nativeElement, '14:30:00');826 expect(fixture.componentInstance.model).toEqual({hour: 14, minute: 30, second: 0});827 (<HTMLButtonElement>buttons[1]).click(); // H-828 fixture.detectChanges();829 expectToDisplayTime(fixture.nativeElement, '13:30:00');830 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});831 (<HTMLButtonElement>buttons[2]).click(); // M+832 fixture.detectChanges();833 expectToDisplayTime(fixture.nativeElement, '13:31:00');834 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 31, second: 0});835 (<HTMLButtonElement>buttons[3]).click(); // M-836 fixture.detectChanges();837 expectToDisplayTime(fixture.nativeElement, '13:30:00');838 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});839 (<HTMLButtonElement>buttons[4]).click(); // S+840 fixture.detectChanges();841 expectToDisplayTime(fixture.nativeElement, '13:30:01');842 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 1});843 (<HTMLButtonElement>buttons[5]).click(); // S-844 fixture.detectChanges();845 expectToDisplayTime(fixture.nativeElement, '13:30:00');846 expect(fixture.componentInstance.model).toEqual({hour: 13, minute: 30, second: 0});847 });848 }));849 it('should not change value on input change, when it is readonly', () => {850 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [readonlyInputs]="readonly"></ngb-timepicker>`;851 const fixture = createTestComponent(html);852 fixture.detectChanges();853 let inputs = getInputs(fixture.nativeElement);854 expect(inputs[0].hasAttribute('readonly')).toBeTruthy();855 expect(inputs[1].hasAttribute('readonly')).toBeTruthy();856 expect(inputs[2].hasAttribute('readonly')).toBeTruthy();857 fixture.componentInstance.readonly = false;858 fixture.detectChanges();859 inputs = getInputs(fixture.nativeElement);860 expect(inputs[0].hasAttribute('readonly')).toBeFalsy();861 expect(inputs[1].hasAttribute('readonly')).toBeFalsy();862 expect(inputs[2].hasAttribute('readonly')).toBeFalsy();863 });864 });865 describe('spinners', () => {866 it('should not have spinners if configured so', () => {867 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true" [spinners]="false"></ngb-timepicker>`;868 const fixture = createTestComponent(html);869 const buttons = getButtons(fixture.nativeElement);870 expect(buttons.length).toBe(0);871 });872 });873 describe('size', () => {874 it('should add appropriate CSS classes to buttons and inputs when size is small', () => {875 const html = `<ngb-timepicker size="small"></ngb-timepicker>`;876 const fixture = createTestComponent(html);877 const buttons = getButtons(fixture.nativeElement);878 const inputs = getInputs(fixture.nativeElement);879 for (let i = 0; i < buttons.length; i++) {880 expect(buttons[i]).toHaveCssClass('btn-sm');881 }882 for (let i = 0; i < inputs.length; i++) {883 expect(inputs[i]).toHaveCssClass('form-control-sm');884 }885 });886 it('should add appropriate CSS classes to buttons and inputs when size is large', () => {887 const html = `<ngb-timepicker size="large"></ngb-timepicker>`;888 const fixture = createTestComponent(html);889 const buttons = getButtons(fixture.nativeElement);890 const inputs = getInputs(fixture.nativeElement);891 for (let i = 0; i < buttons.length; i++) {892 expect(buttons[i]).toHaveCssClass('btn-lg');893 }894 for (let i = 0; i < inputs.length; i++) {895 expect(inputs[i]).toHaveCssClass('form-control-lg');896 }897 });898 it('should not add special CSS classes to buttons and inputs when size is medium', () => {899 const html = `<ngb-timepicker size="medium"></ngb-timepicker>`;900 const fixture = createTestComponent(html);901 const buttons = getButtons(fixture.nativeElement);902 const inputs = getInputs(fixture.nativeElement);903 for (let i = 0; i < buttons.length; i++) {904 expect(buttons[i]).not.toHaveCssClass('btn-lg');905 }906 for (let i = 0; i < inputs.length; i++) {907 expect(inputs[i]).not.toHaveCssClass('form-control-lg');908 }909 });910 it('should not add special CSS classes to buttons and inputs when no size is specified', () => {911 const html = `<ngb-timepicker></ngb-timepicker>`;912 const fixture = createTestComponent(html);913 const buttons = getButtons(fixture.nativeElement);914 const inputs = getInputs(fixture.nativeElement);915 for (let i = 0; i < buttons.length; i++) {916 expect(buttons[i]).not.toHaveCssClass('btn-lg');917 }918 for (let i = 0; i < inputs.length; i++) {919 expect(inputs[i]).not.toHaveCssClass('form-control-lg');920 }921 });922 });923 describe('Custom config', () => {924 let config: NgbTimepickerConfig;925 beforeEach(() => {926 TestBed.configureTestingModule({imports: [NgbTimepickerModule]});927 TestBed.overrideComponent(NgbTimepicker, {set: {template: ''}});928 });929 beforeEach(inject([NgbTimepickerConfig], (c: NgbTimepickerConfig) => {930 config = c;931 customizeConfig(config);932 }));933 it('should initialize inputs with provided config', () => {934 const fixture = TestBed.createComponent(NgbTimepicker);935 const timepicker = fixture.componentInstance;936 expectSameValues(timepicker, config);937 });938 });939 describe('Custom config as provider', () => {940 const config = new NgbTimepickerConfig();941 customizeConfig(config);942 beforeEach(() => {943 TestBed.configureTestingModule(944 {imports: [NgbTimepickerModule], providers: [{provide: NgbTimepickerConfig, useValue: config}]});945 });946 it('should initialize inputs with provided config as provider', () => {947 const fixture = createGenericTestComponent('', NgbTimepicker);948 const timepicker = fixture.componentInstance;949 expectSameValues(timepicker, config);950 });951 });952 describe('accessibility', () => {953 it('should have text for screen readers on buttons', async(() => {954 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true"></ngb-timepicker>`;955 const fixture = createTestComponent(html);956 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};957 fixture.detectChanges();958 fixture.whenStable()959 .then(() => {960 fixture.detectChanges();961 return fixture.whenStable();962 })963 .then(() => {964 const buttons = getButtons(fixture.nativeElement);965 expect((<HTMLButtonElement>buttons[0]).querySelector('.sr-only').textContent).toBe('Increment hours');966 expect((<HTMLButtonElement>buttons[1]).querySelector('.sr-only').textContent).toBe('Decrement hours');967 expect((<HTMLButtonElement>buttons[2]).querySelector('.sr-only').textContent).toBe('Increment minutes');968 expect((<HTMLButtonElement>buttons[3]).querySelector('.sr-only').textContent).toBe('Decrement minutes');969 expect((<HTMLButtonElement>buttons[4]).querySelector('.sr-only').textContent).toBe('Increment seconds');970 expect((<HTMLButtonElement>buttons[5]).querySelector('.sr-only').textContent).toBe('Decrement seconds');971 });972 }));973 it('should have aria-label for inputs', async(() => {974 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="true"></ngb-timepicker>`;975 const fixture = createTestComponent(html);976 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};977 fixture.detectChanges();978 fixture.whenStable()979 .then(() => {980 fixture.detectChanges();981 return fixture.whenStable();982 })983 .then(() => {984 const inputs = getInputs(fixture.nativeElement);985 expect(inputs[0].getAttribute('aria-label')).toBe('Hours');986 expect(inputs[1].getAttribute('aria-label')).toBe('Minutes');987 expect(inputs[2].getAttribute('aria-label')).toBe('Seconds');988 });989 }));990 });991 describe('Custom steps', () => {992 const config = new NgbTimepickerConfig();993 config.seconds = true;994 config.hourStep = 2;995 config.minuteStep = 3;996 config.secondStep = 4;997 beforeEach(() => {998 TestBed.configureTestingModule(999 {imports: [NgbTimepickerModule], providers: [{provide: NgbTimepickerConfig, useValue: config}]});1000 });1001 it('should increment / decrement hours by 6', async(async() => {1002 const html = `<ngb-timepicker [(ngModel)]="model" [hourStep]="6"></ngb-timepicker>`;1003 const fixture = createTestComponent(html);1004 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};1005 fixture.detectChanges();1006 await fixture.whenStable();1007 fixture.detectChanges();1008 await fixture.whenStable();1009 const buttons = getButtons(fixture.nativeElement);1010 expectToDisplayTime(fixture.nativeElement, '10:30:00');1011 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1012 (<HTMLButtonElement>buttons[0]).click(); // H+1013 fixture.detectChanges();1014 expectToDisplayTime(fixture.nativeElement, '16:30:00');1015 expect(fixture.componentInstance.model).toEqual({hour: 16, minute: 30, second: 0});1016 (<HTMLButtonElement>buttons[1]).click(); // H-1017 fixture.detectChanges();1018 expectToDisplayTime(fixture.nativeElement, '10:30:00');1019 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1020 }));1021 it('should increment / decrement hours to default value if step set to undefined', async(async() => {1022 const html = `<ngb-timepicker [(ngModel)]="model" [hourStep]="undefined"></ngb-timepicker>`;1023 const fixture = createTestComponent(html);1024 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};1025 fixture.detectChanges();1026 await fixture.whenStable();1027 fixture.detectChanges();1028 await fixture.whenStable();1029 const buttons = getButtons(fixture.nativeElement);1030 expectToDisplayTime(fixture.nativeElement, '10:30:00');1031 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1032 (<HTMLButtonElement>buttons[0]).click(); // H+1033 fixture.detectChanges();1034 expectToDisplayTime(fixture.nativeElement, '12:30:00');1035 expect(fixture.componentInstance.model).toEqual({hour: 12, minute: 30, second: 0});1036 (<HTMLButtonElement>buttons[1]).click(); // H-1037 fixture.detectChanges();1038 expectToDisplayTime(fixture.nativeElement, '10:30:00');1039 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1040 }));1041 it('should increment / decrement minutes by 7', async(async() => {1042 const html = `<ngb-timepicker [(ngModel)]="model" [minuteStep]="7"></ngb-timepicker>`;1043 const fixture = createTestComponent(html);1044 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};1045 fixture.detectChanges();1046 await fixture.whenStable();1047 fixture.detectChanges();1048 await fixture.whenStable();1049 const buttons = getButtons(fixture.nativeElement);1050 expectToDisplayTime(fixture.nativeElement, '10:30:00');1051 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1052 (<HTMLButtonElement>buttons[2]).click(); // M+1053 fixture.detectChanges();1054 expectToDisplayTime(fixture.nativeElement, '10:37:00');1055 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 37, second: 0});1056 (<HTMLButtonElement>buttons[3]).click(); // M-1057 fixture.detectChanges();1058 expectToDisplayTime(fixture.nativeElement, '10:30:00');1059 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1060 }));1061 it('should increment / decrement minutes to default value if step set to undefined', async(async() => {1062 const html = `<ngb-timepicker [(ngModel)]="model" [minuteStep]="undefined"></ngb-timepicker>`;1063 const fixture = createTestComponent(html);1064 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};1065 fixture.detectChanges();1066 await fixture.whenStable();1067 fixture.detectChanges();1068 await fixture.whenStable();1069 const buttons = getButtons(fixture.nativeElement);1070 expectToDisplayTime(fixture.nativeElement, '10:30:00');1071 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1072 (<HTMLButtonElement>buttons[2]).click(); // M+1073 fixture.detectChanges();1074 expectToDisplayTime(fixture.nativeElement, '10:33:00');1075 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 33, second: 0});1076 (<HTMLButtonElement>buttons[3]).click(); // M-1077 fixture.detectChanges();1078 expectToDisplayTime(fixture.nativeElement, '10:30:00');1079 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1080 }));1081 it('should increment / decrement seconds by 8', async(async() => {1082 const html = `<ngb-timepicker [(ngModel)]="model" [secondStep]="8"></ngb-timepicker>`;1083 const fixture = createTestComponent(html);1084 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};1085 fixture.detectChanges();1086 await fixture.whenStable();1087 fixture.detectChanges();1088 await fixture.whenStable();1089 const buttons = getButtons(fixture.nativeElement);1090 expectToDisplayTime(fixture.nativeElement, '10:30:00');1091 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1092 (<HTMLButtonElement>buttons[4]).click(); // S+1093 fixture.detectChanges();1094 expectToDisplayTime(fixture.nativeElement, '10:30:08');1095 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 8});1096 (<HTMLButtonElement>buttons[5]).click(); // S-1097 fixture.detectChanges();1098 expectToDisplayTime(fixture.nativeElement, '10:30:00');1099 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1100 }));1101 it('should increment / decrement seconds to default value if step set to undefined', async(async() => {1102 const html = `<ngb-timepicker [(ngModel)]="model" [secondStep]="undefined"></ngb-timepicker>`;1103 const fixture = createTestComponent(html);1104 fixture.componentInstance.model = {hour: 10, minute: 30, second: 0};1105 fixture.detectChanges();1106 await fixture.whenStable();1107 fixture.detectChanges();1108 await fixture.whenStable();1109 const buttons = getButtons(fixture.nativeElement);1110 expectToDisplayTime(fixture.nativeElement, '10:30:00');1111 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1112 (<HTMLButtonElement>buttons[4]).click(); // S+1113 fixture.detectChanges();1114 expectToDisplayTime(fixture.nativeElement, '10:30:04');1115 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 4});1116 (<HTMLButtonElement>buttons[5]).click(); // S-1117 fixture.detectChanges();1118 expectToDisplayTime(fixture.nativeElement, '10:30:00');1119 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1120 }));1121 });1122 describe('Seconds handling', () => {1123 it('should propagate seconds to 0 in model if seconds not shown and no second in initial model', async(() => {1124 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="false"></ngb-timepicker>`;1125 const fixture = createTestComponent(html);1126 fixture.componentInstance.model = {hour: 10, minute: 30};1127 fixture.detectChanges();1128 fixture.whenStable()1129 .then(() => {1130 fixture.detectChanges();1131 return fixture.whenStable();1132 })1133 .then(() => {1134 const inputs = fixture.debugElement.queryAll(By.css('input'));1135 inputs[1].triggerEventHandler('change', createChangeEvent('40'));1136 fixture.detectChanges();1137 expectToDisplayTime(fixture.nativeElement, '10:40');1138 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 40, second: 0});1139 });1140 }));1141 it('should propagate second as 0 in model if seconds not shown and null initial model', async(() => {1142 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="false"></ngb-timepicker>`;1143 const fixture = createTestComponent(html);1144 fixture.detectChanges();1145 fixture.whenStable()1146 .then(() => {1147 fixture.detectChanges();1148 return fixture.whenStable();1149 })1150 .then(() => {1151 const inputs = fixture.debugElement.queryAll(By.css('input'));1152 inputs[0].triggerEventHandler('change', createChangeEvent('10'));1153 inputs[1].triggerEventHandler('change', createChangeEvent('40'));1154 fixture.detectChanges();1155 expectToDisplayTime(fixture.nativeElement, '10:40');1156 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 40, second: 0});1157 });1158 }));1159 it('should leave second as is in model if seconds not shown and second present in initial model', async(() => {1160 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="false"></ngb-timepicker>`;1161 const fixture = createTestComponent(html);1162 fixture.componentInstance.model = {hour: 10, minute: 30, second: 30};1163 fixture.detectChanges();1164 fixture.whenStable()1165 .then(() => {1166 fixture.detectChanges();1167 return fixture.whenStable();1168 })1169 .then(() => {1170 const inputs = fixture.debugElement.queryAll(By.css('input'));1171 inputs[1].triggerEventHandler('change', createChangeEvent('40'));1172 fixture.detectChanges();1173 expectToDisplayTime(fixture.nativeElement, '10:40');1174 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 40, second: 30});1175 });1176 }));1177 it('should reset the second to 0 if invalid when seconds are hidden', async(() => {1178 const html = `<ngb-timepicker [(ngModel)]="model" [seconds]="showSeconds"></ngb-timepicker>`;1179 const fixture = createTestComponent(html);1180 fixture.componentInstance.model = {hour: 10, minute: 30, second: null};1181 fixture.detectChanges();1182 fixture.whenStable()1183 .then(() => {1184 fixture.detectChanges();1185 return fixture.whenStable();1186 })1187 .then(() => {1188 expectToDisplayTime(fixture.nativeElement, '10:30:');1189 fixture.componentInstance.showSeconds = false;1190 fixture.detectChanges();1191 return fixture.whenStable();1192 })1193 .then(() => {1194 expectToDisplayTime(fixture.nativeElement, '10:30');1195 expect(fixture.componentInstance.model).toEqual({hour: 10, minute: 30, second: 0});1196 });1197 }));1198 });1199 describe('Custom adapter', () => {1200 beforeEach(() => {1201 TestBed.configureTestingModule({1202 declarations: [TestComponent],1203 imports: [NgbTimepickerModule, FormsModule],1204 providers: [{provide: NgbTimeAdapter, useClass: StringTimeAdapter}]1205 });1206 });1207 it('should display the right time when model is a string parsed by a custom time adapter', async(() => {1208 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;1209 const fixture = createTestComponent(html);1210 fixture.componentInstance.model = null;1211 fixture.detectChanges();1212 fixture.detectChanges();1213 fixture.whenStable()1214 .then(() => {1215 fixture.detectChanges();1216 return fixture.whenStable();1217 })1218 .then(() => { expectToDisplayTime(fixture.nativeElement, ':'); })1219 .then(() => {1220 fixture.componentInstance.model = '09:25:00';1221 fixture.detectChanges();1222 return fixture.whenStable();1223 })1224 .then(() => {1225 fixture.detectChanges();1226 return fixture.whenStable();1227 })1228 .then(() => { expectToDisplayTime(fixture.nativeElement, '09:25'); });1229 }));1230 it('should write the entered value as a string formatted by a custom time adapter', () => {1231 const html = `<ngb-timepicker [(ngModel)]="model"></ngb-timepicker>`;1232 const fixture = createTestComponent(html);1233 fixture.componentInstance.model = null;1234 fixture.detectChanges();1235 fixture.whenStable()1236 .then(() => {1237 fixture.detectChanges();1238 return fixture.whenStable();1239 })1240 .then(() => {1241 const inputs = fixture.debugElement.queryAll(By.css('input'));1242 inputs[0].triggerEventHandler('change', createChangeEvent('11'));1243 fixture.detectChanges();1244 expectToDisplayTime(fixture.nativeElement, '11:');1245 expect(fixture.componentInstance.model).toBeNull();1246 inputs[1].triggerEventHandler('change', createChangeEvent('5'));1247 fixture.detectChanges();1248 expectToDisplayTime(fixture.nativeElement, '11:05');1249 expect(fixture.componentInstance.model).toEqual('11:05:00');1250 inputs[0].triggerEventHandler('change', createChangeEvent('aa'));1251 fixture.detectChanges();1252 expectToDisplayTime(fixture.nativeElement, ':05');...

Full Screen

Full Screen

parts-layout.component.spec.ts

Source:parts-layout.component.spec.ts Github

copy

Full Screen

...59 it('allows to move a view to a new part in the east', async () => {60 await ngZone.run(async () => {61 // Add view 162 await wbRouter.navigate(['view-1']);63 await fixture.whenStable();64 // Add view 265 await wbRouter.navigate(['view-2']);66 await fixture.whenStable();67 // Move view 2 to a new part in the east68 await viewDragService.dispatchViewMoveEvent({69 source: {70 appInstanceId: workbench.appInstanceId,71 partId: 'main',72 viewId: 'view.2',73 viewUrlSegments: [new UrlSegment('view-2', {})],74 },75 target: {76 appInstanceId: workbench.appInstanceId,77 partId: 'main',78 region: 'east',79 newPartId: 'EAST',80 },81 });82 await fixture.whenStable();83 });84 expect(fixture).toEqualPartsLayout(new MTreeNode({85 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),86 child2: new MPart({partId: 'EAST', viewIds: ['view.2'], activeViewId: 'view.2'}),87 ratio: .5,88 direction: 'row',89 }));90 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');91 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST');92 });93 it('allows to move a view to a new part in the west', async () => {94 await ngZone.run(async () => {95 // Add view 196 await wbRouter.navigate(['view-1']);97 await fixture.whenStable();98 // Add view 299 await wbRouter.navigate(['view-2']);100 await fixture.whenStable();101 // Move view 2 to a new part in the west102 await viewDragService.dispatchViewMoveEvent({103 source: {104 appInstanceId: workbench.appInstanceId,105 partId: 'main',106 viewId: 'view.2',107 viewUrlSegments: [new UrlSegment('view-2', {})],108 },109 target: {110 appInstanceId: workbench.appInstanceId,111 partId: 'main',112 region: 'west',113 newPartId: 'WEST',114 },115 });116 await fixture.whenStable();117 });118 expect(fixture).toEqualPartsLayout(new MTreeNode({119 child1: new MPart({partId: 'WEST', viewIds: ['view.2'], activeViewId: 'view.2'}),120 child2: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),121 ratio: .5,122 direction: 'row',123 }));124 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');125 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('WEST');126 });127 it('allows to move a view to a new part in the north', async () => {128 await ngZone.run(async () => {129 // Add view 1130 await wbRouter.navigate(['view-1']);131 await fixture.whenStable();132 // Add view 2133 await wbRouter.navigate(['view-2']);134 await fixture.whenStable();135 // Move view 1 to a new part in the north136 await viewDragService.dispatchViewMoveEvent({137 source: {138 appInstanceId: workbench.appInstanceId,139 partId: 'main',140 viewId: 'view.2',141 viewUrlSegments: [new UrlSegment('view-2', {})],142 },143 target: {144 appInstanceId: workbench.appInstanceId,145 partId: 'main',146 region: 'north',147 newPartId: 'NORTH',148 },149 });150 await fixture.whenStable();151 });152 expect(fixture).toEqualPartsLayout(new MTreeNode({153 child1: new MPart({partId: 'NORTH', viewIds: ['view.2'], activeViewId: 'view.2'}),154 child2: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),155 ratio: .5,156 direction: 'column',157 }));158 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');159 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('NORTH');160 });161 it('allows to move a view to a new part in the south', async () => {162 await ngZone.run(async () => {163 // Add view 1164 await wbRouter.navigate(['view-1']);165 await fixture.whenStable();166 // Add view 2167 await wbRouter.navigate(['view-2']);168 await fixture.whenStable();169 // Move view 1 to a new part in the south170 await viewDragService.dispatchViewMoveEvent({171 source: {172 appInstanceId: workbench.appInstanceId,173 partId: 'main',174 viewId: 'view.2',175 viewUrlSegments: [new UrlSegment('view-2', {})],176 },177 target: {178 appInstanceId: workbench.appInstanceId,179 partId: 'main',180 region: 'south',181 newPartId: 'SOUTH',182 },183 });184 await fixture.whenStable();185 });186 expect(fixture).toEqualPartsLayout(new MTreeNode({187 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),188 child2: new MPart({partId: 'SOUTH', viewIds: ['view.2'], activeViewId: 'view.2'}),189 ratio: .5,190 direction: 'column',191 }));192 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');193 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('SOUTH');194 });195 it('disallows to move a view to a new part in the center', async () => {196 await ngZone.run(async () => {197 // Add view 1198 await wbRouter.navigate(['view-1']);199 await fixture.whenStable();200 // Add view 2201 await wbRouter.navigate(['view-2']);202 await fixture.whenStable();203 // Move view 1 to a new part in the center204 await viewDragService.dispatchViewMoveEvent({205 source: {206 appInstanceId: workbench.appInstanceId,207 partId: 'main',208 viewId: 'view.2',209 viewUrlSegments: [new UrlSegment('view-2', {})],210 },211 target: {212 appInstanceId: workbench.appInstanceId,213 partId: 'main',214 region: 'center',215 },216 });217 await fixture.whenStable();218 });219 expect(fixture).toEqualPartsLayout(new MPart({partId: 'main', activeViewId: 'view.2', viewIds: ['view.1', 'view.2']}));220 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');221 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('main');222 });223 it('allows to move views to another part', async () => {224 await ngZone.run(async () => {225 // Add view 1226 await wbRouter.navigate(['view-1']);227 await fixture.whenStable();228 // Add view 2229 await wbRouter.navigate(['view-2']);230 await fixture.whenStable();231 // Add view 3232 await wbRouter.navigate(['view-3']);233 await fixture.whenStable();234 // Move view 3 to a new part in the east235 await viewDragService.dispatchViewMoveEvent({236 source: {237 appInstanceId: workbench.appInstanceId,238 partId: 'main',239 viewId: 'view.3',240 viewUrlSegments: [new UrlSegment('view-3', {})],241 },242 target: {243 appInstanceId: workbench.appInstanceId,244 partId: 'main',245 region: 'east',246 newPartId: 'EAST',247 },248 });249 await fixture.whenStable();250 // Move view 2 to the new ViewPart251 await viewDragService.dispatchViewMoveEvent({252 source: {253 appInstanceId: workbench.appInstanceId,254 partId: 'main',255 viewId: 'view.2',256 viewUrlSegments: [new UrlSegment('view-2', {})],257 },258 target: {259 appInstanceId: workbench.appInstanceId,260 partId: 'EAST',261 region: 'center',262 },263 });264 await fixture.whenStable();265 });266 expect(fixture).toEqualPartsLayout(new MTreeNode({267 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),268 child2: new MPart({partId: 'EAST', viewIds: ['view.3', 'view.2'], activeViewId: 'view.2'}),269 ratio: .5,270 direction: 'row',271 }));272 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');273 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST');274 expect(viewRegistry.getElseThrow('view.3').part.partId).toEqual('EAST');275 await ngZone.run(async () => {276 // Move view 1 to the new part277 await viewDragService.dispatchViewMoveEvent({278 source: {279 appInstanceId: workbench.appInstanceId,280 partId: 'main',281 viewId: 'view.1',282 viewUrlSegments: [new UrlSegment('view-1', {})],283 },284 target: {285 appInstanceId: workbench.appInstanceId,286 partId: 'EAST',287 region: 'center',288 },289 });290 await fixture.whenStable();291 });292 expect(fixture).toEqualPartsLayout(new MPart({partId: 'EAST', activeViewId: 'view.1', viewIds: ['view.3', 'view.2', 'view.1']}));293 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('EAST');294 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST');295 expect(viewRegistry.getElseThrow('view.3').part.partId).toEqual('EAST');296 });297 it('allows to move the last view of a part to a new part in the east', async () => {298 await ngZone.run(async () => {299 // Add view 1300 await wbRouter.navigate(['view-1']);301 await fixture.whenStable();302 // Add view 2303 await wbRouter.navigate(['view-2']);304 await fixture.whenStable();305 // Move view 2 to a new part in the east306 await viewDragService.dispatchViewMoveEvent({307 source: {308 appInstanceId: workbench.appInstanceId,309 partId: 'main',310 viewId: 'view.2',311 viewUrlSegments: [new UrlSegment('view-2', {})],312 },313 target: {314 appInstanceId: workbench.appInstanceId,315 partId: 'main',316 region: 'east',317 newPartId: 'EAST-1',318 },319 });320 await fixture.whenStable();321 });322 expect(fixture).toEqualPartsLayout(new MTreeNode({323 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),324 child2: new MPart({partId: 'EAST-1', viewIds: ['view.2'], activeViewId: 'view.2'}),325 ratio: .5,326 direction: 'row',327 }));328 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');329 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST-1');330 await ngZone.run(async () => {331 // Move view 2 to a new part in the east of part EAST-1332 await viewDragService.dispatchViewMoveEvent({333 source: {334 appInstanceId: workbench.appInstanceId,335 partId: 'EAST-1',336 viewId: 'view.2',337 viewUrlSegments: [new UrlSegment('view-2', {})],338 },339 target: {340 appInstanceId: workbench.appInstanceId,341 partId: 'main',342 region: 'east',343 newPartId: 'EAST-2',344 },345 });346 await fixture.whenStable();347 });348 expect(fixture).toEqualPartsLayout(new MTreeNode({349 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),350 child2: new MPart({partId: 'EAST-2', viewIds: ['view.2'], activeViewId: 'view.2'}),351 ratio: .5,352 direction: 'row',353 }));354 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');355 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST-2');356 });357 it('allows to move the last view of a part to a new part in the west', async () => {358 await ngZone.run(async () => {359 // Add view 1360 await wbRouter.navigate(['view-1']);361 await fixture.whenStable();362 // Add view 2363 await wbRouter.navigate(['view-2']);364 await fixture.whenStable();365 // Move view 2 to a new part in the east366 await viewDragService.dispatchViewMoveEvent({367 source: {368 appInstanceId: workbench.appInstanceId,369 partId: 'main',370 viewId: 'view.2',371 viewUrlSegments: [new UrlSegment('view-2', {})],372 },373 target: {374 appInstanceId: workbench.appInstanceId,375 partId: 'main',376 region: 'east',377 newPartId: 'EAST',378 },379 });380 await fixture.whenStable();381 });382 expect(fixture).toEqualPartsLayout(new MTreeNode({383 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),384 child2: new MPart({partId: 'EAST', viewIds: ['view.2'], activeViewId: 'view.2'}),385 ratio: .5,386 direction: 'row',387 }));388 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');389 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST');390 await ngZone.run(async () => {391 // Move view 2 to a new part in the west of part 1392 await viewDragService.dispatchViewMoveEvent({393 source: {394 appInstanceId: workbench.appInstanceId,395 partId: 'EAST',396 viewId: 'view.2',397 viewUrlSegments: [new UrlSegment('view-2', {})],398 },399 target: {400 appInstanceId: workbench.appInstanceId,401 partId: 'main',402 region: 'west',403 newPartId: 'WEST-2',404 },405 });406 await fixture.whenStable();407 });408 expect(fixture).toEqualPartsLayout(new MTreeNode({409 child1: new MPart({partId: 'WEST-2', viewIds: ['view.2'], activeViewId: 'view.2'}),410 child2: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),411 ratio: .5,412 direction: 'row',413 }));414 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');415 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('WEST-2');416 });417 it('allows to move the last view of a part to a new viewpart in the north', async () => {418 await ngZone.run(async () => {419 // Add view 1420 await wbRouter.navigate(['view-1']);421 await fixture.whenStable();422 // Add view 2423 await wbRouter.navigate(['view-2']);424 await fixture.whenStable();425 // Move view 2 to a new part in the east426 await viewDragService.dispatchViewMoveEvent({427 source: {428 appInstanceId: workbench.appInstanceId,429 partId: 'main',430 viewId: 'view.2',431 viewUrlSegments: [new UrlSegment('view-2', {})],432 },433 target: {434 appInstanceId: workbench.appInstanceId,435 partId: 'main',436 region: 'east',437 newPartId: 'EAST',438 },439 });440 await fixture.whenStable();441 });442 expect(fixture).toEqualPartsLayout(new MTreeNode({443 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),444 child2: new MPart({partId: 'EAST', viewIds: ['view.2'], activeViewId: 'view.2'}),445 ratio: .5,446 direction: 'row',447 }));448 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');449 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST');450 await ngZone.run(async () => {451 // Move view 2 to a new part in the north of part 1452 await viewDragService.dispatchViewMoveEvent({453 source: {454 appInstanceId: workbench.appInstanceId,455 partId: 'EAST',456 viewId: 'view.2',457 viewUrlSegments: [new UrlSegment('view-2', {})],458 },459 target: {460 appInstanceId: workbench.appInstanceId,461 partId: 'main',462 region: 'north',463 newPartId: 'NORTH',464 },465 });466 await fixture.whenStable();467 });468 expect(fixture).toEqualPartsLayout(new MTreeNode({469 child1: new MPart({partId: 'NORTH', viewIds: ['view.2'], activeViewId: 'view.2'}),470 child2: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),471 ratio: .5,472 direction: 'column',473 }));474 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');475 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('NORTH');476 });477 it('allows to move the last view of a part to a new part in the south', async () => {478 await ngZone.run(async () => {479 // Add view 1480 await wbRouter.navigate(['view-1']);481 await fixture.whenStable();482 // Add view 2483 await wbRouter.navigate(['view-2']);484 await fixture.whenStable();485 // Move view 2 to a new part in the east486 await viewDragService.dispatchViewMoveEvent({487 source: {488 appInstanceId: workbench.appInstanceId,489 partId: 'main',490 viewId: 'view.2',491 viewUrlSegments: [new UrlSegment('view-2', {})],492 },493 target: {494 appInstanceId: workbench.appInstanceId,495 partId: 'main',496 region: 'east',497 newPartId: 'EAST',498 },499 });500 await fixture.whenStable();501 });502 expect(fixture).toEqualPartsLayout(new MTreeNode({503 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),504 child2: new MPart({partId: 'EAST', viewIds: ['view.2'], activeViewId: 'view.2'}),505 ratio: .5,506 direction: 'row',507 }));508 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');509 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('EAST');510 await ngZone.run(async () => {511 // Move view 2 to a new part in the south of part 1512 await viewDragService.dispatchViewMoveEvent({513 source: {514 appInstanceId: workbench.appInstanceId,515 partId: 'EAST',516 viewId: 'view.2',517 viewUrlSegments: [new UrlSegment('view-2', {})],518 },519 target: {520 appInstanceId: workbench.appInstanceId,521 partId: 'main',522 region: 'south',523 newPartId: 'SOUTH',524 },525 });526 await fixture.whenStable();527 });528 expect(fixture).toEqualPartsLayout(new MTreeNode({529 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),530 child2: new MPart({partId: 'SOUTH', viewIds: ['view.2'], activeViewId: 'view.2'}),531 ratio: .5,532 direction: 'column',533 }));534 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');535 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('SOUTH');536 });537 it('allows to move a view around parts', async () => {538 await ngZone.run(async () => {539 // Add view 1540 await wbRouter.navigate(['view-1']);541 await fixture.whenStable();542 // Add view 2543 await wbRouter.navigate(['view-2']);544 await fixture.whenStable();545 // Add view 3546 await wbRouter.navigate(['view-3']);547 await fixture.whenStable();548 });549 expect(fixture).toEqualPartsLayout(new MPart({partId: 'main', activeViewId: 'view.3', viewIds: ['view.1', 'view.2', 'view.3']}));550 await ngZone.run(async () => {551 // Move view 3 to a new part in the east552 await viewDragService.dispatchViewMoveEvent({553 source: {554 appInstanceId: workbench.appInstanceId,555 partId: 'main',556 viewId: 'view.3',557 viewUrlSegments: [new UrlSegment('view-3', {})],558 },559 target: {560 appInstanceId: workbench.appInstanceId,561 partId: 'main',562 region: 'east',563 newPartId: 'EAST',564 },565 });566 await fixture.whenStable();567 });568 expect(fixture).toEqualPartsLayout(new MTreeNode({569 child1: new MPart({partId: 'main', viewIds: ['view.1', 'view.2'], activeViewId: 'view.2'}),570 child2: new MPart({partId: 'EAST', viewIds: ['view.3'], activeViewId: 'view.3'}),571 ratio: .5,572 direction: 'row',573 }));574 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');575 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('main');576 expect(viewRegistry.getElseThrow('view.3').part.partId).toEqual('EAST');577 const viewPart2Component = viewPartRegistry.getElseThrow('EAST').portal.componentRef.instance;578 expect(viewPart2Component).toBeTruthy();579 // Move view 2 to a new part in the south of part 2580 await ngZone.run(async () => {581 await viewDragService.dispatchViewMoveEvent({582 source: {583 appInstanceId: workbench.appInstanceId,584 partId: 'main',585 viewId: 'view.2',586 viewUrlSegments: [new UrlSegment('view-2', {})],587 },588 target: {589 appInstanceId: workbench.appInstanceId,590 partId: 'EAST',591 region: 'south',592 newPartId: 'SOUTH-EAST',593 },594 });595 await fixture.whenStable();596 });597 expect(fixture).toEqualPartsLayout(new MTreeNode({598 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),599 child2: new MTreeNode({600 child1: new MPart({partId: 'EAST', viewIds: ['view.3'], activeViewId: 'view.3'}),601 child2: new MPart({partId: 'SOUTH-EAST', viewIds: ['view.2'], activeViewId: 'view.2'}),602 ratio: .5,603 direction: 'column',604 }),605 ratio: .5,606 direction: 'row',607 }));608 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');609 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('SOUTH-EAST');610 expect(viewRegistry.getElseThrow('view.3').part.partId).toEqual('EAST');611 await ngZone.run(async () => {612 // Move view 2 to a new part in the south of part 1613 await viewDragService.dispatchViewMoveEvent({614 source: {615 appInstanceId: workbench.appInstanceId,616 partId: 'SOUTH-EAST',617 viewId: 'view.2',618 viewUrlSegments: [new UrlSegment('view-2', {})],619 },620 target: {621 appInstanceId: workbench.appInstanceId,622 partId: 'main',623 newPartId: 'SOUTH-WEST',624 region: 'south',625 },626 });627 await fixture.whenStable();628 });629 expect(fixture).toEqualPartsLayout(new MTreeNode({630 child1: new MTreeNode({631 child1: new MPart({partId: 'main', viewIds: ['view.1'], activeViewId: 'view.1'}),632 child2: new MPart({partId: 'SOUTH-WEST', viewIds: ['view.2'], activeViewId: 'view.2'}),633 ratio: .5,634 direction: 'column',635 }),636 child2: new MPart({partId: 'EAST', viewIds: ['view.3'], activeViewId: 'view.3'}),637 ratio: .5,638 direction: 'row',639 }));640 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');641 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('SOUTH-WEST');642 expect(viewRegistry.getElseThrow('view.3').part.partId).toEqual('EAST');643 });644 it('should open the same view multiple times', async () => {645 await ngZone.run(async () => {646 // Add view 1647 await wbRouter.navigate(['view-1']);648 await fixture.whenStable();649 // Add view 2650 await wbRouter.navigate(['view-2']);651 await fixture.whenStable();652 // Add view 2 again653 await wbRouter.navigate(['view-2'], {blankPartId: 'main', activateIfPresent: true});654 await fixture.whenStable();655 });656 expect(fixture).toEqualPartsLayout(new MPart({partId: 'main', activeViewId: 'view.2', viewIds: ['view.1', 'view.2']}));657 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');658 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('main');659 });660 it('should open the same view multiple times', async () => {661 await ngZone.run(async () => {662 // Add view 1663 await wbRouter.navigate(['view-1']);664 await fixture.whenStable();665 // Add view 2666 await wbRouter.navigate(['view-2']);667 await fixture.whenStable();668 // Add view 2 again669 await wbRouter.navigate(['view-2'], {blankPartId: 'main', activateIfPresent: false});670 await fixture.whenStable();671 });672 expect(fixture).toEqualPartsLayout(new MPart({partId: 'main', activeViewId: 'view.3', viewIds: ['view.1', 'view.2', 'view.3']}));673 expect(viewRegistry.getElseThrow('view.1').part.partId).toEqual('main');674 expect(viewRegistry.getElseThrow('view.2').part.partId).toEqual('main');675 expect(viewRegistry.getElseThrow('view.3').part.partId).toEqual('main');676 });677});678/****************************************************************************************************679 * Definition of App Test Module *680 ****************************************************************************************************/681@Component({selector: 'spec-view1', template: 'view 1'})682class View1Component {683}684@Component({selector: 'spec-view2', template: 'view 2'})...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1module.exports = function(config) {2 config.set({3 mochaOptions: {4 },5 thresholds: {6 }7 });8};9const assert = require('assert');10const foo = require('./src/foo');11describe('foo', () => {12 it('should return 1', () => {13 assert.equal(foo(), 1);14 });15});16module.exports = function foo() {17 return 1;18};19module.exports = function bar() {20 return 2;21};22[2018-07-11 12:33:41.044] [INFO] SandboxPool - Creating 4 test runners (based on CPU count)23[2018-07-11 12:33:41.045] [INFO] InitialTestExecutor - Initial test run succeeded. Ran 1 tests in 0 seconds (net

Full Screen

Using AI Code Generation

copy

Full Screen

1const whenStable = require('stryker').whenStable;2const whenStable = require('stryker').whenStable;3const whenStable = require('stryker').whenStable;4const whenStable = require('stryker').whenStable;5const whenStable = require('stryker').whenStable;6const whenStable = require('stryker').whenStable;7const whenStable = require('stryker').whenStable;8const whenStable = require('stryker').whenStable;9const whenStable = require('stryker').whenStable;

Full Screen

Using AI Code Generation

copy

Full Screen

1const { whenStable } = require('stryker');2whenStable(() => {3 console.log('Stryker has finished mutation testing');4});5const { whenStable } = require('stryker');6whenStable().then(() => {7 console.log('Stryker has finished mutation testing');8});9const { whenStable } = require('stryker');10whenStable(() => {11 console.log('Stryker has finished mutation testing');12});13const { whenStable } = require('stryker');14whenStable().then(() => {15 console.log('Stryker has finished mutation testing');16});

Full Screen

Using AI Code Generation

copy

Full Screen

1const whenStable = require('stryker-parent').whenStable;2whenStable(() => {3});4const whenStable = require('stryker').whenStable;5whenStable(() => {6});

Full Screen

Using AI Code Generation

copy

Full Screen

1const { whenStable } = require('stryker-parent');2whenStable(() => {3});4const { whenStable } = require('stryker');5whenStable(() => {6});7const { whenStable } = require('stryker-parent');8whenStable(() => {9});10const { whenStable } = require('stryker');11whenStable(() => {12});

Full Screen

Using AI Code Generation

copy

Full Screen

1const { whenStable } = require('stryker');2const waitUntilStable = whenStable();3waitUntilStable.then(() => {4 console.log('Stryker is stable');5});6whenStable().then(() => {7 console.log('Stryker is stable');8});

Full Screen

Using AI Code Generation

copy

Full Screen

1const whenStable = require('stryker-parent').whenStable;2whenStable(() => {3});4const whenStable = require('stryker').whenStable;5whenStable(() => {6});

Full Screen

Using AI Code Generation

copy

Full Screen

1const whenStable = require('stryker');2whenStable(() => {3 console.log('When stable');4});5const whenStable = require('stryker');6whenStable(() => {7 console.log('When stable');8});9const whenStable = require('stryker');10whenStable(() => {11 console.log('When stable');12});13const whenStable = require('stryker');14whenStable(() => {15 console.log('When stable');16});17const whenStable = require('stryker');18whenStable(() => {19 console.log('When stable');20});21const whenStable = require('stryker');22whenStable(() => {23 console.log('When stable');24});25const whenStable = require('stryker');26whenStable(() => {27 console.log('When stable');28});

Full Screen

Using AI Code Generation

copy

Full Screen

1const whenStable = require('stryker-parent').whenStable;2whenStable(timeout, interval, function (err) {3 if (err) {4 console.log(err);5 } else {6 console.log('No more mutations are being generated');7 }8});9const whenStable = require('stryker-api/core').whenStable;

Full Screen

Using AI Code Generation

copy

Full Screen

1var whenStable = require('stryker-parent').whenStable;2whenStable().then(function () {3 console.log('done');4});5var whenStable = require('stryker-parent').whenStable;6whenStable().then(function () {7 console.log('done');8});9var whenStable = require('stryker-parent').whenStable;10whenStable().then(function () {11 console.log('done');12});13var whenStable = require('stryker-parent').whenStable;14whenStable().then(function () {15 console.log('done');16});17var whenStable = require('stryker-parent').whenStable;18whenStable().then(function () {19 console.log('done');20});21var whenStable = require('stryker-parent').whenStable;22whenStable().then(function () {23 console.log('done');24});25var whenStable = require('stryker-parent').whenStable;26whenStable().then(function () {27 console.log('done');28});

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run stryker-parent automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful