Skip to content

Commit b2a750d

Browse files
committed
possible fix for #38 , make mask function work as the test spec says it should
1 parent d8f7a06 commit b2a750d

3 files changed

Lines changed: 198 additions & 20 deletions

File tree

src/mask.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ export default function mask(
1313
if (precision < 0) { precision = 0; } // precision cannot be negative
1414
if (precision > 20) { precision = 20; } // precision cannot be greater than 20
1515

16+
if (value === undefined || value === null || value === '') {
17+
return { value: 0, maskedValue: '' };
18+
}
19+
1620
if (!value) {
1721
return {
1822
value: 0,

tests/example.spec.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

tests/mask.spec.ts

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
import { test, expect } from '@playwright/test';
2+
import mask from '../src/mask';
3+
4+
test.describe('mask', () => {
5+
6+
test('should return empty strings when value is not set', async () => {
7+
const { maskedValue, value } = mask();
8+
expect(maskedValue).toBe("");
9+
expect(value).toBe(0);
10+
});
11+
12+
test('should return empty strings when value is empty string', async () => {
13+
const { maskedValue, value } = mask("");
14+
expect(maskedValue).toBe("");
15+
expect(value).toBe(0);
16+
});
17+
18+
test('should return empty strings when value is null', async () => {
19+
const { maskedValue, value } = mask(null);
20+
expect(maskedValue).toBe("");
21+
expect(value).toBe(0);
22+
});
23+
24+
test('should change "0" to "0.00"', async () => {
25+
const { maskedValue, value } = mask("0");
26+
expect(maskedValue).toBe("0.00");
27+
expect(value).toBe(0);
28+
});
29+
30+
test('should change "00" to "0.00"', async () => {
31+
const { maskedValue, value } = mask("00");
32+
expect(maskedValue).toBe("0.00");
33+
expect(value).toBe(0);
34+
});
35+
36+
test('should change "000" to "0.00"', async () => {
37+
const { maskedValue, value } = mask("000");
38+
expect(maskedValue).toBe("0.00");
39+
expect(value).toBe(0);
40+
});
41+
42+
test('should change "0000" to "0.00"', async () => {
43+
const { maskedValue, value } = mask("0000");
44+
expect(maskedValue).toBe("0.00");
45+
expect(value).toBe(0);
46+
});
47+
48+
test('should change "0001" to "0.01"', async () => {
49+
const { maskedValue, value } = mask("0001");
50+
expect(maskedValue).toBe("0.01");
51+
expect(value).toBe(0.01);
52+
});
53+
54+
test('should change "1001" to "10.01"', async () => {
55+
const { maskedValue, value } = mask("1001");
56+
expect(maskedValue).toBe("10.01");
57+
expect(value).toBe(10.01);
58+
});
59+
60+
test('should change "123456789" to "1,234,567.89"', async () => {
61+
const { maskedValue, value } = mask("123456789");
62+
expect(maskedValue).toBe("1,234,567.89");
63+
expect(value).toBe(1234567.89);
64+
});
65+
66+
test.describe('with separators', () => {
67+
68+
test('decimal:"," thousand:"." should change "123456789" to "1.234.567,89"', async () => {
69+
const { maskedValue, value } = mask("123456789", 2, ",", ".");
70+
expect(maskedValue).toBe("1.234.567,89");
71+
expect(value).toBe(1234567.89);
72+
});
73+
74+
test('zero length thousand separator should change "123456789" to "1234567.89"', async () => {
75+
const { maskedValue, value } = mask("123456789", 2, ".", "");
76+
expect(maskedValue).toBe("1234567.89");
77+
expect(value).toBe(1234567.89);
78+
});
79+
80+
test('zero length decimal separator should change "123456789" to "1,234,56789"', async () => {
81+
const { maskedValue, value } = mask("123456789", 2, "", ",");
82+
expect(maskedValue).toBe("1,234,56789");
83+
expect(value).toBe(1234567.89);
84+
});
85+
86+
});
87+
88+
test.describe('with precision', () => {
89+
90+
test('set to string value "3" should change "123456789" to "123,456.789"', async () => {
91+
const { maskedValue, value } = mask("123456789", "3");
92+
expect(maskedValue).toBe("123,456.789");
93+
expect(value).toBe(123456.789);
94+
});
95+
96+
test('set to 3 should change "123456789" to "123,456.789"', async () => {
97+
const { maskedValue, value } = mask("123456789", 3);
98+
expect(maskedValue).toBe("123,456.789");
99+
expect(value).toBe(123456.789);
100+
});
101+
102+
test('set to 0 should change "123456789" to "123,456,789"', async () => {
103+
const { maskedValue, value } = mask("123456789", 0);
104+
expect(maskedValue).toBe("123,456,789");
105+
expect(value).toBe(123456789);
106+
});
107+
108+
});
109+
110+
test.describe('negative numbers', () => {
111+
112+
test('all "-" should be stripped out if allowNegative is false', async () => {
113+
expect(mask("123456").maskedValue).toBe("1,234.56");
114+
expect(mask("-123456").maskedValue).toBe("1,234.56");
115+
expect(mask("--123456").maskedValue).toBe("1,234.56");
116+
expect(mask("--123--456").maskedValue).toBe("1,234.56");
117+
expect(mask("--123--456--").maskedValue).toBe("1,234.56");
118+
});
119+
120+
test('single "-" anywhere in the string should result in a negative masked number', async () => {
121+
expect(mask("-123456", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
122+
expect(mask("123-456", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
123+
expect(mask("123456-", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
124+
});
125+
126+
test('single "-" anywhere in the string should result in a negative unmasked number', async () => {
127+
expect(mask("-123456", "2", ".", ",", true).value).toBe(-1234.56);
128+
expect(mask("123-456", "2", ".", ",", true).value).toBe(-1234.56);
129+
expect(mask("123456-", "2", ".", ",", true).value).toBe(-1234.56);
130+
});
131+
132+
test('no or even number of "-" should result in a positive number', async () => {
133+
expect(mask("123456", "2", ".", ",", true).maskedValue).toBe("1,234.56");
134+
expect(mask("--123456", "2", ".", ",", true).maskedValue).toBe("1,234.56");
135+
expect(mask("123--456", "2", ".", ",", true).maskedValue).toBe("1,234.56");
136+
expect(mask("123456--", "2", ".", ",", true).maskedValue).toBe("1,234.56");
137+
expect(mask("--123456--", "2", ".", ",", true).maskedValue).toBe("1,234.56");
138+
expect(mask("--123--456--", "2", ".", ",", true).maskedValue).toBe("1,234.56");
139+
expect(mask("--1--234--56--", "2", ".", ",", true).maskedValue).toBe("1,234.56");
140+
});
141+
142+
test('odd number of "-" should result in a negative number', async () => {
143+
expect(mask("-123456", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
144+
expect(mask("123-456", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
145+
expect(mask("123456-", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
146+
expect(mask("-123-456-", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
147+
expect(mask("-1-23-45-6-", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
148+
expect(mask("-1-2-3-4-5-6-", "2", ".", ",", true).maskedValue).toBe("-1,234.56");
149+
});
150+
151+
test('0 is never negative', async () => {
152+
expect(mask("0", "2", ".", ",", true).maskedValue).toBe("0.00");
153+
expect(mask("-0", "2", ".", ",", true).maskedValue).toBe("0.00");
154+
expect(mask("-0-", "2", ".", ",", true).maskedValue).toBe("0.00");
155+
expect(mask("--0-", "2", ".", ",", true).maskedValue).toBe("0.00");
156+
});
157+
158+
test('just "-" should result in 0.00', async () => {
159+
expect(mask("-", "2", ".", ",", true).maskedValue).toBe("0.00");
160+
});
161+
162+
});
163+
164+
test.describe('with currency symbol', () => {
165+
166+
test('"$" prefix should change "0" to "$0.00"', async () => {
167+
expect(mask("0", "2", ".", ",", true, "$", "").maskedValue).toBe("$0.00");
168+
});
169+
170+
test('"kr" suffix should change "0" to "0.00kr"', async () => {
171+
expect(mask("0", "2", ".", ",", true, "", "kr").maskedValue).toBe("0.00kr");
172+
});
173+
174+
test('can have both a prefix and a suffix', async () => {
175+
expect(mask("0", "2", ".", ",", true, "$", "kr").maskedValue).toBe("$0.00kr");
176+
});
177+
178+
test('does not strip whitespaces between amount and symbol', async () => {
179+
expect(mask("0", "2", ".", ",", true, "$ ", "").maskedValue).toBe("$ 0.00");
180+
expect(mask("0", "2", ".", ",", true, "", " kr").maskedValue).toBe("0.00 kr");
181+
});
182+
183+
test('strips whitespaces before and after value', async () => {
184+
expect(mask("0", "2", ".", ",", true, " $ ", "").maskedValue).toBe("$ 0.00");
185+
expect(mask("0", "2", ".", ",", true, "", " kr ").maskedValue).toBe("0.00 kr");
186+
});
187+
188+
test('"-" should come before the prefix', async () => {
189+
expect(mask("-20.00", "2", ".", ",", true, "$", "").maskedValue).toBe("-$20.00");
190+
});
191+
192+
});
193+
194+
});

0 commit comments

Comments
 (0)