TestGenericContract.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System.Collections.Generic;
  2. using NUnit.Framework;
  3. using Assert = ModestTree.Assert;
  4. namespace Zenject.Tests.Other
  5. {
  6. [TestFixture]
  7. public class TestGenericContract : ZenjectUnitTestFixture
  8. {
  9. class Test1<T>
  10. {
  11. public T Data;
  12. }
  13. class Test2
  14. {
  15. }
  16. [Test]
  17. public void TestToSingle()
  18. {
  19. Container.Bind(typeof(Test1<>)).AsSingle().NonLazy();
  20. var test1 = Container.Resolve<Test1<int>>();
  21. Assert.That(test1.Data == 0);
  22. test1.Data = 5;
  23. var test2 = Container.Resolve<Test1<int>>();
  24. Assert.That(test2 == test1);
  25. Assert.That(test1.Data == 5);
  26. }
  27. [Test]
  28. public void TestToTransient()
  29. {
  30. Container.Bind(typeof(Test1<>)).AsTransient().NonLazy();
  31. var test1 = Container.Resolve<Test1<int>>();
  32. Assert.That(test1.Data == 0);
  33. var test2 = Container.Resolve<Test1<int>>();
  34. Assert.That(test2.Data == 0);
  35. Assert.That(test2 != test1);
  36. Container.Resolve<Test1<string>>();
  37. Container.Resolve<Test1<List<int>>>();
  38. Container.Resolve<Test1<Test2>>();
  39. }
  40. interface IFoo<T>
  41. {
  42. }
  43. interface IBar<T>
  44. {
  45. }
  46. class Test2<T> : IFoo<T>, IBar<T>
  47. {
  48. }
  49. [Test]
  50. public void TestToSingleMultipleContracts()
  51. {
  52. Container.Bind(typeof(IFoo<>), typeof(IBar<>)).To(typeof(Test2<>)).AsSingle();
  53. var foo = Container.Resolve<IFoo<int>>();
  54. Assert.That(foo is Test2<int>);
  55. var bar = Container.Resolve<IBar<int>>();
  56. Assert.That(bar is Test2<int>);
  57. Assert.IsEqual(foo, bar);
  58. Assert.IsEqual(foo, Container.Resolve<IFoo<int>>());
  59. Assert.IsEqual(bar, Container.Resolve<IBar<int>>());
  60. }
  61. public interface IQux {
  62. }
  63. public class Qux : IQux {
  64. }
  65. [Test]
  66. public void TestToSingleMultipleContractsMismatch()
  67. {
  68. Container.Bind(typeof(IQux), typeof(IFoo<>), typeof(IBar<>)).To(typeof(Test2<>), typeof(Qux)).AsSingle();
  69. var foo = Container.Resolve<IFoo<int>>();
  70. Assert.That(foo is Test2<int>);
  71. var bar = Container.Resolve<IBar<int>>();
  72. Assert.That(bar is Test2<int>);
  73. Assert.IsEqual(foo, bar);
  74. Assert.IsEqual(foo, Container.Resolve<IFoo<int>>());
  75. Assert.IsEqual(bar, Container.Resolve<IBar<int>>());
  76. var qux = Container.Resolve<IQux>();
  77. Assert.IsEqual(qux, Container.Resolve<IQux>());
  78. }
  79. }
  80. }