diff --git a/.eslintrc.json b/.eslintrc.json index d9631ed..f706aa0 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,7 +3,8 @@ "env": { "es6": true, "node": false, - "browser": false + "browser": false, + "commonjs": false }, "parserOptions": { "ecmaVersion": "latest", @@ -23,7 +24,9 @@ "files": ["**/cli/**/*"], "env": { "es6": true, - "node": true + "node": true, + "browser": false, + "commonjs": false }, "rules": { "no-console": "off", @@ -36,14 +39,20 @@ { "files": ["**/{test,tests}/**/*"], "env": { - "mocha": true, "es6": true, - "node": true + "mocha": true, + "node": false, + "browser": false, + "commonjs": false }, "extends": ["eslint:recommended", "plugin:mocha/recommended"], "plugins": ["mocha"], "rules": { - "mocha/max-top-level-suites": "off" + "no-console": "off", + "jsdoc/require-jsdoc": "off", + "mocha/max-top-level-suites": "off", + "mocha/no-setup-in-describe": "off", + "mocha/no-exports": "off" } } ] diff --git a/cli/tests/clean.test.js b/cli/tests/clean.test.js deleted file mode 100644 index 33ccd48..0000000 --- a/cli/tests/clean.test.js +++ /dev/null @@ -1,132 +0,0 @@ -import { strictEqual } from 'assert' -import { cleanFile } from '../src/func/clean.js' - -describe('1: تنظيف الأسطر', function () { - it('1.1: تحويل التصدير إلى التصدير الافتراضي', function () { - const a = cleanFile('export = example;') - strictEqual(a, 'export default example;') - }) - - it('1.2: يجب أن يبقى التصدير كما هو', function () { - const a = cleanFile('export * as Types from "./file/path.js";') - strictEqual(a, 'export * as Types from "./file/path.js";') - }) - - it('1.3: تحويل نوع التصدير إلى إعلان نوع التصدير', function () { - const a = cleanFile('export type exports = example;') - strictEqual(a, 'export declare type exports = example;') - }) - - it('1.4: يجب أن يبقى التصدير كما هو', function () { - const a = cleanFile('export { example };') - strictEqual(a, 'export { example };') - }) - - it('1.5: يجب أن يبقى استيراد النوع كما هو', function () { - const a = cleanFile('import type { example } from "./file/path.js";') - strictEqual(a, 'import type { example } from "./file/path.js";') - }) - - it('1.6: تحويل نوع التصدير إلى إعلان نوع التصدير', function () { - const a = cleanFile('export type example = typeof import("./file/path.js");') - strictEqual(a, 'export declare type example = typeof import("./file/path.js");') - }) - - it('1.7: تحويل دالة التصدير إلى دالة إعلان التصدير', function () { - const a = cleanFile(`export function (...args: example[][], ...args2: example[example][], ...args3: example[][][]) : - | Promise - | example - | void { }`) - strictEqual( - a, - `import type { example } from "file/path.js"; - -export declare function (...args: example[], ...args2: example[example], ...args3: example[][]) : - | Promise - | example - | void { }` - ) - }) - - it('1.8: تحويل تعداد التصدير إلى تعداد إعلان التصدير', function () { - const a = cleanFile(`export enum Example = { - other: import("../file/path.js").OtherExample; -};`) - strictEqual( - a, - `import type { OtherExample } from "../file/path.js"; - -export declare enum Example = { - other: OtherExample; -};` - ) - }) - - it('1.9: تحويل نوع التصدير إلى إعلان نوع التصدير مع تعليق', function () { - const a = cleanFile( - `export type Example = { - /** - * pretend to be a useful comment - */ - some?: import("../file/path.js").SomeExample; -};` - ) - strictEqual( - a, - `import type { SomeExample } from "../file/path.js"; - -export declare type Example = { - /** - * pretend to be a useful comment - */ - some?: SomeExample; -};` - ) - }) - - it('1.10: تحويل نوع التصدير إلى إعلان نوع التصدير مع استيراد', function () { - const a = cleanFile( - 'export declare type Example = import("./file/path").example1 | import("./file/path").example2;' - ) - strictEqual( - a, - `import type { example1, example2 } from "./file/path"; - -export declare type Example = example1 | example2;` - ) - }) - - it('1.11: يجب أن يبقى الاستيراد كما هو', function () { - const a = cleanFile('import { example } from "./file/path";') - strictEqual(a, 'import { example } from "./file/path";') - }) - - it('1.12: تحويل استيراد إلى استيراد نوع', function () { - const a = cleanFile(`const e1 = import("./file/path.js").Example1; -const e2 = import("./file/path.js").Example2;`) - strictEqual( - a, - `import type { Example1, Example2 } from "./file/path.js"; - -const e1 = Example1; -const e2 = Example2;` - ) - }) - - it('1.13: إزالة تعريف النوع', function () { - const a = cleanFile('/** @typedef {Example} Example */') - strictEqual(a, '') - }) - - it('1.14: إزالة نوع التصدير', function () { - const a = cleanFile('export type Example = Example;') - strictEqual(a, '') - }) -}) - -describe('2: تنظيف لا شيء', function () { - it('2.1: يجب أن تعيده كما هو', function () { - const a = cleanFile('function foo() { return 0 }') - strictEqual(a, 'function foo() { return 0 }') - }) -}) diff --git a/cli/tests/cli.test.js b/cli/tests/cli.test.js new file mode 100644 index 0000000..e6bb80f --- /dev/null +++ b/cli/tests/cli.test.js @@ -0,0 +1,19 @@ +import clean from './func/clean.js' +import read from './func/read.js' +import write from './func/write.js' + +describe('cli', function () { + describe('func', function () { + describe('clean', function () { + clean() + }) + + describe('read', function () { + read() + }) + + describe('write', function () { + write() + }) + }) +}) diff --git a/cli/tests/func/clean.js b/cli/tests/func/clean.js new file mode 100644 index 0000000..cde5b83 --- /dev/null +++ b/cli/tests/func/clean.js @@ -0,0 +1,135 @@ +import { equal } from 'assert/strict' +import { cleanFile } from '../../src/func/clean.js' + +export default function () { + describe('1: تنظيف الأسطر', function () { + it('1.1: تحويل التصدير إلى التصدير الافتراضي', function () { + const a = cleanFile('export = example;') + equal(a, 'export default example;') + }) + + it('1.2: يجب أن يبقى التصدير كما هو', function () { + const a = cleanFile('export * as Types from "./file/path.js";') + equal(a, 'export * as Types from "./file/path.js";') + }) + + it('1.3: تحويل نوع التصدير إلى إعلان نوع التصدير', function () { + const a = cleanFile('export type exports = example;') + equal(a, 'export declare type exports = example;') + }) + + it('1.4: يجب أن يبقى التصدير كما هو', function () { + const a = cleanFile('export { example };') + equal(a, 'export { example };') + }) + + it('1.5: يجب أن يبقى استيراد النوع كما هو', function () { + const a = cleanFile('import type { example } from "./file/path.js";') + equal(a, 'import type { example } from "./file/path.js";') + }) + + it('1.6: تحويل نوع التصدير إلى إعلان نوع التصدير', function () { + const a = cleanFile('export type example = typeof import("./file/path.js");') + equal(a, 'export declare type example = typeof import("./file/path.js");') + }) + + it('1.7: تحويل دالة التصدير إلى دالة إعلان التصدير', function () { + const a = + cleanFile(`export function (...args: example[][], ...args2: example[example][], ...args3: example[][][]) : + | Promise + | example + | void { }`) + equal( + a, + `import type { example } from "file/path.js"; + +export declare function (...args: example[], ...args2: example[example], ...args3: example[][]) : + | Promise + | example + | void { }` + ) + }) + + it('1.8: تحويل تعداد التصدير إلى تعداد إعلان التصدير', function () { + const a = cleanFile(`export enum Example = { + other: import("../file/path.js").OtherExample; +};`) + equal( + a, + `import type { OtherExample } from "../file/path.js"; + +export declare enum Example = { + other: OtherExample; +};` + ) + }) + + it('1.9: تحويل نوع التصدير إلى إعلان نوع التصدير مع تعليق', function () { + const a = cleanFile( + `export type Example = { + /** + * pretend to be a useful comment + */ + some?: import("../file/path.js").SomeExample; +};` + ) + equal( + a, + `import type { SomeExample } from "../file/path.js"; + +export declare type Example = { + /** + * pretend to be a useful comment + */ + some?: SomeExample; +};` + ) + }) + + it('1.10: تحويل نوع التصدير إلى إعلان نوع التصدير مع استيراد', function () { + const a = cleanFile( + 'export declare type Example = import("./file/path").example1 | import("./file/path").example2;' + ) + equal( + a, + `import type { example1, example2 } from "./file/path"; + +export declare type Example = example1 | example2;` + ) + }) + + it('1.11: يجب أن يبقى الاستيراد كما هو', function () { + const a = cleanFile('import { example } from "./file/path";') + equal(a, 'import { example } from "./file/path";') + }) + + it('1.12: تحويل استيراد إلى استيراد نوع', function () { + const a = cleanFile(`const e1 = import("./file/path.js").Example1; +const e2 = import("./file/path.js").Example2;`) + equal( + a, + `import type { Example1, Example2 } from "./file/path.js"; + +const e1 = Example1; +const e2 = Example2;` + ) + }) + + it('1.13: إزالة تعريف النوع', function () { + const a = cleanFile('/** @typedef {Example} Example */') + equal(a, '') + }) + + it('1.14: إزالة نوع التصدير', function () { + const a = cleanFile('export type Example = Example;') + equal(a, '') + }) + }) + + describe('2: تنظيف لا شيء', function () { + it('2.1: يجب أن تعيده كما هو', function () { + const a = cleanFile('function foo() { return 0 }') + equal(a, 'function foo() { return 0 }') + }) + }) +} diff --git a/cli/tests/func/read.js b/cli/tests/func/read.js new file mode 100644 index 0000000..b94c3b9 --- /dev/null +++ b/cli/tests/func/read.js @@ -0,0 +1,117 @@ +import { deepEqual, ok } from 'assert/strict' +import { isAbsolute, sep } from 'path' +import { readFolder, readImport } from '../../src/func/read.js' + +export default function () { + describe('1: قراءة مسارات المجلدات', function () { + it('1.1: إعادة المسارات المتوقعة', async function () { + const paths = await readFolder('cli/src') + deepEqual( + paths, + [ + 'clean.js', + 'docs.js', + 'func/clean.js', + 'func/read.js', + 'func/write.js' + // eslint-disable-next-line no-undef + ].map((subPath) => (process.cwd() + '/cli/src/' + subPath).replace(/\//g, sep)) + ) + }) + + it('1.2: إعادة المسارات المطلقة', async function () { + const paths = await readFolder('cli') + ok(paths.every((x) => isAbsolute(x))) + }) + }) + + describe('2: قراءة محتويات الملفات', function () { + it('2.1: إعادة المسار والنوع الصحيحين', function () { + const a = readImport('@param {import("./file").string} str') + deepEqual(a, ['@param {string} str', './file', 'string']) + + const a2 = readImport("@param {import('./file').string} str") + deepEqual(a2, ['@param {string} str', './file', 'string']) + + const a3 = readImport('@param {import(`./file`).string} str') + deepEqual(a3, ['@param {string} str', './file', 'string']) + }) + + it('2.2: إعادة المسار والنوع الصحيحين مع مسافة', function () { + const a = readImport('@param {import("./file").string } str') + deepEqual(a, ['@param {string } str', './file', 'string']) + }) + + it('2.3: إعادة المسار والنوع الصحيحين مع ()', function () { + const a = readImport('@param {(import("./file").string)} str') + deepEqual(a, ['@param {(string)} str', './file', 'string']) + }) + + it('2.4: إعادة المسار والنوع الصحيحين مع []', function () { + const a = readImport('@param {import("./file").string[]} str') + deepEqual(a, ['@param {string[]} str', './file', 'string']) + }) + + it('2.5: إعادة المسار والنوع الصحيحين مع [any]', function () { + const a = readImport('@param {import("./file").string[any]} str') + deepEqual(a, ['@param {string[any]} str', './file', 'string']) + }) + + it('2.6: إعادة المسار والنوع الصحيحين مع tuple', function () { + let a = readImport('@param {[import("./file").string, import("./file").number]} str') + + deepEqual(a, ['@param {[string, import("./file").number]} str', './file', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {[string, number]} str', './file', 'number']) + }) + + it('2.7: إعادة المسار والنوع الصحيحين مع ', function () { + const a = readImport('@param {import("./file").string} str') + deepEqual(a, ['@param {string} str', './file', 'string']) + }) + + it('2.8: إعادة المسار والنوع الصحيحين مع Promise', function () { + const a = readImport('@param {Promise} str') + deepEqual(a, ['@param {Promise} str', './file', 'string']) + }) + + it('2.9: إعادة المسار والنوع الصحيحين مع Map', function () { + let a = readImport('@param {Map} str') + + deepEqual(a, ['@param {Map} str', './file', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {Map} str', './file', 'number']) + }) + + it('2.10: إعادة المسار والنوع الصحيحين مع نفس المسار استيرادات متعددة', function () { + let a = readImport('@param {import("./file").string|import("./file").number} str') + + deepEqual(a, ['@param {string|import("./file").number} str', './file', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {string|number} str', './file', 'number']) + }) + + it('2.11: إعادة المسار والنوع الصحيحين مع مسارات مختلفة استيرادات متعددة', function () { + let a = readImport('@param {import("./file1").string|import("./file2").number} str') + deepEqual(a, ['@param {string|import("./file2").number} str', './file1', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {string|number} str', './file2', 'number']) + }) + + it('2.12: إعادة المسار والنوع الصحيحين مع استيرادات كاملة', function () { + const a = readImport('export type string = typeof import("./file");') + deepEqual(a, ['export type string = typeof import("./file");', null, null]) + }) + }) + + describe('3: الحالات السلبية', function () { + it('3.1: إعادة المسارات المطلقة', function () { + const a = readImport('str') + deepEqual(a, ['str', null, null]) + }) + }) +} diff --git a/cli/tests/func/write.js b/cli/tests/func/write.js new file mode 100644 index 0000000..b94c3b9 --- /dev/null +++ b/cli/tests/func/write.js @@ -0,0 +1,117 @@ +import { deepEqual, ok } from 'assert/strict' +import { isAbsolute, sep } from 'path' +import { readFolder, readImport } from '../../src/func/read.js' + +export default function () { + describe('1: قراءة مسارات المجلدات', function () { + it('1.1: إعادة المسارات المتوقعة', async function () { + const paths = await readFolder('cli/src') + deepEqual( + paths, + [ + 'clean.js', + 'docs.js', + 'func/clean.js', + 'func/read.js', + 'func/write.js' + // eslint-disable-next-line no-undef + ].map((subPath) => (process.cwd() + '/cli/src/' + subPath).replace(/\//g, sep)) + ) + }) + + it('1.2: إعادة المسارات المطلقة', async function () { + const paths = await readFolder('cli') + ok(paths.every((x) => isAbsolute(x))) + }) + }) + + describe('2: قراءة محتويات الملفات', function () { + it('2.1: إعادة المسار والنوع الصحيحين', function () { + const a = readImport('@param {import("./file").string} str') + deepEqual(a, ['@param {string} str', './file', 'string']) + + const a2 = readImport("@param {import('./file').string} str") + deepEqual(a2, ['@param {string} str', './file', 'string']) + + const a3 = readImport('@param {import(`./file`).string} str') + deepEqual(a3, ['@param {string} str', './file', 'string']) + }) + + it('2.2: إعادة المسار والنوع الصحيحين مع مسافة', function () { + const a = readImport('@param {import("./file").string } str') + deepEqual(a, ['@param {string } str', './file', 'string']) + }) + + it('2.3: إعادة المسار والنوع الصحيحين مع ()', function () { + const a = readImport('@param {(import("./file").string)} str') + deepEqual(a, ['@param {(string)} str', './file', 'string']) + }) + + it('2.4: إعادة المسار والنوع الصحيحين مع []', function () { + const a = readImport('@param {import("./file").string[]} str') + deepEqual(a, ['@param {string[]} str', './file', 'string']) + }) + + it('2.5: إعادة المسار والنوع الصحيحين مع [any]', function () { + const a = readImport('@param {import("./file").string[any]} str') + deepEqual(a, ['@param {string[any]} str', './file', 'string']) + }) + + it('2.6: إعادة المسار والنوع الصحيحين مع tuple', function () { + let a = readImport('@param {[import("./file").string, import("./file").number]} str') + + deepEqual(a, ['@param {[string, import("./file").number]} str', './file', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {[string, number]} str', './file', 'number']) + }) + + it('2.7: إعادة المسار والنوع الصحيحين مع ', function () { + const a = readImport('@param {import("./file").string} str') + deepEqual(a, ['@param {string} str', './file', 'string']) + }) + + it('2.8: إعادة المسار والنوع الصحيحين مع Promise', function () { + const a = readImport('@param {Promise} str') + deepEqual(a, ['@param {Promise} str', './file', 'string']) + }) + + it('2.9: إعادة المسار والنوع الصحيحين مع Map', function () { + let a = readImport('@param {Map} str') + + deepEqual(a, ['@param {Map} str', './file', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {Map} str', './file', 'number']) + }) + + it('2.10: إعادة المسار والنوع الصحيحين مع نفس المسار استيرادات متعددة', function () { + let a = readImport('@param {import("./file").string|import("./file").number} str') + + deepEqual(a, ['@param {string|import("./file").number} str', './file', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {string|number} str', './file', 'number']) + }) + + it('2.11: إعادة المسار والنوع الصحيحين مع مسارات مختلفة استيرادات متعددة', function () { + let a = readImport('@param {import("./file1").string|import("./file2").number} str') + deepEqual(a, ['@param {string|import("./file2").number} str', './file1', 'string']) + + a = readImport(a[0]) + deepEqual(a, ['@param {string|number} str', './file2', 'number']) + }) + + it('2.12: إعادة المسار والنوع الصحيحين مع استيرادات كاملة', function () { + const a = readImport('export type string = typeof import("./file");') + deepEqual(a, ['export type string = typeof import("./file");', null, null]) + }) + }) + + describe('3: الحالات السلبية', function () { + it('3.1: إعادة المسارات المطلقة', function () { + const a = readImport('str') + deepEqual(a, ['str', null, null]) + }) + }) +} diff --git a/cli/tests/read.test.js b/cli/tests/read.test.js deleted file mode 100644 index d046889..0000000 --- a/cli/tests/read.test.js +++ /dev/null @@ -1,111 +0,0 @@ -import { deepStrictEqual, ok } from 'assert' -import { isAbsolute, sep } from 'path' -import { readFolder, readImport } from '../src/func/read.js' - -describe('1: قراءة مسارات المجلدات', function () { - it('1.1: إعادة المسارات المتوقعة', async function () { - const paths = await readFolder('cli/src') - deepStrictEqual( - paths, - ['clean.js', 'docs.js', 'func/clean.js', 'func/read.js', 'func/write.js'].map((subPath) => - // eslint-disable-next-line no-undef - (process.cwd() + '/cli/src/' + subPath).replace(/\//g, sep) - ) - ) - }) - - it('1.2: إعادة المسارات المطلقة', async function () { - const paths = await readFolder('cli') - ok(paths.every((x) => isAbsolute(x))) - }) -}) - -describe('2: قراءة محتويات الملفات', function () { - it('2.1: إعادة المسار والنوع الصحيحين', function () { - const a = readImport('@param {import("./file").string} str') - deepStrictEqual(a, ['@param {string} str', './file', 'string']) - - const a2 = readImport("@param {import('./file').string} str") - deepStrictEqual(a2, ['@param {string} str', './file', 'string']) - - const a3 = readImport('@param {import(`./file`).string} str') - deepStrictEqual(a3, ['@param {string} str', './file', 'string']) - }) - - it('2.2: إعادة المسار والنوع الصحيحين مع مسافة', function () { - const a = readImport('@param {import("./file").string } str') - deepStrictEqual(a, ['@param {string } str', './file', 'string']) - }) - - it('2.3: إعادة المسار والنوع الصحيحين مع ()', function () { - const a = readImport('@param {(import("./file").string)} str') - deepStrictEqual(a, ['@param {(string)} str', './file', 'string']) - }) - - it('2.4: إعادة المسار والنوع الصحيحين مع []', function () { - const a = readImport('@param {import("./file").string[]} str') - deepStrictEqual(a, ['@param {string[]} str', './file', 'string']) - }) - - it('2.5: إعادة المسار والنوع الصحيحين مع [any]', function () { - const a = readImport('@param {import("./file").string[any]} str') - deepStrictEqual(a, ['@param {string[any]} str', './file', 'string']) - }) - - it('2.6: إعادة المسار والنوع الصحيحين مع tuple', function () { - let a = readImport('@param {[import("./file").string, import("./file").number]} str') - - deepStrictEqual(a, ['@param {[string, import("./file").number]} str', './file', 'string']) - - a = readImport(a[0]) - deepStrictEqual(a, ['@param {[string, number]} str', './file', 'number']) - }) - - it('2.7: إعادة المسار والنوع الصحيحين مع ', function () { - const a = readImport('@param {import("./file").string} str') - deepStrictEqual(a, ['@param {string} str', './file', 'string']) - }) - - it('2.8: إعادة المسار والنوع الصحيحين مع Promise', function () { - const a = readImport('@param {Promise} str') - deepStrictEqual(a, ['@param {Promise} str', './file', 'string']) - }) - - it('2.9: إعادة المسار والنوع الصحيحين مع Map', function () { - let a = readImport('@param {Map} str') - - deepStrictEqual(a, ['@param {Map} str', './file', 'string']) - - a = readImport(a[0]) - deepStrictEqual(a, ['@param {Map} str', './file', 'number']) - }) - - it('2.10: إعادة المسار والنوع الصحيحين مع نفس المسار استيرادات متعددة', function () { - let a = readImport('@param {import("./file").string|import("./file").number} str') - - deepStrictEqual(a, ['@param {string|import("./file").number} str', './file', 'string']) - - a = readImport(a[0]) - deepStrictEqual(a, ['@param {string|number} str', './file', 'number']) - }) - - it('2.11: إعادة المسار والنوع الصحيحين مع مسارات مختلفة استيرادات متعددة', function () { - let a = readImport('@param {import("./file1").string|import("./file2").number} str') - deepStrictEqual(a, ['@param {string|import("./file2").number} str', './file1', 'string']) - - a = readImport(a[0]) - deepStrictEqual(a, ['@param {string|number} str', './file2', 'number']) - }) - - it('2.12: إعادة المسار والنوع الصحيحين مع استيرادات كاملة', function () { - const a = readImport('export type string = typeof import("./file");') - deepStrictEqual(a, ['export type string = typeof import("./file");', null, null]) - }) -}) - -describe('3: الحالات السلبية', function () { - it('3.1: إعادة المسارات المطلقة', function () { - const a = readImport('str') - deepStrictEqual(a, ['str', null, null]) - }) -}) diff --git a/cli/tests/write.test.js b/cli/tests/write.test.js deleted file mode 100644 index 1f6c7b0..0000000 --- a/cli/tests/write.test.js +++ /dev/null @@ -1,31 +0,0 @@ -import { equal } from 'assert' -import { writeImports } from '../src/func/write.js' - -describe('1: تحويل خريطة الأنواع إلى واردات', function () { - it('1.1: قيمة واحدة', function () { - const a = writeImports(new Map([['./file', ['string']]])) - equal(a, 'import type { string } from "./file";\n') - }) - - it('1.3: قيم متعددة', function () { - const a = writeImports(new Map([['./file', ['string', 'number']]])) - equal(a, 'import type { string, number } from "./file";\n') - }) - - it('1.4: واردات متعددة', function () { - const a = writeImports( - new Map([ - ['./file1', ['string']], - ['./file2', ['number']] - ]) - ) - equal(a, 'import type { string } from "./file1";\nimport type { number } from "./file2";\n') - }) -}) - -describe('2: حالات سلبية', function () { - it('2.1: إعادة لا شيء', function () { - const a = writeImports(new Map()) - equal(a, undefined) - }) -}) diff --git a/tests/line/create.test.js b/tests/line/create.test.js deleted file mode 100644 index 37340d8..0000000 --- a/tests/line/create.test.js +++ /dev/null @@ -1,359 +0,0 @@ -import { deepStrictEqual } from 'assert' -import { Line } from '../../src/exports.js' - -describe('1: اصنع مستقيماً بلا أي قيم', function () { - it('1.1: ', function () { - // 0 -1-> 1 - - let l = Line.create.one({}) - deepStrictEqual(l, { - start: 0, - dis: 1, - count: 2, - neg: false - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, 1) - deepStrictEqual(l.points, [0, 1]) - }) -}) - -describe('2: اصنع مستقيماً بالمسافة فقط', function () { - it('2.1: موجب', function () { - // 0 -2-> 2 - - let l = Line.create.one({ dis: 2 }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 2, - neg: false - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, 2) - deepStrictEqual(l.min, 0) - deepStrictEqual(l.max, 2) - deepStrictEqual(l.points, [0, 2]) - - // 1 -2-> 3 - - l.start = 1 - deepStrictEqual(l, { - start: 1, - dis: 2, - count: 2, - neg: false - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, 3) - deepStrictEqual(l.points, [1, 3]) - }) - - it('2.2: سلبي', function () { - // -2 <-2- 0 - - let l = Line.create.one({ dis: 2, neg: true }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 2, - neg: true - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, -2) - deepStrictEqual(l.min, -2) - deepStrictEqual(l.max, 0) - deepStrictEqual(l.points, [0, -2]) - - // -1 <-2- 1 - - l.start = 1 - deepStrictEqual(l, { - start: 1, - dis: 2, - count: 2, - neg: true - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, -1) - deepStrictEqual(l.points, [1, -1]) - }) - - it('2.3: نهاية إيجابية', function () { - // 0 -2-> 2 - - const l = Line.create.one({ start: 0, end: 2 }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 2, - neg: false - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, 2) - deepStrictEqual(l.min, 0) - deepStrictEqual(l.max, 2) - deepStrictEqual(l.points, [0, 2]) - }) - - it('2.4: نهاية سلبية', function () { - // -2 <-2- 0 - - const l = Line.create.one({ start: 0, end: -2 }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 2, - neg: true - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, -2) - deepStrictEqual(l.min, -2) - deepStrictEqual(l.max, 0) - deepStrictEqual(l.points, [0, -2]) - }) -}) - -describe('3: اصنع مستقيماً بالمسافة والتباعد', function () { - it('3.1: موجب', function () { - // 1 -1-> 2 -1-> 3 - - const l = Line.create.one({ start: 1, dis: 2, spacing: 1 }) - deepStrictEqual(l, { - start: 1, - dis: 2, - count: 3, - neg: false - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, 3) - deepStrictEqual(l.min, 0) - deepStrictEqual(l.max, 2) - deepStrictEqual(l.points, [1, 2, 3]) - }) - - it('3.2: سلبي', function () { - // -3 <-1- -2 <-1- -1 - - const l = Line.create.one({ start: -1, dis: 2, spacing: 1, neg: true }) - deepStrictEqual(l, { - start: -1, - dis: 2, - count: 3, - neg: true - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, -3) - deepStrictEqual(l.min, -2) - deepStrictEqual(l.max, 0) - deepStrictEqual(l.points, [-1, -2, -3]) - }) -}) - -describe('4: اصنع مستقيماً بالمسافة والعدد', function () { - it('4.1: موجب', function () { - // 0 -1-> 1 -1-> 2 - - const l = Line.create.one({ dis: 2, count: 3 }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 3, - neg: false - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, 2) - deepStrictEqual(l.min, 0) - deepStrictEqual(l.max, 2) - deepStrictEqual(l.points, [0, 1, 2]) - }) - - it('4.2: سلبي', function () { - // -2 <-1- -1 <-1- 0 - - const l = Line.create.one({ dis: 2, count: 3, neg: true }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 3, - neg: true - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, -2) - deepStrictEqual(l.min, -2) - deepStrictEqual(l.max, 0) - deepStrictEqual(l.points, [0, -1, -2]) - }) -}) - -describe('5: اصنع مستقيماً بالتباعد والعدد', function () { - it('5.1: موجب', function () { - // 0 -1-> 1 -1-> 2 - - const l = Line.create.one({ spacing: 1, count: 3 }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 3, - neg: false - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, 2) - deepStrictEqual(l.min, 0) - deepStrictEqual(l.max, 2) - deepStrictEqual(l.points, [0, 1, 2]) - }) - - it('5.2: سلبي', function () { - // -2 <-1- -1 <-1- 0 - - const l = Line.create.one({ spacing: 1, count: 3, neg: true }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 3, - neg: true - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, -2) - deepStrictEqual(l.min, -2) - deepStrictEqual(l.max, 0) - deepStrictEqual(l.points, [0, -1, -2]) - }) -}) - -describe('6: اصنع مستقيماً بنقاط جاهزة', function () { - it('6.1: موجب', function () { - // 0 -1-> 1 -1-> 2 - - const l = Line.create.one({ points: [0, 1, 2] }) - deepStrictEqual(l, { - start: 0, - dis: 2, - count: 3, - neg: false - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, 2) - deepStrictEqual(l.points, [0, 1, 2]) - }) - - it('6.2: سلبي', function () { - // -4 <-2- -2 <-2- 0 - - const l = Line.create.one({ points: [0, -2, -4] }) - deepStrictEqual(l, { - start: 0, - dis: 4, - count: 3, - neg: true - }) - deepStrictEqual(l.spacing, 2) - deepStrictEqual(l.end, -4) - deepStrictEqual(l.points, [0, -2, -4]) - }) - - it('6.3: دالة صنع النقاط - موجب', function () { - // -1 | 0 | +1 - - const pArr = Line.create.points({ count: 3, sort: 'neg' }) - deepStrictEqual(pArr, [-1, 0, 1]) - - // -1 -1-> 0 -1-> 1 - - const l = Line.create.one({ points: pArr }) - deepStrictEqual(l, { - start: -1, - dis: 2, - count: 3, - neg: false - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, 1) - deepStrictEqual(l.points, [-1, 0, 1]) - }) - - it('6.4: دالة صنع النقاط - سالب', function () { - // +1 | 0 | -1 - - const pArr = Line.create.points({ count: 3, sort: 'pos' }) - deepStrictEqual(pArr, [1, 0, -1]) - - // -1 <-1- 0 <-1- 1 - - const l = Line.create.one({ points: pArr }) - deepStrictEqual(l, { - start: 1, - dis: 2, - count: 3, - neg: true - }) - deepStrictEqual(l.spacing, 1) - deepStrictEqual(l.end, -1) - deepStrictEqual(l.points, [1, 0, -1]) - }) -}) - -describe('7: اصنع نقاطاً على مستقيم', function () { - it('7.1: العدد فقط - فردي', function () { - // -3, -2, -1 | 0 | +1, +2, +3 - - // -3 * 1 = -3 - // -2 * 1 = -2 - // -1 * 1 = -1 - // 0 * 1 = 0 - // +1 * 1 = +1 - // +2 * 1 = +2 - // +3 * 1 = +3 - - const pArr = Line.create.points({ count: 7 }) - deepStrictEqual(pArr, [0, 1, -1, 2, -2, 3, -3]) - }) - - it('7.2: العدد فقط - زوجي', function () { - // -2.5, -1.5, -0.5 | | +0.5, +1.5, +2.5 - - // half_spacing = 1 * 0.5 = 0.5 - // (-2 * 1) + -half_spacing = -2 + -0.5 = -2.5 - // (-1 * 1) + -half_spacing = -1 + -0.5 = -1.5 - // (-0 * 1) + -half_spacing = -0 + -0.5 = -0.5 - // - // (+0 * 1) + +half_spacing = +0 + +0.5 = +0.5 - // (+1 * 1) + +half_spacing = +1 + +0.5 = +1.5 - // (+2 * 1) + +half_spacing = +2 + +0.5 = +2.5 - - const pArr = Line.create.points({ count: 6 }) - deepStrictEqual(pArr, [0.5, -0.5, 1.5, -1.5, 2.5, -2.5]) - }) - - it('7.3: العدد والتباعد - فردي', function () { - // -6, -4, -2 | 0 | +2, +4, +6 - - // -3 * 2 = -6 - // -2 * 2 = -4 - // -1 * 2 = -2 - // 0 * 2 = 0 - // +1 * 2 = +2 - // +2 * 2 = +4 - // +3 * 2 = +6 - - const pArr = Line.create.points({ count: 7, spacing: 2 }) - deepStrictEqual(pArr, [0, 2, -2, 4, -4, 6, -6]) - }) - - it('7.4: العدد والتباعد - زوجي', function () { - // -5, -3, -1 | | +1, +3, +5 - - // half_spacing = 2 * 0.5 = 1 - // (-2 * 2) + -half_spacing = -4 + -1 = -5 - // (-1 * 2) + -half_spacing = -2 + -1 = -3 - // (-0 * 2) + -half_spacing = -0 + -1 = -1 - // - // (+0 * 2) + +half_spacing = -0 + +1 = +1 - // (+1 * 2) + +half_spacing = -2 + +1 = +3 - // (+2 * 2) + +half_spacing = -4 + +1 = +5 - - const pArr = Line.create.points({ count: 6, spacing: 2 }) - deepStrictEqual(pArr, [1, -1, 3, -3, 5, -5]) - }) -}) diff --git a/tests/line/func/create.js b/tests/line/func/create.js new file mode 100644 index 0000000..45cd722 --- /dev/null +++ b/tests/line/func/create.js @@ -0,0 +1,361 @@ +import { deepEqual } from 'assert/strict' +import { Line } from '../../../src/exports.js' + +export default function () { + describe('1: اصنع مستقيماً بلا أي قيم', function () { + it('1.1: ', function () { + // 0 -1-> 1 + + let l = Line.create.one({}) + deepEqual(l, { + start: 0, + dis: 1, + count: 2, + neg: false + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, 1) + deepEqual(l.points, [0, 1]) + }) + }) + + describe('2: اصنع مستقيماً بالمسافة فقط', function () { + it('2.1: موجب', function () { + // 0 -2-> 2 + + let l = Line.create.one({ dis: 2 }) + deepEqual(l, { + start: 0, + dis: 2, + count: 2, + neg: false + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, 2) + deepEqual(l.min, 0) + deepEqual(l.max, 2) + deepEqual(l.points, [0, 2]) + + // 1 -2-> 3 + + l.start = 1 + deepEqual(l, { + start: 1, + dis: 2, + count: 2, + neg: false + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, 3) + deepEqual(l.points, [1, 3]) + }) + + it('2.2: سلبي', function () { + // -2 <-2- 0 + + let l = Line.create.one({ dis: 2, neg: true }) + deepEqual(l, { + start: 0, + dis: 2, + count: 2, + neg: true + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, -2) + deepEqual(l.min, -2) + deepEqual(l.max, 0) + deepEqual(l.points, [0, -2]) + + // -1 <-2- 1 + + l.start = 1 + deepEqual(l, { + start: 1, + dis: 2, + count: 2, + neg: true + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, -1) + deepEqual(l.points, [1, -1]) + }) + + it('2.3: نهاية إيجابية', function () { + // 0 -2-> 2 + + const l = Line.create.one({ start: 0, end: 2 }) + deepEqual(l, { + start: 0, + dis: 2, + count: 2, + neg: false + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, 2) + deepEqual(l.min, 0) + deepEqual(l.max, 2) + deepEqual(l.points, [0, 2]) + }) + + it('2.4: نهاية سلبية', function () { + // -2 <-2- 0 + + const l = Line.create.one({ start: 0, end: -2 }) + deepEqual(l, { + start: 0, + dis: 2, + count: 2, + neg: true + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, -2) + deepEqual(l.min, -2) + deepEqual(l.max, 0) + deepEqual(l.points, [0, -2]) + }) + }) + + describe('3: اصنع مستقيماً بالمسافة والتباعد', function () { + it('3.1: موجب', function () { + // 1 -1-> 2 -1-> 3 + + const l = Line.create.one({ start: 1, dis: 2, spacing: 1 }) + deepEqual(l, { + start: 1, + dis: 2, + count: 3, + neg: false + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, 3) + deepEqual(l.min, 0) + deepEqual(l.max, 2) + deepEqual(l.points, [1, 2, 3]) + }) + + it('3.2: سلبي', function () { + // -3 <-1- -2 <-1- -1 + + const l = Line.create.one({ start: -1, dis: 2, spacing: 1, neg: true }) + deepEqual(l, { + start: -1, + dis: 2, + count: 3, + neg: true + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, -3) + deepEqual(l.min, -2) + deepEqual(l.max, 0) + deepEqual(l.points, [-1, -2, -3]) + }) + }) + + describe('4: اصنع مستقيماً بالمسافة والعدد', function () { + it('4.1: موجب', function () { + // 0 -1-> 1 -1-> 2 + + const l = Line.create.one({ dis: 2, count: 3 }) + deepEqual(l, { + start: 0, + dis: 2, + count: 3, + neg: false + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, 2) + deepEqual(l.min, 0) + deepEqual(l.max, 2) + deepEqual(l.points, [0, 1, 2]) + }) + + it('4.2: سلبي', function () { + // -2 <-1- -1 <-1- 0 + + const l = Line.create.one({ dis: 2, count: 3, neg: true }) + deepEqual(l, { + start: 0, + dis: 2, + count: 3, + neg: true + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, -2) + deepEqual(l.min, -2) + deepEqual(l.max, 0) + deepEqual(l.points, [0, -1, -2]) + }) + }) + + describe('5: اصنع مستقيماً بالتباعد والعدد', function () { + it('5.1: موجب', function () { + // 0 -1-> 1 -1-> 2 + + const l = Line.create.one({ spacing: 1, count: 3 }) + deepEqual(l, { + start: 0, + dis: 2, + count: 3, + neg: false + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, 2) + deepEqual(l.min, 0) + deepEqual(l.max, 2) + deepEqual(l.points, [0, 1, 2]) + }) + + it('5.2: سلبي', function () { + // -2 <-1- -1 <-1- 0 + + const l = Line.create.one({ spacing: 1, count: 3, neg: true }) + deepEqual(l, { + start: 0, + dis: 2, + count: 3, + neg: true + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, -2) + deepEqual(l.min, -2) + deepEqual(l.max, 0) + deepEqual(l.points, [0, -1, -2]) + }) + }) + + describe('6: اصنع مستقيماً بنقاط جاهزة', function () { + it('6.1: موجب', function () { + // 0 -1-> 1 -1-> 2 + + const l = Line.create.one({ points: [0, 1, 2] }) + deepEqual(l, { + start: 0, + dis: 2, + count: 3, + neg: false + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, 2) + deepEqual(l.points, [0, 1, 2]) + }) + + it('6.2: سلبي', function () { + // -4 <-2- -2 <-2- 0 + + const l = Line.create.one({ points: [0, -2, -4] }) + deepEqual(l, { + start: 0, + dis: 4, + count: 3, + neg: true + }) + deepEqual(l.spacing, 2) + deepEqual(l.end, -4) + deepEqual(l.points, [0, -2, -4]) + }) + + it('6.3: دالة صنع النقاط - موجب', function () { + // -1 | 0 | +1 + + const pArr = Line.create.points({ count: 3, sort: 'neg' }) + deepEqual(pArr, [-1, 0, 1]) + + // -1 -1-> 0 -1-> 1 + + const l = Line.create.one({ points: pArr }) + deepEqual(l, { + start: -1, + dis: 2, + count: 3, + neg: false + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, 1) + deepEqual(l.points, [-1, 0, 1]) + }) + + it('6.4: دالة صنع النقاط - سالب', function () { + // +1 | 0 | -1 + + const pArr = Line.create.points({ count: 3, sort: 'pos' }) + deepEqual(pArr, [1, 0, -1]) + + // -1 <-1- 0 <-1- 1 + + const l = Line.create.one({ points: pArr }) + deepEqual(l, { + start: 1, + dis: 2, + count: 3, + neg: true + }) + deepEqual(l.spacing, 1) + deepEqual(l.end, -1) + deepEqual(l.points, [1, 0, -1]) + }) + }) + + describe('7: اصنع نقاطاً على مستقيم', function () { + it('7.1: العدد فقط - فردي', function () { + // -3, -2, -1 | 0 | +1, +2, +3 + + // -3 * 1 = -3 + // -2 * 1 = -2 + // -1 * 1 = -1 + // 0 * 1 = 0 + // +1 * 1 = +1 + // +2 * 1 = +2 + // +3 * 1 = +3 + + const pArr = Line.create.points({ count: 7 }) + deepEqual(pArr, [0, 1, -1, 2, -2, 3, -3]) + }) + + it('7.2: العدد فقط - زوجي', function () { + // -2.5, -1.5, -0.5 | | +0.5, +1.5, +2.5 + + // half_spacing = 1 * 0.5 = 0.5 + // (-2 * 1) + -half_spacing = -2 + -0.5 = -2.5 + // (-1 * 1) + -half_spacing = -1 + -0.5 = -1.5 + // (-0 * 1) + -half_spacing = -0 + -0.5 = -0.5 + // + // (+0 * 1) + +half_spacing = +0 + +0.5 = +0.5 + // (+1 * 1) + +half_spacing = +1 + +0.5 = +1.5 + // (+2 * 1) + +half_spacing = +2 + +0.5 = +2.5 + + const pArr = Line.create.points({ count: 6 }) + deepEqual(pArr, [0.5, -0.5, 1.5, -1.5, 2.5, -2.5]) + }) + + it('7.3: العدد والتباعد - فردي', function () { + // -6, -4, -2 | 0 | +2, +4, +6 + + // -3 * 2 = -6 + // -2 * 2 = -4 + // -1 * 2 = -2 + // 0 * 2 = 0 + // +1 * 2 = +2 + // +2 * 2 = +4 + // +3 * 2 = +6 + + const pArr = Line.create.points({ count: 7, spacing: 2 }) + deepEqual(pArr, [0, 2, -2, 4, -4, 6, -6]) + }) + + it('7.4: العدد والتباعد - زوجي', function () { + // -5, -3, -1 | | +1, +3, +5 + + // half_spacing = 2 * 0.5 = 1 + // (-2 * 2) + -half_spacing = -4 + -1 = -5 + // (-1 * 2) + -half_spacing = -2 + -1 = -3 + // (-0 * 2) + -half_spacing = -0 + -1 = -1 + // + // (+0 * 2) + +half_spacing = -0 + +1 = +1 + // (+1 * 2) + +half_spacing = -2 + +1 = +3 + // (+2 * 2) + +half_spacing = -4 + +1 = +5 + + const pArr = Line.create.points({ count: 6, spacing: 2 }) + deepEqual(pArr, [1, -1, 3, -3, 5, -5]) + }) + }) +} diff --git a/tests/line/func/point.js b/tests/line/func/point.js new file mode 100644 index 0000000..2b5bbf3 --- /dev/null +++ b/tests/line/func/point.js @@ -0,0 +1,173 @@ +import { equal } from 'assert/strict' +import { Line } from '../../../src/exports.js' + +let line +let current + +export default function () { + describe('1: تحقق مما إذا كانت القيمة داخل المستقيم الموجب', function () { + before(function () { + line = Line.create.one({ dis: 10 }) + }) + + it('1.1: خارج المستقيم - قبل', function () { + // -1 <-> [0 <-> 10] + + const a = Line.point.inside(line, -1) + equal(a, false) + }) + + it('1.2: خارج المستقيم - بعد', function () { + // [0 <-> 10] <-> 11 + + const a = Line.point.inside(line, 11) + equal(a, false) + }) + + it('1.3: داخل المستقيم', function () { + // [0 <-> 5 <-> 10] + + const a = Line.point.inside(line, 5) + equal(a, true) + }) + + it('1.4: على بداية المستقيم', function () { + // [0' <-> 10] + + const a = Line.point.inside(line, 0) + equal(a, true) + }) + + it('1.5: على نهاية المستقيم', function () { + // [0 <-> '10] + + const a = Line.point.inside(line, 10) + equal(a, true) + }) + }) + + describe('2: تحقق مما إذا كانت القيمة داخل المستقيم السالب', function () { + before(function () { + line = Line.create.one({ dis: 10, neg: true }) + }) + + it('2.1: خارج المستقيم - قبل', function () { + // -11 <-> [-10 <-> 0] + + const a = Line.point.inside(line, -11) + equal(a, false) + }) + + it('2.2: خارج المستقيم - بعد', function () { + // [-10 <-> 0] <-> 1 + + const a = Line.point.inside(line, 1) + equal(a, false) + }) + + it('2.3: داخل المستقيم', function () { + // [-10 <-> -5 <-> 0] + + const a = Line.point.inside(line, -5) + equal(a, true) + }) + + it('2.4: على بداية المستقيم', function () { + // [-10 <-> '0] + + const a = Line.point.inside(line, 0) + equal(a, true) + }) + + it('2.5: على نهاية المستقيم', function () { + // [-10' <-> 0] + + const a = Line.point.inside(line, -10) + equal(a, true) + }) + }) + + describe('3: حرّك القيمة على المستقيم الموجب', function () { + before(function () { + line = Line.create.one({ dis: 10 }) + current = 5 + }) + + it('3.1: خطوة صفر', function () { + // [0 <- 5 -> 10] 0>> = [0 <- 5 -> 10] + + const a = Line.point.move(line, current, 0) + equal(a, 5) + }) + + it('3.2: الحركة للأمام داخل النطاق', function () { + // [0 <- 5 -> 10] 3>> = [0 <- 8 -> 10] + + const a = Line.point.move(line, current, 3) + equal(a, 8) + }) + + it('3.3: عدم تجاوز الحد الأقصى', function () { + // [0 <- 5 -> 10] 10>> = [0 <-> '10] + + const a = Line.point.move(line, current, 10) + equal(a, 10) + }) + + it('3.4: الحركة للخلف داخل النطاق', function () { + // [0 <- 5 -> 10] <<3 = [0 <- 2 -> 10] + + const a = Line.point.move(line, current, 3, true) + equal(a, 2) + }) + + it('3.5: عدم تجاوز الحد الأدنى', function () { + // [0 <- 5 -> 10] <<10 = [0' <-> 10] + + const a = Line.point.move(line, current, 10, true) + equal(a, 0) + }) + }) + + describe('4: حرّك القيمة على المستقيم السالب', function () { + before(function () { + line = Line.create.one({ dis: 10, neg: true }) + current = -5 + }) + + it('4.1: خطوة صفر', function () { + // [-10 <- -5 -> 0] <<0 = [-10 <- -5 -> 0] + + const a = Line.point.move(line, current, 0) + equal(a, -5) + }) + + it('4.2: الحركة للأمام داخل النطاق', function () { + // [-10 <- -5 -> 0] <<3 = [-10 <- -8 -> 0] + + const a = Line.point.move(line, current, 3) + equal(a, -8) + }) + + it('4.3: عدم تجاوز الحد الأقصى', function () { + // [-10 <- -5 -> 0] <<10 = [-10' <-> 0] + + const a = Line.point.move(line, current, 10) + equal(a, -10) + }) + + it('4.4: الحركة للخلف داخل النطاق', function () { + // [-10 <- -5 -> 0] 3>> = [-10 <- -2 -> 0] + + const a = Line.point.move(line, current, 3, true) + equal(a, -2) + }) + + it('4.5: عدم تجاوز الحد الأدنى', function () { + // [-10 <- -5 -> 0] 10>> = [-10 <-> '0] + + const a = Line.point.move(line, current, 10, true) + equal(a, 0) + }) + }) +} diff --git a/tests/line/func/time.js b/tests/line/func/time.js new file mode 100644 index 0000000..a996072 --- /dev/null +++ b/tests/line/func/time.js @@ -0,0 +1,188 @@ +import { equal } from 'assert/strict' +import { Line } from '../../../src/exports.js' + +let line + +export default function () { + describe('1: الحصول على وقت النقطة على مستقيم موجب', function () { + before(function () { + line = Line.create.one({ dis: 4 }) + }) + + it('1.1: قيمة المنتصف', function () { + // 2 / 4 = 0.5 + + const t = Line.time.to(line, 2) + equal(t, 0.5) + }) + + it('1.2: القيمة الأدنى', function () { + // 0 / 4 = 0 + + const t = Line.time.to(line, 0) + equal(t, 0) + }) + + it('1.3: القيمة القصوى', function () { + // 4 / 4 = 1 + + const t = Line.time.to(line, 4) + equal(t, 1) + }) + }) + + describe('2: الحصول على وقت النقطة على مستقيم سالب', function () { + before(function () { + line = Line.create.one({ dis: 4, neg: true }) + }) + + it('2.1: قيمة المنتصف', function () { + // 1 - (-2 / -4) = 1 - 0.5 = 0.5 + + const t = Line.time.to(line, -2) + equal(t, 0.5) + }) + + it('2.2: القيمة الأدنى', function () { + // 1 - (-4 / -4) = 1 - 1 = 0 + + const t = Line.time.to(line, -4) + equal(t, 0) + }) + + it('2.3: القيمة القصوى', function () { + // 1 - (0 / -4) = 1 - 0 = 1 + + const t = Line.time.to(line, 0) + equal(t, 1) + }) + }) + + describe('3: الحصول على نقطة الوقت على مستقيم موجب', function () { + before(function () { + line = Line.create.one({ dis: 6 }) + }) + + it('3.1: قيمة المنتصف', function () { + // 6 * 0.5 = 3 + + let p = Line.time.from(line, 0.5) + equal(p, 3) + + p = Line.time.from.center(line) + equal(p, 3) + }) + + it('3.2: القيمة الأدنى', function () { + // 6 * 0 = 0 + + const p = Line.time.from(line, 0) + equal(p, 0) + }) + + it('3.3: القيمة القصوى', function () { + // 6 * 1 = 6 + + const p = Line.time.from(line, 1) + equal(p, 6) + }) + + it('3.4: أصغر من القيمة الأدنى', function () { + // 6 * -1 = -6 + + const p = Line.time.from(line, -1) + equal(p, -6) + }) + + it('3.5: أكبر من القيمة القصوى', function () { + // 6 * 2 = 12 + + const p = Line.time.from(line, 2) + equal(p, 12) + }) + + it('3.6: التثبيت عند الحد الأدنى', function () { + // 6 * min(-1) = 6 * 0 = -0 + + let p = Line.time.from.clamp.min(line, -1) + equal(p, 0) + + p = Line.time.from.clamp(line, -1) + equal(p, 0) + }) + + it('3.7: التثبيت عند الحد الأقصى', function () { + // 6 * max(2) = 6 * 1 = 6 + + let p = Line.time.from.clamp.max(line, 2) + equal(p, 6) + + p = Line.time.from.clamp(line, 2) + equal(p, 6) + }) + }) + + describe('4: الحصول على نقطة الوقت على مستقيم سالب', function () { + before(function () { + line = Line.create.one({ dis: 7, neg: true }) + }) + + it('4.1: قيمة المنتصف', function () { + // -(7 - (7 * 0.5)) = -(7 - 3.5) = -3.5 + + let p = Line.time.from(line, 0.5) + equal(p, -3.5) + + p = Line.time.from.center(line) + equal(p, -3.5) + }) + + it('4.2: القيمة الأدنى', function () { + // -(7 - (7 * 0)) = -(7 - 0) = -7 + + const p = Line.time.from(line, 0) + equal(p, -7) + }) + + it('4.3: القيمة القصوى', function () { + // -(7 - (7 * 1)) = -(7 - 7) = -0 + + const p = Line.time.from(line, 1) + equal(p, 0) + }) + + it('4.4: أصغر من القيمة الأدنى', function () { + // -(7 - (7 * -1)) = -(7 + 7) = -14 + + const p = Line.time.from(line, -1) + equal(p, -14) + }) + + it('4.5: أكبر من القيمة القصوى', function () { + // -(7 - (7 * 2)) = -(7 - 14) = 7 + + const p = Line.time.from(line, 2) + equal(p, 7) + }) + + it('4.6: التثبيت عند الحد الأدنى', function () { + // -(7 - (7 * min(-1))) = -(7 - (7 * 0)) = -(7 - 0) = -7 + + let p = Line.time.from.clamp.min(line, -1) + equal(p, -7) + + p = Line.time.from.clamp(line, -1) + equal(p, -7) + }) + + it('4.7: التثبيت عند الحد الأقصى', function () { + // -(7 - (7 * max(2))) = -(7 - (7 * 1)) = -(7 - 7) = -0 + + let p = Line.time.from.clamp.max(line, 2) + equal(p, 0) + + p = Line.time.from.clamp(line, 2) + equal(p, 0) + }) + }) +} diff --git a/tests/line/line.test.js b/tests/line/line.test.js new file mode 100644 index 0000000..30ae3dd --- /dev/null +++ b/tests/line/line.test.js @@ -0,0 +1,19 @@ +import create from './func/create.js' +import point from './func/point.js' +import time from './func/time.js' + +describe('line', function () { + describe('func', function () { + describe('create', function () { + create() + }) + + describe('point', function () { + point() + }) + + describe('time', function () { + time() + }) + }) +}) diff --git a/tests/line/point.test.js b/tests/line/point.test.js deleted file mode 100644 index d4f08bd..0000000 --- a/tests/line/point.test.js +++ /dev/null @@ -1,171 +0,0 @@ -import { strictEqual } from 'assert' -import { Line } from '../../src/exports.js' - -let line -let current - -describe('1: تحقق مما إذا كانت القيمة داخل المستقيم الموجب', function () { - before(function () { - line = Line.create.one({ dis: 10 }) - }) - - it('1.1: خارج المستقيم - قبل', function () { - // -1 <-> [0 <-> 10] - - const a = Line.point.inside(line, -1) - strictEqual(a, false) - }) - - it('1.2: خارج المستقيم - بعد', function () { - // [0 <-> 10] <-> 11 - - const a = Line.point.inside(line, 11) - strictEqual(a, false) - }) - - it('1.3: داخل المستقيم', function () { - // [0 <-> 5 <-> 10] - - const a = Line.point.inside(line, 5) - strictEqual(a, true) - }) - - it('1.4: على بداية المستقيم', function () { - // [0' <-> 10] - - const a = Line.point.inside(line, 0) - strictEqual(a, true) - }) - - it('1.5: على نهاية المستقيم', function () { - // [0 <-> '10] - - const a = Line.point.inside(line, 10) - strictEqual(a, true) - }) -}) - -describe('2: تحقق مما إذا كانت القيمة داخل المستقيم السالب', function () { - before(function () { - line = Line.create.one({ dis: 10, neg: true }) - }) - - it('2.1: خارج المستقيم - قبل', function () { - // -11 <-> [-10 <-> 0] - - const a = Line.point.inside(line, -11) - strictEqual(a, false) - }) - - it('2.2: خارج المستقيم - بعد', function () { - // [-10 <-> 0] <-> 1 - - const a = Line.point.inside(line, 1) - strictEqual(a, false) - }) - - it('2.3: داخل المستقيم', function () { - // [-10 <-> -5 <-> 0] - - const a = Line.point.inside(line, -5) - strictEqual(a, true) - }) - - it('2.4: على بداية المستقيم', function () { - // [-10 <-> '0] - - const a = Line.point.inside(line, 0) - strictEqual(a, true) - }) - - it('2.5: على نهاية المستقيم', function () { - // [-10' <-> 0] - - const a = Line.point.inside(line, -10) - strictEqual(a, true) - }) -}) - -describe('3: حرّك القيمة على المستقيم الموجب', function () { - before(function () { - line = Line.create.one({ dis: 10 }) - current = 5 - }) - - it('3.1: خطوة صفر', function () { - // [0 <- 5 -> 10] 0>> = [0 <- 5 -> 10] - - const a = Line.point.move(line, current, 0) - strictEqual(a, 5) - }) - - it('3.2: الحركة للأمام داخل النطاق', function () { - // [0 <- 5 -> 10] 3>> = [0 <- 8 -> 10] - - const a = Line.point.move(line, current, 3) - strictEqual(a, 8) - }) - - it('3.3: عدم تجاوز الحد الأقصى', function () { - // [0 <- 5 -> 10] 10>> = [0 <-> '10] - - const a = Line.point.move(line, current, 10) - strictEqual(a, 10) - }) - - it('3.4: الحركة للخلف داخل النطاق', function () { - // [0 <- 5 -> 10] <<3 = [0 <- 2 -> 10] - - const a = Line.point.move(line, current, 3, true) - strictEqual(a, 2) - }) - - it('3.5: عدم تجاوز الحد الأدنى', function () { - // [0 <- 5 -> 10] <<10 = [0' <-> 10] - - const a = Line.point.move(line, current, 10, true) - strictEqual(a, 0) - }) -}) - -describe('4: حرّك القيمة على المستقيم السالب', function () { - before(function () { - line = Line.create.one({ dis: 10, neg: true }) - current = -5 - }) - - it('4.1: خطوة صفر', function () { - // [-10 <- -5 -> 0] <<0 = [-10 <- -5 -> 0] - - const a = Line.point.move(line, current, 0) - strictEqual(a, -5) - }) - - it('4.2: الحركة للأمام داخل النطاق', function () { - // [-10 <- -5 -> 0] <<3 = [-10 <- -8 -> 0] - - const a = Line.point.move(line, current, 3) - strictEqual(a, -8) - }) - - it('4.3: عدم تجاوز الحد الأقصى', function () { - // [-10 <- -5 -> 0] <<10 = [-10' <-> 0] - - const a = Line.point.move(line, current, 10) - strictEqual(a, -10) - }) - - it('4.4: الحركة للخلف داخل النطاق', function () { - // [-10 <- -5 -> 0] 3>> = [-10 <- -2 -> 0] - - const a = Line.point.move(line, current, 3, true) - strictEqual(a, -2) - }) - - it('4.5: عدم تجاوز الحد الأدنى', function () { - // [-10 <- -5 -> 0] 10>> = [-10 <-> '0] - - const a = Line.point.move(line, current, 10, true) - strictEqual(a, 0) - }) -}) diff --git a/tests/line/time.test.js b/tests/line/time.test.js deleted file mode 100644 index 5dd9df8..0000000 --- a/tests/line/time.test.js +++ /dev/null @@ -1,186 +0,0 @@ -import { strictEqual } from 'assert' -import { Line } from '../../src/exports.js' - -let line - -describe('1: الحصول على وقت النقطة على مستقيم موجب', function () { - before(function () { - line = Line.create.one({ dis: 4 }) - }) - - it('1.1: قيمة المنتصف', function () { - // 2 / 4 = 0.5 - - const t = Line.time.to(line, 2) - strictEqual(t, 0.5) - }) - - it('1.2: القيمة الأدنى', function () { - // 0 / 4 = 0 - - const t = Line.time.to(line, 0) - strictEqual(t, 0) - }) - - it('1.3: القيمة القصوى', function () { - // 4 / 4 = 1 - - const t = Line.time.to(line, 4) - strictEqual(t, 1) - }) -}) - -describe('2: الحصول على وقت النقطة على مستقيم سالب', function () { - before(function () { - line = Line.create.one({ dis: 4, neg: true }) - }) - - it('2.1: قيمة المنتصف', function () { - // 1 - (-2 / -4) = 1 - 0.5 = 0.5 - - const t = Line.time.to(line, -2) - strictEqual(t, 0.5) - }) - - it('2.2: القيمة الأدنى', function () { - // 1 - (-4 / -4) = 1 - 1 = 0 - - const t = Line.time.to(line, -4) - strictEqual(t, 0) - }) - - it('2.3: القيمة القصوى', function () { - // 1 - (0 / -4) = 1 - 0 = 1 - - const t = Line.time.to(line, 0) - strictEqual(t, 1) - }) -}) - -describe('3: الحصول على نقطة الوقت على مستقيم موجب', function () { - before(function () { - line = Line.create.one({ dis: 6 }) - }) - - it('3.1: قيمة المنتصف', function () { - // 6 * 0.5 = 3 - - let p = Line.time.from(line, 0.5) - strictEqual(p, 3) - - p = Line.time.from.center(line) - strictEqual(p, 3) - }) - - it('3.2: القيمة الأدنى', function () { - // 6 * 0 = 0 - - const p = Line.time.from(line, 0) - strictEqual(p, 0) - }) - - it('3.3: القيمة القصوى', function () { - // 6 * 1 = 6 - - const p = Line.time.from(line, 1) - strictEqual(p, 6) - }) - - it('3.4: أصغر من القيمة الأدنى', function () { - // 6 * -1 = -6 - - const p = Line.time.from(line, -1) - strictEqual(p, -6) - }) - - it('3.5: أكبر من القيمة القصوى', function () { - // 6 * 2 = 12 - - const p = Line.time.from(line, 2) - strictEqual(p, 12) - }) - - it('3.6: التثبيت عند الحد الأدنى', function () { - // 6 * min(-1) = 6 * 0 = -0 - - let p = Line.time.from.clamp.min(line, -1) - strictEqual(p, 0) - - p = Line.time.from.clamp(line, -1) - strictEqual(p, 0) - }) - - it('3.7: التثبيت عند الحد الأقصى', function () { - // 6 * max(2) = 6 * 1 = 6 - - let p = Line.time.from.clamp.max(line, 2) - strictEqual(p, 6) - - p = Line.time.from.clamp(line, 2) - strictEqual(p, 6) - }) -}) - -describe('4: الحصول على نقطة الوقت على مستقيم سالب', function () { - before(function () { - line = Line.create.one({ dis: 7, neg: true }) - }) - - it('4.1: قيمة المنتصف', function () { - // -(7 - (7 * 0.5)) = -(7 - 3.5) = -3.5 - - let p = Line.time.from(line, 0.5) - strictEqual(p, -3.5) - - p = Line.time.from.center(line) - strictEqual(p, -3.5) - }) - - it('4.2: القيمة الأدنى', function () { - // -(7 - (7 * 0)) = -(7 - 0) = -7 - - const p = Line.time.from(line, 0) - strictEqual(p, -7) - }) - - it('4.3: القيمة القصوى', function () { - // -(7 - (7 * 1)) = -(7 - 7) = -0 - - const p = Line.time.from(line, 1) - strictEqual(p, 0) - }) - - it('4.4: أصغر من القيمة الأدنى', function () { - // -(7 - (7 * -1)) = -(7 + 7) = -14 - - const p = Line.time.from(line, -1) - strictEqual(p, -14) - }) - - it('4.5: أكبر من القيمة القصوى', function () { - // -(7 - (7 * 2)) = -(7 - 14) = 7 - - const p = Line.time.from(line, 2) - strictEqual(p, 7) - }) - - it('4.6: التثبيت عند الحد الأدنى', function () { - // -(7 - (7 * min(-1))) = -(7 - (7 * 0)) = -(7 - 0) = -7 - - let p = Line.time.from.clamp.min(line, -1) - strictEqual(p, -7) - - p = Line.time.from.clamp(line, -1) - strictEqual(p, -7) - }) - - it('4.7: التثبيت عند الحد الأقصى', function () { - // -(7 - (7 * max(2))) = -(7 - (7 * 1)) = -(7 - 7) = -0 - - let p = Line.time.from.clamp.max(line, 2) - strictEqual(p, 0) - - p = Line.time.from.clamp(line, 2) - strictEqual(p, 0) - }) -})