using NUnit.Framework;
using Assert = ModestTree.Assert;

namespace Zenject.Tests.Injection
{
    [TestFixture]
    public class TestStructInjection : ZenjectUnitTestFixture
    {
        struct Test1
        {
        }

        class Test2
        {
            public Test2(Test1 t1)
            {
            }
        }

        [Test]
        public void TestInjectStructIntoClass()
        {
            Container.Bind<Test1>().FromInstance(new Test1()).NonLazy();
            Container.Bind<Test2>().AsSingle().NonLazy();

            Container.ResolveRoots();

            var t2 = Container.Resolve<Test2>();

            Assert.That(t2 != null);
        }

        struct Test3
        {
            [Inject]
#pragma warning disable 649
            public int ValueField;
#pragma warning restore 649

            [Inject]
            public string ValueProperty
            {
                get; private set;
            }

            public float ValueConstructor
            {
                get; private set;
            }
        }

        [Test]
        public void TestInjectFieldsOfStruct()
        {
            Container.BindInstance("asdf");
            Container.BindInstance(5);
            Container.Bind<Test3>().AsSingle();

            var test3 = Container.Instantiate<Test3>();

            Assert.IsEqual(test3.ValueProperty, "asdf");
            Assert.IsEqual(test3.ValueField, 5);
        }

        struct Test4
        {
            public Test4(string value)
            {
                Value = value;
            }

            public string Value
            {
                get; private set;
            }
        }

        [Test]
        public void TestInjectConstructorOfStruct()
        {
            Container.BindInstance("asdf");
            Container.Bind<Test4>().AsSingle();

            var test4 = Container.Instantiate<Test4>();

            Assert.IsEqual(test4.Value, "asdf");
        }
    }
}
