public void AccessorTests()
        {
            AggregatedDataPoint target = new AggregatedDataPoint();

            target.UtcTimestamp = new DateTime(2016, 3, 13, 17, 28, 59, DateTimeKind.Utc);
            Assert.AreEqual(new DateTime(2016, 3, 13, 17, 28, 59, DateTimeKind.Utc), target.UtcTimestamp);

            target.AggregatedValue = 0.6;
            Assert.AreEqual(0.6, target.AggregatedValue);
        }
        public void EqualityTests()
        {
            AggregatedDataPoint point1 = new AggregatedDataPoint();
            point1.UtcTimestamp = new DateTime(2016, 3, 13, 17, 28, 2, DateTimeKind.Utc);
            point1.AggregatedValue = 0.3;

            AggregatedDataPoint point2 = new AggregatedDataPoint();
            point2.UtcTimestamp = new DateTime(2016, 3, 13, 17, 28, 2, DateTimeKind.Utc);
            point2.AggregatedValue = 0.4; // Invalid (aggregation must be consistent) but overlooked in this context

            AggregatedDataPoint point3 = new AggregatedDataPoint();
            point3.UtcTimestamp = new DateTime(2016, 3, 13, 17, 28, 3, DateTimeKind.Utc);
            point3.AggregatedValue = 0.5;

            Assert.IsTrue(point1 == point2);
            Assert.IsFalse(point1 == point3);
            Assert.IsTrue(point2 == point1);
            Assert.IsFalse(point2 == point3);
            Assert.IsFalse(point3 == point1);
            Assert.IsFalse(point3 == point2);

            Assert.IsTrue(point1.GetHashCode() == point2.GetHashCode());
            Assert.IsFalse(point1.GetHashCode() == point3.GetHashCode());
            Assert.IsTrue(point2.GetHashCode() == point1.GetHashCode());
            Assert.IsFalse(point2.GetHashCode() == point3.GetHashCode());
            Assert.IsFalse(point3.GetHashCode() == point1.GetHashCode());
            Assert.IsFalse(point3.GetHashCode() == point2.GetHashCode());

            Assert.IsFalse(point1 != point2);
            Assert.IsTrue(point1 != point3);
            Assert.IsFalse(point2 != point1);
            Assert.IsTrue(point2 != point3);
            Assert.IsTrue(point3 != point1);
            Assert.IsTrue(point3 != point2);

            Assert.IsTrue(point1.Equals(point2));
            Assert.IsFalse(point1.Equals(point3));
            Assert.IsTrue(point2.Equals(point1));
            Assert.IsFalse(point2.Equals(point3));
            Assert.IsFalse(point3.Equals(point1));
            Assert.IsFalse(point3.Equals(point2));

            Assert.IsFalse(point1.Equals("A String object"));
        }
        /// <summary>
        /// Generate predictable (based on test build) but seemingly random sample data for use in tests.
        /// </summary>
        /// <param name="seed">
        /// Seed. A constant seed will produce consistent results. A small change in the seed used should produce massively 
        /// different results.</param>
        /// <param name="sampleRawDataMaximumLength">Amount of data point observations. Can be zero.</param>
        /// <param name="sampleAggregatedDataMaximumLength">Amount of aggregated data points. Can be zero.</param>
        /// <param name="sampleRawData">Will be populated with sample raw data point observations.</param>
        /// <param name="sampleAggregatedData">Will be populated with aggregated data points.</param>
        /// <returns>Whether or not to consider the sample raw data a partial page.</returns>
        private static bool GenerateSampleData(
            int seed,
            int sampleRawDataMaximumLength,
            int sampleAggregatedDataMaximumLength,
            out DataPointObservation[] sampleRawData,
            out AggregatedDataPoint[] sampleAggregatedData)
        {
            Random psuedoRandomNumberGenerator = new Random(seed);

            int sampleRawDataLength = sampleRawDataMaximumLength == 0 ? 0 : psuedoRandomNumberGenerator.Next(1, sampleRawDataMaximumLength + 1);
            sampleRawData = new DataPointObservation[sampleRawDataLength];
            for (int i = 0; i < sampleRawData.Length; i++)
            {
                sampleRawData[i] = new DataPointObservation(NewRandomDateTimeUtc(psuedoRandomNumberGenerator), value: psuedoRandomNumberGenerator.NextDouble());
            }

            int sampleAggregatedDataLength = sampleAggregatedDataMaximumLength == 0 ? 0 : psuedoRandomNumberGenerator.Next(1, sampleAggregatedDataMaximumLength + 1);
            sampleAggregatedData = new AggregatedDataPoint[sampleAggregatedDataLength];
            for (int i = 0; i < sampleAggregatedData.Length; i++)
            {
                sampleAggregatedData[i] = new AggregatedDataPoint();
                sampleAggregatedData[i].UtcTimestamp = NewRandomDateTimeUtc(psuedoRandomNumberGenerator);
                sampleAggregatedData[i].AggregatedValue = psuedoRandomNumberGenerator.NextDouble();
            }

            return psuedoRandomNumberGenerator.NextDouble() < 0.5;
        }