Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions Assets/Reflex.EditModeTests/OnInjectedListenerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using FluentAssertions;
using NUnit.Framework;
using Reflex.Attributes;
using Reflex.Core;
using Reflex.Enums;

namespace Reflex.EditModeTests
{
public class OnInjectedListenerTests
{
private static class StaticEventBus
{
public static event Action<char> OnInjectedEvent;
public static void RaiseOnInjectedEvent(char id) => OnInjectedEvent?.Invoke(id);
}

private abstract class AttributeInjected : IOnInjectedListener
{
private readonly char _id;
protected AttributeInjected(char id) => _id = id;
public void OnInjected() => StaticEventBus.RaiseOnInjectedEvent(_id);
}

private class AttributeInjectedA : AttributeInjected
{
[Inject] private readonly AttributeInjectedB _b;
public AttributeInjectedA() : base('a') { }
}

private class AttributeInjectedB : AttributeInjected
{
[Inject] private readonly AttributeInjectedC _c;
public AttributeInjectedB() : base('b') { }
}

private class AttributeInjectedC : AttributeInjected
{
public AttributeInjectedC() : base('c') { }
}

private class ConstructorInjectedA : AttributeInjected
{
private readonly ConstructorInjectedB _b;
public ConstructorInjectedA(ConstructorInjectedB b) : base('a') => _b = b;
}

private class ConstructorInjectedB : AttributeInjected
{
private readonly ConstructorInjectedC _c;
public ConstructorInjectedB(ConstructorInjectedC c) : base('b') => _c = c;
}

private class ConstructorInjectedC : AttributeInjected
{
public ConstructorInjectedC() : base('c') { }
}

[Test]
public void AttributeInjectedObjects_GetsOnInjectedRaisedRecursively()
{
var constructionOrder = new List<char>(3);
StaticEventBus.OnInjectedEvent -= UpdateOnInjectedOrder;
StaticEventBus.OnInjectedEvent += UpdateOnInjectedOrder;
void UpdateOnInjectedOrder(char service) => constructionOrder.Add(service);

var container = new ContainerBuilder()
.RegisterType(typeof(AttributeInjectedA), Lifetime.Singleton, Resolution.Lazy)
.RegisterType(typeof(AttributeInjectedB), Lifetime.Singleton, Resolution.Lazy)
.RegisterType(typeof(AttributeInjectedC), Lifetime.Singleton, Resolution.Lazy)
.Build();

container.Resolve<AttributeInjectedA>();
string.Join(string.Empty, constructionOrder).Should().BeEquivalentTo("cba");
}

[Test]
public void ConstructorInjectedObjects_GetsOnInjectedRaisedRecursively()
{
var constructionOrder = new List<char>(3);
StaticEventBus.OnInjectedEvent -= UpdateOnInjectedOrder;
StaticEventBus.OnInjectedEvent += UpdateOnInjectedOrder;
void UpdateOnInjectedOrder(char service) => constructionOrder.Add(service);

var container = new ContainerBuilder()
.RegisterType(typeof(ConstructorInjectedA), Lifetime.Singleton, Resolution.Lazy)
.RegisterType(typeof(ConstructorInjectedB), Lifetime.Singleton, Resolution.Lazy)
.RegisterType(typeof(ConstructorInjectedC), Lifetime.Singleton, Resolution.Lazy)
.Build();

container.Resolve<ConstructorInjectedA>();
string.Join(string.Empty, constructionOrder).Should().BeEquivalentTo("cba");
}
}
}
3 changes: 3 additions & 0 deletions Assets/Reflex.EditModeTests/OnInjectedListenerTests.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion Assets/Reflex/Core/Container.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,13 @@ public T Construct<T>()
public object Construct(Type concrete)
{
var instance = ConstructorInjector.Construct(concrete, this);
AttributeInjector.Inject(instance, this);
AttributeInjector.Inject(instance, this);

if (instance is IOnInjectedListener onInjectedListener)
{
onInjectedListener.OnInjected();
}

return instance;
}

Expand Down
7 changes: 7 additions & 0 deletions Assets/Reflex/Core/IOnInjectedListener.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Reflex.Core
{
public interface IOnInjectedListener
{
void OnInjected();
}
}
3 changes: 3 additions & 0 deletions Assets/Reflex/Core/IOnInjectedListener.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading