UNPKG

5.09 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 MapPredicate extends Predicate {
6 /**
7 @hidden
8 */
9 constructor(options) {
10 super('Map', options);
11 }
12 /**
13 Test a Map to have a specific size.
14
15 @param size - The size of the Map.
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 Test an Map to have a minimum size.
25
26 @param size - The minimum size of the Map.
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 Test an Map to have a maximum size.
37
38 @param size - The maximum size of the Map.
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 Test a Map to include all the provided keys. The keys are tested by identity, not structure.
49
50 @param keys - The keys that should be a key in the Map.
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 Test a Map to include any of the provided keys. The keys are tested by identity, not structure.
60
61 @param keys - The keys that could be a key in the Map.
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 Test a Map to include all the provided values. The values are tested by identity, not structure.
71
72 @param values - The values that should be a value in the Map.
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 Test a Map to include any of the provided values. The values are tested by identity, not structure.
82
83 @param values - The values that could be a value in the Map.
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 Test all the keys in the Map to match the provided predicate.
96
97 @param predicate - The predicate that should be applied against every key in the Map.
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 Test all the values in the Map to match the provided predicate.
107
108 @param predicate - The predicate that should be applied against every value in the Map.
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 Test a Map to be empty.
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 Test a Map to be not empty.
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 Test a Map to be deeply equal to the provided Map.
136
137 @param expected - Expected Map to match.
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}