From d7bc2504cd43a89430f9e3481c4d82bc46b8abdb Mon Sep 17 00:00:00 2001 From: wellwelwel <46850407+wellwelwel@users.noreply.github.com> Date: Sun, 9 Jun 2024 19:53:46 -0300 Subject: [PATCH 1/4] feat(describe): support for Node.js familiar API usage --- src/modules/describe.ts | 59 +++++++++++++++++----- test/integration/describe/describe.test.ts | 40 ++++++++++++++- 2 files changed, 83 insertions(+), 16 deletions(-) diff --git a/src/modules/describe.ts b/src/modules/describe.ts index 62cd50c0..b7dca8c8 100644 --- a/src/modules/describe.ts +++ b/src/modules/describe.ts @@ -5,24 +5,55 @@ import { indentation } from '../configs/indentation.js'; import type { DescribeOptions } from '../@types/describe.js'; /** - * On **Poku**, `describe` is just a pretty `console.log` to title your test suites in the terminal. + * On **Poku**, `describe` also can be used just as a pretty `console.log` to title your test suites in the terminal. */ -export const describe = (title: string, options?: DescribeOptions) => { - const { background, icon } = options || {}; +export async function describe( + title: string, + cb: () => Promise +): Promise; +export function describe(title: string, cb: () => unknown): void; +export async function describe(cb: () => Promise): Promise; +export function describe(cb: () => unknown): unknown; +export function describe(title: string, options?: DescribeOptions): void; +export async function describe( + arg1: string | (() => unknown | Promise), + arg2?: (() => unknown | Promise) | DescribeOptions +): Promise { + let title: string | undefined; + let cb: (() => unknown | Promise) | undefined; + let options: DescribeOptions | undefined; - const message = `${icon || '☰'} ${title}`; - const noBackground = !background; + if (typeof arg1 === 'string') { + title = arg1; - indentation.describeCounter++; + if (typeof arg2 === 'function') cb = arg2; + else options = arg2; + } else if (typeof arg1 === 'function') { + cb = arg1; + options = arg2 as DescribeOptions; + } /* c8 ignore start */ - if (noBackground) { - write(`${format.bold(message)}`); - return; - } + if (title) { + const { background, icon } = options || {}; + const message = `${cb ? '›' : icon || '☰'} ${title || ''}`; + const noBackground = !background; - write( - `${format.bg(backgroundColor[typeof background === 'string' ? background : 'grey'], message)}` - ); + indentation.describeCounter++; + + if (noBackground) write(`${format.bold(message)}`); + else { + write( + `${format.bg(backgroundColor[typeof background === 'string' ? background : 'grey'], message)}` + ); + } + } /* c8 ignore stop */ -}; + + if (typeof cb !== 'function') return; + + const resultCb = cb(); + + /* c8 ignore next */ + if (resultCb instanceof Promise) await resultCb; +} diff --git a/test/integration/describe/describe.test.ts b/test/integration/describe/describe.test.ts index 3e297bcf..097f2e2a 100644 --- a/test/integration/describe/describe.test.ts +++ b/test/integration/describe/describe.test.ts @@ -1,2 +1,38 @@ -// import { describe } from '../../../src/modules/describe.js'; -// import { test } from '../../../src/modules/test.js'; +import { describe } from '../../../src/modules/describe.js'; +import { test } from '../../../src/modules/test.js'; + +describe('Testing "describe" method', { + icon: '🔬', +}); + +test(() => { + describe(''); + describe('', {}); +}); + +test(async () => { + describe(() => {}); + describe(() => true); + describe(() => false); + describe(() => undefined); + describe(() => new Promise((resolve) => resolve(undefined))); + describe(async () => await new Promise((resolve) => resolve(undefined))); + + await describe(() => new Promise((resolve) => resolve(undefined))); + await describe( + async () => await new Promise((resolve) => resolve(undefined)) + ); +}); + +test(async () => { + describe('', () => {}); + describe('', () => true); + describe('', () => false); + describe('', () => undefined); + describe('', () => new Promise((resolve) => resolve(undefined))); + describe('', async () => await new Promise((resolve) => resolve(undefined))); + + await describe('', () => new Promise((resolve) => resolve(undefined))); + await describe('', async () => + await new Promise((resolve) => resolve(undefined))); +}); From 416ed20b517f519bfcaaf523533d4920ba7dab1a Mon Sep 17 00:00:00 2001 From: wellwelwel <46850407+wellwelwel@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:07:32 -0300 Subject: [PATCH 2/4] ci: improve test descriptions --- test/integration/describe/describe.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/describe/describe.test.ts b/test/integration/describe/describe.test.ts index 097f2e2a..0e278f78 100644 --- a/test/integration/describe/describe.test.ts +++ b/test/integration/describe/describe.test.ts @@ -5,12 +5,12 @@ describe('Testing "describe" method', { icon: '🔬', }); -test(() => { +test('Using as titles', () => { describe(''); describe('', {}); }); -test(async () => { +test('Using as functions', async () => { describe(() => {}); describe(() => true); describe(() => false); @@ -24,7 +24,7 @@ test(async () => { ); }); -test(async () => { +test('Using as groups', async () => { describe('', () => {}); describe('', () => true); describe('', () => false); From 0dd2a79d91d994d24ae97b130bc7d2c3ab6a13fe Mon Sep 17 00:00:00 2001 From: wellwelwel <46850407+wellwelwel@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:12:58 -0300 Subject: [PATCH 3/4] docs: improve benchmark description --- benchmark/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/README.md b/benchmark/README.md index f06af6b0..b44a2420 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -4,7 +4,7 @@ The benchmark is performed by comparing a simple success and a failure test, eac > [!important] > -> **Poku** doesn't intend to be the best, but to offer a balance between high performance, compatibility, lightness and ease of use. +> **Poku** doesn't intend to be "the best", but to offer a balance between high performance, isolation, compatibility, lightness and ease of use. --- From 04487dbc8a25610736507f8025f3a7d6b4d0f2bf Mon Sep 17 00:00:00 2001 From: wellwelwel <46850407+wellwelwel@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:25:47 -0300 Subject: [PATCH 4/4] docs: include `description` approaches --- .../docs/documentation/helpers/describe.mdx | 72 ++++++++---------- website/static/img/describe-example.png | Bin 28066 -> 0 bytes 2 files changed, 33 insertions(+), 39 deletions(-) delete mode 100644 website/static/img/describe-example.png diff --git a/website/docs/documentation/helpers/describe.mdx b/website/docs/documentation/helpers/describe.mdx index 620c3ca4..65fc78b5 100644 --- a/website/docs/documentation/helpers/describe.mdx +++ b/website/docs/documentation/helpers/describe.mdx @@ -3,36 +3,35 @@ sidebar_position: 2 --- import { FAQ } from '@site/src/components/FAQ'; -import Example from '@site/static/img/describe-example.png'; # describe -On **Poku**, `describe` is just a pretty `console.log` to title your test suites in the terminal. +## Using as test titles + +On **Poku**, `describe` can be used just as a pretty `console.log` to title your test suites in the terminal. ```ts import { describe, assert } from 'poku'; -describe('Group A'); -assert(true, '1'); -assert(true, '2'); +describe('Test Title'); -describe('Group B'); assert(true, '1'); assert(true, '2'); ``` -## Personalization +### Personalization > `describe(title: string, options?: DescribeOptions)` -### background +#### background Change the background color for your personal title. ```ts import { describe, assert } from 'poku'; -describe('Group A', { background: 'blue' }); +describe('Test Title', { background: 'blue' }); + assert.ok(true, '1'); assert.ok(true, '2'); ``` @@ -57,7 +56,7 @@ assert.ok(true, '2'); -### icon (prefix) +#### icon (prefix) **Poku** also allows the prefix customization. @@ -66,42 +65,37 @@ assert.ok(true, '2'); ```ts import { describe, assert } from 'poku'; -describe('Group A', { icon: '🚀' }); +describe('Test Title', { icon: '🔬' }); + assert.ok(true, '1'); assert.ok(true, '2'); ``` -
+## Grouping tests (usual) -## Overview - - - - ```ts - import { assert, describe } from 'poku'; - - describe('Needs to Succeed', { - icon: '🚀', - }); +```ts +import { describe, assert } from 'poku'; - assert.ok(true, 'Test 1'); - assert.ok(true, 'Test 2'); +describe(() => { + assert.equal(1 + 1, 2, '1 + 1 should be 2'); + assert.equal(2 + 2, 4, '2 + 2 should be 4'); +}); +``` - describe('Needs to Fail', { - background: 'yellow', - icon: '🚫', - }); +```ts +import { describe, assert } from 'poku'; - assert.throws(() => { throw new Error() }, 'Test 1'); - assert.throws(() => { throw new Error() }, 'Test 2'); - ``` +describe('Sum tests', () => { + assert.equal(1 + 1, 2); + assert.equal(2 + 2, 4); +}); +``` - +```ts +import { describe, assert } from 'poku'; - - - - -
- -
+describe('Sum tests', () => { + assert.equal(1 + 1, 2, '1 + 1 should be 2'); + assert.equal(2 + 2, 4, '2 + 2 should be 4'); +}); +``` diff --git a/website/static/img/describe-example.png b/website/static/img/describe-example.png deleted file mode 100644 index 0151c7b983d9c95ac7e02f242c33811e45a76fb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28066 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