@@ -264,39 +264,63 @@ func TestEndToEndSuccess(t *testing.T) {
264264 })
265265
266266 t .Run ("param recurse" , func (t * testing.T ) {
267- type anotherParam struct {
267+ type anotherParamEmbedded struct {
268268 dig.In
269269
270270 Buffer * bytes.Buffer
271271 }
272272
273- type someParam struct {
274- dig.In
273+ type anotherParam struct {
274+ Reader * bytes.Reader
275+ }
275276
276- Buffer * bytes.Buffer
277- Another anotherParam
277+ type someParam struct {
278+ Buffer * bytes.Buffer
279+ Reader * bytes.Reader
280+ AnotherEmbedded anotherParamEmbedded
281+ Another anotherParam
278282 }
279283
280284 var (
281- buff * bytes.Buffer
282- called bool
285+ buff * bytes.Buffer
286+ reader * bytes.Reader
287+ calledBuffer bool
288+ calledReader bool
283289 )
284290
285291 c := digtest .New (t )
286292 c .RequireProvide (func () * bytes.Buffer {
287- require .False (t , called , "constructor must be called exactly once" )
288- called = true
293+ require .False (t , calledBuffer , "constructor must be calledBuffer exactly once" )
294+ calledBuffer = true
289295 buff = new (bytes.Buffer )
290296 return buff
291297 })
292298
299+ c .RequireProvide (func () * bytes.Reader {
300+ require .False (t , calledReader , "constructor must be calledBuffer exactly once" )
301+ calledReader = true
302+ reader = new (bytes.Reader )
303+ return reader
304+ })
305+
306+ c .RequireProvide (dig .AsIn (someParam {}))
307+ c .RequireProvide (dig .AsIn (reflect .TypeOf (anotherParam {})))
308+
293309 c .RequireInvoke (func (p someParam ) {
294- require .True (t , called , "constructor must be called first" )
310+ require .True (t , calledReader , "constructor must be calledBuffer first" )
311+ require .True (t , calledReader , "constructor must be calledReader first" )
312+
313+ require .NotNil (t , p .Buffer , "someParam.Reader must not be nil" )
314+ require .NotNil (t , p .Reader , "someParam.Reader must not be nil" )
315+
316+ require .NotNil (t , p .Another .Reader , "anotherParam.Reader must not be nil" )
317+ require .True (t , p .Reader == p .Another .Reader , "readers fields must match" )
318+
319+ require .True (t , p .Reader == reader , "buffer must match constructor's return value" )
295320
296- require .NotNil (t , p .Buffer , "someParam.Buffer must not be nil" )
297- require .NotNil (t , p .Another . Buffer , "anotherParam.Buffer must not be nil " )
321+ require .NotNil (t , p .AnotherEmbedded . Buffer , "anotherParamEmbedded.Reader must not be nil" )
322+ require .True (t , p .Buffer == p . AnotherEmbedded . Buffer , "buffers fields must match " )
298323
299- require .True (t , p .Buffer == p .Another .Buffer , "buffers fields must match" )
300324 require .True (t , p .Buffer == buff , "buffer must match constructor's return value" )
301325 })
302326 })
@@ -638,6 +662,13 @@ func TestEndToEndSuccess(t *testing.T) {
638662 A1 A `name:"first"` // should come from ret1 through ret2
639663 A2 A `name:"second"` // should come from ret2
640664 }
665+
666+ type paramAsIn struct {
667+ A1 A `name:"first"` // should come from ret1 through ret2
668+ A2 A `name:"second"` // should come from ret2
669+ }
670+ c .RequireProvide (dig .AsIn (paramAsIn {}))
671+
641672 c .RequireProvide (func () Ret2 {
642673 return Ret2 {
643674 Ret1 : Ret1 {
@@ -651,6 +682,11 @@ func TestEndToEndSuccess(t *testing.T) {
651682 assert .Equal (t , 1 , p .A1 .idx )
652683 assert .Equal (t , 2 , p .A2 .idx )
653684 })
685+
686+ c .RequireInvoke (func (p paramAsIn ) {
687+ assert .Equal (t , 1 , p .A1 .idx )
688+ assert .Equal (t , 2 , p .A2 .idx )
689+ })
654690 })
655691
656692 t .Run ("named instances do not cause cycles" , func (t * testing.T ) {
@@ -709,7 +745,7 @@ func TestEndToEndSuccess(t *testing.T) {
709745
710746 require .Error (t , c .Invoke (func (* bytes.Buffer ) {
711747 t .Fatalf ("must not be called" )
712- }), "must not have a *bytes.Buffer in the container" )
748+ }), "must not have a *bytes.Reader in the container" )
713749 })
714750
715751 t .Run ("As with Name" , func (t * testing.T ) {
0 commit comments