DigitalConsumer.FixMyGlass/playwright-tests/impl/utils/EnumUtils.ts
maguire-arman 404dda6556 Adds Playwright test framework for FMG
Initial commit of the Playwright test framework, including:
- Configuration files for Playwright, Docker, and Sauce Labs
- Test case structure and page object models
- CI/CD pipeline configuration
- Utilities and business logic implementations

This framework will be used for end-to-end testing of the FMG application.
2025-04-07 15:40:31 -04:00

76 lines
No EOL
2.4 KiB
TypeScript

function isFlags(enumObj: object): boolean {
const values = Object.values(enumObj).filter(v => typeof v === "number");
return values.some(v => v !== 0 && (v & (v - 1)) === 0);
}
function isValidEnumValue(value: any, enumType: object): boolean {
if (isFlags(enumType)) {
const allFlags = Object.values(enumType).reduce((acc, val) => typeof val === "number" ? acc | val : acc, 0);
return typeof value === "number" && (value & allFlags) === value;
} else {
return Object.values(enumType).includes(value);
}
}
function getEnumValues(enumObj: object): string[] | number[] {
if (!isFlags(enumObj))
return Object.values(enumObj);
return Object.values(enumObj).filter(value => typeof value === "number") as number[];
}
function getEnumString<T extends { [key: string]: string | number }>(enumObj: T, flags: number): string {
if (flags === 0)
return Object.keys(enumObj).find(key => enumObj[key] === 0) || 'None';
const attributes = Object.entries(enumObj).filter(([key, value]) =>
typeof value === 'number' && value !== 0 && (flags & value) === value)
.map(([key]) => key);
return attributes.length === 1 ? attributes[0] : attributes.join(', ');
}
function validateEnumProperty(json: any, property: string, enumType: object): number | string | null {
if (json.hasOwnProperty(property) && isValidEnumValue(json[property], enumType))
return json[property];
return null;
}
function hasFlag(value: number | string, flag: number | string, enumType: object): boolean {
if (isFlags(enumType))
return typeof value === "number" && typeof flag === "number" && (value & flag) === flag;
else
return value === flag;
}
function addFlag(value: number, flag: number, enumType: object): number {
if (isFlags(enumType))
return value | flag;
else
throw new Error("Attempted to add flag on non-flags enum");
}
function removeFlag(value: number, flag: number, enumType: object): number {
if (isFlags(enumType))
return value & ~flag;
else
throw new Error("Attempted to remove flag on non-flags enum");
}
function toggleFlag(value: number, flag: number, enumType: object): number {
if (isFlags(enumType))
return value ^ flag;
else
throw new Error("Attempted to toggle flag on non-flags enum");
}
const EnumUtils = {
hasFlag,
addFlag,
removeFlag,
toggleFlag,
validateEnumProperty,
getEnumValues,
getEnumString
};
export default EnumUtils;