public void TestCache <T>(int min, int max) where T : IFunction, new() { var function = new T(); var cachedFunction = new Cached <T>(); var random = new Random(); for (var i = 0; i < 4000; ++i) { var input = Enumerable.Range(0, 100).Select(_ => random.Next(min, max)).ToArray(); var expected = function.Compute(input); var result = cachedFunction.Compute(input); var cachedResult = cachedFunction.Compute(input); Assert.AreEqual(expected, cachedResult); Assert.AreEqual(result, cachedResult); } }