diff options
| -rw-r--r-- | src/domain/EstimatedNetProductionFor.cs | 4 | ||||
| -rw-r--r-- | src/domain/GasPlant.cs | 16 | ||||
| -rw-r--r-- | src/domain/Range.cs | 8 | ||||
| -rw-r--r-- | src/domain/utility/IVisitor.cs | 30 | ||||
| -rw-r--r-- | src/test/GasPlantSpecs.cs | 15 |
5 files changed, 61 insertions, 12 deletions
diff --git a/src/domain/EstimatedNetProductionFor.cs b/src/domain/EstimatedNetProductionFor.cs index 31b2bd0..c046351 100644 --- a/src/domain/EstimatedNetProductionFor.cs +++ b/src/domain/EstimatedNetProductionFor.cs @@ -2,7 +2,7 @@ namespace domain { using utility; - public class EstimatedNetProductionFor<T> : IValueReturningVisitor<IWell, IQuantity> where T : ICommodity, new() + public class EstimatedNetProductionFor<Commodity> : IValueReturningVisitor<IWell, IQuantity> where Commodity : ICommodity, new() { Month month; IQuantity result; @@ -15,7 +15,7 @@ namespace domain public void Visit(IWell well) { - result = result.Plus(well.NetProductionFor<T>(month)); + result = result.Plus(well.NetProductionFor<Commodity>(month)); } public IQuantity Result() diff --git a/src/domain/GasPlant.cs b/src/domain/GasPlant.cs index 42bd38b..3035edb 100644 --- a/src/domain/GasPlant.cs +++ b/src/domain/GasPlant.cs @@ -34,27 +34,25 @@ namespace domain public IEnumerable<Month> MonthsOverAvailableCapacity() { - return MonthsOverAvailableCapacity(Month.Now().UpTo(new Month(2099, 12))); + return MonthsOverAvailableCapacity(Month.Now().UpTo(Month.Infinity)); } - public virtual IQuantity AvailableCapacityFor(Month month){ - throw new System.NotImplementedException(); + public virtual IQuantity AvailableCapacityFor(Month month) + { + return capacity.AvailableFor(month); } public IEnumerable<Month> MonthsOverAvailableCapacity(IRange<Month> months) { - var results = new List<Month>(); - months.Accept(month => + return months.Collect( month => { - if(IsOverCapacity(month)) - results.Add(month); + return IsOverCapacity(month); }); - return results; } bool IsOverCapacity(Month month) { - return capacity.AvailableFor(month).IsGreaterThan(TotalProductionFor(month)); + return AvailableCapacityFor(month).IsGreaterThan(TotalProductionFor(month)); } IQuantity TotalProductionFor(Month month) diff --git a/src/domain/Range.cs b/src/domain/Range.cs index 97b37af..236c513 100644 --- a/src/domain/Range.cs +++ b/src/domain/Range.cs @@ -1,6 +1,7 @@ namespace domain { using System; + using utility; public static class Ranges { @@ -10,7 +11,7 @@ namespace domain } } - public interface IRange<T> where T : IComparable<T> + public interface IRange<T> : IVisitable<T> where T : IComparable<T> { void Accept(Action<T> action); bool Contains(T item); @@ -27,6 +28,11 @@ namespace domain this.end = end; } + public void Accept(IVisitor<T> visitor) + { + Accept(visitor.Visit); + } + public void Accept(Action<T> visitor) { var next = this.start; diff --git a/src/domain/utility/IVisitor.cs b/src/domain/utility/IVisitor.cs index 25a7bbc..b086042 100644 --- a/src/domain/utility/IVisitor.cs +++ b/src/domain/utility/IVisitor.cs @@ -1,5 +1,8 @@ namespace utility { + using System; + using System.Collections.Generic; + public interface IVisitor<T> { void Visit(T item); @@ -9,10 +12,12 @@ namespace utility { void Accept(IVisitor<T> visitor); } + public interface IValueReturningVisitor<T, TResult> : IVisitor<T> { TResult Result(); } + public static class Visiting { public static TResult AcceptAndReturnResultFrom<T, TResult>(this IVisitable<T> visitable, IValueReturningVisitor<T, TResult> visitor) @@ -20,5 +25,30 @@ namespace utility visitable.Accept(visitor); return visitor.Result(); } + + public static IEnumerable<T> Collect<T>( this IVisitable<T> visitable, Func<T, bool> predicate) + { + var results = new List<T>(); + visitable.Accept(new AnonymousVisitor<T>(item => + { + if(predicate(item)) results.Add(item); + })); + return results; + } + } + + public class AnonymousVisitor<T> : IVisitor<T> + { + Action<T> visitor; + + public AnonymousVisitor(Action<T> visitor) + { + this.visitor = visitor; + } + + public void Visit(T item) + { + visitor(item); + } } } diff --git a/src/test/GasPlantSpecs.cs b/src/test/GasPlantSpecs.cs index e9a74b0..fdf8fd0 100644 --- a/src/test/GasPlantSpecs.cs +++ b/src/test/GasPlantSpecs.cs @@ -44,5 +44,20 @@ namespace test static IWell firstWell; static IWell secondWell; } + public class when_retrieving_the_available_capacity_for_a_month + { + It should_return_the_correct_amount = () => + { + result.ShouldEqual(30m.MCF()); + }; + + Because of = () => + { + sut.IncreaseCapacityTo(30m.MCF(),Month.Now()); + result = sut.AvailableCapacityFor(Month.Now()); + }; + + static IQuantity result; + } } } |
