public void TestGetObjWithoutInit()
        {
            var injector = new SimpleInjector();

            injector.Bind<IMock>().Using<MockObj>();

            PerformTest(() => injector.Resolve<PerfTester>());
        }
        public void TestSimpleBinding()
        {
            var injector = new SimpleInjector();

            injector.Bind<IMock>().Using<MockObj>();

            Assert.IsNotNull(injector.Resolve<Dependency>());
        }
        public void TestBindingLookup()
        {
            var injector = new SimpleInjector();

            injector.Bind<IMock>().Using<MockObj>().WithBinding(b => b.WhenType(t => t != typeof(Dependency)));
            injector.Bind<IMock>().Using<MockObj1>();

            Assert.IsNotNull(injector.Resolve<Dependency>());
        }
        public void TestParamCriteria()
        {
            var injector = new SimpleInjector();

            injector.Bind<IMock>().Using<MockObj>().WithBinding(b => b.WhenParam(p => p.Name != "mock1"));
            injector.Bind<IMock>().Using<MockObj1>();

            var obj = injector.Resolve<Dependency1>();
            Assert.AreNotEqual(obj.first, obj.second);
        }
        public void TestParamLocation()
        {
            var injector = new SimpleInjector();

            injector.Bind<IMock>().Using<MockObj1>().WithBinding(b => b.AtPosition(1));
            injector.Bind<IMock>().Using<MockObj>();

            var obj = injector.Resolve<Dependency1>();
            Assert.AreNotEqual(obj.first, obj.second);
        }
        public void TestNoScope()
        {
            var injector = new SimpleInjector();

            injector.Bind<IMock>().Using<MockObj>();

            var obj = injector.Resolve<IMock>();
            var obj1 = injector.Resolve<IMock>();

            Assert.IsFalse(obj.Equals(obj1));
        }
        public void TestScope()
        {
            var injector = new SimpleInjector();

            var scopeObj = new object();

            injector.Bind<IMock>().Using<MockObj>().WithBinding(b => b.InScope(() => scopeObj));

            var obj = injector.Resolve<IMock>();
            var obj1 = injector.Resolve<IMock>();

            Assert.IsTrue(obj.Equals(obj1));
        }
        public void TestTypeBinding()
        {
            try
            {
                var injector = new SimpleInjector();

                injector.Bind<IMock>().Using<MockObj>().WithBinding(b => b.WhenType(t => t != typeof(Dependency)));

                injector.Resolve<Dependency>();
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
        }
        public void TestConcurrentBinding()
        {
            var injector = new SimpleInjector();
            injector.Bind<IMock>().Using<MockObj>().WithBinding(b => b.InScope(() => Thread.CurrentThread));

            var obj = injector.Resolve<IMock>();
            Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);

            Task.Run(() =>
            {
                var obj2 = injector.Resolve<IMock>();
                Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
                Assert.IsFalse(obj2.Equals(obj));
            });
        }
        public void TestSelfBind()
        {
            var injector = new SimpleInjector();

            Assert.IsTrue(injector.Equals(injector.Resolve<IInjector>()));
        }