Skip to content

Commit

Permalink
feat: Add support for primitive object wrappers (fixes #295) (#296)
Browse files Browse the repository at this point in the history
* Added support for primitive object wrappers (fixes #295)

* Updated tests by instructing ESLint to ignore primitive object wrappers.
Updated readme to reflect the added support for primitive object wrappers.
Updated package.json to include myself as contributor.

* Add Oxford comma.

* Add missing commas.

Co-authored-by: Sebastian Mares <mail@smares.de>
Co-authored-by: Golo Roden <golo.roden@thenativeweb.io>
  • Loading branch information
3 people authored May 30, 2021
1 parent 066fd38 commit 5ae115f
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 11 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ The `boolean` function considers the following values to be equivalent to `true`
- `'1'` (string)
- `1` (number)

_Please note that if you provide a string, it will be trimmed._
In addition to the primitive types mentioned above, boolean also supports their object wrappers `Boolean`, `String`, and `Number`.

_Please note that if you provide a `string` or `String` object, it will be trimmed._

All other values, including `undefined` and `null` are considered to be `false`.

Expand Down
20 changes: 10 additions & 10 deletions lib/boolean.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
const boolean = function (value: any): boolean {
if (typeof value === 'string') {
return [ 'true', 't', 'yes', 'y', 'on', '1' ].includes(value.trim().toLowerCase());
}
switch (Object.prototype.toString.call(value)) {
case '[object String]':
return [ 'true', 't', 'yes', 'y', 'on', '1' ].includes(value.trim().toLowerCase());

if (typeof value === 'number') {
return value === 1;
}
case '[object Number]':
return value.valueOf() === 1;

if (typeof value === 'boolean') {
return value;
}
case '[object Boolean]':
return value.valueOf();

return false;
default:
return false;
}
};

export { boolean };
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
{
"name": "Thomas Schaaf",
"email": "schaaf@komola.de"
},
{
"name": "Sebastian Mares",
"email": "camil.sebastian@mares.email"
}
],
"main": "build/lib/boolean.js",
Expand Down
145 changes: 145 additions & 0 deletions test/unit/booleanTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ suite('boolean', (): void => {
test('false returns false.', async (): Promise<void> => {
assert.that(boolean(false)).is.false();
});

test('Boolean(true) returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new Boolean(true))).is.true();
});

test('Boolean(false) returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new Boolean(false))).is.false();
});
});

suite('string', (): void => {
Expand Down Expand Up @@ -129,6 +139,126 @@ suite('boolean', (): void => {
test('trims whitespace.', async (): Promise<void> => {
assert.that(boolean(' true ')).is.true();
});

test('String("true") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('true'))).is.true();
});

test('String("false") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('false'))).is.false();
});

test('String("TRUE") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('TRUE'))).is.true();
});

test('String("FALSE") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('FALSE'))).is.false();
});

test('String("t") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('t'))).is.true();
});

test('String("f") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('f'))).is.false();
});

test('String("T") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('T'))).is.true();
});

test('String("F") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('F'))).is.false();
});

test('String("yes") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('yes'))).is.true();
});

test('String("no") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('no'))).is.false();
});

test('String("YES") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('YES'))).is.true();
});

test('String("NO") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('NO'))).is.false();
});

test('String("y") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('y'))).is.true();
});

test('String("n") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('n'))).is.false();
});

test('String("Y") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('Y'))).is.true();
});

test('String("N") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('N'))).is.false();
});

test('String("on") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('on'))).is.true();
});

test('String("ON") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('ON'))).is.true();
});

test('String("1") returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('1'))).is.true();
});

test('String("0") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('0'))).is.false();
});

test('String("contains-the-letter-t") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('contains-the-letter-t'))).is.false();
});

test('String("contains-the-word-yes") returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('noyesno'))).is.false();
});

test('arbitrary string object wrapper string returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String('123'))).is.false();
});

test('trims whitespace in string object wrapper.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new String(' true '))).is.true();
});
});

suite('number', (): void => {
Expand All @@ -143,5 +273,20 @@ suite('boolean', (): void => {
test('123 returns false.', async (): Promise<void> => {
assert.that(boolean(123)).is.false();
});

test('Number(1) returns true.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new Number(1))).is.true();
});

test('Number(0) returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new Number(0))).is.false();
});

test('Number(123) returns false.', async (): Promise<void> => {
// eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins
assert.that(boolean(new Number(123))).is.false();
});
});
});

0 comments on commit 5ae115f

Please sign in to comment.