Click here to Skip to main content
15,896,118 members
Articles / Programming Languages / C#

A TimeZone Aware DateTime Implementation

Rate me:
Please Sign up or sign in to vote.
3.56/5 (10 votes)
24 Feb 2010CPOL6 min read 70.4K   466   37  
An implementation that wraps DateTime to allow for keeping track of TimeZone state
/*
 * Created by: Steinar Dragsnes
 * Created: 12-apr-2009
 */

using System;
using DateTimeZone;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TEST.DateTimeZone
{
    [TestClass]
    public class DayFractionTest
    {
        private double df1double;
        private double df2double;
        private TimeSpan oneDayAndAHalfTimeSpan;
        private double df1Plus1double;
        private double df1Minus1double;

        /// <summary>
        /// Sets up testvalues
        /// </summary>
        [TestInitialize]
        public void SetUp()
        {
            df1double = 2.5;
            df2double = 1.5;
            oneDayAndAHalfTimeSpan = new TimeSpan(1, 12, 0, 0);
            df1Plus1double = 3.5;
            df1Minus1double = 1.5;
        }

        /// <summary>
        /// Tests creation from a double value
        /// </summary>
        [TestMethod]
        public void TestCreateDFFromDouble()
        {
            DayFraction fraction = new DayFraction(df1double);
            Assert.AreEqual(fraction.Days, df1double);
        }

        /// <summary>
        /// tests comparison using Nunit Asserts
        /// </summary>
        [TestMethod]
        public void TestComparison()
        {
            DayFraction fraction1 = new DayFraction(df1double);
            DayFraction fraction1Copy = fraction1;
            DayFraction fraction2 = new DayFraction(df2double);
            Assert.IsTrue(2 > 1);
            Assert.IsTrue(fraction1 > fraction2);
            Assert.IsTrue(1 < 2);
            Assert.IsTrue(fraction2 < fraction1);
            Assert.AreNotSame(fraction1, fraction2);
            Assert.AreEqual(fraction1, fraction1Copy);
        }

        /// <summary>
        /// Tests comparison using operators
        /// </summary>
        [TestMethod]
        public void TestComparisonOperators()
        {
            DayFraction df1 = new DayFraction(df1double);
            DayFraction df1Copy = df1;
            DayFraction df2 = new DayFraction(df2double);

            Assert.IsTrue(df1 >= df2);
            Assert.IsTrue(df1 > df2);
            Assert.IsTrue(df1Copy >= df1);
            Assert.IsTrue(df2 < df1);
            Assert.IsTrue(df2 <= df1);
            Assert.IsTrue(df1Copy <= df1);
            Assert.IsTrue(df2 != df1);
        }

        /// <summary>
        /// Tests addition operator
        /// </summary>
        [TestMethod]
        public void TestPlus1WithinDayFractionAndDouble()
        {
            DayFraction df1 = new DayFraction(df1double);
            DayFraction df1Plus1 = new DayFraction(df1Plus1double);
            Assert.AreEqual(df1Plus1, df1 + 1);
        }

        /// <summary>
        /// Tests addition operator
        /// </summary>
        [TestMethod]
        public void TestPlus1WithinDayFractions()
        {
            DayFraction df1 = new DayFraction(df1double);
            DayFraction df1Plus1 = new DayFraction(df1Plus1double);
            Assert.AreEqual(df1Plus1, df1 + new DayFraction(1));
        }

        /// <summary>
        /// Tests addition operator
        /// </summary>
        [TestMethod]
        public void TestPlus1WithinDoubleAndDayFraction()
        {
            DayFraction df1 = new DayFraction(df1double);
            DayFraction df1Plus1 = new DayFraction(df1Plus1double);
            Assert.AreEqual(3.5, 1 + df1);
        }

        /// <summary>
        /// Tests subtraction operator
        /// </summary>
        [TestMethod]
        public void TestMinus1WithinDayFractions()
        {
            DayFraction df1 = new DayFraction(df1double);
            DayFraction df1Minus1 = new DayFraction(df1Minus1double);
            Assert.AreEqual(df1 - df1Minus1, new DayFraction(1));
        }

        /// <summary>
        /// Tests subtraction operator
        /// </summary>
        [TestMethod]
        public void TestMinus1WithinDayFractionAndDouble()
        {
            DayFraction df1 = new DayFraction(df1double);
            Assert.AreEqual(df1 - 1.5, new DayFraction(1));
        }

        /// <summary>
        /// Tests subtraction operator
        /// </summary>
        [TestMethod]
        public void TestMinus1WithinDoubleAndDayFraction()
        {
            DayFraction df1Minus1 = new DayFraction(df1Minus1double);
            Assert.AreEqual(2.5 - df1Minus1, 1);
        }

        /// <summary>
        /// Tests average calculation
        /// </summary>
        [TestMethod]
        public void TestDivision()
        {
            DayFraction df2 = new DayFraction(df2double);
            DayFraction df1Minus1 = new DayFraction(df1Minus1double);
            Assert.AreEqual(df1Minus1 / df2, new DayFraction(1));
            Assert.AreEqual(df1Minus1 / 1.5, new DayFraction(1));
            Assert.AreEqual(1.5 / df2, new DayFraction(1));
        }

        /// <summary>
        /// Test the hashcode of 2 instances
        /// </summary>
        [TestMethod]
        public void TestIdentity()
        {
            DayFraction df1 = new DayFraction(df1double);
            DayFraction df1Copy = df1;
            Assert.AreEqual(df1.GetHashCode(), df1Copy.GetHashCode());
        }

        [TestMethod]
        public void TestGetTimeSpan()
        {
            DayFraction df2 = new DayFraction(df2double);
            Assert.AreEqual(df2.GetTimeSpan(), oneDayAndAHalfTimeSpan);
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Norway Norway
http://www.linkedin.com/in/steinardragsnes

Comments and Discussions