Skip to content

Commit

Permalink
feat: add mergeMargin() function (#114)
Browse files Browse the repository at this point in the history
* feat: add mergeMargin()

* fix: typings

* refactor: address chris' comments
  • Loading branch information
kristw authored and zhaoyongjie committed Nov 25, 2021
1 parent 4a97740 commit 747368c
Show file tree
Hide file tree
Showing 4 changed files with 193 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { default as getTextDimension } from './getTextDimension';
export { default as computeMaxFontSize } from './computeMaxFontSize';
export { default as mergeMargin } from './mergeMargin';
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Margin } from './types';

export default function mergeMargin(
margin1: Partial<Margin> = {},
margin2: Partial<Margin> = {},
mode: 'expand' | 'shrink' = 'expand',
) {
const { top = 0, left = 0, bottom = 0, right = 0 } = margin1;
const { top: top2 = 0, left: left2 = 0, bottom: bottom2 = 0, right: right2 = 0 } = margin2;

const func = mode === 'expand' ? Math.max : Math.min;

return {
bottom: func(bottom, bottom2),
left: func(left, left2),
right: func(right, right2),
top: func(top, top2),
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,10 @@ export interface TextStyle {
fontWeight?: string | number;
letterSpacing?: string | number;
}

export interface Margin {
top: number;
left: number;
bottom: number;
right: number;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import { mergeMargin } from '../src';

describe('mergeMargin(margin1, margin2, mode?)', () => {
it('combines two given margin', () => {
expect(
mergeMargin(
{
top: 1,
left: 1,
bottom: 2,
right: 2,
},
{
top: 2,
left: 2,
bottom: 1,
right: 1,
},
),
).toEqual({
top: 2,
left: 2,
bottom: 2,
right: 2,
});
});
describe('default values', () => {
it('works if margin1 is not defined', () => {
expect(
mergeMargin(undefined, {
top: 2,
left: 2,
bottom: 1,
right: 1,
}),
).toEqual({
top: 2,
left: 2,
bottom: 1,
right: 1,
});
});
it('works if margin2 is not defined', () => {
expect(
mergeMargin(
{
top: 1,
left: 1,
bottom: 2,
right: 2,
},
undefined,
),
).toEqual({
top: 1,
left: 1,
bottom: 2,
right: 2,
});
});
it('use 0 for the side that is not specified', () => {
expect(mergeMargin({}, {})).toEqual({
top: 0,
left: 0,
bottom: 0,
right: 0,
});
});
});
describe('mode', () => {
it('if mode=expand, returns the larger margin for each side', () => {
expect(
mergeMargin(
{
top: 1,
left: 1,
bottom: 2,
right: 2,
},
{
top: 2,
left: 2,
bottom: 1,
right: 1,
},
'expand',
),
).toEqual({
top: 2,
left: 2,
bottom: 2,
right: 2,
});
});
it('if mode=shrink, returns the smaller margin for each side', () => {
expect(
mergeMargin(
{
top: 1,
left: 1,
bottom: 2,
right: 2,
},
{
top: 2,
left: 2,
bottom: 1,
right: 1,
},
'shrink',
),
).toEqual({
top: 1,
left: 1,
bottom: 1,
right: 1,
});
});
it('expand by default', () => {
expect(
mergeMargin(
{
top: 1,
left: 1,
bottom: 2,
right: 2,
},
{
top: 2,
left: 2,
bottom: 1,
right: 1,
},
),
).toEqual({
top: 2,
left: 2,
bottom: 2,
right: 2,
});
});
});
it('works correctly for negative margins', () => {
expect(
mergeMargin(
{
top: -3,
left: -3,
bottom: -2,
right: -2,
},
{
top: -2,
left: -2,
bottom: 0,
right: -1,
},
),
).toEqual({
top: -2,
left: -2,
bottom: 0,
right: -1,
});
});
});

0 comments on commit 747368c

Please sign in to comment.