mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-15 20:54:59 +08:00
Add enum utility tests
This commit is contained in:
parent
21cae1502a
commit
0d4218ee35
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2020 The Matrix.org Foundation C.I.C.
|
Copyright 2020, 2021 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -19,11 +19,23 @@ limitations under the License.
|
|||||||
* @param e The enum.
|
* @param e The enum.
|
||||||
* @returns The enum values.
|
* @returns The enum values.
|
||||||
*/
|
*/
|
||||||
export function getEnumValues<T>(e: any): T[] {
|
export function getEnumValues(e: any): (string | number)[] {
|
||||||
|
// String-based enums will simply be objects ({Key: "value"}), but number-based
|
||||||
|
// enums will instead map themselves twice: in one direction for {Key: 12} and
|
||||||
|
// the reverse for easy lookup, presumably ({12: Key}). In the reverse mapping,
|
||||||
|
// the key is a string, not a number.
|
||||||
|
//
|
||||||
|
// For this reason, we try to determine what kind of enum we're dealing with.
|
||||||
|
|
||||||
const keys = Object.keys(e);
|
const keys = Object.keys(e);
|
||||||
return keys
|
const values: (string | number)[] = [];
|
||||||
.filter(k => ['string', 'number'].includes(typeof(e[k])))
|
for (const key of keys) {
|
||||||
.map(k => e[k]);
|
const value = e[key];
|
||||||
|
if (Number.isFinite(value) || e[value.toString()] !== Number(key)) {
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
67
test/enums-test.ts
Normal file
67
test/enums-test.ts
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
|
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 {getEnumValues, isEnumValue} from "../src/utils/enums";
|
||||||
|
|
||||||
|
enum TestStringEnum {
|
||||||
|
First = "__first__",
|
||||||
|
Second = "__second__",
|
||||||
|
}
|
||||||
|
|
||||||
|
enum TestNumberEnum {
|
||||||
|
FirstKey = 10,
|
||||||
|
SecondKey = 20,
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('enums', () => {
|
||||||
|
describe('getEnumValues', () => {
|
||||||
|
it('should work on string enums', () => {
|
||||||
|
const result = getEnumValues(TestStringEnum);
|
||||||
|
expect(result).toBeDefined();
|
||||||
|
expect(result).toHaveLength(2);
|
||||||
|
expect(result).toEqual(['__first__', '__second__']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should work on number enums', () => {
|
||||||
|
const result = getEnumValues(TestNumberEnum);
|
||||||
|
expect(result).toBeDefined();
|
||||||
|
expect(result).toHaveLength(2);
|
||||||
|
expect(result).toEqual([10, 20]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('isEnumValue', () => {
|
||||||
|
it('should return true on values in a string enum', () => {
|
||||||
|
const result = isEnumValue(TestStringEnum, '__first__');
|
||||||
|
expect(result).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return false on values not in a string enum', () => {
|
||||||
|
const result = isEnumValue(TestStringEnum, 'not a value');
|
||||||
|
expect(result).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return true on values in a number enum', () => {
|
||||||
|
const result = isEnumValue(TestNumberEnum, 10);
|
||||||
|
expect(result).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return false on values not in a number enum', () => {
|
||||||
|
const result = isEnumValue(TestStringEnum, 99);
|
||||||
|
expect(result).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user