/src/Wormhole.Tests/PipelineInjectionTests.cs

https://github.com/stevehebert/wormhole
C# | 134 lines | 106 code | 28 blank | 0 comment | 0 complexity | 590151b19bf6f218fff8cbb1cd358a99 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Autofac;
  4. using NUnit.Framework;
  5. using Wormhole.Pipeline;
  6. namespace Wormhole.Tests
  7. {
  8. [TestFixture]
  9. public class PipelineInjectionTests
  10. {
  11. [Test]
  12. public void verify_ordered()
  13. {
  14. var module = new SimplePipelineModule(item => item.RegisterPipeline<IEnumerable<int>, IEnumerable<int>>()
  15. .Bind<Adder>()
  16. .Bind<Divider>()
  17. .Bind<NonConformingType>((a, input) => a.Run(input)));
  18. var builder = new ContainerBuilder();
  19. builder.RegisterModule(module);
  20. var container = builder.Build();
  21. var function = container.Resolve<Functor<IEnumerable<int>, IEnumerable<int>>>();
  22. var items = new[] { 10, 20, 30 };
  23. var resolvedItems = function(items);
  24. Assert.That(resolvedItems.Count(), Is.EqualTo(3));
  25. Assert.That(resolvedItems.ToArray()[0], Is.EqualTo(12));
  26. Assert.That(resolvedItems.ToArray()[1], Is.EqualTo(22));
  27. Assert.That(resolvedItems.ToArray()[2], Is.EqualTo(32));
  28. }
  29. [Test]
  30. public void verify_inline_type_conversion()
  31. {
  32. var module = new SimplePipelineModule(item => item.RegisterPipeline<IEnumerable<int>, IEnumerable<string>>()
  33. .Bind<Adder, IEnumerable<int>>()
  34. .Bind<Divider, IEnumerable<int>>()
  35. .Bind<Stringifier>());
  36. var builder = new ContainerBuilder();
  37. builder.RegisterModule(module);
  38. var container = builder.Build();
  39. var function = container.Resolve<Functor<IEnumerable<int>, IEnumerable<string>>>();
  40. var items = new[] { 10, 20, 30 };
  41. var resolvedItems = function(items);
  42. Assert.That(resolvedItems.Count(), Is.EqualTo(3));
  43. Assert.That(resolvedItems.ToArray()[0], Is.EqualTo("6"));
  44. Assert.That(resolvedItems.ToArray()[1], Is.EqualTo("11"));
  45. Assert.That(resolvedItems.ToArray()[2], Is.EqualTo("16"));
  46. }
  47. [Test]
  48. public void verify_explicit_pipeline_resolution()
  49. {
  50. var module = new SimplePipelineModule(item => item.RegisterPipeline<IEnumerable<int>, IEnumerable<string>>()
  51. .Bind<Adder, IEnumerable<int>>()
  52. .Bind<Divider, IEnumerable<int>>()
  53. .Bind<Stringifier>());
  54. var builder = new ContainerBuilder();
  55. builder.RegisterModule(module);
  56. var container = builder.Build();
  57. var pipeline = container.Resolve<Functor<IEnumerable<int>, IEnumerable<string>>>();
  58. var items = new[] { 10, 20, 30 };
  59. var resolvedItems = pipeline(items);
  60. Assert.That(resolvedItems.Count(), Is.EqualTo(3));
  61. Assert.That(resolvedItems.ToArray()[0], Is.EqualTo("6"));
  62. Assert.That(resolvedItems.ToArray()[1], Is.EqualTo("11"));
  63. Assert.That(resolvedItems.ToArray()[2], Is.EqualTo("16"));
  64. }
  65. [Test]
  66. public void verify_malformed_type_conversion()
  67. {
  68. var module = new SimplePipelineModule(item => item.RegisterPipeline<IEnumerable<int>, IEnumerable<string>>()
  69. .Bind<Adder, IEnumerable<int>>()
  70. .Bind<Divider, IEnumerable<int>>());
  71. var builder = new ContainerBuilder();
  72. builder.RegisterModule(module);
  73. Assert.Throws<MismatchedClosingTypeDeclarationException>(() => builder.Build());
  74. }
  75. #region supporting injected classes
  76. public class Divider : IPipelineTask<IEnumerable<int>, IEnumerable<int>>
  77. {
  78. public IEnumerable<int> Execute(IEnumerable<int> input)
  79. {
  80. return from p in input select p / 2;
  81. }
  82. }
  83. public class NonConformingType
  84. {
  85. public IEnumerable<int> Run(IEnumerable<int> input)
  86. {
  87. return from p in input select p*2;
  88. }
  89. }
  90. public class Adder : IPipelineTask<IEnumerable<int>, IEnumerable<int>>
  91. {
  92. public IEnumerable<int> Execute(IEnumerable<int> input)
  93. {
  94. return from p in input select p + 2;
  95. }
  96. }
  97. public class Stringifier : IPipelineTask<IEnumerable<int>, IEnumerable<string>>
  98. {
  99. public IEnumerable<string> Execute(IEnumerable<int> input)
  100. {
  101. return from p in input select p.ToString();
  102. }
  103. }
  104. #endregion
  105. }
  106. }