123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- import {
- isObjectEquals,
- duckSchema,
- mixin,
- clone,
- deepExtend,
- deepObjectSize,
- createObjectPropListener,
- } from 'handsontable/helpers/object';
- describe('Object helper', () => {
- //
- // Handsontable.helper.isObjectEquals
- //
- describe('isObjectEquals', () => {
- it('should returns true on equal objects', () => {
- expect(isObjectEquals({}, {})).toBe(true);
- expect(isObjectEquals({test: 1}, {test: 1})).toBe(true);
- expect(isObjectEquals({test: {test2: [{}]}}, {test: {test2: [{}]}})).toBe(true);
- expect(isObjectEquals([], [])).toBe(true);
- expect(isObjectEquals([33], [33])).toBe(true);
- expect(isObjectEquals([{test: 1}], [{test: 1}])).toBe(true);
- });
- it('should returns false for not equal objects', () => {
- expect(isObjectEquals({}, [])).toBe(false);
- expect(isObjectEquals({test: 2}, {test: 1})).toBe(false);
- expect(isObjectEquals({test: {test3: [{}]}}, {test: {test2: [{}]}})).toBe(false);
- expect(isObjectEquals([12], [33])).toBe(false);
- expect(isObjectEquals([{test: 3}], [{test: 1}])).toBe(false);
- });
- });
- //
- // Handsontable.helper.duckSchema
- //
- describe('duckSchema', () => {
- it('should returns valid schema object', () => {
- expect(duckSchema({})).toEqual({});
- expect(duckSchema({test: 1})).toEqual({test: null});
- expect(duckSchema({test: 'foo'})).toEqual({test: null});
- expect(duckSchema({test: undefined})).toEqual({test: null});
- expect(duckSchema({test: null})).toEqual({test: null});
- expect(duckSchema({test: []})).toEqual({test: []});
- expect(duckSchema({test: [1, 2, 3]})).toEqual({test: []});
- });
- it('should returns valid schema object (deeply)', () => {
- expect(duckSchema({test: {a: {b: 11}}})).toEqual({test: {a: {b: null}}});
- expect(duckSchema({test: {a: {b: []}}})).toEqual({test: {a: {b: []}}});
- expect(duckSchema({test: {a: {b: [{q: 1, w: 2}]}}})).toEqual({test: {a: {b: [{q: null, w: null}]}}});
- });
- });
- //
- // Handsontable.helper.mixin
- //
- describe('mixin', () => {
- it('should mix base object from one object', () => {
- var Base = function() {};
- var MixinFoo = {
- local: 'value',
- myFunction() {
- return this.local;
- },
- mySetterFunction(value) {
- this.local = value;
- }
- };
- mixin(Base, MixinFoo);
- var instance = new Base();
- expect(instance.myFunction()).toBe('value');
- expect(instance.local).toBe('value');
- instance.local = 123;
- expect(instance.myFunction()).toBe(123);
- expect(instance.local).toBe(123);
- var initialObject = {a: 1};
- instance.mySetterFunction(initialObject);
- expect(instance.myFunction()).toBe(initialObject);
- expect(instance.local).toBe(initialObject);
- });
- it('should mix base object from multiple objects', () => {
- var Base = function() {};
- var MixinFoo = {
- local: 'value',
- myFunction() {
- return this.local;
- },
- mySetterFunction(value) {
- this.local = value;
- }
- };
- var MixinBar = {
- test: {zzz: 2}
- };
- var MixinBaz = {
- getTest() {
- return this.test;
- }
- };
- mixin(Base, MixinFoo, MixinBar, MixinBaz);
- var instance = new Base();
- expect(instance.myFunction()).toBe('value');
- expect(instance.local).toBe('value');
- expect(instance.test).not.toBe(MixinBar.test);
- expect(instance.test).toEqual(MixinBar.test);
- expect(instance.test.zzz).toBe(2);
- expect(instance.getTest()).not.toBe(MixinBar.test);
- expect(instance.getTest()).toEqual(MixinBar.test);
- });
- it('mixed object should not interfere with properties from another mixed objects', () => {
- var Base = function() {};
- var Base1 = function() {};
- var MixinFoo = {
- local: {},
- myFunction() {
- this.local.test = 1;
- return this.local.test;
- }
- };
- mixin(Base, MixinFoo);
- mixin(Base1, MixinFoo);
- var instance = new Base();
- var instance1 = new Base1();
- instance.myFunction();
- expect(instance.local.test).toEqual(1);
- expect(instance1.local.test).not.toBeDefined();
- });
- });
- //
- // Handsontable.helper.clone
- //
- describe('clone', () => {
- it('should returns cloned object', () => {
- var function1 = function() {};
- var object1 = {};
- var object2 = {
- foo: false,
- und: void 0,
- bar: 0,
- baz: object1,
- func: function1,
- };
- expect(clone(object1)).toEqual({});
- expect(clone(object1)).not.toBe(object1);
- expect(clone(object2)).toEqual(object2);
- expect(clone(object2)).not.toBe(object2);
- expect(clone(object2).baz).toBe(object2.baz);
- expect(clone(object2).func).toBe(function1);
- });
- });
- //
- // Handsontable.helper.deepExtend
- //
- describe('deepExtend', () => {
- it('should extend an object with all the properties of another object (recursively)', () => {
- var baseObject = {
- test: 'one',
- anotherTest: ['one, two']
- };
- var date = new Date();
- var partial = {
- prop1: 'prop1',
- prop2: 34,
- prop3: [
- 12,
- 'test',
- {
- prop: 'one'
- },
- [0, 1]
- ],
- prop4: {
- p1: 0,
- p2: [0, 1],
- p3: {
- a: 'b'
- }
- },
- prop5: date
- };
- deepExtend(baseObject, partial);
- expect(baseObject.test).toEqual('one');
- expect(baseObject.anotherTest).toEqual(['one, two']);
- expect(baseObject.prop1).toEqual('prop1');
- expect(baseObject.prop2).toEqual(34);
- expect(baseObject.prop3[0]).toEqual(12);
- expect(baseObject.prop3[1]).toEqual('test');
- expect(baseObject.prop3[2].prop).toEqual('one');
- expect(baseObject.prop3[3]).toEqual([0, 1]);
- expect(baseObject.prop4.p1).toEqual(0);
- expect(baseObject.prop4.p2).toEqual([0, 1]);
- expect(baseObject.prop4.p3.a).toEqual('b');
- expect(baseObject.prop5).toEqual(date);
- });
- });
- //
- // Handsontable.helper.deepObjectSize
- //
- describe('deepObjectSize', () => {
- it('should return false if a variable is not an object', () => {
- var toCount = [
- 1,
- 2,
- 3
- ];
- expect(deepObjectSize(toCount)).toBeFalsy();
- });
- it('should return an object keys length (recursively and only these keys, which contain value)', () => {
- var toCount = {
- prop1: 1,
- prop2: 2,
- prop3: {
- prop31: {
- prop311: 311,
- prop312: 312
- },
- prop32: 32,
- prop33: 33
- },
- prop4: 4,
- prop5: 5
- };
- expect(deepObjectSize(toCount)).toEqual(8);
- });
- });
- //
- // Handsontable.helper.createObjectPropListener
- //
- describe('createObjectPropListener', () => {
- it('should returns object listener and listen default property', () => {
- var propListener = createObjectPropListener('foo');
- expect(propListener.isTouched()).toBe(false);
- expect(propListener.value).toBe('foo');
- propListener.test = 'bar';
- expect(propListener.isTouched()).toBe(false);
- expect(propListener.value).toBe('foo');
- propListener.value = 'bar';
- expect(propListener.isTouched()).toBe(true);
- expect(propListener.value).toBe('bar');
- expect(propListener.test).toBe('bar');
- });
- it('should returns object listener and listen defined by user property', () => {
- var propListener = createObjectPropListener('foo', 'me');
- expect(propListener.isTouched()).toBe(false);
- expect(propListener.me).toBe('foo');
- propListener.value = 'bar';
- expect(propListener.isTouched()).toBe(false);
- expect(propListener.me).toBe('foo');
- expect(propListener.value).toBe('bar');
- propListener.me = 'bar';
- expect(propListener.isTouched()).toBe(true);
- expect(propListener.value).toBe('bar');
- expect(propListener.me).toBe('bar');
- });
- it('should detect change value to undefined', () => {
- var propListener = createObjectPropListener('foo');
- propListener.value = void 0;
- expect(propListener.isTouched()).toBe(true);
- expect(propListener.value).toBe(void 0);
- });
- });
- });
|