1 | import { deepEqual } from 'fast-equals';
|
2 | import hasItems from '../utils/has-items.js';
|
3 | import ofType from '../utils/of-type.js';
|
4 | import { Predicate } from './predicate.js';
|
5 | export class SetPredicate extends Predicate {
|
6 | |
7 |
|
8 |
|
9 | constructor(options) {
|
10 | super('Set', options);
|
11 | }
|
12 | |
13 |
|
14 |
|
15 |
|
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 |
|
37 |
|
38 |
|
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 |
|
49 |
|
50 |
|
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 | }
|