248 lines
7.5 KiB
TypeScript
248 lines
7.5 KiB
TypeScript
// (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('consumes object keys', () => {
|
|
const object = {
|
|
foo: 'a',
|
|
bar: 'b',
|
|
baz: 'c',
|
|
};
|
|
|
|
const fooValue = CoreObject.consumeKey(object, 'foo');
|
|
const bazValue = CoreObject.consumeKey(object, 'baz');
|
|
|
|
expect(fooValue).toEqual('a');
|
|
expect(bazValue).toEqual('c');
|
|
expect(object.bar).toEqual('b');
|
|
expect(Object.keys(object)).toEqual(['bar']);
|
|
});
|
|
|
|
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 with certain properties (using a list)', () => {
|
|
const originalObject = {
|
|
foo: 1,
|
|
bar: 2,
|
|
baz: 3,
|
|
};
|
|
|
|
expect(CoreObject.only(originalObject, [])).toEqual({});
|
|
expect(CoreObject.only(originalObject, ['foo'])).toEqual({
|
|
foo: 1,
|
|
});
|
|
expect(CoreObject.only(originalObject, ['foo', 'baz'])).toEqual({
|
|
foo: 1,
|
|
baz: 3,
|
|
});
|
|
expect(CoreObject.only(originalObject, ['foo', 'bar', 'baz'])).toEqual(originalObject);
|
|
expect(originalObject).toEqual({
|
|
foo: 1,
|
|
bar: 2,
|
|
baz: 3,
|
|
});
|
|
});
|
|
|
|
it('creates a copy of an object with certain properties (using a regular expression)', () => {
|
|
const originalObject = {
|
|
foo: 1,
|
|
bar: 2,
|
|
baz: 3,
|
|
};
|
|
|
|
expect(CoreObject.only(originalObject, /.*/)).toEqual(originalObject);
|
|
expect(CoreObject.only(originalObject, /^ba.*/)).toEqual({
|
|
bar: 2,
|
|
baz: 3,
|
|
});
|
|
expect(CoreObject.only(originalObject, /(foo|bar)/)).toEqual({
|
|
foo: 1,
|
|
bar: 2,
|
|
});
|
|
expect(CoreObject.only(originalObject, /notfound/)).toEqual({});
|
|
expect(originalObject).toEqual({
|
|
foo: 1,
|
|
bar: 2,
|
|
baz: 3,
|
|
});
|
|
});
|
|
|
|
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.
|
|
}
|
|
|
|
}
|