MOBILE-4069 tests: Add unit tests for CoreObject
parent
9ac2374820
commit
a6aa9e7a88
|
@ -0,0 +1,184 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { CoreObject } from '@singletons/object';
|
||||||
|
|
||||||
|
describe('CoreObject singleton', () => {
|
||||||
|
|
||||||
|
it('compares two values, checking all subproperties if needed', () => {
|
||||||
|
expect(CoreObject.deepEquals(1, 1)).toBe(true);
|
||||||
|
expect(CoreObject.deepEquals(1, 2)).toBe(false);
|
||||||
|
expect(CoreObject.deepEquals(NaN, NaN)).toBe(true);
|
||||||
|
expect(CoreObject.deepEquals(NaN, 0)).toBe(false);
|
||||||
|
|
||||||
|
expect(CoreObject.deepEquals('foo', 'foo')).toBe(true);
|
||||||
|
expect(CoreObject.deepEquals('foo', 'bar')).toBe(false);
|
||||||
|
|
||||||
|
expect(CoreObject.deepEquals(true, true)).toBe(true);
|
||||||
|
expect(CoreObject.deepEquals(true, false)).toBe(false);
|
||||||
|
|
||||||
|
expect(CoreObject.deepEquals(null, null)).toBe(true);
|
||||||
|
expect(CoreObject.deepEquals(undefined, undefined)).toBe(true);
|
||||||
|
expect(CoreObject.deepEquals(null, undefined)).toBe(false);
|
||||||
|
|
||||||
|
const firstObject = {
|
||||||
|
foo: 'bar',
|
||||||
|
subobject: {
|
||||||
|
foo: 'bar',
|
||||||
|
subobject: {
|
||||||
|
foo: 'bar',
|
||||||
|
items: [1, 2, 3],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const secondObject = {
|
||||||
|
foo: 'bar',
|
||||||
|
subobject: {
|
||||||
|
foo: 'bar',
|
||||||
|
subobject: {
|
||||||
|
foo: 'bar',
|
||||||
|
items: [1, 2, 3],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(CoreObject.deepEquals(firstObject, secondObject)).toBe(true);
|
||||||
|
|
||||||
|
secondObject.foo = 'baz';
|
||||||
|
expect(CoreObject.deepEquals(firstObject, secondObject)).toBe(false);
|
||||||
|
|
||||||
|
secondObject.foo = 'bar';
|
||||||
|
secondObject.subobject.foo = 'baz';
|
||||||
|
expect(CoreObject.deepEquals(firstObject, secondObject)).toBe(false);
|
||||||
|
|
||||||
|
secondObject.subobject.foo = 'bar';
|
||||||
|
secondObject.subobject.subobject.foo = 'baz';
|
||||||
|
expect(CoreObject.deepEquals(firstObject, secondObject)).toBe(false);
|
||||||
|
|
||||||
|
secondObject.subobject.subobject.foo = 'bar';
|
||||||
|
secondObject.subobject.subobject.items[0] = 0;
|
||||||
|
expect(CoreObject.deepEquals(firstObject, secondObject)).toBe(false);
|
||||||
|
|
||||||
|
secondObject.subobject.subobject.items[0] = 1;
|
||||||
|
expect(CoreObject.deepEquals(firstObject, secondObject)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('gets all property names', () => {
|
||||||
|
expect(CoreObject.getAllPropertyNames(null)).toEqual(new Set([]));
|
||||||
|
expect(CoreObject.getAllPropertyNames(undefined)).toEqual(new Set([]));
|
||||||
|
expect(CoreObject.getAllPropertyNames(1)).toEqual(new Set([]));
|
||||||
|
expect(CoreObject.getAllPropertyNames('foo')).toEqual(new Set([]));
|
||||||
|
|
||||||
|
expect(CoreObject.getAllPropertyNames({
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
doSomething: () => {
|
||||||
|
// Nothing to do.
|
||||||
|
},
|
||||||
|
})).toEqual(new Set(['foo', 'bar', 'doSomething']));
|
||||||
|
|
||||||
|
expect(CoreObject.getAllPropertyNames(new TestParentClass()))
|
||||||
|
.toEqual(new Set(['constructor', 'foo', 'bar', 'baz', 'doSomething']));
|
||||||
|
expect(CoreObject.getAllPropertyNames(new TestSubClass()))
|
||||||
|
.toEqual(new Set(['constructor', 'foo', 'bar', 'baz', 'doSomething', 'sub', 'doSomethingElse']));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('checks if an object is empty', () => {
|
||||||
|
expect(CoreObject.isEmpty({})).toEqual(true);
|
||||||
|
expect(CoreObject.isEmpty({ foo: 1 })).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('creates a copy of an object without certain properties', () => {
|
||||||
|
const originalObject = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
baz: 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(CoreObject.without(originalObject, [])).toEqual(originalObject);
|
||||||
|
expect(CoreObject.without(originalObject, ['foo'])).toEqual({
|
||||||
|
bar: 2,
|
||||||
|
baz: 3,
|
||||||
|
});
|
||||||
|
expect(CoreObject.without(originalObject, ['foo', 'baz'])).toEqual({
|
||||||
|
bar: 2,
|
||||||
|
});
|
||||||
|
expect(originalObject).toEqual({
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
baz: 3,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('creates a copy of an object without null/undefined properties', () => {
|
||||||
|
const objectWithoutEmpty = {
|
||||||
|
bool: false,
|
||||||
|
num: 0,
|
||||||
|
nan: NaN,
|
||||||
|
str: '',
|
||||||
|
obj: {},
|
||||||
|
arr: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(CoreObject.withoutEmpty({
|
||||||
|
...objectWithoutEmpty,
|
||||||
|
foo: null,
|
||||||
|
bar: undefined,
|
||||||
|
baz: null,
|
||||||
|
})).toEqual(objectWithoutEmpty);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('creates a copy of an object without undefined properties', () => {
|
||||||
|
const objectWithoutUndefined = {
|
||||||
|
bool: false,
|
||||||
|
num: 0,
|
||||||
|
nan: NaN,
|
||||||
|
str: '',
|
||||||
|
obj: {},
|
||||||
|
arr: [],
|
||||||
|
foo: null,
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(CoreObject.withoutUndefined({
|
||||||
|
...objectWithoutUndefined,
|
||||||
|
bar: undefined,
|
||||||
|
baz: undefined,
|
||||||
|
})).toEqual(objectWithoutUndefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
class TestParentClass {
|
||||||
|
|
||||||
|
foo = 1;
|
||||||
|
protected bar = 2;
|
||||||
|
private baz = 3;
|
||||||
|
|
||||||
|
protected doSomething(): void {
|
||||||
|
// Nothing to do.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestSubClass extends TestParentClass {
|
||||||
|
|
||||||
|
foo = 10;
|
||||||
|
protected bar = 20;
|
||||||
|
private sub = 30;
|
||||||
|
|
||||||
|
protected doSomethingElse(): void {
|
||||||
|
// Nothing to do.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue