Skip to content

Commit

Permalink
fix issue #37 (#38)
Browse files Browse the repository at this point in the history
Fix issue #37
  • Loading branch information
miladrahimi committed Apr 7, 2022
1 parent 7db2e51 commit 5401218
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 17 deletions.
20 changes: 10 additions & 10 deletions container.go
Expand Up @@ -92,20 +92,20 @@ func (c Container) bind(resolver interface{}, name string, singleton bool) error
return errors.New("container: the resolver must be a function")
}

for i := 0; i < reflectedResolver.NumOut(); i++ {
if _, exist := c[reflectedResolver.Out(i)]; !exist {
c[reflectedResolver.Out(i)] = make(map[string]binding)
if reflectedResolver.NumOut() > 0 {
if _, exist := c[reflectedResolver.Out(0)]; !exist {
c[reflectedResolver.Out(0)] = make(map[string]binding)
}

if singleton {
instance, err := c.invoke(resolver)
if err != nil {
return err
}
instance, err := c.invoke(resolver)
if err != nil {
return err
}

c[reflectedResolver.Out(i)][name] = binding{resolver: resolver, instance: instance}
if singleton {
c[reflectedResolver.Out(0)][name] = binding{resolver: resolver, instance: instance}
} else {
c[reflectedResolver.Out(i)][name] = binding{resolver: resolver}
c[reflectedResolver.Out(0)][name] = binding{resolver: resolver}
}
}

Expand Down
27 changes: 20 additions & 7 deletions container_test.go
Expand Up @@ -105,6 +105,13 @@ func TestContainer_Singleton(t *testing.T) {
assert.NoError(t, err)
}

func TestContainer_Singleton_With_Resolve_That_Returns_Error(t *testing.T) {
err := instance.Singleton(func() (Shape, error) {
return nil, errors.New("app: error")
})
assert.Error(t, err, "app: error")
}

func TestContainer_Singleton_With_NonFunction_Resolver_It_Should_Fail(t *testing.T) {
err := instance.Singleton("STRING!")
assert.EqualError(t, err, "container: the resolver must be a function")
Expand Down Expand Up @@ -166,21 +173,27 @@ func TestContainer_Transient_With_Resolve_That_Returns_Error(t *testing.T) {
err := instance.Transient(func() (Shape, error) {
return nil, errors.New("app: error")
})
assert.Error(t, err, "app: error")

firstCall := true
err = instance.Transient(func() (Database, error) {
if firstCall {
firstCall = false
return &MySQL{}, nil
}
return nil, errors.New("app: second call error")
})
assert.NoError(t, err)

var s Shape
err = instance.Resolve(&s)
assert.Error(t, err, "app: error")
var db Database
err = instance.Resolve(&db)
assert.Error(t, err, "app: second call error")
}

func TestContainer_Transient_With_Resolve_With_Invalid_Signature_It_Should_Fail(t *testing.T) {
err := instance.Transient(func() (Shape, Database, error) {
return nil, nil, nil
})
assert.NoError(t, err)

var s Shape
err = instance.Resolve(&s)
assert.Error(t, err, "container: resolver function signature is invalid")
}

Expand Down

0 comments on commit 5401218

Please sign in to comment.