UNPKG

3.7 kBJavaScriptView Raw
1import { deepEqual } from 'fast-equals';
2import hasItems from '../utils/has-items.js';
3import ofType from '../utils/of-type.js';
4import { Predicate } from './predicate.js';
5export class SetPredicate extends Predicate {
6 /**
7 @hidden
8 */
9 constructor(options) {
10 super('Set', options);
11 }
12 /**
13 Test a Set to have a specific size.
14
15 @param size - The size of the Set.
16 */
17 size(size) {
18 return this.addValidator({
19 message: (set, label) => `Expected ${label} to have size \`${size}\`, got \`${set.size}\``,
20 validator: set => set.size === size,
21 });
22 }
23 /**
24 Test a Set to have a minimum size.
25
26 @param size - The minimum size of the Set.
27 */
28 minSize(size) {
29 return this.addValidator({
30 message: (set, label) => `Expected ${label} to have a minimum size of \`${size}\`, got \`${set.size}\``,
31 validator: set => set.size >= size,
32 negatedMessage: (set, label) => `Expected ${label} to have a maximum size of \`${size - 1}\`, got \`${set.size}\``,
33 });
34 }
35 /**
36 Test a Set to have a maximum size.
37
38 @param size - The maximum size of the Set.
39 */
40 maxSize(size) {
41 return this.addValidator({
42 message: (set, label) => `Expected ${label} to have a maximum size of \`${size}\`, got \`${set.size}\``,
43 validator: set => set.size <= size,
44 negatedMessage: (set, label) => `Expected ${label} to have a minimum size of \`${size + 1}\`, got \`${set.size}\``,
45 });
46 }
47 /**
48 Test a Set to include all the provided items. The items are tested by identity, not structure.
49
50 @param items - The items that should be a item in the Set.
51 */
52 has(...items) {
53 return this.addValidator({
54 message: (_, label, missingItems) => `Expected ${label} to have items \`${JSON.stringify(missingItems)}\``,
55 validator: set => hasItems(set, items),
56 });
57 }
58 /**
59 Test a Set to include any of the provided items. The items are tested by identity, not structure.
60
61 @param items - The items that could be a item in the Set.
62 */
63 hasAny(...items) {
64 return this.addValidator({
65 message: (_, label) => `Expected ${label} to have any item of \`${JSON.stringify(items)}\``,
66 validator: set => items.some(item => set.has(item)),
67 });
68 }
69 /**
70 Test all the items in the Set to match the provided predicate.
71
72 @param predicate - The predicate that should be applied against every item in the Set.
73 */
74 ofType(predicate) {
75 return this.addValidator({
76 message: (_, label, error) => `(${label}) ${error}`,
77 validator: set => ofType(set, 'values', predicate),
78 });
79 }
80 /**
81 Test a Set to be empty.
82 */
83 get empty() {
84 return this.addValidator({
85 message: (set, label) => `Expected ${label} to be empty, got \`${JSON.stringify([...set])}\``,
86 validator: set => set.size === 0,
87 });
88 }
89 /**
90 Test a Set to be not empty.
91 */
92 get nonEmpty() {
93 return this.addValidator({
94 message: (_, label) => `Expected ${label} to not be empty`,
95 validator: set => set.size > 0,
96 });
97 }
98 /**
99 Test a Set to be deeply equal to the provided Set.
100
101 @param expected - Expected Set to match.
102 */
103 deepEqual(expected) {
104 return this.addValidator({
105 message: (set, label) => `Expected ${label} to be deeply equal to \`${JSON.stringify([...expected])}\`, got \`${JSON.stringify([...set])}\``,
106 validator: set => deepEqual(set, expected),
107 });
108 }
109}