Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 100 additions & 30 deletions src/__tests__/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import {nullishToOptional, formatNumberToString, Language} from '../utils';
import {nullishToOptional, formatNumberToString} from '../utils';

enum AppLanguage {
Norwegian = 'nb',
English = 'en',
Nynorsk = 'nn',
}

enum PlannerWebLanguage {
Norwegian = 'no',
English = 'en-US',
Nynorsk = 'nn',
}

describe('nullishToOptional', () => {
it('should return undefined for nullish values', () => {
Expand All @@ -14,38 +26,96 @@ describe('nullishToOptional', () => {
});
});

describe('formatNumberToString', () => {
it('should format integer without decimals by default', () => {
expect(formatNumberToString(10, Language.Norwegian)).toBe('10');
});
function runFormatNumberToStringTests(
Enum: typeof AppLanguage | typeof PlannerWebLanguage,
enumName: string,
) {
describe(`formatNumberToString with ${enumName}`, () => {
it('should format integer without decimals by default', () => {
expect(formatNumberToString(10, Enum.Norwegian)).toBe('10');
});

it('should format number with one decimal to two decimals by default', () => {
expect(formatNumberToString(10.1, Language.Norwegian)).toBe('10,10');
});
it('should format number with one decimal to two decimals by default', () => {
expect(formatNumberToString(10.1, Enum.Norwegian)).toBe('10,10');
});

it('should round and format number with more than two decimals', () => {
expect(formatNumberToString(10.125, Language.Norwegian)).toBe('10,13');
expect(formatNumberToString(10.999, Language.Norwegian)).toBe('11');
});
it('should round and format number with more than two decimals', () => {
expect(formatNumberToString(10.125, Enum.Norwegian)).toBe('10,13');
expect(formatNumberToString(10.999, Enum.Norwegian)).toBe('11');
});

it('should use minDigits and maxDigits when provided', () => {
expect(formatNumberToString(10.1, Language.Norwegian, 1, 1)).toBe('10,1');
expect(formatNumberToString(10.1, Language.Norwegian, 3, 3)).toBe('10,100');
expect(formatNumberToString(10, Language.Norwegian, 1, 1)).toBe('10,0');
expect(formatNumberToString(10, Language.Norwegian, 0, 3)).toBe('10');
});
it('should use minDigits and maxDigits when provided', () => {
expect(formatNumberToString(10.1, Enum.Norwegian, 1, 1)).toBe('10,1');
expect(formatNumberToString(10.1, Enum.Norwegian, 3, 3)).toBe('10,100');
expect(formatNumberToString(10, Enum.Norwegian, 1, 1)).toBe('10,0');
expect(formatNumberToString(10, Enum.Norwegian, 0, 3)).toBe('10');
});

it('should prioritize maxDigits if it is less than minDigits', () => {
expect(formatNumberToString(10.1234, Language.Norwegian, 3, 1)).toBe(
'10,1',
);
});
it('should prioritize maxDigits if it is less than minDigits', () => {
expect(formatNumberToString(10.1234, Enum.Norwegian, 3, 1)).toBe('10,1');
});

it('should use correct locale for formatting', () => {
expect(formatNumberToString(1234.5, Enum.English)).toBe('1,234.50');
expect(formatNumberToString(1234.5, Enum.Norwegian)).toBe(
'1\u00a0234,50',
);
});

it('should use correct locale for formatting', () => {
expect(formatNumberToString(1234.5, Language.English)).toBe('1,234.50');
// Norwegian locale uses non-breaking space as thousand separator
expect(formatNumberToString(1234.5, Language.Norwegian)).toBe(
'1\u00a0234,50',
);
it('should show decimals on whole numbers if minDigits is set', () => {
expect(formatNumberToString(11.0, Enum.Norwegian, 2)).toBe('11,00');
expect(formatNumberToString(11, Enum.Norwegian, 2)).toBe('11,00');
expect(formatNumberToString(11.0, Enum.Norwegian, 2, 3)).toBe('11,00');
expect(formatNumberToString(11, Enum.Norwegian, 2, 3)).toBe('11,00');
});

it('should show number of decimals up to given maxDigits on decimal numbers', () => {
expect(formatNumberToString(10.2, Enum.Norwegian, undefined, 3)).toBe(
'10,20',
);
expect(formatNumberToString(10.23, Enum.Norwegian, undefined, 3)).toBe(
'10,23',
);
expect(formatNumberToString(10.233, Enum.Norwegian, undefined, 3)).toBe(
'10,233',
);
expect(formatNumberToString(10.237, Enum.Norwegian, undefined, 3)).toBe(
'10,237',
);
expect(formatNumberToString(10.2346, Enum.Norwegian, undefined, 3)).toBe(
'10,235',
);
});

it('should always round to whole number when minDigits and maxDigits are 0', () => {
expect(formatNumberToString(10.2, Enum.Norwegian, 0, 0)).toBe('10');
expect(formatNumberToString(10.23, Enum.Norwegian, 0, 0)).toBe('10');
expect(formatNumberToString(10.233, Enum.Norwegian, 0, 0)).toBe('10');
expect(formatNumberToString(10.237, Enum.Norwegian, 0, 0)).toBe('10');
});

it('should always show 3 digits', () => {
expect(formatNumberToString(10.2, Enum.Norwegian, 3, 3)).toBe('10,200');
expect(formatNumberToString(10.23, Enum.Norwegian, 3, 3)).toBe('10,230');
expect(formatNumberToString(10.233, Enum.Norwegian, 3, 3)).toBe('10,233');
expect(formatNumberToString(10.2376, Enum.Norwegian, 3, 3)).toBe(
'10,238',
);
});

it('should always show 1 digit', () => {
expect(formatNumberToString(10, Enum.Norwegian, 1, 1)).toBe('10,0');
expect(formatNumberToString(10.23, Enum.Norwegian, 1, 1)).toBe('10,2');
expect(formatNumberToString(10.233, Enum.Norwegian, 1, 1)).toBe('10,2');
});

it('should show max 1 digit', () => {
expect(formatNumberToString(10, Enum.Norwegian, 0, 1)).toBe('10');
expect(formatNumberToString(10.2, Enum.Norwegian, 0, 1)).toBe('10,2');
expect(formatNumberToString(10.233, Enum.Norwegian, 0, 1)).toBe('10,2');
});
});
});
}

runFormatNumberToStringTests(AppLanguage, 'AppLanguage');
runFormatNumberToStringTests(PlannerWebLanguage, 'PlannerWebLanguage');
9 changes: 1 addition & 8 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,6 @@ export function nullishToOptional<T>(
return value ?? undefined;
}

// Language should be imported from translations if that is also moved to utils one day.
export enum Language {
Norwegian = 'nb',
English = 'en',
Nynorsk = 'nn',
}

/**
* A utility function to format a number to a string with a given
* number of decimals.
Expand All @@ -41,7 +34,7 @@ export enum Language {
*/
export const formatNumberToString = (
num: number,
language: Language,
language: Intl.LocalesArgument,
minDigits: number = 0,
maxDigits: number = 2,
) => {
Expand Down