From 42e0fb609a40160e27e90e765d5da2f6d8ef2e54 Mon Sep 17 00:00:00 2001 From: chenshenhai Date: Wed, 16 Jun 2021 15:06:23 +0800 Subject: [PATCH] feat: @idraw/core limit element num and angle --- docs/todo/core.md | 2 +- jest.cover.js | 21 +++++++++++++ package.json | 1 + packages/core/__tests__/lib/element.test.ts | 33 +++++++++++++++++++++ packages/core/__tests__/lib/value.test.ts | 33 +++++++++++++++++++++ packages/core/src/index.ts | 6 +++- packages/core/src/lib/element.ts | 7 +++-- packages/core/src/lib/value.ts | 9 ++++++ 8 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 jest.cover.js create mode 100644 packages/core/__tests__/lib/element.test.ts create mode 100644 packages/core/__tests__/lib/value.test.ts create mode 100644 packages/core/src/lib/value.ts diff --git a/docs/todo/core.md b/docs/todo/core.md index 26c2ae1..fadd6e3 100644 --- a/docs/todo/core.md +++ b/docs/todo/core.md @@ -1,6 +1,6 @@ # @idraw/core -* [] Reset board's size +* [x] Reset board's size * [] Keep two decimals * [] Limit element's angle between -360~360 deg * [] Check if the element and elements' attribute of desc is supported diff --git a/jest.cover.js b/jest.cover.js new file mode 100644 index 0000000..e0c3776 --- /dev/null +++ b/jest.cover.js @@ -0,0 +1,21 @@ +const config = require('./jest.config'); + +module.exports = { + ...config, + ...{ + "collectCoverage": true, + "coverageReporters": [ + "clover", + // "html", + "text-summary" + ], + "coverageThreshold": { + "global": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + } + }, + } +} \ No newline at end of file diff --git a/package.json b/package.json index 4610fce..d9c3ee0 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "init": "lerna bootstrap --npm-client=cnpm", "clear": "rm -rf ./packages/*/dist/ & rm -rf ./packages/*/node_modules/", "jest": "jest --config jest.config.js", + "cover": "jest --config jest.cover.js", "beforetest": "lerna bootstrap --no-ci && npm run build", "test": "npm run e2e && npm run jest", "serve": "http-server ./", diff --git a/packages/core/__tests__/lib/element.test.ts b/packages/core/__tests__/lib/element.test.ts new file mode 100644 index 0000000..60abf6f --- /dev/null +++ b/packages/core/__tests__/lib/element.test.ts @@ -0,0 +1,33 @@ +import { TypeData } from '@idraw/types'; +import Core from './../../src'; +import { getData } from './../data'; +import { Element } from './../../src/lib/element'; + +describe("./lib/element", () => { + document.body.innerHTML = ` +
+ `; + const opts = { + width: 600, + height: 400, + contextWidth: 600, + contextHeight: 400, + devicePixelRatio: 4 + } + const mount = document.querySelector('#mount') as HTMLDivElement; + const core = new Core(mount, opts); + const ctx = core.__getBoardContext(); + const data = getData(); + + test('initData', async () => { + const element = new Element(ctx); + const newData = element.initData(data as TypeData); + expect(newData.elements[0].uuid.length).toStrictEqual(36); + }); + + +}); + + + + diff --git a/packages/core/__tests__/lib/value.test.ts b/packages/core/__tests__/lib/value.test.ts new file mode 100644 index 0000000..3e75d7e --- /dev/null +++ b/packages/core/__tests__/lib/value.test.ts @@ -0,0 +1,33 @@ +import { limitNum, limitAngle } from './../../src/lib/value'; + +describe("./lib/value", () => { + + test('limitNum', () => { + + const num1 = limitNum(1 / 3); + expect(num1).toStrictEqual(0.33); + + const num2 = limitNum(1 / 6); + expect(num2).toStrictEqual(0.17); + + const num3 = limitNum(1234 * 1); + expect(num3).toStrictEqual(1234); + + }); + + + test('limitAngle', () => { + + const num1 = limitAngle(372); + expect(num1).toStrictEqual(12); + + const num2 = limitAngle(-372); + expect(num2).toStrictEqual(-12); + + const num3 = limitAngle(-372.3333333); + expect(num3).toStrictEqual(-12.33); + + const num4 = limitAngle(372.66666666); + expect(num4).toStrictEqual(12.67); + }); +}) \ No newline at end of file diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 49a8d9e..3829614 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,7 +2,7 @@ import { TypeData, TypePoint, TypeBoardSizeOptions, TypeHelperWrapperDotDirection, TypeConfig, TypeConfigStrict, - TypeElement, TypeElemDesc, + TypeElement, TypeElemDesc, TypeContext, TypeCoreOptions, TypeScreenContext, } from '@idraw/types'; import Board from '@idraw/board'; @@ -215,6 +215,10 @@ class Core { this[_coreEvent].off(key, callback); } + __getBoardContext(): TypeContext { + return this[_board].getContext(); + } + __getDisplayContext(): CanvasRenderingContext2D { return this[_board].getDisplayContext() } diff --git a/packages/core/src/lib/element.ts b/packages/core/src/lib/element.ts index cb467bb..dd2954e 100644 --- a/packages/core/src/lib/element.ts +++ b/packages/core/src/lib/element.ts @@ -9,6 +9,7 @@ import { import util from '@idraw/util'; import { rotateElement } from './transform'; import { calcRadian, calcElementCenter, parseRadianToAngle } from './calculate'; +import { limitAngle, limitNum } from './value'; const { createUUID } = util.uuid; @@ -167,9 +168,9 @@ export class Element { } return { - width: elem.w, - height: elem.h, - angle: elem.angle || 0, + width: limitNum(elem.w), + height: limitNum(elem.h), + angle: limitAngle(elem.angle || 0), } } diff --git a/packages/core/src/lib/value.ts b/packages/core/src/lib/value.ts new file mode 100644 index 0000000..06b7297 --- /dev/null +++ b/packages/core/src/lib/value.ts @@ -0,0 +1,9 @@ + +export function limitNum(num: number): number { + const numStr: string = num.toFixed(2); + return parseFloat(numStr); +} + +export function limitAngle(angle: number): number { + return limitNum(angle % 360); +} \ No newline at end of file