How to use createContainer method in Playwright Internal

Best JavaScript code snippet using playwright-internal

Manager.js

Source:Manager.js Github

copy

Full Screen

...10 'Ext.layout.Form'11 ],12 function() {13 var ct;14 function createContainer(cfg) {15 if (Ext.isArray(cfg)) {16 cfg = {17 items: cfg18 };19 }20 return ct = new MyContainer(cfg);21 }22 function sortById(A, B) {23 if (A.id < B.id) {24 return -1;25 }26 if (A.id > B.id) {27 return 1;28 }29 return 0;30 }31 beforeAll(function() {32 Ext.define('MyContainer', {33 extend: 'Ext.Container',34 xtype: 'mycontainer',35 mixins: [36 'Ext.field.Manager'37 ],38 nameHolder: true,39 defaultType: 'textfield',40 updateRecord: function(record) {41 this.consumeRecord(record);42 },43 updateDisabled: function(newDisabled, oldDisabled) {44 this.mixins.fieldmanager.updateDisabled.call(this, newDisabled, oldDisabled);45 this.callParent([newDisabled, oldDisabled]);46 }47 });48 Ext.define('MyModel', {49 extend: 'Ext.data.Model',50 fields: ['foo', 'bar', 'baz']51 });52 });53 afterAll(function() {54 Ext.undefine('MyContainer');55 Ext.undefine('MyModel');56 delete window.MyContainer;57 delete window.MyModel;58 });59 afterEach(function() {60 ct = Ext.destroy(ct);61 });62 it('should get mixed in', function() {63 createContainer();64 expect(ct.mixins.fieldmanager).toBeTruthy();65 });66 describe('fillRecord', function() {67 it('should fill passed record', function() {68 var record = new MyModel({69 id: 'mymodel'70 });71 createContainer([72 { name: 'foo', value: 'foo value' },73 { name: 'bar', value: 'bar value' },74 {75 xtype: 'container',76 defaultType: 'checkboxfield',77 items: [78 { name: 'baz', value: 'baz 1', checked: true },79 { name: 'baz', value: 'baz 2', checked: true },80 { name: 'baz', value: 'baz 3' },81 { name: 'baz', value: 'baz 4', checked: true }82 ]83 }84 ]);85 expect(ct.fillRecord(record)).toBe(ct);86 expect(record.data).toEqual({87 bar: 'bar value',88 foo: 'foo value',89 id: 'mymodel',90 baz: [91 'baz 1',92 'baz 2',93 'baz 4'94 ]95 });96 });97 it('should fill passed record overwriting values', function() {98 var record = new MyModel({99 id: 'mymodel',100 foo: 'blah',101 baz: 'nothing'102 });103 createContainer([104 { name: 'foo', value: 'foo value' },105 { name: 'bar', value: 'bar value' },106 {107 xtype: 'container',108 defaultType: 'checkboxfield',109 items: [110 { name: 'baz', value: 'baz 1', checked: true },111 { name: 'baz', value: 'baz 2', checked: true },112 { name: 'baz', value: 'baz 3' },113 { name: 'baz', value: 'baz 4', checked: true }114 ]115 }116 ]);117 expect(ct.fillRecord(record)).toBe(ct);118 expect(record.data).toEqual({119 bar: 'bar value',120 foo: 'foo value',121 id: 'mymodel',122 baz: [123 'baz 1',124 'baz 2',125 'baz 4'126 ]127 });128 });129 it('should not fill undefined record', function() {130 createContainer();131 var spy = spyOn(ct, 'getValues');132 expect(ct.fillRecord()).toBe(ct);133 expect(spy).not.toHaveBeenCalled();134 });135 });136 describe('updateRecord', function() {137 it('should set values from a record', function() {138 createContainer();139 var record = new MyModel({140 bar: 'bar value',141 baz: 'baz value',142 foo: 'foo value',143 id: 'mymodel'144 }),145 spy = spyOn(ct, 'setValues');146 ct.updateRecord(record);147 expect(spy).toHaveBeenCalled();148 expect(spy.mostRecentCall.args[0]).toEqual({149 bar: 'bar value',150 baz: 'baz value',151 foo: 'foo value',152 id: 'mymodel'153 });154 });155 it('should not set values from an undefined record', function() {156 createContainer();157 var spy = spyOn(ct, 'setValues');158 ct.updateRecord();159 expect(spy).not.toHaveBeenCalled();160 });161 });162 describe('setValues', function() {163 it('should set values to all fields', function() {164 createContainer([165 { name: 'foo' },166 { name: 'bar' },167 {168 xtype: 'container',169 defaultType: 'checkboxfield',170 items: [171 { name: 'baz', value: 'baz 1' },172 { name: 'baz', value: 'baz 2' },173 { name: 'baz', value: 'baz 3' },174 { name: 'baz', value: 'baz 4' }175 ]176 },177 {178 xtype: 'container',179 defaultType: 'radiofield',180 items: [181 { name: 'bazier', value: 'bazier 1', checked: true },182 { name: 'bazier', value: 'bazier 2' },183 { name: 'bazier', value: 'bazier 3' },184 { name: 'bazier', value: 'bazier 4' }185 ]186 }187 ]);188 var values = {189 bar: 'bar value',190 bazier: 'bazier 3',191 foo: 'foo value',192 baz: [193 'baz 1',194 'baz 3'195 ]196 };197 expect(ct.setValues(values)).toBe(ct);198 expect(ct.getValues()).toEqual({199 bar: 'bar value',200 bazier: 'bazier 3',201 foo: 'foo value',202 baz: [203 'baz 1',204 'baz 3'205 ]206 });207 });208 it('should not set values if none passed', function() {209 createContainer([210 { name: 'foo' },211 { name: 'bar' },212 {213 xtype: 'container',214 defaultType: 'checkboxfield',215 items: [216 { name: 'baz', value: 'baz 1' },217 { name: 'baz', value: 'baz 2' },218 { name: 'baz', value: 'baz 3' },219 { name: 'baz', value: 'baz 4' }220 ]221 },222 {223 xtype: 'container',224 defaultType: 'radiofield',225 items: [226 { name: 'bazier', value: 'bazier 1', checked: true },227 { name: 'bazier', value: 'bazier 2' },228 { name: 'bazier', value: 'bazier 3' },229 { name: 'bazier', value: 'bazier 4' }230 ]231 }232 ]);233 expect(ct.setValues()).toBe(ct);234 var values = ct.getValues();235 expect(values).toEqual({236 bar: null,237 bazier: 'bazier 1',238 foo: null,239 baz: null240 });241 });242 });243 describe('getValues', function() {244 it('should get values from all fields', function() {245 createContainer([246 { name: 'foo', value: 'foo value' },247 { name: 'bar', value: 'bar value' },248 {249 xtype: 'container',250 defaultType: 'checkboxfield',251 items: [252 { name: 'baz', value: 'baz 1', checked: true },253 { name: 'baz', value: 'baz 2', checked: true },254 { name: 'baz', value: 'baz 3' },255 { name: 'baz', value: 'baz 4', checked: true }256 ]257 },258 {259 xtype: 'container',260 defaultType: 'radiofield',261 items: [262 { name: 'bazier', value: 'bazier 1', checked: true },263 { name: 'bazier', value: 'bazier 2' },264 { name: 'bazier', value: 'bazier 3' },265 { name: 'bazier', value: 'bazier 4' }266 ]267 }268 ]);269 expect(ct.getValues()).toEqual({270 bar: 'bar value',271 bazier: 'bazier 1',272 foo: 'foo value',273 baz: [274 'baz 1',275 'baz 2',276 'baz 4'277 ]278 });279 });280 });281 describe('reset', function() {282 it('should reset all fields', function() {283 createContainer([284 { required: true, name: 'foo', value: 'foo value' },285 { required: true, name: 'bar', value: 'bar value' },286 {287 xtype: 'container',288 defaultType: 'checkboxfield',289 items: [290 { name: 'baz', value: 'baz 1', checked: true },291 { name: 'baz', value: 'baz 2', checked: true },292 { name: 'baz', value: 'baz 3' },293 { name: 'baz', value: 'baz 4', checked: true }294 ]295 },296 {297 xtype: 'container',298 defaultType: 'radiofield',299 items: [300 { name: 'bazier', value: 'bazier 1', checked: true },301 { name: 'bazier', value: 'bazier 2' },302 { name: 'bazier', value: 'bazier 3' },303 { name: 'bazier', value: 'bazier 4' }304 ]305 }306 ]);307 var origValues = {308 bar: 'bar value',309 bazier: 'bazier 1',310 foo: 'foo value',311 baz: [312 'baz 1',313 'baz 2',314 'baz 4'315 ]316 },317 newValues = {318 bar: '',319 bazier: 'bazier 3',320 foo: '',321 baz: [322 'baz 1',323 'baz 3'324 ]325 },326 foo = ct.lookupName('foo'),327 bar = ct.lookupName('bar');328 expect(ct.getValues()).toEqual(origValues);329 expect(ct.setValues(newValues)).toBe(ct);330 expect(ct.getValues()).toEqual(newValues);331 expect(foo.getError()).toEqual(['This field is required']);332 expect(bar.getError()).toEqual(['This field is required']);333 expect(ct.reset()).toBe(ct);334 expect(ct.getValues()).toEqual(origValues);335 });336 it('should reset all fields and setError(null) each field', function() {337 createContainer([338 { required: true, name: 'foo', value: 'foo value' },339 { required: true, name: 'bar', value: 'bar value' },340 {341 xtype: 'container',342 defaultType: 'checkboxfield',343 items: [344 { name: 'baz', value: 'baz 1', checked: true },345 { name: 'baz', value: 'baz 2', checked: true },346 { name: 'baz', value: 'baz 3' },347 { name: 'baz', value: 'baz 4', checked: true }348 ]349 },350 {351 xtype: 'container',352 defaultType: 'radiofield',353 items: [354 { name: 'bazier', value: 'bazier 1', checked: true },355 { name: 'bazier', value: 'bazier 2' },356 { name: 'bazier', value: 'bazier 3' },357 { name: 'bazier', value: 'bazier 4' }358 ]359 }360 ]);361 var origValues = {362 bar: 'bar value',363 bazier: 'bazier 1',364 foo: 'foo value',365 baz: [366 'baz 1',367 'baz 2',368 'baz 4'369 ]370 },371 newValues = {372 bar: '',373 bazier: 'bazier 3',374 foo: '',375 baz: [376 'baz 1',377 'baz 3'378 ]379 },380 foo = ct.lookupName('foo'),381 bar = ct.lookupName('bar');382 expect(ct.getValues()).toEqual(origValues);383 expect(ct.setValues(newValues)).toBe(ct);384 expect(ct.getValues()).toEqual(newValues);385 expect(foo.getError()).toEqual(['This field is required']);386 expect(bar.getError()).toEqual(['This field is required']);387 expect(ct.reset(true)).toBe(ct);388 expect(ct.getValues()).toEqual(origValues);389 expect(foo.getError()).toBeNull();390 expect(bar.getError()).toBeNull();391 });392 });393 describe('updateDisabled', function() {394 it('should disable all fields', function() {395 createContainer([396 { required: true, name: 'foo', value: 'foo value' },397 { required: true, name: 'bar', value: 'bar value' },398 {399 xtype: 'container',400 defaultType: 'checkboxfield',401 items: [402 { name: 'baz', value: 'baz 1', checked: true },403 { name: 'baz', value: 'baz 2', checked: true },404 { name: 'baz', value: 'baz 3' },405 { name: 'baz', value: 'baz 4', checked: true }406 ]407 }408 ]);409 var foo = ct.lookupName('foo'),410 bar = ct.lookupName('bar'),411 baz = ct.lookupName('baz');412 expect(ct.setDisabled(true)).toBe(ct);413 expect(foo.getDisabled()).toBe(true);414 expect(bar.getDisabled()).toBe(true);415 baz.forEach(function(field) {416 expect(field.getDisabled()).toBe(true);417 });418 });419 it('should enable all fields', function() {420 createContainer([421 { required: true, name: 'foo', value: 'foo value', disabled: true },422 { required: true, name: 'bar', value: 'bar value', disabled: true },423 {424 xtype: 'container',425 defaultType: 'checkboxfield',426 items: [427 { name: 'baz', value: 'baz 1', disabled: true, checked: true },428 { name: 'baz', value: 'baz 2', disabled: true, checked: true },429 { name: 'baz', value: 'baz 3', disabled: true },430 { name: 'baz', value: 'baz 4', disabled: true, checked: true }431 ]432 }433 ]);434 var foo = ct.lookupName('foo'),435 bar = ct.lookupName('bar'),436 baz = ct.lookupName('baz');437 expect(foo.getDisabled()).toBe(true);438 expect(bar.getDisabled()).toBe(true);439 baz.forEach(function(field) {440 expect(field.getDisabled()).toBe(true);441 });442 expect(ct.setDisabled(false)).toBe(ct);443 expect(foo.getDisabled()).toBe(false);444 expect(bar.getDisabled()).toBe(false);445 baz.forEach(function(field) {446 expect(field.getDisabled()).toBe(false);447 });448 });449 });450 describe('setErrors', function() {451 it('should set errors on all fields', function() {452 createContainer([453 { name: 'foo' },454 { name: 'bar' },455 {456 xtype: 'container',457 defaultType: 'checkboxfield',458 items: [459 { name: 'baz', value: 'baz 1' },460 { name: 'baz', value: 'baz 2' },461 { name: 'baz', value: 'baz 3' },462 { name: 'baz', value: 'baz 4' }463 ]464 },465 {466 xtype: 'container',467 defaultType: 'radiofield',468 items: [469 { name: 'bazier', value: 'bazier 1' },470 { name: 'bazier', value: 'bazier 2' },471 { name: 'bazier', value: 'bazier 3' },472 { name: 'bazier', value: 'bazier 4' }473 ]474 }475 ]);476 var foo = ct.lookupName('foo'),477 bar = ct.lookupName('bar'),478 baz = ct.lookupName('baz'),479 bazier = ct.lookupName('bazier'),480 errors = {481 foo: 'Foo is in error!',482 bar: [483 'Bar is in error!',484 'Bar still error!'485 ],486 baz: 'Baz is errored',487 bazier: 'Bazier not very good'488 };489 expect(ct.setErrors(errors)).toBe(ct);490 expect(foo.getError()).toBe('Foo is in error!');491 expect(bar.getError()).toEqual(['Bar is in error!', 'Bar still error!']);492 baz.forEach(function(check) {493 expect(check.getError()).toBe('Baz is errored');494 });495 bazier.forEach(function(radio) {496 expect(radio.getError()).toBe('Bazier not very good');497 });498 });499 it('should not set errors if an array is passed', function() {500 createContainer();501 var spy = spyOn(Ext, 'raise');502 ct.setErrors([]);503 expect(spy).toHaveBeenCalled();504 });505 it('should not set errors if a string is passed', function() {506 createContainer();507 var spy = spyOn(Ext, 'raise');508 ct.setErrors('foobar');509 expect(spy).toHaveBeenCalled();510 });511 it('should set errors on nested fields', function() {512 createContainer({513 layout: {514 type: 'form'515 },516 items: [{517 xtype: 'containerfield',518 label: 'Name',519 defaults: {520 flex: 1,521 labelAlign: 'top'522 },523 items: [524 { label: 'First', name: 'first' },525 { label: 'Middle', name: 'middle' },526 { label: 'Last', name: 'last' }527 ]528 }, {529 xtype: 'textfield',530 label: 'A longer label to test width',531 name: 'text'532 }]533 });534 var first = ct.lookupName('first'),535 middle = ct.lookupName('middle'),536 last = ct.lookupName('last'),537 text = ct.lookupName('text'),538 errors = {539 text: 'Text value is bad!',540 // containerfield errors below541 first: 'First is bad!',542 middle: 'Middle is bad!',543 last: 'Last is bad!'544 };545 expect(ct.setErrors(errors)).toBe(ct);546 expect(first.getError()).toBe('First is bad!');547 expect(middle.getError()).toBe('Middle is bad!');548 expect(last.getError()).toBe('Last is bad!');549 expect(text.getError()).toBe('Text value is bad!');550 });551 });552 describe('clearErrors', function() {553 it('should clear all field errors', function() {554 createContainer([555 { name: 'foo', error: 'foo error' },556 { name: 'bar', error: 'bar error' },557 {558 xtype: 'container',559 defaultType: 'radiofield',560 items: [561 { name: 'bazier', value: 'bazier 1', error: 'bazier error' },562 { name: 'bazier', value: 'bazier 2', error: 'bazier error' },563 { name: 'bazier', value: 'bazier 3', error: 'bazier error' },564 { name: 'bazier', value: 'bazier 4', error: 'bazier error' }565 ]566 }567 ]);568 var foo = ct.lookupName('foo'),569 bar = ct.lookupName('bar'),570 baz = ct.lookupName('baz'),571 bazier = ct.lookupName('bazier');572 expect(foo.getError()).toBe('foo error');573 expect(bar.getError()).toBe('bar error');574 bazier.forEach(function(radio) {575 expect(radio.getError()).toBe('bazier error');576 });577 expect(ct.clearErrors()).toBe(ct);578 expect(foo.getError()).toBeNull();579 expect(bar.getError()).toBeNull();580 bazier.forEach(function(radio) {581 expect(radio.getError()).toBeNull();582 });583 });584 it('should not clear fields without a name', function() {585 createContainer([586 { name: 'foo', error: 'foo error' },587 { error: 'bar error' },588 {589 xtype: 'container',590 defaultType: 'radiofield',591 items: [592 { name: 'bazier', value: 'bazier 1', error: 'bazier error' },593 { name: 'bazier', value: 'bazier 2', error: 'bazier error' },594 { name: 'bazier', value: 'bazier 3', error: 'bazier error' },595 { name: 'bazier', value: 'bazier 4', error: 'bazier error' }596 ]597 }598 ]);599 var foo = ct.lookupName('foo'),600 bar = ct.getAt(1),601 baz = ct.lookupName('baz'),602 bazier = ct.lookupName('bazier');603 expect(foo.getError()).toBe('foo error');604 expect(bar.getError()).toBe('bar error');605 bazier.forEach(function(radio) {606 expect(radio.getError()).toBe('bazier error');607 });608 expect(ct.clearErrors()).toBe(ct);609 expect(foo.getError()).toBeNull();610 expect(bar.getError()).toBe('bar error');611 bazier.forEach(function(radio) {612 expect(radio.getError()).toBeNull();613 });614 });615 });616 describe('getErrors', function() {617 it('should return field errors', function() {618 createContainer([619 { name: 'foo', error: 'foo error' },620 { name: 'bar' },621 {622 xtype: 'container',623 defaultType: 'radiofield',624 items: [625 { name: 'bazier', value: 'bazier 1', error: 'bazier error' },626 { name: 'bazier', value: 'bazier 2', error: 'bazier error' },627 { name: 'bazier', value: 'bazier 3', error: 'bazier error' },628 { name: 'bazier', value: 'bazier 4', error: 'bazier error' }629 ]630 }631 ]);632 expect(ct.getErrors()).toEqual({633 foo: 'foo error',634 bar: null,635 bazier: 'bazier error'636 });637 });638 });639 describe('isValid', function() {640 it('should stop checking fields when a field is not valid', function() {641 it('should stop checking fields when a field is not valid', function() {642 createContainer([643 { name: 'foo', error: 'foo error' },644 { name: 'bar' }645 ]);646 var foo = ct.lookupName('foo'),647 bar = ct.lookupName('bar'),648 spy = spyOn(bar, 'isValid');649 expect(ct.isValid()).toBe(false);650 expect(spy).not.toHaveBeenCalled();651 });652 });653 it('should check all fields if valid', function() {654 createContainer([655 { name: 'foo' },656 { name: 'bar' }657 ]);658 var bar = ct.lookupName('bar'),659 spy = spyOn(bar, 'isValid').andCallThrough();660 expect(ct.isValid()).toBe(true);661 expect(spy).toHaveBeenCalled();662 });663 });664 describe('validate', function() {665 it('should validate all fields', function() {666 createContainer([667 { name: 'foo', required: true },668 { name: 'bar' }669 ]);670 var foo = ct.lookupName('foo'),671 bar = ct.lookupName('bar'),672 spy = spyOn(bar, 'validate').andCallThrough();673 expect(ct.validate()).toBe(false);674 expect(spy).toHaveBeenCalled();675 });676 it('should be valid', function() {677 createContainer([678 { name: 'foo', value: 'foo', required: true },679 { name: 'bar' }680 ]);681 var foo = ct.lookupName('foo'),682 bar = ct.lookupName('bar'),683 spy = spyOn(bar, 'validate').andCallThrough();684 expect(ct.validate()).toBe(true);685 expect(spy).toHaveBeenCalled();686 });687 });688 describe('getFields', function() {689 beforeEach(function() {690 createContainer([691 { name: 'foo' },692 { name: 'bar' },693 {694 xtype: 'container',695 defaultType: 'checkboxfield',696 items: [697 { name: 'baz', value: 'baz 1' },698 { name: 'baz', value: 'baz 2' },699 { name: 'baz', value: 'baz 3' },700 { name: 'baz', value: 'baz 4' }701 ]702 },703 {704 xtype: 'container',705 defaultType: 'radiofield',706 items: [707 { name: 'bazier', value: 'bazier 1' },708 { name: 'bazier', value: 'bazier 2' },709 { name: 'bazier', value: 'bazier 3' },710 { name: 'bazier', value: 'bazier 4' }711 ]712 }713 ]);714 });715 describe('return object', function() {716 it('should return an object of fields by name', function() {717 var fields = {718 foo: ct.lookupName('foo'),719 bar: ct.lookupName('bar'),720 baz: jasmine.array.toMap(ct.lookupName('baz'), 'id'),721 bazier: jasmine.array.toMap(ct.lookupName('bazier'), 'id')722 },723 found = ct.getFields();724 found.baz = jasmine.array.toMap(found.baz, 'id');725 found.bazier = jasmine.array.toMap(found.bazier, 'id');726 expect(found).toEqual(fields);727 });728 it('should return an object of shallow fields by name', function() {729 var fields = {730 foo: ct.lookupName('foo'),731 bar: ct.lookupName('bar')732 };733 expect(ct.getFields(null, false)).toEqual(fields);734 });735 });736 describe('return array', function() {737 it('should return an array if byName is false', function() {738 var fields = jasmine.array.toMap([739 ct.lookupName('foo'),740 ct.lookupName('bar')741 ].concat(742 ct.lookupName('baz'),743 ct.lookupName('bazier')744 ), 'id');745 expect(jasmine.array.toMap(ct.getFields(false), 'id')).toEqual(fields);746 });747 it('should return an array if name passed', function() {748 var fields = jasmine.array.toMap(ct.lookupName('baz'), 'id');749 expect(jasmine.array.toMap(ct.getFields('baz'), 'id')).toEqual(fields);750 });751 });752 describe('return instance', function() {753 it('should return an instance if name passed', function() {754 var field = ct.lookupName('foo');755 expect(ct.getFields('foo')).toBe(field);756 });757 it('should return a shallow instance if name is passed', function() {758 var field = ct.lookupName('foo');759 expect(ct.getFields('foo', false)).toBe(field);760 });761 });762 describe('return undefined', function() {763 it('should not return if name does not match', function() {764 expect(ct.getFields('foobar')).toBeUndefined();765 });766 it('should not return if name is passed but is not shallow', function() {767 expect(ct.getFields('baz', false)).toBeUndefined();768 });769 });770 });771 describe('getFocusedField', function() {772 it('should find a focused field', function() {773 createContainer({774 renderTo: Ext.getBody(),775 items: [776 { name: 'foo' },777 { name: 'bar' }778 ]779 });780 var foo = ct.lookupName('foo');781 waitsFor(function() {782 return ct.rendered;783 });784 runs(function() {785 foo.onFocus();786 expect(ct.getFocusedField()).toBe(foo);787 });788 });789 it('should not find a focused field', function() {790 createContainer({791 renderTo: Ext.getBody(),792 items: [793 { name: 'foo' },794 { name: 'bar' }795 ]796 });797 var foo = ct.lookupName('foo');798 waitsFor(function() {799 return ct.rendered;800 });801 runs(function() {802 expect(ct.getFocusedField()).toBeNull();803 });804 });805 });806 describe('getNextField', function() {807 it('should find the next field after the focused field', function() {808 createContainer({809 renderTo: Ext.getBody(),810 items: [811 { name: 'foo' },812 { name: 'bar' }813 ]814 });815 var foo = ct.lookupName('foo'),816 bar = ct.lookupName('bar');817 waitsFor(function() {818 return ct.rendered;819 });820 runs(function() {821 foo.onFocus();822 expect(ct.getNextField()).toBe(bar);823 });824 });825 it('should not find the next field after the focused field', function() {826 createContainer({827 renderTo: Ext.getBody(),828 items: [829 { name: 'foo' },830 { name: 'bar' }831 ]832 });833 var foo = ct.lookupName('foo'),834 bar = ct.lookupName('bar');835 waitsFor(function() {836 return ct.rendered;837 });838 runs(function() {839 expect(ct.getNextField()).toBe(false);840 });841 });842 it('should not find the next field if focused is last field', function() {843 createContainer({844 renderTo: Ext.getBody(),845 items: [846 { name: 'foo' },847 { name: 'bar' }848 ]849 });850 var bar = ct.lookupName('bar');851 waitsFor(function() {852 return ct.rendered;853 });854 runs(function() {855 bar.onFocus();856 expect(ct.getNextField()).toBe(false);857 });858 });859 });860 describe('focusNextField', function() {861 it('should focus next field', function() {862 createContainer({863 renderTo: Ext.getBody(),864 items: [865 { name: 'foo' },866 { name: 'bar' }867 ]868 });869 var foo = ct.lookupName('foo'),870 bar = ct.lookupName('bar'),871 spy = spyOn(bar, 'focus');872 waitsFor(function() {873 return ct.rendered;874 });875 runs(function() {876 foo.onFocus();877 expect(ct.focusNextField()).toBe(bar);878 expect(spy).toHaveBeenCalled();879 });880 });881 it('should not focus next field if no field was focused', function() {882 createContainer({883 renderTo: Ext.getBody(),884 items: [885 { name: 'foo' },886 { name: 'bar' }887 ]888 });889 var foo = ct.lookupName('foo'),890 bar = ct.lookupName('bar'),891 spy = spyOn(bar, 'focus');892 waitsFor(function() {893 return ct.rendered;894 });895 runs(function() {896 expect(ct.focusNextField()).toBe(false);897 expect(spy).not.toHaveBeenCalled();898 });899 });900 it('should not focus next field if focused is last field', function() {901 createContainer({902 renderTo: Ext.getBody(),903 items: [904 { name: 'foo' },905 { name: 'bar' }906 ]907 });908 var bar = ct.lookupName('bar');909 waitsFor(function() {910 return ct.rendered;911 });912 runs(function() {913 bar.onFocus();914 expect(ct.focusNextField()).toBe(false);915 });916 });917 });918 describe('getPreviousField', function() {919 it('should get field before focused field', function() {920 createContainer({921 renderTo: Ext.getBody(),922 items: [923 { name: 'foo' },924 { name: 'bar' }925 ]926 });927 var foo = ct.lookupName('foo'),928 bar = ct.lookupName('bar');929 waitsFor(function() {930 return ct.rendered;931 });932 runs(function() {933 bar.onFocus();934 expect(ct.getPreviousField()).toBe(foo);935 });936 });937 it('should not find the previous field if no field is focused', function() {938 createContainer({939 renderTo: Ext.getBody(),940 items: [941 { name: 'foo' },942 { name: 'bar' }943 ]944 });945 var foo = ct.lookupName('foo'),946 bar = ct.lookupName('bar');947 waitsFor(function() {948 return ct.rendered;949 });950 runs(function() {951 expect(ct.getPreviousField()).toBe(false);952 });953 });954 it('should not find the previous field if focused is first field', function() {955 createContainer({956 renderTo: Ext.getBody(),957 items: [958 { name: 'foo' },959 { name: 'bar' }960 ]961 });962 var foo = ct.lookupName('foo');963 waitsFor(function() {964 return ct.rendered;965 });966 runs(function() {967 foo.onFocus();968 expect(ct.getPreviousField()).toBe(false);969 });970 });971 });972 describe('focusPreviousField', function() {973 it('should focus previous field', function() {974 createContainer({975 renderTo: Ext.getBody(),976 items: [977 { name: 'foo' },978 { name: 'bar' }979 ]980 });981 var foo = ct.lookupName('foo'),982 bar = ct.lookupName('bar'),983 spy = spyOn(foo, 'focus');984 waitsFor(function() {985 return ct.rendered;986 });987 runs(function() {988 bar.onFocus();989 expect(ct.focusPreviousField()).toBe(foo);990 expect(spy).toHaveBeenCalled();991 });992 });993 it('should not focus previous field if no field was focused', function() {994 createContainer({995 renderTo: Ext.getBody(),996 items: [997 { name: 'foo' },998 { name: 'bar' }999 ]1000 });1001 var foo = ct.lookupName('foo'),1002 bar = ct.lookupName('bar'),1003 spy = spyOn(foo, 'focus');1004 waitsFor(function() {1005 return ct.rendered;1006 });1007 runs(function() {1008 expect(ct.focusPreviousField()).toBe(false);1009 expect(spy).not.toHaveBeenCalled();1010 });1011 });1012 it('should not focus previous field if focused is first field', function() {1013 createContainer({1014 renderTo: Ext.getBody(),1015 items: [1016 { name: 'foo' },1017 { name: 'bar' }1018 ]1019 });1020 var foo = ct.lookupName('foo');1021 waitsFor(function() {1022 return ct.rendered;1023 });1024 runs(function() {1025 foo.onFocus();1026 expect(ct.focusPreviousField()).toBe(false);1027 });...

Full Screen

Full Screen

container.spec.js

Source:container.spec.js Github

copy

Full Screen

...4describe('Container', () => {5 let container;6 describe('Constructor', () => {7 it('should instantiate a new Container', () => {8 container = createContainer();9 expect(container).to.be.an.instanceof(Container);10 });11 it('should not have a collider by default', () => {12 container = createContainer();13 expect(container.colliderType).to.equal(null);14 });15 it('should accept arguments', () => {16 container = createContainer({ collider: { type: 'rect' } });17 expect(container.colliderType).to.equal('rect');18 expect(container.collider).to.be.an.instanceof(GeoRect);19 });20 });21 describe('Set', () => {22 it('should set correct values', () => {23 container = createContainer();24 container.set({ collider: { type: 'rect' } });25 expect(container.colliderType).to.equal('rect');26 expect(container.collider).to.be.an.instanceof(GeoRect);27 });28 it('should handle no arguments', () => {29 container = createContainer();30 container.set();31 expect(container.colliderType).to.equal(null);32 });33 it('should be able to disable the collider', () => {34 container = createContainer({ collider: { type: 'rect' } });35 container.set({ collider: { type: null } });36 expect(container.colliderType).to.equal(null);37 });38 });39 describe('BoundingRect', () => {40 it('should return a zero sized rect if no children have been added', () => {41 container = createContainer();42 expect(container.boundingRect()).to.deep.equal({43 x: 0, y: 0, width: 0, height: 044 });45 });46 it('should return correct value if container and children are without a transformation', () => {47 container = createContainer();48 container.addChildren([49 createRect({50 x: 5, y: 10, width: 1, height: 2051 }), // Height52 createRect({53 x: 0, y: 0, width: 10, height: 254 }), // Width55 createRect({56 x: -10, y: -20, width: 1, height: 257 }) // x,y58 ]);59 expect(container.boundingRect()).to.deep.equal({60 x: -10, y: -20, width: 20, height: 5061 });62 });63 it('should return correct value with a transformation on its children', () => {64 container = createContainer();65 container.addChildren([66 createRect({67 x: 5, y: 10, width: 1, height: 20, transform: 'scale(2, 3)'68 }),69 createRect({70 x: 0, y: 0, width: 10, height: 2, transform: 'scale(2, 3)'71 }),72 createRect({73 x: -10, y: -20, width: 1, height: 2, transform: 'scale(2, 3)'74 })75 ]);76 container.children.forEach(c => c.resolveGlobalTransform());77 expect(container.boundingRect(true)).to.deep.equal({78 x: -20, y: -60, width: 40, height: 15079 });80 });81 it('should return correct value with a transformation the container and its children', () => {82 container = createContainer({ transform: 'scale(2, 3)' });83 container.addChildren([84 createRect({85 x: 5, y: 10, width: 1, height: 20, transform: 'translate(1, 2)'86 }),87 createRect({88 x: 0, y: 0, width: 10, height: 2, transform: 'translate(1, 2)'89 }),90 createRect({91 x: -10, y: -20, width: 1, height: 2, transform: 'translate(1, 2)'92 })93 ]);94 container.children.forEach(c => c.resolveGlobalTransform());95 expect(container.boundingRect(true)).to.deep.equal({96 x: -18, y: -54, width: 40, height: 15097 });98 });99 it('should return correct value a scale transformation', () => {100 container = createContainer({ transform: 'scale(2, 3)' });101 container.addChildren([102 createRect({103 x: 5, y: 10, width: 1, height: 20104 }), // Height105 createRect({106 x: 0, y: 0, width: 10, height: 2107 }), // Width108 createRect({109 x: -10, y: -20, width: 1, height: 2110 }) // x,y111 ]);112 container.children.forEach(c => c.resolveGlobalTransform());113 expect(container.boundingRect(true)).to.deep.equal({114 x: -20, y: -60, width: 40, height: 150115 });116 });117 it('should return correct value with a translate transformation', () => {118 container = createContainer({ transform: 'translate(2, 3)' });119 container.addChildren([120 createRect({121 x: 5, y: 10, width: 1, height: 20122 }), // Height123 createRect({124 x: 0, y: 0, width: 10, height: 2125 }), // Width126 createRect({127 x: -10, y: -20, width: 1, height: 2128 }) // x,y129 ]);130 container.children.forEach(c => c.resolveGlobalTransform());131 expect(container.boundingRect(true)).to.deep.equal({132 x: -8, y: -17, width: 20, height: 50133 });134 });135 it('should return correct value with a rotate transformation', () => {136 container = createContainer({ transform: 'rotate(45)' });137 container.addChildren([138 createRect({139 x: 5, y: 10, width: 1, height: 20140 }),141 createRect({142 x: 0, y: 0, width: 10, height: 2143 }),144 createRect({145 x: -10, y: -20, width: 1, height: 2146 })147 ]);148 container.children.forEach(c => c.resolveGlobalTransform());149 expect(container.boundingRect(true)).to.deep.equal({150 x: -17.677669529663685, y: -21.213203435596427, width: 25.455844122715707, height: 46.66904755831214151 });152 });153 });154 describe('Bounds', () => {155 it('should return a zero sized rect if no children have been added', () => {156 container = createContainer();157 expect(container.bounds()).to.deep.equal([158 { x: 0, y: 0 },159 { x: 0, y: 0 },160 { x: 0, y: 0 },161 { x: 0, y: 0 }162 ]);163 });164 it('should return correct value if container and children are without a transformation', () => {165 container = createContainer();166 container.addChildren([167 createRect({168 x: 5, y: 10, width: 1, height: 20169 }), // Height170 createRect({171 x: 0, y: 0, width: 10, height: 2172 }), // Width173 createRect({174 x: -10, y: -20, width: 1, height: 2175 }) // x,y176 ]);177 expect(container.bounds()).to.deep.equal([178 { x: -10, y: -20 },179 { x: 10, y: -20 },180 { x: 10, y: 30 },181 { x: -10, y: 30 }182 ]);183 });184 it('should return correct value with a transformation on its children', () => {185 container = createContainer();186 container.addChildren([187 createRect({188 x: 5, y: 10, width: 1, height: 20, transform: 'scale(2, 3)'189 }),190 createRect({191 x: 0, y: 0, width: 10, height: 2, transform: 'scale(2, 3)'192 }),193 createRect({194 x: -10, y: -20, width: 1, height: 2, transform: 'scale(2, 3)'195 })196 ]);197 container.children.forEach(c => c.resolveGlobalTransform());198 expect(container.bounds(true)).to.deep.equal([199 { x: -20, y: -60 },200 { x: 20, y: -60 },201 { x: 20, y: 90 },202 { x: -20, y: 90 }203 ]);204 });205 it('should return correct value with a transformation the container and its children', () => {206 container = createContainer({ transform: 'scale(2, 3)' });207 container.addChildren([208 createRect({209 x: 5, y: 10, width: 1, height: 20, transform: 'translate(1, 2)'210 }),211 createRect({212 x: 0, y: 0, width: 10, height: 2, transform: 'translate(1, 2)'213 }),214 createRect({215 x: -10, y: -20, width: 1, height: 2, transform: 'translate(1, 2)'216 })217 ]);218 container.children.forEach(c => c.resolveGlobalTransform());219 expect(container.bounds(true)).to.deep.equal([220 { x: -18, y: -54 },221 { x: 22, y: -54 },222 { x: 22, y: 96 },223 { x: -18, y: 96 }224 ]);225 });226 it('should return correct value a scale transformation', () => {227 container = createContainer({ transform: 'scale(2, 3)' });228 container.addChildren([229 createRect({230 x: 5, y: 10, width: 1, height: 20231 }), // Height232 createRect({233 x: 0, y: 0, width: 10, height: 2234 }), // Width235 createRect({236 x: -10, y: -20, width: 1, height: 2237 }) // x,y238 ]);239 container.children.forEach(c => c.resolveGlobalTransform());240 expect(container.bounds(true)).to.deep.equal([241 { x: -20, y: -60 },242 { x: 20, y: -60 },243 { x: 20, y: 90 },244 { x: -20, y: 90 }245 ]);246 });247 it('should return correct value with a translate transformation', () => {248 container = createContainer({ transform: 'translate(2, 3)' });249 container.addChildren([250 createRect({251 x: 5, y: 10, width: 1, height: 20252 }), // Height253 createRect({254 x: 0, y: 0, width: 10, height: 2255 }), // Width256 createRect({257 x: -10, y: -20, width: 1, height: 2258 }) // x,y259 ]);260 container.children.forEach(c => c.resolveGlobalTransform());261 expect(container.bounds(true)).to.deep.equal([262 { x: -8, y: -17 },263 { x: 12, y: -17 },264 { x: 12, y: 33 },265 { x: -8, y: 33 }266 ]);267 });268 it('should return correct value with a rotate transformation', () => {269 container = createContainer({ transform: 'rotate(45)' });270 container.addChildren([271 createRect({272 x: 5, y: 10, width: 1, height: 20273 }),274 createRect({275 x: 0, y: 0, width: 10, height: 2276 }),277 createRect({278 x: -10, y: -20, width: 1, height: 2279 })280 ]);281 container.children.forEach(c => c.resolveGlobalTransform());282 expect(container.bounds(true)).to.deep.equal([283 { x: -17.677669529663685, y: -21.213203435596427 },284 { x: 7.778174593052022, y: -21.213203435596427 },285 { x: 7.778174593052022, y: 25.45584412271571 },286 { x: -17.677669529663685, y: 25.45584412271571 }287 ]);288 });289 });290 describe('containsPoint', () => {291 it('should return true if any child contains point', () => {292 container = createContainer();293 container.addChild(createRect({294 x: 500, y: 500, width: 100, height: 100295 }));296 container.addChild(createRect({297 x: 500, y: 500, width: 200, height: 200298 }));299 const r = container.containsPoint({ x: 550, y: 550 });300 expect(r).to.equal(true);301 });302 it('should return true if any childs child contains point', () => {303 container = createContainer();304 container.addChild(createRect({305 x: 500, y: 500, width: 100, height: 100306 }));307 container.addChild(createRect({308 x: 500, y: 500, width: 200, height: 200309 }));310 const childContainer = createContainer();311 childContainer.addChild(createRect({312 x: 0, y: 0, width: 200, height: 200313 }));314 childContainer.addChild(createRect({315 x: 1500, y: 1500, width: 200, height: 200316 }));317 container.addChild(childContainer);318 const r = container.containsPoint({ x: 1550, y: 1550 });319 expect(r).to.equal(true);320 });321 it('should return false if no child contains point', () => {322 container = createContainer();323 container.addChild(createRect({324 x: 500, y: 500, width: 100, height: 100325 }));326 container.addChild(createRect({327 x: 500, y: 500, width: 200, height: 200328 }));329 const r = container.containsPoint({ x: 0, y: 0 });330 expect(r).to.equal(false);331 });332 it('should return true if bounds contains point', () => {333 container = createContainer({ collider: { type: 'bounds' } });334 container.addChild(createRect({335 x: 0, y: 0, width: 100, height: 100336 }));337 container.addChild(createRect({338 x: 1500, y: 1500, width: 200, height: 200339 }));340 const r = container.containsPoint({ x: 2, y: 2 });341 expect(r).to.equal(true);342 });343 it('should include self transformation when resolving collision', () => {344 const rect = createRect({345 x: 0,346 y: 0,347 width: 100,348 height: 100349 });350 container = createContainer({ transform: 'translate(10, 20)', collider: { type: 'bounds' } });351 container.addChild(rect);352 rect.resolveGlobalTransform();353 // After transform, container should have a bounds of { x: 10, y: 20, width: 100, height: 100 }354 const r = container.containsPoint({ x: 105, y: 110 });355 expect(r).to.equal(true);356 });357 it('should include descendant transformation when resolving collision', () => {358 container = createContainer({ collider: { type: 'bounds' } });359 const rect = createRect({360 x: 0,361 y: 0,362 width: 100,363 height: 100,364 transform: 'translate(10, 20)'365 });366 container.addChild(rect);367 // After transform, container should have a bounds of { x: 10, y: 20, width: 100, height: 100 }368 rect.resolveGlobalTransform();369 const r = container.containsPoint({ x: 105, y: 110 });370 expect(r).to.equal(true);371 });372 it('should include self and descendant transformation when resolving collision', () => {373 container = createContainer({ transform: 'translate(-100, -100)', collider: { type: 'bounds' } });374 const rect = createRect({375 x: 0,376 y: 0,377 width: 100,378 height: 100,379 transform: 'translate(10, 20)'380 });381 container.addChild(rect);382 // After transform, container should have a bounds of { x: -90, y: -80, width: 100, height: 100 }383 rect.resolveGlobalTransform();384 expect(container.containsPoint({ x: -10, y: -20 })).to.true;385 expect(container.containsPoint({ x: 20, y: 30 })).to.false;386 });387 it('should include ancestors transformation when resolving collision', () => {388 const ancestor = createContainer({ transform: 'translate(-100, -100)' });389 const rect = createRect({390 x: 0,391 y: 0,392 width: 100,393 height: 100394 });395 container = createContainer({ collider: { type: 'bounds' } });396 container.addChild(rect);397 ancestor.addChild(container);398 // After transform, container should have a bounds of { x: -100, y: -100, width: 100, height: 100 }399 rect.resolveGlobalTransform();400 expect(container.containsPoint({ x: -10, y: -20 })).to.true;401 expect(container.containsPoint({ x: 20, y: 30 })).to.false;402 });403 it('should return true if custom collider contains point', () => {404 container = createContainer({405 collider: {406 type: 'rect', x: 0, y: 0, width: 100, height: 100407 }408 });409 container.addChild(createRect({410 x: 0, y: 0, width: 100, height: 100411 }));412 container.addChild(createRect({413 x: 1500, y: 1500, width: 200, height: 200414 }));415 const r = container.containsPoint({ x: 2, y: 2 });416 expect(r).to.equal(true);417 });418 it('should return true if frontChild contains point', () => {419 container = createContainer({ collider: { type: 'frontChild' } });420 container.addChild(createRect({421 x: 0, y: 0, width: 100, height: 100422 }));423 container.addChild(createRect({424 x: 1500, y: 1500, width: 200, height: 200425 }));426 const r = container.containsPoint({ x: 2, y: 2 });427 expect(r).to.equal(true);428 });429 });430 describe('intersectsLine', () => {431 it('should return true if any child intersects line', () => {432 container = createContainer();433 container.addChild(createRect({434 x: 500, y: 500, width: 100, height: 100435 }));436 container.addChild(createRect({437 x: 500, y: 500, width: 200, height: 200438 }));439 const r = container.intersectsLine({440 x1: 550, y1: 550, x2: 0, y2: 0441 });442 expect(r).to.equal(true);443 });444 it('should return true if any childs child intersects line', () => {445 container = createContainer();446 container.addChild(createRect({447 x: 500, y: 500, width: 100, height: 100448 }));449 container.addChild(createRect({450 x: 500, y: 500, width: 200, height: 200451 }));452 const childContainer = createContainer();453 childContainer.addChild(createRect({454 x: 0, y: 0, width: 200, height: 200455 }));456 childContainer.addChild(createRect({457 x: 1500, y: 1500, width: 200, height: 200458 }));459 container.addChild(childContainer);460 const r = container.intersectsLine({461 x1: 1550, y1: 1550, x2: 2000, y2: 2000462 });463 expect(r).to.equal(true);464 });465 it('should return false if no child intersects line', () => {466 container = createContainer();467 container.addChild(createRect({468 x: 500, y: 500, width: 100, height: 100469 }));470 container.addChild(createRect({471 x: 500, y: 500, width: 200, height: 200472 }));473 const childContainer = createContainer();474 childContainer.addChild(createRect({475 x: 1500, y: 1500, width: 200, height: 200476 }));477 const r = container.intersectsLine({478 x1: 2, y1: 2, x2: 0, y2: 0479 });480 expect(r).to.equal(false);481 });482 it('should return true if bounds intersects line', () => {483 container = createContainer({ collider: { type: 'bounds' } });484 container.addChild(createRect({485 x: 0, y: 0, width: 100, height: 100486 }));487 container.addChild(createRect({488 x: 1500, y: 1500, width: 200, height: 200489 }));490 const r = container.intersectsLine({491 x1: 2, y1: 2, x2: 0, y2: 0492 });493 expect(r).to.equal(true);494 });495 it('should return true if custom collider intersects line', () => {496 container = createContainer({497 collider: {498 type: 'rect', x: 0, y: 0, width: 100, height: 100499 }500 });501 container.addChild(createRect({502 x: 0, y: 0, width: 100, height: 100503 }));504 container.addChild(createRect({505 x: 1500, y: 1500, width: 200, height: 200506 }));507 const r = container.intersectsLine({508 x1: 2, y1: 2, x2: 0, y2: 0509 });510 expect(r).to.equal(true);511 });512 it('should return true if frontChild intersects line', () => {513 container = createContainer({ collider: { type: 'frontChild' } });514 container.addChild(createRect({515 x: 0, y: 0, width: 100, height: 100516 }));517 container.addChild(createRect({518 x: 1500, y: 1500, width: 200, height: 200519 }));520 const r = container.intersectsLine({521 x1: 2, y1: 2, x2: 0, y2: 0522 });523 expect(r).to.equal(true);524 });525 });526 describe('intersectsRect', () => {527 it('should return true if any child intersects rect', () => {528 container = createContainer();529 container.addChild(createRect({530 x: 500, y: 500, width: 100, height: 100531 }));532 container.addChild(createRect({533 x: 500, y: 500, width: 200, height: 200534 }));535 const r = container.intersectsRect({536 x: 550, y: 550, width: 100, height: 100537 });538 expect(r).to.equal(true);539 });540 it('should return true if bounds intersects rect', () => {541 container = createContainer({ collider: { type: 'bounds' } });542 container.addChild(createRect({543 x: 0, y: 0, width: 100, height: 100544 }));545 container.addChild(createRect({546 x: 1500, y: 1500, width: 200, height: 200547 }));548 const r = container.intersectsRect({549 x: 550, y: 550, width: 100, height: 100550 });551 expect(r).to.equal(true);552 });553 it('should return true if custom collider intersects rect', () => {554 container = createContainer({555 collider: {556 type: 'rect', x: 0, y: 0, width: 100, height: 100557 }558 });559 container.addChild(createRect({560 x: 0, y: 0, width: 100, height: 100561 }));562 container.addChild(createRect({563 x: 1500, y: 1500, width: 200, height: 200564 }));565 const r = container.intersectsRect({566 x: 2, y: 2, width: 2, height: 2567 });568 expect(r).to.equal(true);569 });570 it('should return true if frontChild intersects rect', () => {571 container = createContainer({ collider: { type: 'frontChild' } });572 container.addChild(createRect({573 x: 0, y: 0, width: 100, height: 100574 }));575 container.addChild(createRect({576 x: 1500, y: 1500, width: 200, height: 200577 }));578 const r = container.intersectsRect({579 x: 20, y: 20, width: 2, height: 2580 });581 expect(r).to.equal(true);582 });583 it('should return true if any childs child intersects rect', () => {584 container = createContainer();585 container.addChild(createRect({586 x: 500, y: 500, width: 100, height: 100587 }));588 container.addChild(createRect({589 x: 500, y: 500, width: 200, height: 200590 }));591 const childContainer = createContainer();592 childContainer.addChild(createRect({593 x: 0, y: 0, width: 200, height: 200594 }));595 childContainer.addChild(createRect({596 x: 1500, y: 1500, width: 200, height: 200597 }));598 container.addChild(childContainer);599 const r = container.intersectsRect({600 x: 1550, y: 1550, width: 100, height: 100601 });602 expect(r).to.equal(true);603 });604 it('should return false if no child intersects rect', () => {605 container = createContainer();606 container.addChild(createRect({607 x: 500, y: 500, width: 100, height: 100608 }));609 container.addChild(createRect({610 x: 500, y: 500, width: 200, height: 200611 }));612 const childContainer = createContainer();613 childContainer.addChild(createRect({614 x: 1500, y: 1500, width: 200, height: 200615 }));616 const r = container.intersectsRect({617 x: 0, y: 0, width: 100, height: 100618 });619 expect(r).to.equal(false);620 });621 });622 describe('intersectsCircle', () => {623 it('should return true if any child intersects circle', () => {624 container = createContainer();625 container.addChild(createRect({626 x: 500, y: 500, width: 100, height: 100627 }));628 container.addChild(createRect({629 x: 500, y: 500, width: 200, height: 200630 }));631 const r = container.intersectsCircle({ x: 550, y: 550, r: 10 });632 expect(r).to.equal(true);633 });634 it('should return true if bounds intersects circle', () => {635 container = createContainer({ collider: { type: 'bounds' } });636 container.addChild(createRect({637 x: 0, y: 0, width: 100, height: 100638 }));639 container.addChild(createRect({640 x: 1500, y: 1500, width: 200, height: 200641 }));642 const r = container.intersectsCircle({ x: 550, y: 550, r: 100 });643 expect(r).to.equal(true);644 });645 it('should return true if custom collider intersects circle', () => {646 container = createContainer({647 collider: {648 type: 'rect', x: 0, y: 0, width: 100, height: 100649 }650 });651 container.addChild(createRect({652 x: 0, y: 0, width: 100, height: 100653 }));654 container.addChild(createRect({655 x: 1500, y: 1500, width: 200, height: 200656 }));657 const r = container.intersectsCircle({ x: 2, y: 2, r: 2 });658 expect(r).to.equal(true);659 });660 it('should return true if frontChild intersects circle', () => {661 container = createContainer({ collider: { type: 'frontChild' } });662 container.addChild(createRect({663 x: 0, y: 0, width: 100, height: 100664 }));665 container.addChild(createRect({666 x: 1500, y: 1500, width: 200, height: 200667 }));668 const r = container.intersectsCircle({ x: 20, y: 20, r: 2 });669 expect(r).to.equal(true);670 });671 it('should return true if any childs child intersects circle', () => {672 container = createContainer();673 container.addChild(createRect({674 x: 500, y: 500, width: 100, height: 100675 }));676 container.addChild(createRect({677 x: 500, y: 500, width: 200, height: 200678 }));679 const childContainer = createContainer();680 childContainer.addChild(createRect({681 x: 0, y: 0, width: 200, height: 200682 }));683 childContainer.addChild(createRect({684 x: 1500, y: 1500, width: 200, height: 200685 }));686 container.addChild(childContainer);687 const r = container.intersectsCircle({ x: 1550, y: 1550, r: 100 });688 expect(r).to.equal(true);689 });690 it('should return false if no child intersects circle', () => {691 container = createContainer();692 container.addChild(createRect({693 x: 500, y: 500, width: 100, height: 100694 }));695 container.addChild(createRect({696 x: 500, y: 500, width: 200, height: 200697 }));698 const childContainer = createContainer();699 childContainer.addChild(createRect({700 x: 1500, y: 1500, width: 200, height: 200701 }));702 const r = container.intersectsCircle({ x: 0, y: 0, r: 100 });703 expect(r).to.equal(false);704 });705 });706 describe('getItemsFrom', () => {707 it('should return an empty array if call has no argument', () => {708 container = createContainer();709 container.addChild(createRect({710 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'711 }));712 container.addChild(createRect({713 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'714 }));715 const items = container.getItemsFrom();716 expect(items).to.be.empty;717 });718 it('should return an empty array if call argument is an empty object', () => {719 container = createContainer();720 container.addChild(createRect({721 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'722 }));723 container.addChild(createRect({724 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'725 }));726 const items = container.getItemsFrom({});727 expect(items).to.be.empty;728 });729 it('should return an empty array if call argument is null', () => {730 container = createContainer();731 container.addChild(createRect({732 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'733 }));734 container.addChild(createRect({735 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'736 }));737 const items = container.getItemsFrom(null);738 expect(items).to.be.empty;739 });740 it('should return an empty array if call argument shape is not supported', () => {741 container = createContainer();742 container.addChild(createRect({743 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'744 }));745 container.addChild(createRect({746 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'747 }));748 const items = container.getItemsFrom({749 a: 1, b: 2, c: 20, width: 20750 });751 expect(items).to.be.empty;752 });753 describe('Bounds', () => {754 it('should return the bounding node', () => {755 container = createContainer({ collider: { type: 'bounds' }, fill: 'container' });756 container.addChild(createRect({757 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'758 }));759 container.addChild(createRect({760 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'761 }));762 const items = container.getItemsFrom({ x: 550, y: 550 });763 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['container']);764 });765 it('should include childrens children', () => {766 container = createContainer({ collider: { type: 'bounds' }, fill: 'container' });767 container.addChild(createRect({768 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'769 }));770 container.addChild(createRect({771 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'772 }));773 const childContainer = createContainer({ fill: 'childContainer' });774 childContainer.addChild(createRect({775 x: 1500, y: 1500, width: 200, height: 200, fill: 'containerRect3'776 }));777 container.addChild(childContainer);778 const items = container.getItemsFrom({ x: 1550, y: 1550 });779 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['container']);780 });781 it('should return empty result if no collision is detected', () => {782 container = createContainer({ collider: { type: 'bounds' }, fill: 'container' });783 container.addChild(createRect({784 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'785 }));786 container.addChild(createRect({787 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'788 }));789 const items = container.getItemsFrom({ x: 400, y: 450 });790 expect(items).to.be.empty;791 });792 it('should handle polygon as input shape', () => {793 container = createContainer({ collider: { type: 'bounds' }, fill: 'container' });794 container.addChild(createRect({795 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'796 }));797 container.addChild(createRect({798 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'799 }));800 const vertices = [801 { x: 0, y: 0 },802 { x: 500, y: 550 },803 { x: 600, y: 50 }804 ];805 const items = container.getItemsFrom({ vertices });806 expect(items).to.not.be.empty;807 });808 });809 describe('FrontChild', () => {810 it('should return the first colliding child node', () => {811 container = createContainer({ collider: { type: 'frontChild' }, fill: 'container' });812 container.addChild(createRect({813 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'814 }));815 container.addChild(createRect({816 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'817 }));818 const items = container.getItemsFrom({ x: 550, y: 550 });819 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['containerRect2']);820 });821 it('should include childrens children', () => {822 container = createContainer({ collider: { type: 'frontChild' }, fill: 'container' });823 container.addChild(createRect({824 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'825 }));826 container.addChild(createRect({827 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'828 }));829 const childContainer = createContainer({ fill: 'childContainer' });830 childContainer.addChild(createRect({831 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect3'832 }));833 container.addChild(childContainer);834 const items = container.getItemsFrom({ x: 550, y: 550 });835 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['containerRect3']);836 });837 it('should ignore children with no collider', () => {838 container = createContainer({ collider: { type: 'frontChild' }, fill: 'container' });839 container.addChild(createRect({840 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'841 }));842 container.addChild(createRect({843 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2', collider: { type: null }844 }));845 const items = container.getItemsFrom({ x: 550, y: 550 });846 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['containerRect1']);847 });848 it('should return empty result if there are no children', () => {849 container = createContainer({ collider: { type: 'frontChild' }, fill: 'container' });850 const items = container.getItemsFrom({ x: 550, y: 550 });851 expect(items).to.be.empty;852 });853 });854 describe('Default collider', () => {855 it('should return the all colliding child nodes', () => {856 container = createContainer({ fill: 'container' });857 container.addChild(createRect({858 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'859 }));860 container.addChild(createRect({861 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'862 }));863 container.addChild(createRect({864 x: 1500, y: 1500, width: 200, height: 200, fill: 'containerRect3'865 }));866 const items = container.getItemsFrom({ x: 550, y: 550 });867 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['containerRect1', 'containerRect2']);868 });869 it('should include childrens children', () => {870 container = createContainer({ fill: 'container' });871 container.addChild(createRect({872 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'873 }));874 container.addChild(createRect({875 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'876 }));877 const childContainer = createContainer({ fill: 'childContainer' });878 childContainer.addChild(createRect({879 x: 1500, y: 1500, width: 200, height: 200, fill: 'containerRect3'880 }));881 container.addChild(childContainer);882 const items = container.getItemsFrom({ x: 1550, y: 1550 });883 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['containerRect3']);884 });885 it('should return ignore children with no collider', () => {886 container = createContainer({ fill: 'container' });887 container.addChild(createRect({888 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'889 }));890 container.addChild(createRect({891 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2', collider: { type: null }892 }));893 const items = container.getItemsFrom({ x: 550, y: 550 });894 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['containerRect1']);895 });896 it('should return empty result if there are no children', () => {897 container = createContainer({ fill: 'container' });898 const items = container.getItemsFrom({ x: 550, y: 550 });899 expect(items).to.be.empty;900 });901 it('should return empty result if there are no colliding children', () => {902 container = createContainer({ fill: 'container' });903 container.addChild(createRect({904 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'905 }));906 container.addChild(createRect({907 x: 500, y: 500, width: 200, height: 200, fill: 'containerRect2'908 }));909 const items = container.getItemsFrom({ x: 450, y: 450 });910 expect(items).to.be.empty;911 });912 });913 describe('Custom collider', () => {914 it('should return the colliding container', () => {915 container = createContainer({916 collider: {917 type: 'rect', x: 500, y: 500, width: 100, height: 100918 },919 fill: 'container'920 });921 container.addChild(createRect({922 x: 0, y: 0, width: 100, height: 100, fill: 'containerRect1'923 }));924 const items = container.getItemsFrom({ x: 550, y: 550 });925 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['container']);926 });927 it('should return the colliding container if child collider also matches', () => {928 container = createContainer({929 collider: {930 type: 'rect', x: 500, y: 500, width: 100, height: 100931 },932 fill: 'container'933 });934 container.addChild(createRect({935 x: 500, y: 500, width: 100, height: 100, fill: 'containerRect1'936 }));937 const items = container.getItemsFrom({ x: 550, y: 550 });938 expect(items.map(i => i.node.attrs.fill)).to.deep.equal(['container']);939 });940 it('should not collide if custom collider doesnt but child collider does', () => {941 container = createContainer({942 collider: {943 type: 'rect', x: 500, y: 500, width: 100, height: 100944 },945 fill: 'container'946 });947 container.addChild(createRect({948 x: 0, y: 0, width: 100, height: 100, fill: 'containerRect1'949 }));950 const childContainer = createContainer({ collider: { type: 'bounds' }, fill: 'childContainer' });951 childContainer.addChild(createRect({952 x: 0, y: 0, width: 200, height: 200, fill: 'containerRect2'953 }));954 const items = container.getItemsFrom({ x: 10, y: 10 });955 expect(items).to.be.empty;956 });957 it('should return empty result if no collision is detected', () => {958 container = createContainer({959 collider: {960 type: 'rect', x: 500, y: 500, width: 100, height: 100961 },962 fill: 'containerBounds'963 });964 const items = container.getItemsFrom({ x: 400, y: 450 });965 expect(items).to.be.empty;966 });967 });968 });...

Full Screen

Full Screen

test_container.js

Source:test_container.js Github

copy

Full Screen

...104 });105 });106 describe('.state', () => {107 it("Should be an object.", () => {108 const container = createContainer();109 assert('object' == typeof container.state);110 });111 it("Should be a cloned object.", () => {112 const container = createContainer();113 const a = container.state;114 const b = container.state;115 assert('object' == typeof a);116 assert('object' == typeof b);117 assert(a != b);118 });119 it("Should be immutable.", done => {120 const container = createContainer();121 const value = {foo: 'bar'};122 try { container.state = value; }123 catch (e) {124 assert(undefined === container.state.foo);125 done();126 }127 });128 });129 describe('.id', () => {130 it("Should be a string.", () => {131 const container = createContainer();132 assert('string' == typeof container.id);133 });134 it("Should be immutable.", done => {135 const container = createContainer();136 const id = container.id;137 try { container.id = '123'; }138 catch (e) {139 assert(container.id == id);140 done();141 }142 });143 });144 describe('.parent', () => {145 it("Should be null when container is an orphaned.", () => {146 const container = createContainer();147 assert(null == container.parent);148 });149 it("Should derive parent from parent DOM element.", () => {150 const parent = createContainer();151 const child = createContainer();152 parent.appendChild(child);153 assert(parent == child.parent);154 });155 it("Should derive parent from parent DOM element from existing DOM tree.", () => {156 const tree = document.createElement('div');157 tree.innerHTML = '<div><span></span></div>';158 const container = createContainer(tree.children[0]); // div159 const child = createContainer(tree.children[0].children[0]);160 assert(container == child.parent);161 });162 });163 describe('.domElement', () => {164 it("Should be an instance of Element", () => {165 const container = createContainer();166 assert(container.domElement instanceof Element);167 });168 it("Should be mutable effectively replacing the container DOM element.", () => {169 const container = createContainer();170 const domElement = document.createElement('span');171 domElement.innerHTML = 'hello ${name}';172 container.domElement = domElement;173 assert(domElement == container.domElement);174 container.update({name: 'kinkajou'});175 assert('hello kinkajou' == domElement.innerHTML);176 assert('hello kinkajou' == container.domElement.innerHTML);177 });178 it("Should throw a TypeError when value set is not a DOM element.", done => {179 const container = createContainer();180 try {181 container.domElement = 'foo';182 throw new Error("Error not thrown.");183 } catch (e) {184 assert(e instanceof TypeError);185 done();186 }187 });188 });189 describe('.innerContents', () => {190 it("Should be a string.", () => {191 const container = createContainer();192 assert('string' == typeof container.innerContents);193 });194 it("Should be a string representation of the containers DOM element.", () => {195 const container = createContainer();196 container.domElement.innerHTML = 'hello';197 assert('hello' == container.innerContents);198 });199 });200 describe('.children', () => {201 it("Should return an array of child containers.", () => {202 const container = new Container();203 const childA = new Container();204 const childB = new Container();205 container.appendChild(childA);206 container.appendChild(childB);207 const children = container.children;208 assert(children);209 assert(childA == children[0]);210 assert(childB == children[1]);211 });212 });213 describe('#define(model)', () => {214 it("Should extend the container state object.", () => {215 const container = new Container();216 container.define({key: 'value'});217 assert('value' == container.state.key);218 });219 });220 describe('#use(...plugins)', () => {221 it("Should install reducer middleware.", done => {222 done = once(done);223 const container = new Container();224 container.use(() => done());225 container.update();226 });227 });228 describe('#update(data[, propagate = true]', () => {229 it("Should update internal state.", () => {230 const container = new Container();231 container.update({value: 123});232 assert(123 == container.state.value);233 });234 it("Should propagate changes to child containers.", () => {235 const container = new Container();236 const childA = new Container();237 const childAA = new Container();238 const childB = new Container();239 container.appendChild(childA);240 container.appendChild(childB);241 childA.appendChild(childAA);242 assert(childA.children.length)243 container.update({value: 123});244 assert(123 == container.state.value);245 assert(123 == childA.state.value);246 assert(123 == childAA.state.value);247 assert(123 == childB.state.value);248 });249 it("Should only update the container and not children when `propagate = false`.", () => {250 const container = new Container();251 const childA = new Container();252 const childB = new Container();253 container.appendChild(childA);254 container.appendChild(childB);255 container.update({value: 123}, false);256 assert(123 == container.state.value);257 assert(!childA.state.value);258 assert(!childB.state.value);259 });260 it("Should dispatch `stardux.UPDATE` event type in a reducer.", done => {261 done = once(done);262 const container = new Container(null, (state, action) => {263 if (stardux.UPDATE == action.type) done();264 return {};265 });266 container.update();267 });268 });269 describe('#render(domElement)', () => {270 it("Should render the container to a given DOM element.", () => {271 const container = new Container();272 const domElement = document.createElement('div');273 container.render(domElement);274 assert(domElement.contains(container.domElement));275 });276 });277 describe('#dispatch(type[, data = {}, args = {}])', () => {278 it("Should dispatch any arbitrary event type and propagate to a reducer.", done => {279 done = once(done);280 const type = Symbol('foo');281 const container = new Container(null, (state, action) => {282 if (type == action.type) done();283 return {};284 });285 container.dispatch(type);286 });287 });288 describe('#replaceChildren(children)', () => {289 it("Should remove all existing children and append new ones.", () => {290 const container = new Container();291 const childA = new Container();292 const childB = new Container();293 const childC = new Container();294 const childX = new Container();295 const childY = new Container();296 const childZ = new Container();297 container.update();298 container.appendChild(childA);299 container.appendChild(childB);300 container.appendChild(childC);301 assert(container.contains(childA));302 assert(container.contains(childB));303 assert(container.contains(childC));304 container.replaceChildren([childX, childY, childZ]);305 assert(false == container.contains(childA));306 assert(false == container.contains(childB));307 assert(false == container.contains(childC));308 assert(container.contains(childX));309 assert(container.contains(childY));310 assert(container.contains(childZ));311 });312 });313 describe('#valueOf()', () => {314 it("Should return the underlying DOM element.", () => {315 const container = new Container();316 assert(container.valueOf() instanceof Element);317 })318 });319 describe('#toString()', () => {320 it("Should return a text representation of the container contents.", () => {321 const container = new Container();322 container.innerContents = '${value}';323 container.update({value: 'hello'});324 assert('hello' == String(container));325 container.update({value: 'kinkajou'});326 assert('kinkajou' == String(container));327 });328 });329 describe('#toJSON()', () => {330 it("Should return a JSON object representation.", () => {331 const container = new Container();332 container.innerContents = 'hello ${value}';333 container.update({value: 'world'});334 const json = container.toJSON();335 assert('object' == typeof json);336 assert(json.id);337 assert(json.src);338 assert(json.state);339 assert(json.children);340 });341 });342 describe('#pipe(container)', () => {343 it("Should pipe update to another container.", done => {344 done = once(done);345 const containerA = new Container();346 const containerB = new Container();347 containerA.pipe(containerB);348 containerB.use(_ => done());349 containerA.update();350 });351 });352 describe('#unpipe(container)', () => {353 it("Should unpipe containers.", () => {354 const containerA = new Container();355 const containerB = new Container();356 containerA.pipe(containerB);357 containerB.use(_ => { throw new Error("Unpipe failed."); });358 containerA.unpipe(containerB);359 containerA.update();360 });361 });362 describe('#appendChild(child)', () => {363 it("Should append a child container.", () => {364 const container = new Container();365 const child = new Container();366 container.appendChild(child);367 assert(container.children[0] == child);368 assert(container.children[0].domElement == child.domElement);369 });370 });371 describe('#removeChild(child)', () => {372 it("Should remove a child container.", () => {373 const container = new Container();374 const child = new Container();375 container.appendChild(child);376 assert(container.children[0] == child);377 container.removeChild(child);378 assert(container.children[0] != child);379 assert(0 == container.children.length);380 });381 });382 describe('#contains(container[, recursive = true])', () => {383 it("Should return true or false if a container is a child or not.", () => {384 const container = new Container();385 const child = new Container();386 const other = new Container();387 container.appendChild(child);388 assert(container.contains(child));389 assert(false == container.contains(other));390 });391 it("Should only search direct descendants if [recursive = false].", () => {392 const container = new Container();393 const child = new Container();394 const other = new Container();395 container.appendChild(child);396 child.appendChild(other);397 assert(container.contains(child));398 assert(container.contains(other));399 assert(false == container.contains(other, false));400 });401 });402});403describe('createContainer([domElement = null, initialState = {}, ...reducers]', () => {404 it("Should create an instance of a Container", () => {405 assert(createContainer() instanceof Container);406 });407 it("Should create a container with a default DOM Element.", () => {408 const container = createContainer();409 assert(container);410 assert(container.domElement instanceof Element);411 });412 it("Should create a container with a given DOM Element.", () => {413 const domElement = document.createElement('div');414 const container = createContainer(domElement);415 assert(container);416 assert(domElement == container.domElement);417 });418 it("Should create a container with initial state.", () => {419 const container = createContainer(null, {value: 123});420 assert(container);421 assert(123 == container.state.value);422 });423 it("Should return an existing container for an already wrapped " +424 "DOM Element.", () => {425 const domElement = document.createElement('div');426 const container = createContainer(domElement);427 const duplicate = createContainer(domElement);428 assert(container);429 assert(duplicate);430 assert(duplicate.domElement == container.domElement);431 assert(duplicate === container);432 });433 it("Should return an existing container for an already existing " +434 "container.", () => {435 const container = createContainer();436 const duplicate = createContainer(container);437 assert(container);438 assert(duplicate);439 assert(duplicate.domElement == container.domElement);440 assert(duplicate === container);441 });442 it("Should apply a set of given reducers.", done => {443 done = once(done);444 const called = [0, 0, 0, 0];445 const container = createContainer(null, null,446 (state, action) => (called[0] = true),447 (state, action) => (called[1] = true),448 (state, action) => (called[2] = true),449 (state, action) => (called[3] = true),450 (state, action) => {451 assert(called.every(Boolean),452 "Missing reducer call.");453 done();454 return {};455 });456 });457});458describe('makeContainer(domElement)', () => {459 it("Should make a container from a DOM element.", () => {460 const domElement = document.createElement('div');461 const container = makeContainer(domElement);462 assert(container);463 assert(container.domElement == domElement);464 });465});466describe('restoreContainerFromJSON(object)', () => {467 it("Should be able to restore a container from a JSON structure.", () => {468 const container = createContainer();469 const json = JSON.stringify(container);470 const restored = restoreContainerFromJSON(JSON.parse(json));471 assert(restored.id == container.id)472 // prevents copies and returns existing if still in memory473 assert(restored == container,474 "Failed to restore existing container.");475 });476 it("Should be able to create a new container from a JSON structure.", () => {477 const id = '.81b55b8d'478 const str = `{"id":"${id}","src":"","state":{"value":123},"children":[]}`479 const json = JSON.parse(str);480 const container = restoreContainerFromJSON(json);481 assert(container);482 assert(id == container.id);483 });484 it("Should be able to restore a container with new initial state.", () => {485 const container = createContainer(null, {value: 123});486 const json = JSON.stringify(container);487 const restored = restoreContainerFromJSON(JSON.parse(json), {other: 456});488 assert(restored.id == container.id)489 assert(restored == container, "Failed to restore existing container.");490 assert(123 == restored.state.value);491 assert(456 == restored.state.other);492 });493});494describe('composeContainers([...containers]', () => {495 it("Should return a new Container instance with no arguments.", () => {496 const composite = composeContainers();497 assert(composite);498 });499 it("Should use the first argument as the root composite.", () => {500 const container = createContainer();501 const composite = composeContainers(container);502 assert(composite);503 assert(composite == container);504 });505 it("Should create a new container when given an array of containers.", done => {506 done = once(done);507 const containerA = createContainer();508 const containerB = createContainer();509 const composite = composeContainers([containerA, containerB]);510 assert(composite);511 containerB.use(_ => done());512 composite.update();513 });514 it("Should return a root container with chained containers.", done => {515 done = once(done);516 const root = createContainer();517 const containerA = createContainer();518 const containerB = createContainer();519 const composite = composeContainers(root, containerA, containerB);520 assert(composite);521 assert(composite == root);522 containerB.use(_ => done());523 root.update();524 });525});526describe('getContainerData([container | id | domElement])', () => {527 it("Should return null for DOM Elements that have not been claimed by a container.", () => {528 const domElement = document.createElement('div');529 const data = getContainerData(domElement);530 assert(null == data);531 });532 it("Should return data for a DOM Element claimed by a container.", () => {533 const domElement = document.createElement('div');534 const container = createContainer(domElement);535 const data = getContainerData(domElement);536 assert(data);537 assert(data.id == container.id);538 });539 it("Should return data for an existing container.", () => {540 const domElement = document.createElement('div');541 const container = createContainer(domElement);542 const data = getContainerData(container);543 assert(data);544 assert(data.id == container.id);545 });546 it("Should return data for an existing container by id.", () => {547 const domElement = document.createElement('div');548 const container = createContainer(domElement);549 const data = getContainerData(container.id);550 assert(data);551 assert(data.id == container.id);552 });553});554describe('restoreOrphanedTree(container | domElement)', () => {555 it("Should restore orphaned containers DOM elements", () => {556 const domElement = document.createElement('div');557 const childDomElementA = document.createElement('div');558 const childDomElementB = document.createElement('div');559 const container = createContainer(domElement);560 const childContainerA = createContainer(childDomElementA);561 const childContainerB = createContainer(childDomElementB);562 container.appendChild(childContainerA);563 container.appendChild(childContainerB);564 assert(container.contains(childContainerA));565 assert(container.contains(childContainerB));566 domElement.removeChild(childDomElementA);567 domElement.removeChild(childDomElementB);568 assert(container.contains(childContainerA, false));569 assert(container.contains(childContainerB, false));570 assert(false == domElement.contains(childDomElementA));571 assert(false == domElement.contains(childDomElementB));572 restoreOrphanedTree(container);573 assert(domElement.contains(childDomElementA));574 assert(domElement.contains(childDomElementB));575 assert(container.contains(childContainerA));576 assert(container.contains(childContainerB));577 });578});579/**580 * Tests container tree realignment.581 */582describe('realignContainerTree(container[, recursive = false])', () => {583 it("Should realign an unaligned container tree by restoring lost DOM elements.", () => {584 const domElement = document.createElement('div');585 const childDomElementA = document.createElement('div');586 const childDomElementB = document.createElement('div');587 const container = createContainer(domElement);588 const childContainerA = createContainer(childDomElementA);589 const childContainerB = createContainer(childDomElementB);590 container.appendChild(childContainerA);591 container.appendChild(childContainerB);592 assert(container.contains(childContainerA));593 assert(container.contains(childContainerB));594 // child DOM element is removed but the container will595 // still reference a child container596 domElement.removeChild(childDomElementB);597 assert(false == domElement.contains(childDomElementB));598 assert(container.contains(childContainerB));599 // realign container tree force lost node to be restored600 realignContainerTree(container);601 assert(domElement.contains(childDomElementB));602 });603 it("Should recursively realign a container tree.", () => {604 const domElement = document.createElement('div');605 const childDomElementA = document.createElement('div');606 const childDomElementAA = document.createElement('div');607 const container = createContainer(domElement);608 const childContainerA = createContainer(childDomElementA);609 const childContainerAA = createContainer(childDomElementAA);610 container.appendChild(childContainerA);611 childContainerA.appendChild(childContainerAA);612 assert(container.contains(childContainerA));613 assert(childContainerA.contains(childContainerAA));614 childDomElementA.removeChild(childDomElementAA);615 assert(false == childDomElementA.contains(childDomElementAA));616 assert(childContainerA.contains(childContainerAA));617 realignContainerTree(container, true);618 assert(childDomElementA.contains(childDomElementAA));619 });620});621describe('replaceDOMElement(container, domElement)', () => {622 it("Should replace the internal DOM element associated witht the container.", () => {623 const domElement = document.createElement('div');624 const container = createContainer();625 assert(container.domElement);626 replaceDOMElement(container, domElement);627 assert(domElement == container.domElement);628 });629});630describe('createContainerUid()', () => {631 it("Should return a string.", () => {632 assert('string' == typeof createContainerUid());633 });634 it("Should return a UID prefixed with a '.'.", () => {635 assert('.' == createContainerUid()[0]);636 });637});638describe('getAllContainers()', () => {639 it("Should return all created containers.", () => {640 const a = createContainer();641 const b = createContainer();642 const c = createContainer();643 const containers = [ ...getAllContainers() ].map(_ => _[1]); // [id, container]644 assert(containers.indexOf(a) > -1);645 assert(containers.indexOf(b) > -1);646 assert(containers.indexOf(c) > -1);647 });648});649describe('fetchContainer(container | domElement | id)', () => {650 it("Should return a container if a container is given.", () => {651 const container = createContainer();652 assert(container == fetchContainer(container));653 });654 it("Should return a container if a DOM element is given.", () => {655 const container = createContainer();656 assert(container == fetchContainer(container.domElement));657 });658 it("Should return a container if a id is given.", () => {659 const container = createContainer();660 assert(container == fetchContainer(container.id));661 });662 it("Should return a container if an object with id is given.", () => {663 const container = createContainer();664 assert(container == fetchContainer({id: container.id}));665 });666});667describe('removeContainer(container | domElement | id)', () => {668 it("Should remove a container from its parent.", () => {669 const parent = createContainer();670 const child = createContainer();671 parent.appendChild(child);672 assert(true == removeContainer(child));673 assert(false == parent.contains(child));674 });675 it("Should remove a container from the internal tree.", () => {676 const container = createContainer();677 assert(true == removeContainer(container));678 const containers = [ ...getAllContainers() ];679 assert(0 == containers.length);680 });681 it("Should remove a container by a given DOM element.", () => {682 const container = createContainer();683 assert(true == removeContainer(container.domElement));684 const containers = [ ...getAllContainers() ];685 assert(0 == containers.length);686 });687 it("Should remove a container by a given id.", () => {688 const container = createContainer();689 assert(true == removeContainer(container.id));690 const containers = [ ...getAllContainers() ];691 assert(0 == containers.length);692 });693});694describe('saveContainer(container)', () => {695 it("Should save a container.", () => {696 const container = createContainer();697 // containers are saved automatically698 assert(true == removeContainer(container));699 assert(null == fetchContainer(container.id));700 assert(true === saveContainer(container));701 });702});703describe('clearContainers()', () => {704 it("Should clear all existing containers.", () => {705 const count = 10;706 for (let i = 0; i < count; ++i) createContainer();707 assert(count == [ ...getAllContainers() ].length);708 clearContainers();709 assert(0 == [ ...getAllContainers() ].length);710 });711});712describe('forEachContainer(fn[, scope])', () => {713 it("Should iterate over each container in the order in which they were created.", () => {714 const a = createContainer();715 const b = createContainer();716 const c = createContainer();717 const d = createContainer();718 const seen = [];719 forEachContainer(container => seen.push(container));720 assert(seen.length);721 assert(a == seen[0]);722 assert(b == seen[1]);723 assert(c == seen[2]);724 assert(d == seen[3]);725 });726 it("Should iterate over each container with an optional scope.", () => {727 const a = createContainer();728 const b = createContainer();729 const c = createContainer();730 const seen = [];731 forEachContainer(function (container) {732 assert(this == seen);733 this.push(container);734 }, seen);735 assert(seen.length);736 assert(a == seen[0]);737 assert(b == seen[1]);738 assert(c == seen[2]);739 });740});741describe('traverseContainer(container, fn[, scope])', () => {742 it("Should traverse a container's children.", () => {743 const root = createContainer();744 const a = createContainer();745 const b = createContainer();746 const c = createContainer();747 const d = createContainer();748 const e = createContainer();749 const seen = [];750 a.appendChild(c);751 a.appendChild(d);752 traverseContainer(a, container => seen.push(container));753 assert(seen.length);754 assert(c == seen[0]);755 assert(d == seen[1]);756 });757 it("Should traverse a container's children with an optional scope.", () => {758 const root = createContainer();759 const a = createContainer();760 const b = createContainer();761 const c = createContainer();762 const d = createContainer();763 const e = createContainer();764 const seen = [];765 a.appendChild(c);766 a.appendChild(d);767 traverseContainer(a, function (container) {768 assert(this == seen);769 this.push(container);770 }, seen);771 assert(seen.length);772 assert(c == seen[0]);773 assert(d == seen[1]);774 });...

Full Screen

Full Screen

Container.js

Source:Container.js Github

copy

Full Screen

1topSuite('Ext.field.Container', ['Ext.JSON', 'Ext.field.Checkbox', 'Ext.field.Radio', 'Ext.field.Text'], function() {2 var ct;3 function createContainer(cfg) {4 if (Ext.isArray(cfg)) {5 cfg = {6 items: cfg7 };8 }9 return ct = new Ext.field.Container(Ext.apply({}, cfg));10 }11 afterEach(function() {12 ct = Ext.destroy(ct);13 });14 describe('proxied', function() {15 it('should have proxied container configs', function() {16 var proto = Ext.field.Container.prototype;17 expect(proto.hasConfig('defaults')).toBe(true);18 expect(proto.hasConfig('defaultType')).toBe(true);19 expect(proto.hasConfig('items')).toBe(true);20 expect(proto.hasConfig('layout')).toBe(true);21 expect(proto).toHaveProperties(22 'getDefaults', 'setDefaults',23 'getDefaultType', 'setDefaultType',24 'getItems', 'setItems',25 'getLayout', 'setLayout'26 );27 });28 it('should have proxied container methods', function() {29 var proto = Ext.field.Container.prototype;30 expect(proto).toHaveProperties('add', 'insert', 'remove', 'removeAll', 'getAt');31 });32 });33 describe('errorTarget', function() {34 it('should set errorTarget to "parent" of configured items', function() {35 createContainer([36 { label: 'foo', name: 'foo' },37 { label: 'bar', name: 'bar' },38 { label: 'baz', name: 'baz' }39 ]);40 var first = ct.getAt(0),41 second = ct.getAt(1),42 third = ct.getAt(2);43 expect(first.getErrorTarget()).toBe('parent');44 expect(second.getErrorTarget()).toBe('parent');45 expect(third.getErrorTarget()).toBe('parent');46 });47 it('should set errorTarget to null of added item', function() {48 createContainer();49 var item = ct.add({50 label: 'foo',51 name: 'foo'52 });53 expect(item.getErrorTarget()).toBe('parent');54 });55 it('should not set errorTarget of configured items', function() {56 createContainer([57 { label: 'foo', name: 'foo', errorTarget: 'qtip' },58 { label: 'bar', name: 'bar', errorTarget: 'side' },59 { label: 'baz', name: 'baz', errorTarget: 'under' }60 ]);61 var first = ct.getAt(0),62 second = ct.getAt(1),63 third = ct.getAt(2);64 expect(first.getErrorTarget()).toBe('qtip');65 expect(second.getErrorTarget()).toBe('side');66 expect(third.getErrorTarget()).toBe('under');67 });68 it('should not set errorTarget of added item', function() {69 createContainer();70 var item = ct.add({71 errorTarget: 'side',72 label: 'foo',73 name: 'foo'74 });75 expect(item.getErrorTarget()).toBe('side');76 });77 });78 describe('getValues', function() {79 it('should return an object as a value', function() {80 createContainer([81 { label: 'foo', name: 'foo', value: 'Foo' },82 { label: 'bar', name: 'bar', value: 'Bar' },83 { label: 'baz', name: 'baz', value: 'Baz' }84 ]);85 expect(ct.getValues()).toEqual({86 foo: 'Foo',87 bar: 'Bar',88 baz: 'Baz'89 });90 });91 it('should return an object as a value with checkboxfields', function() {92 createContainer([93 { label: 'foo', name: 'foo', value: 'Foo' },94 { xtype: 'checkboxfield', label: 'bar 1', name: 'bar', value: 'Bar 1', checked: true },95 { xtype: 'checkboxfield', label: 'bar 2', name: 'bar', value: 'Bar 2', checked: true },96 { label: 'baz', name: 'baz', value: 'Baz' }97 ]);98 expect(ct.getValues()).toEqual({99 foo: 'Foo',100 bar: ['Bar 1', 'Bar 2'],101 baz: 'Baz'102 });103 });104 it('should return an object as a value with radiofields', function() {105 createContainer([106 { label: 'foo', name: 'foo', value: 'Foo' },107 { xtype: 'radiofield', label: 'bar 1', name: 'bar', value: 'Bar 1' },108 { xtype: 'radiofield', label: 'bar 2', name: 'bar', value: 'Bar 2', checked: true },109 { label: 'baz', name: 'baz', value: 'Baz' }110 ]);111 expect(ct.getValues()).toEqual({112 foo: 'Foo',113 bar: 'Bar 2',114 baz: 'Baz'115 });116 });117 });118 describe('setValues', function() {119 it('should set values on all fields', function() {120 createContainer([121 { label: 'foo', name: 'foo' },122 { label: 'bar', name: 'bar' },123 { label: 'baz', name: 'baz' }124 ]);125 var first = ct.getAt(0),126 second = ct.getAt(1),127 third = ct.getAt(2),128 values = {129 foo: 'Foo',130 bar: 'Bar',131 baz: 'Baz'132 };133 expect(ct.setValues(values)).toBe(ct);134 expect(first.getValue()).toBe('Foo');135 expect(second.getValue()).toBe('Bar');136 expect(third.getValue()).toBe('Baz');137 });138 it('should set values on some fields', function() {139 createContainer([140 { label: 'foo', name: 'foo' },141 { label: 'bar', name: 'bar' },142 { label: 'baz', name: 'baz' }143 ]);144 var first = ct.getAt(0),145 second = ct.getAt(1),146 third = ct.getAt(2),147 values = {148 foo: 'Foo',149 baz: 'Baz'150 };151 expect(ct.setValues(values)).toBe(ct);152 expect(first.getValue()).toBe('Foo');153 expect(second.getValue()).toBeNull();154 expect(third.getValue()).toBe('Baz');155 });156 });157 describe('onFieldErrorChange', function() {158 it('should get called when a field is marked with error', function() {159 createContainer([160 { label: 'foo', name: 'foo' },161 { label: 'bar', name: 'bar' },162 { label: 'baz', name: 'baz' }163 ]);164 var first = ct.getAt(0),165 spy = spyOn(ct, 'onFieldErrorChange');166 first.setError(['test error']);167 expect(spy).toHaveBeenCalled();168 });169 });170 describe('getRefItems', function() {171 it('should find a field via down()', function() {172 var container = new Ext.Container({173 items: [174 {},175 {},176 createContainer([177 { label: 'foo', name: 'foo' },178 { label: 'bar', name: 'bar' },179 { label: 'baz', name: 'baz' }180 ]),181 {}182 ]183 }),184 field = container.down('textfield'),185 first = ct.getAt(0);186 expect(field).toBe(first);187 Ext.destroy(container);188 });189 it('should find all fields via query()', function() {190 var container = new Ext.Container({191 items: [192 {},193 {},194 createContainer([195 { label: 'foo', name: 'foo' },196 { label: 'bar', name: 'bar' },197 { label: 'baz', name: 'baz' }198 ]),199 {}200 ]201 }),202 fields = container.query('textfield'),203 first = ct.getAt(0),204 second = ct.getAt(1),205 third = ct.getAt(2);206 expect(fields).toEqual([207 first,208 second,209 third210 ]);211 Ext.destroy(container);212 });213 });214 describe('getFocusEl', function() {215 it('should get first field\'s focus element', function() {216 createContainer([217 { label: 'foo', name: 'foo' },218 { label: 'bar', name: 'bar' },219 { label: 'baz', name: 'baz' }220 ]);221 var first = ct.getAt(0);222 expect(ct.getFocusEl()).toBe(first.getFocusEl());223 });224 });225 describe('reset', function() {226 it('should reset all fields', function() {227 createContainer([228 { label: 'foo', name: 'foo' },229 { label: 'bar', name: 'bar', value: 'bar' }230 ]);231 var first = ct.getAt(0),232 second = ct.getAt(1);233 first.setValue('foo');234 second.setValue('foobar');235 expect(ct.reset()).toBe(ct);236 expect(first.getValue()).toBe('');237 expect(second.getValue()).toBe('bar');238 });239 });240 describe('setErrors', function() {241 it('should only mark specified fields when passing an object', function() {242 createContainer([243 { placeholder: 'foo', name: 'foo' },244 { placeholder: 'bar', name: 'bar' },245 { placeholder: 'baz', name: 'baz' }246 ]);247 var first = ct.getAt(0),248 second = ct.getAt(1),249 third = ct.getAt(2),250 error = {251 foo: 'Foo is in error',252 baz: 'Baz has an error'253 };254 expect(ct.setErrors(error)).toBe(ct);255 expect(ct.getError()).toEqual([256 {257 label: 'foo',258 error: 'Foo is in error'259 },260 {261 label: 'baz',262 error: 'Baz has an error'263 }264 ]);265 expect(first.getError()).toEqual(['Foo is in error']);266 expect(second.getError()).toBeNull();267 expect(third.getError()).toEqual(['Baz has an error']);268 });269 it('should only mark specified fields when passing an object with nested array', function() {270 createContainer([271 { placeholder: 'foo', name: 'foo' },272 { placeholder: 'bar', name: 'bar' },273 { placeholder: 'baz', name: 'baz' }274 ]);275 var first = ct.getAt(0),276 second = ct.getAt(1),277 third = ct.getAt(2),278 error = {279 foo: ['Foo is in error', 'Another Foo Error'],280 baz: 'Baz has an error'281 };282 expect(ct.setErrors(error)).toBe(ct);283 expect(ct.getError()).toEqual([284 {285 label: 'foo',286 error: 'Foo is in error'287 },288 {289 label: 'foo',290 error: 'Another Foo Error'291 },292 {293 label: 'baz',294 error: 'Baz has an error'295 }296 ]);297 expect(first.getError()).toEqual(['Foo is in error', 'Another Foo Error']);298 expect(second.getError()).toBeNull();299 expect(third.getError()).toEqual(['Baz has an error']);300 });301 it('should clear all field invalids', function() {302 createContainer([303 { label: 'foo', name: 'foo' },304 { label: 'bar', name: 'bar' },305 { label: 'baz', name: 'baz' }306 ]);307 var first = ct.getAt(0),308 second = ct.getAt(1),309 third = ct.getAt(2),310 errors = {311 foo: 'test error',312 bar: 'test error',313 baz: 'test error'314 };315 expect(ct.setErrors(errors)).toBe(ct);316 errors.foo = errors.bar = errors.baz = null;317 expect(ct.setErrors(errors)).toBe(ct);318 expect(ct.getError()).toBeNull();319 expect(first.getError()).toBeNull();320 expect(second.getError()).toBeNull();321 expect(third.getError()).toBeNull();322 });323 describe('with child errorTarget', function() {324 it('should only mark specified fields when passing an object', function() {325 createContainer([326 { placeholder: 'foo', name: 'foo', errorTarget: 'side' },327 { placeholder: 'bar', name: 'bar', errorTarget: 'side' },328 { placeholder: 'baz', name: 'baz', errorTarget: 'side' }329 ]);330 var first = ct.getAt(0),331 second = ct.getAt(1),332 third = ct.getAt(2),333 error = {334 foo: 'Foo is in error',335 baz: 'Baz has an error'336 };337 expect(ct.setErrors(error)).toBe(ct);338 expect(ct.getError()).toBeNull();339 expect(first.getError()).toEqual(['Foo is in error']);340 expect(second.getError()).toBeNull();341 expect(third.getError()).toEqual(['Baz has an error']);342 });343 it('should only mark specified fields when passing an object with nested array', function() {344 createContainer([345 { placeholder: 'foo', name: 'foo', errorTarget: 'side' },346 { placeholder: 'bar', name: 'bar', errorTarget: 'side' },347 { placeholder: 'baz', name: 'baz', errorTarget: 'side' }348 ]);349 var first = ct.getAt(0),350 second = ct.getAt(1),351 third = ct.getAt(2),352 error = {353 foo: ['Foo is in error', 'Another Foo Error'],354 baz: 'Baz has an error'355 };356 expect(ct.setErrors(error)).toBe(ct);357 expect(ct.getError()).toBeNull();358 expect(first.getError()).toEqual(['Foo is in error', 'Another Foo Error']);359 expect(second.getError()).toBeNull();360 expect(third.getError()).toEqual(['Baz has an error']);361 });362 it('should clear all field invalids', function() {363 createContainer([364 { label: 'foo', name: 'foo', errorTarget: 'side' },365 { label: 'bar', name: 'bar', errorTarget: 'side' },366 { label: 'baz', name: 'baz', errorTarget: 'side' }367 ]);368 var first = ct.getAt(0),369 second = ct.getAt(1),370 third = ct.getAt(2),371 errors = {372 foo: 'test error',373 bar: 'test error',374 baz: 'test error'375 };376 expect(ct.setErrors(errors)).toBe(ct);377 errors.foo = errors.bar = errors.baz = null;378 expect(ct.setErrors(errors)).toBe(ct);379 expect(ct.getError()).toBeNull();380 expect(first.getError()).toBeNull();381 expect(second.getError()).toBeNull();382 expect(third.getError()).toBeNull();383 });384 });385 });386 describe('isValid', function() {387 it('should return true if all fields are valid', function() {388 createContainer([389 { label: 'foo', name: 'foo' },390 { label: 'bar', name: 'bar' }391 ]);392 expect(ct.isValid()).toBe(true);393 });394 it('should return false when one field is invalid', function() {395 createContainer([396 { label: 'foo', name: 'foo', required: true },397 { label: 'bar', name: 'bar' }398 ]);399 ct.getAt(0).validate();400 expect(ct.isValid()).toBe(false);401 });402 it('should not check items after one field is found invalid', function() {403 createContainer([404 { label: 'foo', name: 'foo', required: true },405 { label: 'bar', name: 'bar' }406 ]);407 ct.getAt(0).validate();408 var spy = spyOn(ct.getAt(1), 'isValid');409 expect(ct.isValid()).toBe(false);410 expect(spy).not.toHaveBeenCalled();411 });412 });413 describe('validate', function() {414 it('should return true if all fields are valid', function() {415 createContainer([416 { label: 'foo', name: 'foo' },417 { label: 'bar', name: 'bar' }418 ]);419 expect(ct.validate()).toBe(true);420 });421 it('should return false when one field is invalid', function() {422 createContainer([423 { label: 'foo', name: 'foo', required: true },424 { label: 'bar', name: 'bar' }425 ]);426 expect(ct.validate()).toBe(false);427 });428 it('should validate all fields', function() {429 createContainer([430 { label: 'foo', name: 'foo', required: true },431 { label: 'bar', name: 'bar', required: true, requiredMessage: 'This field should not be empty' }432 ]);433 var first = ct.getAt(0),434 spy1 = spyOn(first, 'validate').andCallThrough(),435 second = ct.getAt(1),436 spy2 = spyOn(second, 'validate').andCallThrough();437 expect(ct.validate()).toBe(false);438 expect(first.getError()).toEqual(['This field is required']);439 expect(second.getError()).toEqual(['This field should not be empty']);440 expect(spy1).toHaveBeenCalled();441 expect(spy2).toHaveBeenCalled();442 });443 });444 describe('getFields', function() {445 it('should get all child fields', function() {446 createContainer([447 { label: 'foo', name: 'foo' },448 { label: 'bar', name: 'bar' },449 { label: 'baz', name: 'baz' }450 ]);451 var first = ct.getAt(0),452 second = ct.getAt(1),453 third = ct.getAt(2),454 fields = ct.getFields();455 // tests if the deep arg works456 expect(Object.keys(fields).length).toBe(3);457 expect(fields).toEqual({458 foo: first,459 bar: second,460 baz: third461 });462 });463 it('should get all child fields by name', function() {464 createContainer([465 { label: 'foo', name: 'foo' },466 { label: 'bar', name: 'bar' },467 { label: 'baz', name: 'baz' }468 ]);469 var first = ct.getAt(0),470 second = ct.getAt(1),471 third = ct.getAt(2);472 expect(ct.getFields('foo')).toBe(first);473 expect(ct.getFields('bar')).toBe(second);474 expect(ct.getFields('baz')).toBe(third);475 });476 it('should get all child fields as an array', function() {477 createContainer([478 { label: 'foo', name: 'foo' },479 { label: 'bar', name: 'bar' },480 { label: 'baz', name: 'baz' }481 ]);482 var first = ct.getAt(0),483 second = ct.getAt(1),484 third = ct.getAt(2),485 fields = ct.getFields(false);486 expect(fields.length).toBe(3);487 expect(fields).toEqual([488 first,489 second,490 third491 ]);...

Full Screen

Full Screen

index.test.js

Source:index.test.js Github

copy

Full Screen

1'use strict';2const assert = require('chai').assert;3const sinon = require('sinon');4const mockery = require('mockery');5sinon.assert.expose(assert, { prefix: '' });6describe('index', function() {7 // Time not important. Only life important.8 this.timeout(5000);9 let Executor;10 let dockerodeMock;11 let dockerMock;12 let containerMock;13 let containerShellMock;14 let executor;15 before(() => {16 mockery.enable({17 useCleanCache: true,18 warnOnUnregistered: false19 });20 });21 beforeEach(() => {22 containerMock = {23 id: 'containerID',24 start: sinon.stub().yieldsAsync(),25 remove: sinon.stub().yieldsAsync()26 };27 containerShellMock = {28 id: 'containerID'29 };30 dockerMock = {31 createContainer: sinon.stub().yieldsAsync(null, containerMock),32 createImage: sinon.stub().yieldsAsync(null),33 listContainers: sinon.stub().yieldsAsync(null, [containerShellMock]),34 getContainer: sinon.stub().returns(containerMock)35 };36 dockerodeMock = sinon.stub().returns(dockerMock);37 mockery.registerMock('dockerode', dockerodeMock);38 /* eslint-disable global-require */39 Executor = require('../index');40 /* eslint-enable global-require */41 executor = new Executor({42 ecosystem: {43 api: 'api',44 ui: 'ui',45 store: 'store'46 },47 docker: {48 host: 'docker-swarm'49 },50 fusebox: {51 breaker: {52 timeout: 153 },54 retry: {55 retries: 1,56 minTimeout: 157 }58 }59 });60 });61 afterEach(() => {62 mockery.deregisterAll();63 mockery.resetCache();64 });65 after(() => {66 mockery.disable();67 });68 describe('constructor', () => {69 it('passes options to Dockerode', () => {70 assert.calledWith(dockerodeMock, {71 host: 'docker-swarm'72 });73 });74 it('defaults to stable containers', () => {75 assert.equal(executor.launchVersion, 'stable');76 assert.equal(executor.prefix, '');77 });78 it('supports customizing containers', () => {79 executor = new Executor({80 launchVersion: 'v1.2.3',81 prefix: 'beta_'82 });83 assert.equal(executor.launchVersion, 'v1.2.3');84 assert.equal(executor.prefix, 'beta_');85 });86 });87 describe('start', () => {88 const buildId = 1992;89 const apiUri = 'https://api.sd.cd';90 const token = '123456';91 let container = 'node:6';92 const launcherImageArgs = {93 fromImage: 'screwdrivercd/launcher',94 tag: 'stable'95 };96 let buildArgs;97 let launcherContainer;98 let launcherArgs;99 let buildContainer;100 beforeEach(() => {101 launcherContainer = {102 id: 'launcherID',103 start: sinon.stub().yieldsAsync(new Error()),104 remove: sinon.stub().yieldsAsync(new Error())105 };106 launcherArgs = {107 name: `${buildId}-init`,108 Image: 'screwdrivercd/launcher:stable',109 Entrypoint: '/bin/true',110 Labels: {111 sdbuild: buildId.toString()112 }113 };114 buildContainer = {115 id: 'buildID',116 start: sinon.stub().yieldsAsync(null),117 remove: sinon.stub().yieldsAsync(new Error())118 };119 buildArgs = {120 name: `${buildId}-build`,121 Image: container,122 Entrypoint: '/opt/sd/launcher_entrypoint.sh',123 Labels: {124 sdbuild: buildId.toString()125 },126 Cmd: [['/opt/sd/run.sh', `"${token}"`, 'api', 'store', '90', buildId, 'ui'].join(' ')],127 HostConfig: {128 Memory: 2 * 1024 * 1024 * 1024,129 MemoryLimit: 3 * 1024 * 1024 * 1024,130 VolumesFrom: ['launcherID:rw']131 }132 };133 });134 it('creates the required containers and starts them', () => {135 const buildImageArgs = {136 fromImage: 'node',137 tag: '6'138 };139 dockerMock.createContainer.yieldsAsync(new Error('bad container args'));140 dockerMock.createContainer.withArgs(launcherArgs).yieldsAsync(null, launcherContainer);141 dockerMock.createContainer.withArgs(buildArgs).yieldsAsync(null, buildContainer);142 return executor143 .start({144 buildId,145 container,146 apiUri,147 token148 })149 .then(() => {150 assert.calledWith(dockerMock.createImage, buildImageArgs);151 assert.calledWith(dockerMock.createImage, launcherImageArgs);152 assert.callCount(dockerMock.createImage, 2);153 assert.calledWith(dockerMock.createContainer, buildArgs);154 assert.calledWith(dockerMock.createContainer, launcherArgs);155 assert.callCount(dockerMock.createContainer, 2);156 assert.callCount(buildContainer.start, 1);157 });158 });159 it('creates the containers with correct args from build config', () => {160 const buildImageArgs = {161 fromImage: 'node',162 tag: '6'163 };164 buildArgs.Cmd = [['/opt/sd/run.sh', `"${token}"`, 'api', 'store', 5, buildId, 'ui'].join(' ')];165 dockerMock.createContainer.yieldsAsync(new Error('bad container args'));166 dockerMock.createContainer.withArgs(launcherArgs).yieldsAsync(null, launcherContainer);167 dockerMock.createContainer.withArgs(buildArgs).yieldsAsync(null, buildContainer);168 return executor169 .start({170 buildId,171 container,172 apiUri,173 token,174 annotations: {175 'screwdriver.cd/timeout': 5176 }177 })178 .then(() => {179 assert.calledWith(dockerMock.createImage, buildImageArgs);180 assert.calledWith(dockerMock.createImage, launcherImageArgs);181 assert.callCount(dockerMock.createImage, 2);182 assert.calledWith(dockerMock.createContainer, buildArgs);183 assert.calledWith(dockerMock.createContainer, launcherArgs);184 assert.callCount(dockerMock.createContainer, 2);185 assert.callCount(buildContainer.start, 1);186 });187 });188 it('supports prefixed containers', () => {189 const prefix = 'beta_';190 const buildImageArgs = {191 fromImage: 'node',192 tag: '6'193 };194 launcherArgs = {195 name: `${prefix}${buildId}-init`,196 Image: 'screwdrivercd/launcher:stable',197 Entrypoint: '/bin/true',198 Labels: {199 sdbuild: `${prefix}${buildId}`200 }201 };202 buildArgs = {203 name: `${prefix}${buildId}-build`,204 Image: container,205 Entrypoint: '/opt/sd/launcher_entrypoint.sh',206 Labels: {207 sdbuild: `${prefix}${buildId}`208 },209 Cmd: [['/opt/sd/run.sh', `"${token}"`, 'api', 'store', '90', buildId, 'ui'].join(' ')],210 HostConfig: {211 Memory: 2 * 1024 * 1024 * 1024,212 MemoryLimit: 3 * 1024 * 1024 * 1024,213 VolumesFrom: ['launcherID:rw']214 }215 };216 dockerMock.createContainer.yieldsAsync(new Error('bad container args'));217 dockerMock.createContainer.withArgs(launcherArgs).yieldsAsync(null, launcherContainer);218 dockerMock.createContainer.withArgs(buildArgs).yieldsAsync(null, buildContainer);219 executor = new Executor({220 prefix,221 ecosystem: {222 api: 'api',223 ui: 'ui',224 store: 'store'225 }226 });227 return executor228 .start({229 buildId,230 container,231 apiUri,232 token233 })234 .then(() => {235 assert.calledWith(dockerMock.createImage, buildImageArgs);236 assert.calledWith(dockerMock.createImage, launcherImageArgs);237 assert.callCount(dockerMock.createImage, 2);238 assert.calledWith(dockerMock.createContainer, buildArgs);239 assert.calledWith(dockerMock.createContainer, launcherArgs);240 assert.callCount(dockerMock.createContainer, 2);241 assert.callCount(buildContainer.start, 1);242 });243 });244 it('creates containers without specifying a tag', () => {245 const buildImageArgs = {246 fromImage: 'node',247 tag: 'latest'248 };249 container = 'node';250 buildArgs.Image = container;251 dockerMock.createContainer.yieldsAsync(new Error('bad container args'));252 dockerMock.createContainer.withArgs(launcherArgs).yieldsAsync(null, launcherContainer);253 dockerMock.createContainer.withArgs(buildArgs).yieldsAsync(null, buildContainer);254 return executor255 .start({256 buildId,257 container,258 apiUri,259 token260 })261 .then(() => {262 assert.calledWith(dockerMock.createImage, buildImageArgs);263 assert.calledWith(dockerMock.createImage, launcherImageArgs);264 assert.callCount(dockerMock.createImage, 2);265 assert.calledWith(dockerMock.createContainer, buildArgs);266 assert.calledWith(dockerMock.createContainer, launcherArgs);267 assert.callCount(dockerMock.createContainer, 2);268 assert.callCount(buildContainer.start, 1);269 });270 });271 it('creates containers from a private docker registry and starts them', () => {272 const buildImageArgs = {273 fromImage: 'docker-registry.foo.bar:1111/someImage',274 tag: 'latest'275 };276 container = 'docker-registry.foo.bar:1111/someImage:latest';277 buildArgs.Image = container;278 dockerMock.createContainer.yieldsAsync(new Error('bad container args'));279 dockerMock.createContainer.withArgs(launcherArgs).yieldsAsync(null, launcherContainer);280 dockerMock.createContainer.withArgs(buildArgs).yieldsAsync(null, buildContainer);281 return executor282 .start({283 buildId,284 container,285 apiUri,286 token287 })288 .then(() => {289 assert.calledWith(dockerMock.createImage, buildImageArgs);290 assert.calledWith(dockerMock.createImage, launcherImageArgs);291 assert.callCount(dockerMock.createImage, 2);292 assert.calledWith(dockerMock.createContainer, buildArgs);293 assert.calledWith(dockerMock.createContainer, launcherArgs);294 assert.callCount(dockerMock.createContainer, 2);295 assert.callCount(buildContainer.start, 1);296 });297 });298 it('creates containers from a private docker registry without specifying a tag', () => {299 const buildImageArgs = {300 fromImage: 'docker-registry.foo.bar:1111/someImage',301 tag: 'latest'302 };303 container = 'docker-registry.foo.bar:1111/someImage';304 buildArgs.Image = container;305 dockerMock.createContainer.yieldsAsync(new Error('bad container args'));306 dockerMock.createContainer.withArgs(launcherArgs).yieldsAsync(null, launcherContainer);307 dockerMock.createContainer.withArgs(buildArgs).yieldsAsync(null, buildContainer);308 return executor309 .start({310 buildId,311 container,312 apiUri,313 token314 })315 .then(() => {316 assert.calledWith(dockerMock.createImage, buildImageArgs);317 assert.calledWith(dockerMock.createImage, launcherImageArgs);318 assert.callCount(dockerMock.createImage, 2);319 assert.calledWith(dockerMock.createContainer, buildArgs);320 assert.calledWith(dockerMock.createContainer, launcherArgs);321 assert.callCount(dockerMock.createContainer, 2);322 assert.callCount(buildContainer.start, 1);323 });324 });325 it('bubbles create problems back', () => {326 dockerMock.createContainer.yieldsAsync(new Error('Unable to create container'));327 return executor328 .start({329 buildId,330 container,331 apiUri,332 token333 })334 .then(() => {335 throw new Error('should not have gotten here');336 })337 .catch(error => {338 assert.equal(error.message, 'Unable to create container');339 });340 });341 it('bubbles start problems back', () => {342 containerMock.start.yieldsAsync(new Error('Unable to start container'));343 return executor344 .start({345 buildId,346 container,347 apiUri,348 token349 })350 .then(() => {351 throw new Error('should not have gotten here');352 })353 .catch(error => {354 assert.equal(error.message, 'Unable to start container');355 });356 });357 });358 describe('stop', () => {359 const buildId = 1992;360 it('finds and removes the containers', () => {361 const findArgs = {362 filters: `{"label":["sdbuild=${buildId}"]}`,363 all: true364 };365 const removeArgs = {366 v: true,367 force: true368 };369 dockerMock.listContainers.yieldsAsync(new Error('bad container args'));370 dockerMock.listContainers.withArgs(findArgs).yieldsAsync(null, [containerShellMock, containerShellMock]);371 return executor372 .stop({373 buildId374 })375 .then(() => {376 assert.calledWith(dockerMock.listContainers, findArgs);377 assert.calledWith(containerMock.remove, removeArgs);378 assert.callCount(containerMock.remove, 2);379 });380 });381 it('supports prefixes', () => {382 const prefix = 'beta_';383 const findArgs = {384 filters: `{"label":["sdbuild=${prefix}${buildId}"]}`,385 all: true386 };387 const removeArgs = {388 v: true,389 force: true390 };391 dockerMock.listContainers.yieldsAsync(new Error('bad container args'));392 dockerMock.listContainers.withArgs(findArgs).yieldsAsync(null, [containerShellMock, containerShellMock]);393 executor = new Executor({394 prefix,395 ecosystem: {396 api: 'api',397 ui: 'ui',398 store: 'store'399 }400 });401 return executor402 .stop({403 buildId404 })405 .then(() => {406 assert.calledWith(dockerMock.listContainers, findArgs);407 assert.calledWith(containerMock.remove, removeArgs);408 assert.callCount(containerMock.remove, 2);409 });410 });411 it('bubbles list problems back', () => {412 dockerMock.listContainers.yieldsAsync(new Error('Unable to list containers'));413 return executor414 .stop({415 buildId416 })417 .then(() => {418 throw new Error('should not have gotten here');419 })420 .catch(error => {421 assert.equal(error.message, 'Unable to list containers');422 });423 });424 it('bubbles remove problems back', () => {425 containerMock.remove.yieldsAsync(new Error('Unable to remove container'));426 return executor427 .stop({428 buildId429 })430 .then(() => {431 throw new Error('should not have gotten here');432 })433 .catch(error => {434 assert.equal(error.message, 'Unable to remove container');435 });436 });437 });438 describe('stats', () => {439 it('bubbles stats from circuit fuses', () => {440 assert.deepEqual(441 {442 requests: {443 total: 0,444 timeouts: 0,445 success: 0,446 failure: 0,447 concurrent: 0,448 averageTime: 0449 },450 breaker: {451 isClosed: true452 }453 },454 executor.stats()455 );456 });457 });458 describe('periodic', () => {459 it('resolves to null when calling periodic start', () =>460 executor.startPeriodic().then(res => assert.isNull(res)));461 it('resolves to null when calling periodic stop', () =>462 executor.stopPeriodic().then(res => assert.isNull(res)));463 });464 describe('frozen', () => {465 it('resolves to null when calling frozen start', () => executor.startFrozen().then(res => assert.isNull(res)));466 it('resolves to null when calling frozen stop', () => executor.stopFrozen().then(res => assert.isNull(res)));467 });...

Full Screen

Full Screen

Application.js

Source:Application.js Github

copy

Full Screen

...4 const Application = KraGL.app.Application;5 const KraGLError = KraGL.KraGLError;6 describe('constructor', () => {7 it('defaults', () => {8 let container = createContainer();9 let app = new _MockApp({ container });10 assert.isDefined(app);11 assert.isFalse(app.isRunning);12 assert.instanceOf(app.gl, WebGLRenderingContext);13 assert.isFalse(app.gl.getContextAttributes().alpha);14 assert.isTrue(app.gl.getContextAttributes().stencil);15 assert.equal(app.width, 800);16 assert.equal(app.height, 600);17 destroyApp(app);18 });19 it('webgl2', () => {20 let container = createContainer();21 let app = new _MockApp({22 container,23 glVersion: '2.0'24 });25 assert.instanceOf(app.gl, WebGL2RenderingContext);26 destroyApp(app);27 });28 it('width & height', () => {29 let container = createContainer();30 let app = new _MockApp({31 container,32 width: 320,33 height: 24034 });35 assert.equal(app.width, 320);36 assert.equal(app.height, 240);37 destroyApp(app);38 });39 it('glAttrs', () => {40 let container = createContainer();41 let app = new _MockApp({42 container,43 glAttrs: {44 // Opposite of KraGL defaults45 alpha: true,46 stencil: false47 }48 });49 assert.isTrue(app.gl.getContextAttributes().alpha);50 assert.isFalse(app.gl.getContextAttributes().stencil);51 destroyApp(app);52 });53 });54 // Property tests55 describe('canvas', () => {56 it('normal', () => {57 let container = createContainer();58 let app = new _MockApp({ container });59 assert.instanceOf(app.canvas, HTMLCanvasElement);60 destroyApp(app);61 });62 });63 describe('container', () => {64 it('normal', () => {65 let container = createContainer();66 let app = new _MockApp({ container });67 assert.equal(app.container, container);68 destroyApp(app);69 });70 it('no container', () => {71 assert.throws(() => {72 let app = new _MockApp({});73 }, KraGLError);74 });75 });76 describe('fps', () => {77 it('not started', () => {78 let container = createContainer();79 let app = new _MockApp({ container });80 assert.equal(app.fps, 0);81 destroyApp(app);82 });83 it('running', () => {84 let container = createContainer();85 let app = new _MockApp({ container });86 return app.start()87 .then(() => {88 return new Promise(resolve => {89 setTimeout(() => {90 resolve();91 }, 1100);92 });93 })94 .then(() => {95 assert.approximately(app.fps, 60.0, 3.0);96 return app.end();97 })98 .finally(() => {99 destroyApp(app);100 });101 });102 });103 describe('gl', () => {104 it('normal', () => {105 let container = createContainer();106 let app = new _MockApp({ container });107 assert.instanceOf(app.gl, WebGLRenderingContext);108 destroyApp(app);109 });110 it('webgl2', () => {111 let container = createContainer();112 let app = new _MockApp({113 container,114 glVersion: '2.0'115 });116 assert.instanceOf(app.gl, WebGL2RenderingContext);117 destroyApp(app);118 });119 });120 describe('height', () => {121 it('normal', () => {122 let container = createContainer();123 let app = new _MockApp({ container });124 assert.equal(app.height, 600);125 destroyApp(app);126 });127 it('custom', () => {128 let container = createContainer();129 let app = new _MockApp({130 container,131 height: 240132 });133 assert.equal(app.height, 240);134 destroyApp(app);135 });136 });137 describe('isContextLost', () => {138 it('not lost', () => {139 let container = createContainer();140 let app = new _MockApp({ container });141 return app.start()142 .then(() => {143 assert.isFalse(app.isContextLost);144 return app.end();145 })146 .finally(() => {147 destroyApp(app);148 });149 });150 it('context lost', () => {151 let container = createContainer();152 let app = new _MockApp({ container });153 return app.start()154 .then(() => {155 app.gl.getExtension('WEBGL_lose_context').loseContext();156 return new Promise(resolve => {157 setTimeout(() => {158 resolve();159 }, 10);160 });161 })162 .then(() => {163 assert.isTrue(app.isContextLost);164 return app.end();165 })166 .finally(() => {167 destroyApp(app);168 });169 });170 it('after context restored', () => {171 let container = createContainer();172 let app = new _MockApp({ container });173 return app.start()174 .then(() => {175 app.canvas.dispatchEvent(new WebGLContextEvent('webglcontextlost'));176 return new Promise(resolve => {177 setTimeout(() => {178 resolve();179 }, 10);180 });181 })182 .then(() => {183 app.canvas.dispatchEvent(new WebGLContextEvent('webglcontextrestored'));184 return new Promise(resolve => {185 setTimeout(() => {186 resolve();187 }, 10);188 });189 })190 .then(() => {191 assert.isFalse(app.isContextLost);192 return app.end();193 })194 .finally(() => {195 destroyApp(app);196 });197 });198 });199 describe('isLoading', () => {200 it('from NOT_STARTED', () => {201 let container = createContainer();202 let app = new _MockApp({ container });203 assert.isFalse(app.isLoading);204 destroyApp(app);205 });206 it('from LOADING', () => {207 let container = createContainer();208 let app = new _MockApp({ container });209 // Implement initResources so that it takes 200 millis to load.210 app.initResources = function() {211 return new Promise(resolve => {212 setTimeout(() => {213 resolve();214 }, 200);215 });216 }217 let result = false;218 let promise = app.start();219 // Wait for an animation frame between when start is invoked and when220 // initResources finished. Capture the isLoading value at that time.221 setTimeout(() => {222 result = app.isLoading;223 }, 100);224 return promise225 .then(() => {226 assert.isTrue(result);227 return app.end();228 })229 .finally(() => {230 destroyApp(app);231 });232 });233 it('from RUNNING', () => {234 let container = createContainer();235 let app = new _MockApp({ container });236 return app.start()237 .then(() => {238 assert.isFalse(app.isLoading);239 return app.end();240 })241 .finally(() => {242 destroyApp(app);243 });244 });245 it('from ENDED', () => {246 let container = createContainer();247 let app = new _MockApp({ container });248 app.initResources = function() {249 return new Promise(resolve => {250 setTimeout(() => {251 resolve();252 }, 100);253 });254 }255 return app.start()256 .then(() => {257 return app.end();258 })259 .then(() => {260 assert.isFalse(app.isLoading);261 })262 .finally(() => {263 destroyApp(app);264 });265 });266 });267 describe('isPaused', () => {268 it('from NOT_STARTED', () => {269 let container = createContainer();270 let app = new _MockApp({ container });271 assert.isFalse(app.isPaused);272 destroyApp(app);273 });274 it('from LOADING', () => {275 let container = createContainer();276 let app = new _MockApp({ container });277 app.initResources = function() {278 return new Promise(resolve => {279 setTimeout(() => {280 resolve();281 }, 100);282 });283 };284 let result;285 let promise = app.start();286 setTimeout(() => {287 result = app.isPaused;288 }, 10);289 return promise290 .then(() => {291 return app.end();292 })293 .then(() => {294 assert.isFalse(result);295 })296 .finally(() => {297 destroyApp(app);298 });299 });300 it('from RUNNING', () => {301 let container = createContainer();302 let app = new _MockApp({ container });303 return app.start()304 .then(() => {305 assert.isFalse(app.isPaused);306 return app.end();307 })308 .finally(() => {309 destroyApp(app);310 });311 });312 it('from PAUSED', () => {313 let container = createContainer();314 let app = new _MockApp({ container });315 return app.start()316 .then(() => {317 return app.pause();318 })319 .then(() => {320 assert.isTrue(app.isPaused);321 return app.end();322 })323 .finally(() => {324 destroyApp(app);325 });326 });327 it('from ENDED', () => {328 let container = createContainer();329 let app = new _MockApp({ container });330 return app.start()331 .then(() => {332 return app.end();333 })334 .then(() => {335 assert.isFalse(app.isPaused);336 })337 .finally(() => {338 destroyApp(app);339 });340 });341 });342 describe('isRunning', () => {343 it('from NOT_STARTED', () => {344 let container = createContainer();345 let app = new _MockApp({ container });346 assert.isFalse(app.isRunning);347 destroyApp(app);348 });349 it('from LOADING', () => {350 let container = createContainer();351 let app = new _MockApp({ container });352 app.initResources = function() {353 return new Promise(resolve => {354 setTimeout(() => {355 resolve();356 }, 100);357 });358 };359 let promise = app.start();360 let result;361 setTimeout(() => {362 result = app.isRunning;363 }, 10);364 return promise365 .then(() => {366 assert.isFalse(result);367 return app.end();368 })369 .finally(() => {370 destroyApp(app);371 });372 });373 it('from RUNNING', () => {374 let container = createContainer();375 let app = new _MockApp({ container });376 return app.start()377 .then(() => {378 assert.isTrue(app.isRunning);379 return app.end();380 })381 .finally(() => {382 destroyApp(app);383 });384 });385 it('from CONTEXT_LOST', () => {386 let container = createContainer();387 let app = new _MockApp({ container });388 return app.start()389 .then(() => {390 app.gl.getExtension('WEBGL_lose_context').loseContext();391 return new Promise(resolve => {392 setTimeout(() => {393 resolve();394 }, 10);395 });396 })397 .then(() => {398 assert.isFalse(app.isRunning);399 })400 .finally(() => {401 destroyApp(app);402 });403 });404 it('from ENDED', () => {405 let container = createContainer();406 let app = new _MockApp({ container });407 return app.start()408 .then(() => {409 return app.end();410 })411 .then(() => {412 assert.isFalse(app.isRunning);413 })414 .finally(() => {415 destroyApp(app);416 });417 });418 });419 describe('shaderLib', () => {420 it('normal', () => {421 let container = createContainer();422 let app = new _MockApp({ container });423 assert.instanceOf(app.shaderLib, KraGL.shaders.ShaderLib);424 destroyApp(app);425 });426 });427 describe('width', () => {428 it('default', () => {429 let container = createContainer();430 let app = new _MockApp({ container });431 assert.equal(app.width, 800);432 destroyApp(app);433 });434 it('custom', () => {435 let container = createContainer();436 let app = new _MockApp({437 container,438 width: 320439 });440 assert.equal(app.width, 320);441 destroyApp(app);442 });443 });444 // Method tests445 describe('clean', () => {446 it('called by restart', () => {447 let container = createContainer();448 let app = new _MockApp({ container });449 let result;450 app.clean = function() {451 result = true;452 return Promise.resolve();453 }454 return app.start()455 .then(() => {456 return app.restart();457 })458 .then(() => {459 assert.isTrue(result);460 return app.end();461 })462 .finally(() => {463 destroyApp(app);464 });465 });466 });467 describe('end', () => {468 it('can be restarted', () => {469 let container = createContainer();470 let app = new _MockApp({ container });471 return app.start()472 .then(() => {473 return app.end();474 })475 .then(() => {476 assert.isFalse(app.isRunning);477 return app.restart();478 })479 .then(() => {480 assert.isTrue(app.isRunning);481 return app.end();482 })483 .finally(() => {484 destroyApp(app);485 });486 });487 it('cannot be started', () => {488 let container = createContainer();489 let app = new _MockApp({ container });490 let promise = app.start()491 .then(() => {492 return app.end();493 })494 .then(() => {495 assert.isFalse(app.isRunning);496 return app.start();497 })498 .finally(() => {499 destroyApp(app);500 });501 assert.isRejected(promise);502 });503 });504 describe('initResources', () => {505 it('called during startup', () => {506 let container = createContainer();507 let app = new _MockApp({ container });508 let result;509 app.initResources = function() {510 result = true;511 return Promise.resolve();512 };513 return app.start()514 .then(() => {515 assert.isTrue(result);516 return app.end();517 })518 .finally(() => {519 destroyApp(app);520 });521 });522 });523 describe('initWebGLResources', () => {524 it('called during startup', () => {525 let container = createContainer();526 let app = new _MockApp({ container });527 let result;528 app.initWebGLResources = function() {529 result = true;530 return Promise.resolve();531 };532 return app.start()533 .then(() => {534 assert.isTrue(result);535 return app.end();536 })537 .finally(() => {538 destroyApp(app);539 });;540 });541 });542 describe('pause', () => {543 it('normal', () => {544 let container = createContainer();545 let app = new _MockApp({ container });546 return app.start()547 .then(() => {548 return app.pause();549 })550 .then(() => {551 assert.isTrue(app.isPaused);552 return app.end();553 })554 .finally(() => {555 destroyApp(app);556 });557 });558 it('wrong state', () => {559 let container = createContainer();560 let app = new _MockApp({ container });561 assert.throws(() => {562 app.pause();563 }, KraGL.K);564 destroyApp(app);565 });566 });567 describe('render', () => {568 it('called while running', () => {569 let container = createContainer();570 let app = new _MockApp({ container });571 let result;572 app.render = function() {573 result = true;574 }575 return app.start()576 .then(() => {577 assert.isTrue(result);578 return app.end();579 })580 .finally(() => {581 destroyApp(app);582 });583 });584 });585 describe('restart', () => {586 it('normal', () => {587 let container = createContainer();588 let app = new _MockApp({ container });589 let startCount = 0;590 app.initResources = function() {591 startCount++;592 return Promise.resolve();593 };594 return app.start()595 .then(() => {596 return app.restart();597 })598 .then(() => {599 assert.equal(startCount, 2);600 return app.end();601 })602 .finally(() => {603 destroyApp(app);604 });605 });606 });607 describe('resume', () => {608 it('from PAUSED', () => {609 let container = createContainer();610 let app = new _MockApp({ container });611 return app.start()612 .then(() => {613 return app.pause();614 })615 .then(() => {616 assert.isFalse(app.isRunning);617 return app.resume();618 })619 .then(() => {620 assert.isTrue(app.isRunning);621 return app.end();622 })623 .finally(() => {624 destroyApp(app);625 });626 });627 it('from NOT_STARTED', () => {628 let container = createContainer();629 let app = new _MockApp({ container });630 assert.throws(() => {631 app.resume();632 }, KraGL.KraGLError);633 destroyApp(app);634 });635 it('from RUNNING', () => {636 let container = createContainer();637 let app = new _MockApp({ container });638 let promise = app.start()639 .then(() => {640 return app.resume();641 })642 .finally(() => {643 destroyApp(app);644 });645 return assert.isRejected(promise);646 });647 });648 describe('start', () => {649 it('normal', () => {650 let container = createContainer();651 let app = new _MockApp({ container });652 return app.start()653 .then(() => {654 assert.isTrue(app.isRunning);655 return app.end();656 })657 .then(() => {658 assert.isFalse(app.isRunning);659 })660 .finally(() => {661 destroyApp(app);662 });663 });664 it('wrong state', () => {665 let container = createContainer();666 let app = new _MockApp({ container });667 let promise = app.start()668 .then(() => {669 assert.isTrue(app.isRunning);670 return app.start();671 })672 .then(() => {673 throw new Error('fail');674 })675 .catch(() => {676 assert.isFalse(app.isRunning);677 })678 .finally(() => {679 destroyApp(app);680 });681 return assert.isRejected(promise);682 });683 });684 describe('update', () => {685 it('normal', () => {686 let container = createContainer();687 let app = new _MockApp({ container });688 let updateCount = 0;689 app.update = function() {690 updateCount++;691 };692 return app.start()693 .then(() => {694 return new Promise(resolve => {695 setTimeout(() => {696 resolve();697 }, 1000);698 });699 })700 .then(() => {...

Full Screen

Full Screen

CreateContainer-dbg.js

Source:CreateContainer-dbg.js Github

copy

Full Screen

1/*!2 * OpenUI53 * (c) Copyright 2009-2019 SAP SE or an SAP affiliate company.4 * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.5 */6sap.ui.define([7 "sap/ui/rta/plugin/Plugin",8 "sap/ui/fl/Utils",9 "sap/ui/rta/Utils",10 "sap/ui/dt/Util",11 "sap/base/util/uid"12], function(13 Plugin,14 FlexUtils,15 RtaUtils,16 DtUtil,17 uid18) {19 "use strict";20 /**21 * Constructor for a new CreateContainer Plugin.22 *23 * @param {string} [sId] id for the new object, generated automatically if no id is given24 * @param {object} [mSettings] initial settings for the new object25 * @class The CreateContainer allows trigger CreateContainer operations on the overlay26 * @extends sap.ui.rta.plugin.Plugin27 * @author SAP SE28 * @version 1.72.029 * @constructor30 * @private31 * @since 1.3432 * @alias sap.ui.rta.plugin.CreateContainer33 * @experimental Since 1.34. This class is experimental and provides only limited functionality. Also the API might be changed in future.34 */35 var CreateContainer = Plugin.extend("sap.ui.rta.plugin.CreateContainer", /** @lends sap.ui.rta.plugin.CreateContainer.prototype */ {36 metadata: {37 library: "sap.ui.rta",38 properties: {},39 associations: {},40 events: {}41 }42 });43 /**44 * This function gets called on startup. It checks if the Overlay is editable by this plugin.45 * @param {sap.ui.dt.Overlay} oOverlay - overlay to be checked46 * @returns {object} Returns object with editable boolean values for "asChild" and "asSibling"47 * @private48 */49 CreateContainer.prototype._isEditable = function (oOverlay) {50 return Promise.all([this._isEditableCheck(oOverlay, true), this._isEditableCheck(oOverlay, false)])51 .then(function(aPromiseValues) {52 return {53 asSibling: aPromiseValues[0],54 asChild: aPromiseValues[1]55 };56 });57 };58 CreateContainer.prototype._isEditableCheck = function (oOverlay, bOverlayIsSibling) {59 var oParentOverlay = this._getParentOverlay(bOverlayIsSibling, oOverlay);60 var sAggregationName;61 if (!oParentOverlay || !oParentOverlay.getParentElementOverlay()) {62 //root element is not editable as parent and as sibling63 return Promise.resolve(false);64 }65 if (bOverlayIsSibling) {66 sAggregationName = oOverlay.getParentAggregationOverlay().getAggregationName();67 }68 return this.checkAggregationsOnSelf(oParentOverlay, "createContainer", sAggregationName)69 .then(function(bEditableCheck) {70 if (bEditableCheck) {71 // If ids are created within fragments or controller code,72 // the id of the parent view might not be part of the control id.73 // In these cases the control might have a stable id (this.hasStableId()), but the view doesn't.74 // As the view is needed create the id for the newly created container it75 // has to be stable, otherwise the new id will not be stable.76 var oParentView = FlexUtils.getViewForControl(oParentOverlay.getElement());77 return this.hasStableId(oOverlay) && FlexUtils.checkControlId(oParentView);78 }79 return false;80 }.bind(this));81 };82 CreateContainer.prototype._getParentOverlay = function (bSibling, oOverlay) {83 var oParentOverlay;84 if (bSibling) {85 oParentOverlay = oOverlay.getParentElementOverlay();86 } else {87 oParentOverlay = oOverlay;88 }89 return oParentOverlay;90 };91 CreateContainer.prototype.getCreateAction = function (bSibling, oOverlay) {92 var oParentOverlay = this._getParentOverlay(bSibling, oOverlay);93 var oDesignTimeMetadata = oParentOverlay.getDesignTimeMetadata();94 var aActions = oDesignTimeMetadata.getActionDataFromAggregations("createContainer", oOverlay.getElement());95 return aActions[0];96 };97 CreateContainer.prototype.isAvailable = function (bSibling, aElementOverlays) {98 return this._isEditableByPlugin(aElementOverlays[0], bSibling);99 };100 CreateContainer.prototype.isEnabled = function (bSibling, aElementOverlays) {101 var oElementOverlay = aElementOverlays[0];102 var vAction = this.getCreateAction(bSibling, oElementOverlay);103 if (!vAction) {104 return false;105 }106 if (vAction.isEnabled && typeof vAction.isEnabled === "function") {107 var fnIsEnabled = vAction.isEnabled;108 var oParentOverlay = this._getParentOverlay(bSibling, oElementOverlay);109 return fnIsEnabled(oParentOverlay.getElement());110 }111 return true;112 };113 /**114 * Returns the id of a newly created container using the function115 * defined in the control designtime metadata to retrieve the correct value116 * @param {object} vAction create container action from designtime metadata117 * @param {string} sNewControlID id of the new control118 * @return {string} Returns the id of the created control119 */120 CreateContainer.prototype.getCreatedContainerId = function (vAction, sNewControlID) {121 var sId = sNewControlID;122 if (vAction.getCreatedContainerId && typeof vAction.getCreatedContainerId === "function") {123 var fnMapToRelevantControlID = vAction.getCreatedContainerId;124 sId = fnMapToRelevantControlID(sNewControlID);125 }126 return sId;127 };128 CreateContainer.prototype._determineIndex = function (oParentElement, oSiblingElement, sAggregationName, fnGetIndex) {129 return RtaUtils.getIndex(oParentElement, oSiblingElement, sAggregationName, fnGetIndex);130 };131 CreateContainer.prototype._getText = function (vAction, oElement, oDesignTimeMetadata, sText) {132 if (!vAction) {133 return sText;134 }135 var oAggregationDescription = oDesignTimeMetadata.getAggregationDescription(vAction.aggregation, oElement);136 if (!oAggregationDescription) {137 return sText;138 }139 var sContainerTitle = oAggregationDescription.singular;140 var oTextResources = sap.ui.getCore().getLibraryResourceBundle("sap.ui.rta");141 return oTextResources.getText(sText, sContainerTitle);142 };143 CreateContainer.prototype.getCreateContainerText = function(bSibling, oOverlay) {144 var vAction = this.getCreateAction(bSibling, oOverlay);145 var oParentOverlay = this._getParentOverlay(bSibling, oOverlay);146 var oDesignTimeMetadata = oParentOverlay.getDesignTimeMetadata();147 var oElement = oParentOverlay.getElement();148 var sText = "CTX_CREATE_CONTAINER";149 return this._getText(vAction, oElement, oDesignTimeMetadata, sText);150 };151 CreateContainer.prototype._getContainerTitle = function (vAction, oElement, oDesignTimeMetadata) {152 var sText = "TITLE_CREATE_CONTAINER";153 return this._getText(vAction, oElement, oDesignTimeMetadata, sText);154 };155 CreateContainer.prototype.handleCreate = function (bSibling, oOverlay) {156 var vAction = this.getCreateAction(bSibling, oOverlay);157 var oParentOverlay = this._getParentOverlay(bSibling, oOverlay);158 var oParent = oParentOverlay.getElement();159 var oDesignTimeMetadata = oParentOverlay.getDesignTimeMetadata();160 var oView = FlexUtils.getViewForControl(oParent);161 var oSiblingElement;162 if (bSibling) {163 oSiblingElement = oOverlay.getElement();164 }165 var sNewControlID = oView.createId(uid());166 var fnGetIndex = oDesignTimeMetadata.getAggregation(vAction.aggregation).getIndex;167 var iIndex = this._determineIndex(oParent, oSiblingElement, vAction.aggregation, fnGetIndex);168 var sVariantManagementReference = this.getVariantManagementReference(oParentOverlay);169 return this.getCommandFactory().getCommandFor(oParent, "createContainer", {170 newControlId : sNewControlID,171 label : this._getContainerTitle(vAction, oParent, oDesignTimeMetadata),172 index : iIndex,173 parentId : oParent.getId()174 }, oDesignTimeMetadata, sVariantManagementReference)175 .then(function(oCreateCommand) {176 this.fireElementModified({177 command : oCreateCommand,178 action : vAction,179 newControlId : sNewControlID180 });181 }.bind(this))182 .catch(function(oMessage) {183 throw DtUtil.createError("CreateContainer#handleCreate", oMessage, "sap.ui.rta");184 });185 };186 /**187 * Retrieve the context menu item for the actions.188 * Two items are returned here: one for when the overlay is sibling and one for when it is child.189 * @param {sap.ui.dt.ElementOverlay[]} aElementOverlays - Target overlays190 * @return {object[]} returns array containing the items with required data191 */192 CreateContainer.prototype.getMenuItems = function (aElementOverlays) {193 var bOverlayIsSibling = true;194 var sPluginId = "CTX_CREATE_SIBLING_CONTAINER";195 var iRank = 40;196 var aMenuItems = [];197 for (var i = 0; i < 2; i++) {198 if (this.isAvailable(bOverlayIsSibling, aElementOverlays)) {199 var sMenuItemText = this.getCreateContainerText.bind(this, bOverlayIsSibling);200 aMenuItems.push({201 id: sPluginId,202 text: sMenuItemText,203 handler: this.handler.bind(this, bOverlayIsSibling),204 enabled: this.isEnabled.bind(this, bOverlayIsSibling),205 icon: "sap-icon://add-folder",206 rank: iRank207 });208 }209 bOverlayIsSibling = false;210 sPluginId = "CTX_CREATE_CHILD_CONTAINER";211 iRank = 50;212 }213 return aMenuItems;214 };215 /**216 * Get the name of the action related to this plugin.217 * @return {string} Returns the action name218 */219 CreateContainer.prototype.getActionName = function () {220 return "createContainer";221 };222 /**223 * Trigger the plugin execution.224 * @param {boolean} bOverlayIsSibling True if the overlay is sibling225 * @param {sap.ui.dt.ElementOverlay[]} aElementOverlays - Target overlays226 */227 CreateContainer.prototype.handler = function (bOverlayIsSibling, aElementOverlays) {228 this.handleCreate(bOverlayIsSibling, aElementOverlays[0]);229 };230 return CreateContainer;...

Full Screen

Full Screen

PointSelector.spec.js

Source:PointSelector.spec.js Github

copy

Full Screen

...4import { PointSelector as selector } from '../../src/selectors'5function createPoint ({ x, y } = { x: 10, y: 10 }) {6 return { x, y }7}8function createContainer({ width, height } = { width: 100, height: 100 }) {9 return { width, height }10}11describe('PoinntSelector', () => {12 describe('TYPE', () => {13 it('should be a defined string', () => {14 expect(selector.TYPE).to.be.a('string')15 })16 })17 describe('intersects', () => {18 it('should return true when point is inside geometry', () => {19 expect(20 selector.intersects({ x: 10, y: 10 }, createPoint(), createContainer())21 ).to.be.true22 })23 it('should return false when point is outside of geometry', () => {24 expect(selector.intersects({ x: 0, y: 0 }, createPoint(), createContainer())).to.be.false25 expect(selector.intersects({ x: 10, y: 0 }, createPoint(), createContainer())).to.be.false26 expect(selector.intersects({ x: 0, y: 10 }, createPoint(), createContainer())).to.be.false27 expect(selector.intersects({ x: 30, y: 30 }, createPoint(), createContainer())).to.be.false28 })29 })30 describe('area', () => {31 it('should return geometry area', () => {32 expect(33 selector.area(createPoint(), createContainer())34 ).to.equal(36)35 })36 it('should return geometry area based on container', () => {37 expect(38 selector.area(createPoint(), createContainer({ width: 200, height: 200 }))39 ).to.equal(9)40 })41 })42 describe('methods', () => {43 xit('should be defined')44 })...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({ headless: false });4 const context = await browser.newContext();5 const page = await context.newPage();6 const container = await page.createContainer();7 await container.addInitScript({ path: './initScript.js' });8 await container.addInitScript({ path: './initScript2.js' });9 await container.addInitScript({ path: './initScript3.js' });10 await container.addInitScript({ path: './initScript4.js' });11 await container.addInitScript({ path: './initScript5.js' });12 await container.addInitScript({ path: './initScript6.js' });13 await container.addInitScript({ path: './initScript7.js' });14 await container.addInitScript({ path: './initScript8.js' });15 await container.addInitScript({ path: './initScript9.js' });16 await container.addInitScript({ path: './initScript10.js' });17 await container.addInitScript({ path: './initScript11.js' });18 await container.addInitScript({ path: './initScript12.js' });19 await container.addInitScript({ path: './initScript13.js' });20 await container.addInitScript({ path: './initScript14.js' });21 await container.addInitScript({ path: './initScript15.js' });22 await container.addInitScript({ path: './initScript16.js' });23 await container.addInitScript({ path: './initScript17.js' });24 await container.addInitScript({ path: './initScript18.js' });25 await container.addInitScript({ path: './initScript19.js' });26 await container.addInitScript({ path: './initScript20.js' });27 await container.addInitScript({ path: './initScript21.js' });28 await container.addInitScript({ path: './initScript22.js' });29 await container.addInitScript({ path: './initScript23.js' });30 await container.addInitScript({ path: './initScript24.js' });31 await container.addInitScript({ path: './initScript25.js' });32 await container.addInitScript({ path: './initScript26.js' });33 await container.addInitScript({ path: './initScript27.js' });34 await container.addInitScript({ path: './initScript

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 const container = await page.createContainer();7 await container.setContent('<h1>My Page</h1>');8 const h1 = await container.$('h1');9 console.log(await h1.innerText());10 await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14 const browser = await chromium.launch();15 const context = await browser.newContext();16 const page = await context.newPage();17 const container = await page.createContainer();18 await container.setContent('<h1>My Page</h1>');19 const h1 = await container.$('h1');20 console.log(await h1.innerText());21 await browser.close();22})();23const { chromium } = require('playwright');24(async () => {25 const browser = await chromium.launch();26 const context = await browser.newContext();27 const page = await context.newPage();28 const container = await page.createContainer();29 await container.setContent('<h1>My Page</h1>');30 const h1 = await container.$('h1');31 console.log(await h1.innerText());32 await browser.close();33})();34const { chromium } = require('playwright');35(async () => {36 const browser = await chromium.launch();37 const context = await browser.newContext();38 const page = await context.newPage();39 const container = await page.createContainer();40 await container.setContent('<h1>My Page</h1>');41 const h1 = await container.$('h1');42 console.log(await h1.innerText());43 await browser.close();44})();45const { chromium } = require('playwright');46(async () => {47 const browser = await chromium.launch();48 const context = await browser.newContext();49 const page = await context.newPage();50 const container = await page.createContainer();51 await container.setContent('<h1>My Page</h1>');

Full Screen

Using AI Code Generation

copy

Full Screen

1const playwright = require('playwright');2(async () => {3 const browser = await playwright['chromium'].launch({ headless: false });4 const context = await browser.newContext();5 const page = await context.newPage();6 const container = await page._delegate.createContainer();7 console.log(container);8 await browser.close();9})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2const path = require('path');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.screenshot({ path: 'example.png' });8 await browser.close();9})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 await page.screenshot({ path: `example.png` });7 await browser.close();8})();9const { chromium } = require('playwright');10(async () => {11 const browser = await chromium.launch();12 const context = await browser.newContext();13 const page = await context.newPage();14 await page.screenshot({ path: `example.png` });15 await browser.close();16})();17const { chromium } = require('playwright');18(async () => {19 const browser = await chromium.launch();20 const context = await browser.newContext();21 const page = await context.newPage();22 await page.screenshot({ path: `example.png` });23 await browser.close();24})();25const { chromium } = require('playwright');26(async () => {27 const browser = await chromium.launch();28 const context = await browser.newContext();29 const page = await context.newPage();30 await page.screenshot({ path: `example.png` });31 await browser.close();32})();33const { chromium } = require('playwright');34(async () => {35 const browser = await chromium.launch();36 const context = await browser.newContext();37 const page = await context.newPage();38 await page.screenshot({ path: `example.png` });39 await browser.close();40})();41const { chromium } = require('playwright');

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const page = await browser.newPage();5 const container = await page.createContainer();6 await container.setContent('<div>My div</div>');7 await container.waitForSelector('div');8 await browser.close();9})();10 at Object.throwProtocolError (/home/akshay/projects/playwright/node_modules/playwright-core/lib/cjs/protocol/errors.js:118:14)11 at CDPSession._onMessage (/home/akshay/projects/playwright/node_modules/playwright-core/lib/cjs/protocol/protocol.js:187:23)12 at CDPSession.emit (events.js:315:20)13 at CDPSession.EventEmitter.emit (domain.js:467:12)14 at CDPSession._onMessage (/home/akshay/projects/playwright/node_modules/playwright-core/lib/cjs/protocol/Connection.js:200:14)15 at Connection._onMessage (/home/akshay/projects/playwright/node_modules/playwright-core/lib/cjs/protocol/Connection.js:112:17)16 at WebSocketTransport._ws.addEventListener.event (/home/akshay/projects/playwright/node_modules/playwright-core/lib/cjs/protocol/Transport.js:184:24)17 at WebSocket.onMessage (/home/akshay/projects/playwright/node_modules/ws/lib/event-target.js:132:16)18 at WebSocket.emit (events.js:315:20)19 at WebSocket.EventEmitter.emit (domain.js:467:12)

Full Screen

Using AI Code Generation

copy

Full Screen

1const { createContainer } = require('@playwright/test');2(async () => {3 const container = await createContainer();4 const { page } = await container.newPage();5 await page.screenshot({ path: 'example.png' });6 await container.close();7})();8const { createContainer } = require('@playwright/test');9(async () => {10 const container = await createContainer({11 });12 const { page } = await container.newPage();13 await page.screenshot({ path: 'example.png' });14 await container.close();15})();16const { createContainer } = require('@playwright/test');17(async () => {18 const container = await createContainer({19 });20 const { page } = await container.newPage();21 await page.screenshot({ path: 'example.png' });22 await container.close();23})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { createContainer } = require('playwright/lib/server/browserType');2const container = createContainer({3});4(async () => {5 const browser = await container.createBrowser();6 const page = await browser.newPage();7 await page.screenshot({ path: 'example.png' });8 await browser.close();9})();

Full Screen

Playwright tutorial

LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.

Chapters:

  1. What is Playwright : Playwright is comparatively new but has gained good popularity. Get to know some history of the Playwright with some interesting facts connected with it.
  2. How To Install Playwright : Learn in detail about what basic configuration and dependencies are required for installing Playwright and run a test. Get a step-by-step direction for installing the Playwright automation framework.
  3. Playwright Futuristic Features: Launched in 2020, Playwright gained huge popularity quickly because of some obliging features such as Playwright Test Generator and Inspector, Playwright Reporter, Playwright auto-waiting mechanism and etc. Read up on those features to master Playwright testing.
  4. What is Component Testing: Component testing in Playwright is a unique feature that allows a tester to test a single component of a web application without integrating them with other elements. Learn how to perform Component testing on the Playwright automation framework.
  5. Inputs And Buttons In Playwright: Every website has Input boxes and buttons; learn about testing inputs and buttons with different scenarios and examples.
  6. Functions and Selectors in Playwright: Learn how to launch the Chromium browser with Playwright. Also, gain a better understanding of some important functions like “BrowserContext,” which allows you to run multiple browser sessions, and “newPage” which interacts with a page.
  7. Handling Alerts and Dropdowns in Playwright : Playwright interact with different types of alerts and pop-ups, such as simple, confirmation, and prompt, and different types of dropdowns, such as single selector and multi-selector get your hands-on with handling alerts and dropdown in Playright testing.
  8. Playwright vs Puppeteer: Get to know about the difference between two testing frameworks and how they are different than one another, which browsers they support, and what features they provide.
  9. Run Playwright Tests on LambdaTest: Playwright testing with LambdaTest leverages test performance to the utmost. You can run multiple Playwright tests in Parallel with the LammbdaTest test cloud. Get a step-by-step guide to run your Playwright test on the LambdaTest platform.
  10. Playwright Python Tutorial: Playwright automation framework support all major languages such as Python, JavaScript, TypeScript, .NET and etc. However, there are various advantages to Python end-to-end testing with Playwright because of its versatile utility. Get the hang of Playwright python testing with this chapter.
  11. Playwright End To End Testing Tutorial: Get your hands on with Playwright end-to-end testing and learn to use some exciting features such as TraceViewer, Debugging, Networking, Component testing, Visual testing, and many more.
  12. Playwright Video Tutorial: Watch the video tutorials on Playwright testing from experts and get a consecutive in-depth explanation of Playwright automation testing.

Run Playwright Internal 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