|
1 | 1 | import { AIterable } from 'a-iterable';
|
2 |
| -import { ContextKeyError } from './context-key-error'; |
3 | 2 | import { ContextRegistry } from './context-registry';
|
4 | 3 | import { ContextValues } from './context-values';
|
5 |
| -import { MultiContextKey, SingleContextKey } from './simple-context-key'; |
| 4 | +import { SingleContextKey } from './simple-context-key'; |
6 | 5 | import Mock = jest.Mock;
|
7 | 6 |
|
8 | 7 | describe('ContextRegistry', () => {
|
@@ -50,217 +49,6 @@ describe('ContextRegistry', () => {
|
50 | 49 | });
|
51 | 50 | });
|
52 | 51 |
|
53 |
| - describe('Single value', () => { |
54 |
| - it('provides value', () => { |
55 |
| - |
56 |
| - const value = 'test value'; |
57 |
| - |
58 |
| - mockProvider.mockReturnValue(value); |
59 |
| - |
60 |
| - expect(values.get(key)).toBe(value); |
61 |
| - }); |
62 |
| - it('selects the last value if more than one provided', () => { |
63 |
| - |
64 |
| - const value1 = 'value1'; |
65 |
| - const value2 = 'value2'; |
66 |
| - |
67 |
| - registry.provide({ a: key, is: value1 }); |
68 |
| - registry.provide({ a: key, is: value2 }); |
69 |
| - |
70 |
| - expect(values.get(key)).toBe(value2); |
71 |
| - }); |
72 |
| - it('removes the value specifier', () => { |
73 |
| - |
74 |
| - const value1 = 'value1'; |
75 |
| - const value2 = 'value2'; |
76 |
| - |
77 |
| - registry.provide({ a: key, is: value1 }); |
78 |
| - registry.provide({ a: key, is: value2 })(); |
79 |
| - |
80 |
| - expect(values.get(key)).toBe(value1); |
81 |
| - }); |
82 |
| - it('retains the constructed value when specifier removed', () => { |
83 |
| - |
84 |
| - const value1 = 'value1'; |
85 |
| - const value2 = 'value2'; |
86 |
| - |
87 |
| - registry.provide({ a: key, is: value1 }); |
88 |
| - |
89 |
| - const remove = registry.provide({ a: key, is: value2 }); |
90 |
| - |
91 |
| - expect(values.get(key)).toBe(value2); |
92 |
| - |
93 |
| - remove(); |
94 |
| - remove(); |
95 |
| - expect(values.get(key)).toBe(value2); |
96 |
| - }); |
97 |
| - it('throws if there is neither default nor fallback value', () => { |
98 |
| - expect(() => values.get(new SingleContextKey(key.name))).toThrowError(ContextKeyError); |
99 |
| - expect(() => values.get(new SingleContextKey(key.name), {})).toThrowError(ContextKeyError); |
100 |
| - }); |
101 |
| - it('provides fallback value if there is no provider', () => { |
102 |
| - expect(values.get(new SingleContextKey<string>(key.name), { or: 'fallback' })).toBe('fallback'); |
103 |
| - }); |
104 |
| - it('provides default value if provider did not provide any value', () => { |
105 |
| - |
106 |
| - const defaultValue = 'default'; |
107 |
| - const keyWithDefaults = new SingleContextKey(key.name, { byDefault: () => defaultValue }); |
108 |
| - |
109 |
| - registry.provide({ a: keyWithDefaults, is: null }); |
110 |
| - |
111 |
| - expect(values.get(keyWithDefaults)).toBe(defaultValue); |
112 |
| - }); |
113 |
| - it('provides default value if there is no provider', () => { |
114 |
| - expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }))).toBe('default'); |
115 |
| - }); |
116 |
| - it('prefers fallback value over default one', () => { |
117 |
| - expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), { or: 'fallback' })) |
118 |
| - .toBe('fallback'); |
119 |
| - }); |
120 |
| - it('prefers default value if fallback one is absent', () => { |
121 |
| - expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), {})) |
122 |
| - .toBe('default'); |
123 |
| - }); |
124 |
| - it('prefers `null` fallback value over key one', () => { |
125 |
| - expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), { or: null })) |
126 |
| - .toBeNull(); |
127 |
| - }); |
128 |
| - it('prefers `undefined` fallback value over key one', () => { |
129 |
| - expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), { or: undefined })) |
130 |
| - .toBeUndefined(); |
131 |
| - }); |
132 |
| - it('caches the value', () => { |
133 |
| - |
134 |
| - const value = 'value'; |
135 |
| - |
136 |
| - mockProvider.mockReturnValue(value); |
137 |
| - |
138 |
| - expect(values.get(key)).toBe(value); |
139 |
| - expect(values.get(key)).toBe(value); |
140 |
| - |
141 |
| - expect(mockProvider).toHaveBeenCalledTimes(1); |
142 |
| - }); |
143 |
| - it('caches default value', () => { |
144 |
| - |
145 |
| - const value = 'default value'; |
146 |
| - const defaultProviderSpy = jest.fn(() => value); |
147 |
| - const keyWithDefault = new SingleContextKey('key-with-default', { byDefault: defaultProviderSpy }); |
148 |
| - |
149 |
| - expect(values.get(keyWithDefault)).toBe(value); |
150 |
| - expect(values.get(keyWithDefault)).toBe(value); |
151 |
| - expect(defaultProviderSpy).toHaveBeenCalledTimes(1); |
152 |
| - }); |
153 |
| - it('does not cache fallback value', () => { |
154 |
| - |
155 |
| - const value1 = 'value1'; |
156 |
| - const value2 = 'value2'; |
157 |
| - |
158 |
| - expect(values.get(key, { or: value1 })).toBe(value1); |
159 |
| - expect(values.get(key, { or: value2 })).toBe(value2); |
160 |
| - }); |
161 |
| - it('rebuilds the value in another context', () => { |
162 |
| - |
163 |
| - const value1 = 'value1'; |
164 |
| - const value2 = 'value2'; |
165 |
| - |
166 |
| - mockProvider.mockReturnValue(value1); |
167 |
| - expect(values.get(key)).toBe(value1); |
168 |
| - |
169 |
| - const values2 = registry.newValues(); |
170 |
| - |
171 |
| - mockProvider.mockReturnValue(value2); |
172 |
| - expect(values.get(key)).toBe(value1); |
173 |
| - expect(values2.get(key)).toBe(value2); |
174 |
| - |
175 |
| - expect(mockProvider).toHaveBeenCalledTimes(2); |
176 |
| - }); |
177 |
| - }); |
178 |
| - |
179 |
| - describe('Multi-value', () => { |
180 |
| - |
181 |
| - let multiKey: MultiContextKey<string>; |
182 |
| - |
183 |
| - beforeEach(() => { |
184 |
| - multiKey = new MultiContextKey('values'); |
185 |
| - }); |
186 |
| - |
187 |
| - it('is associated with empty array by default', () => { |
188 |
| - expect(values.get(multiKey)).toEqual([]); |
189 |
| - }); |
190 |
| - it('is associated with empty array if providers did not return any values', () => { |
191 |
| - registry.provide({ a: multiKey, is: null }); |
192 |
| - registry.provide({ a: multiKey, is: undefined }); |
193 |
| - |
194 |
| - expect(values.get(multiKey)).toEqual([]); |
195 |
| - }); |
196 |
| - it('is associated with default value if there is no provider', () => { |
197 |
| - |
198 |
| - const defaultValue = ['default']; |
199 |
| - const keyWithDefaults = new MultiContextKey('key', { byDefault: () => defaultValue }); |
200 |
| - |
201 |
| - expect(values.get(keyWithDefaults)).toEqual(defaultValue); |
202 |
| - }); |
203 |
| - it('is associated with default value if providers did not return any values', () => { |
204 |
| - |
205 |
| - const defaultValue = ['default']; |
206 |
| - const keyWithDefaults = new MultiContextKey('key', { byDefault: () => defaultValue }); |
207 |
| - |
208 |
| - registry.provide({ a: keyWithDefaults, is: null }); |
209 |
| - registry.provide({ a: keyWithDefaults, is: undefined }); |
210 |
| - |
211 |
| - expect(values.get(keyWithDefaults)).toEqual(defaultValue); |
212 |
| - }); |
213 |
| - it('is associated with provided values array', () => { |
214 |
| - registry.provide({ a: multiKey, is: 'a' }); |
215 |
| - registry.provide({ a: multiKey, is: undefined }); |
216 |
| - registry.provide({ a: multiKey, is: 'c' }); |
217 |
| - |
218 |
| - expect(values.get(multiKey)).toEqual(['a', 'c']); |
219 |
| - }); |
220 |
| - it('is associated with value', () => { |
221 |
| - registry.provide({ a: multiKey, is: 'value' }); |
222 |
| - |
223 |
| - expect(values.get(multiKey)).toEqual(['value']); |
224 |
| - }); |
225 |
| - it('throws if there is no default value', () => { |
226 |
| - expect(() => values.get(new MultiContextKey(multiKey.name, { byDefault: () => null }))).toThrowError(); |
227 |
| - }); |
228 |
| - it('is associated with empty array by default', () => { |
229 |
| - expect(values.get(new MultiContextKey(multiKey.name))).toEqual([]); |
230 |
| - }); |
231 |
| - it('is associated with default value is there is no value', () => { |
232 |
| - expect(values.get(new MultiContextKey<string>(multiKey.name), { or: ['default'] })) |
233 |
| - .toEqual(['default']); |
234 |
| - }); |
235 |
| - it('is associated with key default value is there is no value', () => { |
236 |
| - expect(values.get(new MultiContextKey<string>(multiKey.name, { byDefault: () => ['default'] }))) |
237 |
| - .toEqual(['default']); |
238 |
| - }); |
239 |
| - it('prefers fallback value over default one', () => { |
240 |
| - expect(values.get( |
241 |
| - new MultiContextKey<string>( |
242 |
| - multiKey.name, |
243 |
| - { byDefault: () => ['key', 'default'] } |
244 |
| - ), |
245 |
| - { or: ['explicit', 'default'] } |
246 |
| - )).toEqual(['explicit', 'default']); |
247 |
| - }); |
248 |
| - it('prefers `null` fallback value over default one', () => { |
249 |
| - expect(values.get( |
250 |
| - new MultiContextKey<string>(multiKey.name, { byDefault: () => ['key', 'default'] }), |
251 |
| - { or: null } |
252 |
| - )).toBeNull(); |
253 |
| - }); |
254 |
| - it('prefers `undefined` fallback value over default one', () => { |
255 |
| - expect(values.get(new MultiContextKey<string>( |
256 |
| - multiKey.name, |
257 |
| - { byDefault: () => ['key', 'default'] } |
258 |
| - ), |
259 |
| - { or: undefined } |
260 |
| - )).toBeUndefined(); |
261 |
| - }); |
262 |
| - }); |
263 |
| - |
264 | 52 | describe('Providers combination', () => {
|
265 | 53 |
|
266 | 54 | let provider2Spy: Mock;
|
|
0 commit comments