diff --git a/packages/shared/src/cursor.ts b/packages/shared/src/cursor.ts new file mode 100644 index 000000000..34d099543 --- /dev/null +++ b/packages/shared/src/cursor.ts @@ -0,0 +1,44 @@ +import asArray from 'asArray'; +import last from 'last'; + +export function createCursor() { + const storage: { cursor: number[] } = { + cursor: [], + }; + + function addLevel(): void { + storage.cursor.push(0); + } + + function removeLevel(): void { + storage.cursor.pop(); + } + + function cursorAt(): number { + return last(storage.cursor); + } + + function getCursor(): number[] { + return asArray(storage.cursor); + } + + function next(): number { + storage.cursor[storage.cursor.length - 1]++; + return last(storage.cursor); + } + + function reset(): void { + storage.cursor = [0]; + } + + reset(); + + return { + addLevel, + cursorAt, + getCursor, + next, + removeLevel, + reset, + }; +} diff --git a/packages/vest/src/core/ctx/ctx.ts b/packages/vest/src/core/ctx/ctx.ts index 13ee8db92..9a144a5ae 100644 --- a/packages/vest/src/core/ctx/ctx.ts +++ b/packages/vest/src/core/ctx/ctx.ts @@ -1,5 +1,6 @@ import assign from 'assign'; import { createContext } from 'context'; +import { createCursor } from 'cursor'; import VestTest from 'VestTest'; import type { TStateRef } from 'createStateRef'; @@ -10,7 +11,7 @@ export default createContext((ctxRef, parentContext) => : assign( {}, { - cursorAt: [0], + testCursor: createCursor(), exclusion: { tests: {}, groups: {}, @@ -21,7 +22,7 @@ export default createContext((ctxRef, parentContext) => ); type CTXType = { - cursorAt: number[]; + testCursor: ReturnType; stateRef?: TStateRef; exclusion: { tests: Record; diff --git a/packages/vest/src/core/ctx/cursorAt.ts b/packages/vest/src/core/ctx/cursorAt.ts deleted file mode 100644 index 385a7c75c..000000000 --- a/packages/vest/src/core/ctx/cursorAt.ts +++ /dev/null @@ -1,15 +0,0 @@ -import last from 'last'; - -import ctx from 'ctx'; - -export function useCursorAt(): number { - return last(ctx.useX().cursorAt); -} - -export function moveCursorAtForward(): number { - const cursorAt = ctx.useX().cursorAt; - - const nextCursor = cursorAt[cursorAt.length - 1]++; - - return nextCursor; -} diff --git a/packages/vest/src/core/ctx/testCursor.ts b/packages/vest/src/core/ctx/testCursor.ts new file mode 100644 index 000000000..b443603e3 --- /dev/null +++ b/packages/vest/src/core/ctx/testCursor.ts @@ -0,0 +1,21 @@ +import ctx from 'ctx'; + +export function useTestCursorAt(): number { + const context = ctx.useX(); + return context.testCursor.cursorAt(); +} + +export function moveTestCursorForward(): number { + const context = ctx.useX(); + return context.testCursor.next(); +} + +export function addTestCursorLevel(): void { + const context = ctx.useX(); + context.testCursor.addLevel(); +} + +export function removeTestCursorLevel(): void { + const context = ctx.useX(); + context.testCursor.removeLevel(); +} diff --git a/packages/vest/src/core/test/lib/registerPrevRunTest.ts b/packages/vest/src/core/test/lib/registerPrevRunTest.ts index 7f9d07223..e939c6c1f 100644 --- a/packages/vest/src/core/test/lib/registerPrevRunTest.ts +++ b/packages/vest/src/core/test/lib/registerPrevRunTest.ts @@ -2,24 +2,24 @@ import isPromise from 'isPromise'; import VestTest from 'VestTest'; import cancelOverriddenPendingTest from 'cancelOverriddenPendingTest'; -import { moveCursorAtForward } from 'cursorAt'; import { isExcluded } from 'exclusive'; import registerTest from 'registerTest'; import runAsyncTest from 'runAsyncTest'; +import { moveTestCursorForward } from 'testCursor'; import { useTestAtCursor, useSetTestAtCursor } from 'useTestAtCursor'; export default function registerPrevRunTest(testObject: VestTest): VestTest { const prevRunTest = useTestAtCursor(testObject); if (isExcluded(testObject)) { testObject.skip(); - moveCursorAtForward(); + moveTestCursorForward(); return prevRunTest; } cancelOverriddenPendingTest(prevRunTest, testObject); useSetTestAtCursor(testObject); - moveCursorAtForward(); + moveTestCursorForward(); registerTestObjectByTier(testObject); diff --git a/packages/vest/src/core/test/lib/useTestAtCursor.ts b/packages/vest/src/core/test/lib/useTestAtCursor.ts index 0ccd2cf35..3218db99a 100644 --- a/packages/vest/src/core/test/lib/useTestAtCursor.ts +++ b/packages/vest/src/core/test/lib/useTestAtCursor.ts @@ -4,9 +4,9 @@ import removeElementFromArray from 'removeElementFromArray'; import { throwErrorDeferred } from 'throwError'; import VestTest from 'VestTest'; -import { useCursorAt } from 'cursorAt'; import isSameProfileTest from 'isSameProfileTest'; import { usePrevTestObjects, useTestObjects } from 'stateHooks'; +import { useTestCursorAt } from 'testCursor'; export function useTestAtCursor(newTestObject: VestTest): VestTest { const [, setPrevTestObjects] = usePrevTestObjects(); @@ -39,7 +39,7 @@ export function useTestAtCursor(newTestObject: VestTest): VestTest { } export function useSetTestAtCursor(testObject: VestTest): void { - const cursorAt = useCursorAt(); + const cursorAt = useTestCursorAt(); const [testObjects, setTestObjects] = useTestObjects(); if (testObject === testObjects[cursorAt]) { @@ -54,7 +54,7 @@ export function useSetTestAtCursor(testObject: VestTest): void { } function useGetTestAtCursor(): VestTest { - const cursorAt = useCursorAt(); + const cursorAt = useTestCursorAt(); const [prevTestObjects] = usePrevTestObjects(); return prevTestObjects[cursorAt]; diff --git a/packages/vest/src/core/test/test.memo.ts b/packages/vest/src/core/test/test.memo.ts index f116ca3fd..b26013cbb 100644 --- a/packages/vest/src/core/test/test.memo.ts +++ b/packages/vest/src/core/test/test.memo.ts @@ -2,10 +2,10 @@ import createCache from 'cache'; import { isNull } from 'isNull'; import VestTest, { TTestFn } from 'VestTest'; -import { useCursorAt } from 'cursorAt'; import registerPrevRunTest from 'registerPrevRunTest'; import { useSuiteId } from 'stateHooks'; import type { TTestBase } from 'test'; +import { useTestCursorAt } from 'testCursor'; // eslint-disable-next-line max-lines-per-function export default function bindTestMemo(test: TTestBase): { (fieldName: string, test: TTestFn, deps: unknown[]): VestTest; @@ -35,7 +35,7 @@ export default function bindTestMemo(test: TTestBase): { | [test: TTestFn, deps: unknown[]] ): VestTest { const [suiteId] = useSuiteId(); - const cursorAt = useCursorAt(); + const cursorAt = useTestCursorAt(); const [deps, testFn, msg] = args.reverse() as [any[], TTestFn, string]; diff --git a/tsconfig.json b/tsconfig.json index 34000e4b2..6f6c2f24a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -93,6 +93,7 @@ "bus": ["./packages/shared/src/bus.ts"], "cache": ["./packages/shared/src/cache.ts"], "callEach": ["./packages/shared/src/callEach.ts"], + "cursor": ["./packages/shared/src/cursor.ts"], "defaultTo": ["./packages/shared/src/defaultTo.ts"], "either": ["./packages/shared/src/either.ts"], "genId": ["./packages/shared/src/genId.ts"], @@ -115,7 +116,7 @@ "utilityTypes": ["./packages/shared/src/utilityTypes.ts"], "vast": ["./packages/vast/src/vast.ts"], "ctx": ["./packages/vest/src/core/ctx/ctx.ts"], - "cursorAt": ["./packages/vest/src/core/ctx/cursorAt.ts"], + "testCursor": ["./packages/vest/src/core/ctx/testCursor.ts"], "createStateRef": ["./packages/vest/src/core/state/createStateRef.ts"], "stateHooks": ["./packages/vest/src/core/state/stateHooks.ts"], "create": ["./packages/vest/src/core/suite/create.ts"],