From e16de98226862179fa5da4dcb6fbf28c1e2d73bf Mon Sep 17 00:00:00 2001 From: Kir_Antipov Date: Wed, 18 Jan 2023 12:14:33 +0000 Subject: [PATCH] Implemented enum descriptor for boolean enums --- .../enum/descriptors/boolean-descriptor.ts | 41 ++++++++++++++++ .../descriptors/boolean-descriptor.spec.ts | 47 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/utils/enum/descriptors/boolean-descriptor.ts create mode 100644 tests/unit/utils/enum/descriptors/boolean-descriptor.spec.ts diff --git a/src/utils/enum/descriptors/boolean-descriptor.ts b/src/utils/enum/descriptors/boolean-descriptor.ts new file mode 100644 index 0000000..9954600 --- /dev/null +++ b/src/utils/enum/descriptors/boolean-descriptor.ts @@ -0,0 +1,41 @@ +import { EnumDescriptor } from "./enum-descriptor"; + +/** + * This descriptor is used to describe a set of flags stored as a `boolean` value. + */ +export class BooleanDescriptor implements EnumDescriptor { + /** + * @inheritdoc + */ + get name(): "boolean" { + return "boolean"; + } + + /** + * @inheritdoc + */ + get defaultValue(): boolean { + return false; + } + + /** + * @inheritdoc + */ + hasFlag(value: boolean, flag: boolean): boolean { + return !flag || value; + } + + /** + * @inheritdoc + */ + addFlag(value: boolean, flag: boolean): boolean { + return value || flag; + } + + /** + * @inheritdoc + */ + removeFlag(value: boolean, flag: boolean): boolean { + return value && !flag; + } +} diff --git a/tests/unit/utils/enum/descriptors/boolean-descriptor.spec.ts b/tests/unit/utils/enum/descriptors/boolean-descriptor.spec.ts new file mode 100644 index 0000000..5314894 --- /dev/null +++ b/tests/unit/utils/enum/descriptors/boolean-descriptor.spec.ts @@ -0,0 +1,47 @@ +import { BooleanDescriptor } from "@/utils/enum/descriptors/boolean-descriptor"; + +describe("BooleanDescriptor", () => { + const descriptor = new BooleanDescriptor(); + + describe("name", () => { + test("returns 'boolean' as name", () => { + expect(descriptor.name).toBe("boolean"); + }); + }); + + describe("defaultValue", () => { + test("returns false as default value", () => { + expect(descriptor.defaultValue).toBe(false); + }); + }); + + describe("hasFlag", () => { + test("returns true if flag is set", () => { + expect(descriptor.hasFlag(true, true)).toBe(true); + }); + + test("returns false if flag is not set", () => { + expect(descriptor.hasFlag(false, true)).toBe(false); + }); + }); + + describe("addFlag", () => { + test("adds flag to value", () => { + expect(descriptor.addFlag(false, true)).toBe(true); + }); + + test("does not add flag if it is already set", () => { + expect(descriptor.addFlag(true, true)).toBe(true); + }); + }); + + describe("removeFlag", () => { + test("removes flag from value", () => { + expect(descriptor.removeFlag(true, true)).toBe(false); + }); + + test("does not remove flag if it does not exist", () => { + expect(descriptor.removeFlag(false, true)).toBe(false); + }); + }); +});