Skip to content
This repository was archived by the owner on Apr 21, 2024. It is now read-only.

Commit 039f33a

Browse files
committed
test: cover types' base cases
1 parent fa26b1a commit 039f33a

File tree

1 file changed

+119
-1
lines changed

1 file changed

+119
-1
lines changed

lambda-ioc/src/__tests__/container.test.ts

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
import { createContainer } from '..'
1+
/* eslint-disable @typescript-eslint/ban-types */
2+
import { Container, createContainer } from '..'
23

4+
// Behavioural tests
35
describe('container', () => {
46
it('can register simple values', () => {
57
const container = createContainer()
@@ -75,3 +77,119 @@ describe('container', () => {
7577
expect(await c2.resolveAsync('ab')).toBe(21)
7678
})
7779
})
80+
81+
// Type tests
82+
describe('@types/container', () => {
83+
it('has the correct type when created for the first time', () => {
84+
const c = createContainer()
85+
type C = typeof c
86+
type C_extends_Container = C extends Container<{}, {}> ? true : false
87+
type Container_extends_C = Container<{}, {}> extends C ? true : false
88+
type C_is_Container = C_extends_Container extends true
89+
? Container_extends_C extends true
90+
? true
91+
: false
92+
: false
93+
const c_is_Container: C_is_Container = true
94+
expect(c_is_Container).toBe(true)
95+
})
96+
97+
it('has the correct type after register call', () => {
98+
const c = createContainer().register('a', () => 1)
99+
100+
type C = typeof c
101+
type TargetType = Container<{ a: number }, {}>
102+
103+
type C_extends_TargetType = C extends TargetType ? true : false
104+
type TargetType_extends_C = TargetType extends C ? true : false
105+
type C_is_TargetType = C_extends_TargetType extends true
106+
? TargetType_extends_C extends true
107+
? true
108+
: false
109+
: false
110+
const c_is_TargetType: C_is_TargetType = true
111+
expect(c_is_TargetType).toBe(true)
112+
})
113+
114+
it('has the correct type after registerAsync call', () => {
115+
const c = createContainer().registerAsync(
116+
'b',
117+
async () => await Promise.resolve(1),
118+
)
119+
120+
type C = typeof c
121+
type TargetType = Container<{}, { b: number }>
122+
123+
type C_extends_TargetType = C extends TargetType ? true : false
124+
type TargetType_extends_C = TargetType extends C ? true : false
125+
type C_is_TargetType = C_extends_TargetType extends true
126+
? TargetType_extends_C extends true
127+
? true
128+
: false
129+
: false
130+
const c_is_TargetType: C_is_TargetType = true
131+
expect(c_is_TargetType).toBe(true)
132+
})
133+
134+
it('resolves nothing when the container is empty', () => {
135+
type C = Container<{}, {}>
136+
137+
// Checking what can be synchronously resolved (it should be nothing)
138+
type C_resolve_Parameters = Parameters<C['resolve']>
139+
type C_resolve_Parameters_is_never = C_resolve_Parameters extends [never]
140+
? true
141+
: false
142+
const c_cannot_resolve_anything: C_resolve_Parameters_is_never = true
143+
expect(c_cannot_resolve_anything).toBe(true)
144+
145+
// Checking what can be asynchronously resolved (it should be nothing)
146+
type C_resolveAsync_Parameters = Parameters<C['resolveAsync']>
147+
type C_resolveAsync_Parameters_is_never =
148+
C_resolveAsync_Parameters extends [never] ? true : false
149+
const c_cannot_resolveAsync_anything: C_resolveAsync_Parameters_is_never =
150+
true
151+
expect(c_cannot_resolveAsync_anything).toBe(true)
152+
})
153+
154+
it('only resolves the sync registered dependency', () => {
155+
type C = Container<{ a: number }, {}>
156+
157+
// Checking what can be synchronously resolved (it should be just 'a')
158+
type C_resolve_Parameters = Parameters<C['resolve']>
159+
type C_resolve_Parameters_is_a = C_resolve_Parameters extends ['a']
160+
? true
161+
: false
162+
const c_can_only_resolve_a: C_resolve_Parameters_is_a = true
163+
expect(c_can_only_resolve_a).toBe(true)
164+
165+
// Checking what can be asynchronously resolved (it should be nothing)
166+
type C_resolveAsync_Parameters = Parameters<C['resolveAsync']>
167+
type C_resolveAsync_Parameters_is_never =
168+
C_resolveAsync_Parameters extends [never] ? true : false
169+
const c_cannot_resolveAsync_anything: C_resolveAsync_Parameters_is_never =
170+
true
171+
expect(c_cannot_resolveAsync_anything).toBe(true)
172+
})
173+
174+
it('only resolves the async registered dependency', () => {
175+
type C = Container<{}, { b: number }>
176+
177+
// Checking what can be synchronously resolved (it should be nothing)
178+
type C_resolve_Parameters = Parameters<C['resolve']>
179+
type C_resolve_Parameters_is_never = C_resolve_Parameters extends [never]
180+
? true
181+
: false
182+
const c_cannot_resolve_anything: C_resolve_Parameters_is_never = true
183+
expect(c_cannot_resolve_anything).toBe(true)
184+
185+
// Checking what can be asynchronously resolved (it should be just 'b)
186+
type C_resolveAsync_Parameters = Parameters<C['resolveAsync']>
187+
type C_resolveAsync_Parameters_is_b = C_resolveAsync_Parameters extends [
188+
'b',
189+
]
190+
? true
191+
: false
192+
const c_can_only_resolve_b: C_resolveAsync_Parameters_is_b = true
193+
expect(c_can_only_resolve_b).toBe(true)
194+
})
195+
})

0 commit comments

Comments
 (0)