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 MapPredicate extends Predicate {
|
6 | |
7 |
|
8 |
|
9 | constructor(options) {
|
10 | super('Map', options);
|
11 | }
|
12 | |
13 |
|
14 |
|
15 |
|
16 |
|
17 | size(size) {
|
18 | return this.addValidator({
|
19 | message: (map, label) => `Expected ${label} to have size \`${size}\`, got \`${map.size}\``,
|
20 | validator: map => map.size === size,
|
21 | });
|
22 | }
|
23 | |
24 |
|
25 |
|
26 |
|
27 |
|
28 | minSize(size) {
|
29 | return this.addValidator({
|
30 | message: (map, label) => `Expected ${label} to have a minimum size of \`${size}\`, got \`${map.size}\``,
|
31 | validator: map => map.size >= size,
|
32 | negatedMessage: (map, label) => `Expected ${label} to have a maximum size of \`${size - 1}\`, got \`${map.size}\``,
|
33 | });
|
34 | }
|
35 | |
36 |
|
37 |
|
38 |
|
39 |
|
40 | maxSize(size) {
|
41 | return this.addValidator({
|
42 | message: (map, label) => `Expected ${label} to have a maximum size of \`${size}\`, got \`${map.size}\``,
|
43 | validator: map => map.size <= size,
|
44 | negatedMessage: (map, label) => `Expected ${label} to have a minimum size of \`${size + 1}\`, got \`${map.size}\``,
|
45 | });
|
46 | }
|
47 | |
48 |
|
49 |
|
50 |
|
51 |
|
52 | hasKeys(...keys) {
|
53 | return this.addValidator({
|
54 | message: (_, label, missingKeys) => `Expected ${label} to have keys \`${JSON.stringify(missingKeys)}\``,
|
55 | validator: map => hasItems(map, keys),
|
56 | });
|
57 | }
|
58 | |
59 |
|
60 |
|
61 |
|
62 |
|
63 | hasAnyKeys(...keys) {
|
64 | return this.addValidator({
|
65 | message: (_, label) => `Expected ${label} to have any key of \`${JSON.stringify(keys)}\``,
|
66 | validator: map => keys.some(key => map.has(key)),
|
67 | });
|
68 | }
|
69 | |
70 |
|
71 |
|
72 |
|
73 |
|
74 | hasValues(...values) {
|
75 | return this.addValidator({
|
76 | message: (_, label, missingValues) => `Expected ${label} to have values \`${JSON.stringify(missingValues)}\``,
|
77 | validator: map => hasItems(new Set(map.values()), values),
|
78 | });
|
79 | }
|
80 | |
81 |
|
82 |
|
83 |
|
84 |
|
85 | hasAnyValues(...values) {
|
86 | return this.addValidator({
|
87 | message: (_, label) => `Expected ${label} to have any value of \`${JSON.stringify(values)}\``,
|
88 | validator(map) {
|
89 | const valueSet = new Set(map.values());
|
90 | return values.some(key => valueSet.has(key));
|
91 | },
|
92 | });
|
93 | }
|
94 | |
95 |
|
96 |
|
97 |
|
98 |
|
99 | keysOfType(predicate) {
|
100 | return this.addValidator({
|
101 | message: (_, label, error) => `(${label}) ${error}`,
|
102 | validator: map => ofType(map.keys(), 'keys', predicate),
|
103 | });
|
104 | }
|
105 | |
106 |
|
107 |
|
108 |
|
109 |
|
110 | valuesOfType(predicate) {
|
111 | return this.addValidator({
|
112 | message: (_, label, error) => `(${label}) ${error}`,
|
113 | validator: map => ofType(map.values(), 'values', predicate),
|
114 | });
|
115 | }
|
116 | |
117 |
|
118 |
|
119 | get empty() {
|
120 | return this.addValidator({
|
121 | message: (map, label) => `Expected ${label} to be empty, got \`${JSON.stringify([...map])}\``,
|
122 | validator: map => map.size === 0,
|
123 | });
|
124 | }
|
125 | |
126 |
|
127 |
|
128 | get nonEmpty() {
|
129 | return this.addValidator({
|
130 | message: (_, label) => `Expected ${label} to not be empty`,
|
131 | validator: map => map.size > 0,
|
132 | });
|
133 | }
|
134 | |
135 |
|
136 |
|
137 |
|
138 |
|
139 | deepEqual(expected) {
|
140 | return this.addValidator({
|
141 | message: (map, label) => `Expected ${label} to be deeply equal to \`${JSON.stringify([...expected])}\`, got \`${JSON.stringify([...map])}\``,
|
142 | validator: map => deepEqual(map, expected),
|
143 | });
|
144 | }
|
145 | }
|