Skip to content
This repository was archived by the owner on Oct 20, 2021. It is now read-only.

Commit eed92de

Browse files
feat(rules): Added Countable rule
1 parent c3f3922 commit eed92de

6 files changed

Lines changed: 110 additions & 3 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ The library can be loaded either as a standalone script, or through an [AMD](htt
9999
- [Cntrl](docs/cntrl.md)
100100
- [Consonant](docs/consonant.md)
101101
- [Contains](docs/contains.md)
102+
- [Countable](docs/countable.md)
102103
- [CountryCode](docs/country-code.md)
103104
- [Cpf](docs/cpf.md)
104105
- [CreditCard](docs/credit-card.md)

awesome-validator.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/countable.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Countable
2+
3+
Validates if the input is countable.
4+
5+
Valid values:
6+
7+
```js
8+
validator.countable().validate([]);
9+
validator.countable().validate(new Set());
10+
validator.countable().validate(new Map());
11+
```
12+
13+
Invalid values:
14+
15+
```js
16+
validator.countable().validate('foo');
17+
validator.countable().validate(null);
18+
validator.countable().validate(undefined);
19+
validator.countable().validate(false);
20+
validator.countable().validate(0);
21+
validator.countable().validate({});
22+
```

src/rules/countable.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ArrayVal } from './array-val';
2+
import { ObjectPropertyFunction } from './object-property-function';
3+
4+
export class Countable extends ArrayVal {
5+
6+
/**
7+
* Validate.
8+
*/
9+
public validate(input: any): boolean {
10+
return super.validate(input) || new ObjectPropertyFunction('count').validate(input);
11+
}
12+
}

src/rules/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export * from './cnpj';
2020
export * from './cntrl';
2121
export * from './consonant';
2222
export * from './contains';
23+
export * from './countable';
2324
export * from './country-code';
2425
export * from './cpf';
2526
export * from './credit-card';

test/rules/countable.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { assert } from 'chai';
2+
3+
import { AbstractRule } from '../../src/rules/abstract-rule';
4+
import { Countable } from '../../src/rules/countable';
5+
6+
describe('Countable', () => {
7+
8+
let countable: Countable;
9+
10+
beforeEach(() => {
11+
countable = new Countable();
12+
});
13+
14+
it('is rule', () => {
15+
assert.instanceOf(countable, AbstractRule);
16+
});
17+
18+
it('values is valid', () => {
19+
assert.isTrue(countable.validate([]));
20+
assert.isTrue(countable.validate(new Array()));
21+
assert.isTrue(countable.validate(Array()));
22+
assert.isTrue(countable.validate([1, 2, 3]));
23+
assert.isTrue(countable.validate(new Array(1, 2, 3)));
24+
assert.isTrue(countable.validate(Array(1, 2, 3)));
25+
assert.isTrue(countable.validate(['foo', 'bar', 'foobaz']));
26+
assert.isTrue(countable.validate(new Array('foo', 'bar', 'foobaz')));
27+
assert.isTrue(countable.validate(Array('foo', 'bar', 'foobaz')));
28+
assert.isTrue(countable.validate(new Set([1, 2, 3])));
29+
assert.isTrue(countable.validate(new Set(['foo', 'bar', 'foobar'])));
30+
assert.isTrue(countable.validate(new Map().set(1, 'bar')));
31+
assert.isTrue(countable.validate(new Map().set('foo', 'bar')));
32+
assert.isTrue(countable.validate({count: (): number => 1}));
33+
});
34+
35+
it('values is not valid', () => {
36+
assert.isFalse(countable.validate(String()));
37+
assert.isFalse(countable.validate(''));
38+
assert.isFalse(countable.validate('0'));
39+
assert.isFalse(countable.validate(' '));
40+
assert.isFalse(countable.validate(' '));
41+
assert.isFalse(countable.validate('foo'));
42+
assert.isFalse(countable.validate(String('fooBar')));
43+
assert.isFalse(countable.validate(Boolean()));
44+
assert.isFalse(countable.validate(Number()));
45+
assert.isFalse(countable.validate(null));
46+
assert.isFalse(countable.validate(undefined));
47+
assert.isFalse(countable.validate(true));
48+
assert.isFalse(countable.validate(false));
49+
assert.isFalse(countable.validate(0));
50+
assert.isFalse(countable.validate(0.0));
51+
assert.isFalse(countable.validate(-0.0));
52+
assert.isFalse(countable.validate({}));
53+
assert.isFalse(countable.validate(new Object()));
54+
assert.isFalse(countable.validate(Object.create(null)));
55+
assert.isFalse(countable.validate(Boolean(true)));
56+
assert.isFalse(countable.validate(Number(1)));
57+
assert.isFalse(countable.validate({foo: 'bar'}));
58+
assert.isFalse(countable.validate(1));
59+
assert.isFalse(countable.validate(-1));
60+
assert.isFalse(countable.validate(1.0));
61+
assert.isFalse(countable.validate(-1.0));
62+
assert.isFalse(countable.validate(1));
63+
assert.isFalse(countable.validate(1.0));
64+
assert.isFalse(countable.validate(1.1));
65+
assert.isFalse(countable.validate(new Object({foo: 'bar'})));
66+
67+
class Foo {}
68+
assert.isFalse(countable.validate(new Foo()));
69+
});
70+
71+
});

0 commit comments

Comments
 (0)