public void EnumValueTest()
        {
            EnumValue<M.BooleanValues> onoffEnum = new EnumValue<M.BooleanValues>();
            Assert.False(onoffEnum.HasValue);
            Assert.Null(onoffEnum.InnerText);
            Assert.Null(onoffEnum.ToString());

            onoffEnum.InnerText = "error value";
            Assert.False(onoffEnum.HasValue);
            Assert.Equal("error value", onoffEnum.InnerText);
            Assert.Equal("error value", onoffEnum.ToString());

            onoffEnum.InnerText = string.Empty;
            Assert.False(onoffEnum.HasValue);
            Assert.Equal(string.Empty, onoffEnum.InnerText);
            Assert.Equal(string.Empty, onoffEnum.ToString());

            onoffEnum.InnerText = "on";
            Assert.True(onoffEnum.HasValue);
            Assert.Equal("on", onoffEnum.InnerText);
            Assert.Equal(M.BooleanValues.On, onoffEnum.Value);
            Assert.Equal(M.BooleanValues.On, (M.BooleanValues)onoffEnum);
            Assert.Equal("on", onoffEnum.ToString());

            //onoffEnum.Value = M.BooleanValues.False;
            //Assert.True(onoffEnum.HasValue);
            //Assert.Equal("false", onoffEnum.InnerText);
            //Assert.Equal(M.BooleanValues.False, onoffEnum.Value);
            //Assert.Equal(M.BooleanValues.False, (M.BooleanValues)onoffEnum);
            //Assert.Equal("false", onoffEnum.ToString());

            //onoffEnum = new EnumValue<M.BooleanValues>(M.BooleanValues.Zero);
            //Assert.True(onoffEnum.HasValue);
            //Assert.Equal("0", onoffEnum.InnerText);
            //Assert.Equal(M.BooleanValues.Zero, onoffEnum.Value);
            //Assert.Equal(M.BooleanValues.Zero, (M.BooleanValues)onoffEnum);
            //Assert.Equal("0", onoffEnum.ToString());

            var newEnum = new EnumValue<M.BooleanValues>(onoffEnum);
            Assert.True(newEnum.HasValue);
            //Assert.Equal("0", newEnum.InnerText);
            //Assert.Equal(M.BooleanValues.Zero, newEnum.Value);
            //Assert.Equal(M.BooleanValues.Zero, (M.BooleanValues)newEnum);
            //Assert.Equal("0", newEnum.ToString());

            newEnum.Value = M.BooleanValues.Off;
            Assert.True(newEnum.HasValue);
            Assert.Equal("off", newEnum.InnerText);
            Assert.Equal(M.BooleanValues.Off, newEnum.Value);
            Assert.Equal(M.BooleanValues.Off, (M.BooleanValues)newEnum);
            Assert.Equal("off", newEnum.ToString());

            // the onoffEnum should not be changed.
            Assert.True(onoffEnum.HasValue);
            Assert.Equal("on", onoffEnum.InnerText);
            Assert.Equal(M.BooleanValues.On, onoffEnum.Value);
            Assert.Equal(M.BooleanValues.On, (M.BooleanValues)onoffEnum);
            Assert.Equal("on", onoffEnum.ToString());

            // test sepcial case - the enum can be empty string ""
            var truefalseEmpty = new EnumValue<xvml.BooleanEntryWithBlankValues>(xvml.BooleanEntryWithBlankValues.Empty);
            Assert.True(truefalseEmpty.HasValue);
            Assert.Equal("", truefalseEmpty.InnerText);
            Assert.Equal(xvml.BooleanEntryWithBlankValues.Empty, truefalseEmpty.Value);
            Assert.Equal(xvml.BooleanEntryWithBlankValues.Empty, (xvml.BooleanEntryWithBlankValues)truefalseEmpty);
            Assert.Equal("", truefalseEmpty.ToString());

            truefalseEmpty = xvml.BooleanEntryWithBlankValues.T;
            Assert.True(truefalseEmpty.HasValue);
            Assert.Equal("t", truefalseEmpty.InnerText);
            Assert.Equal(xvml.BooleanEntryWithBlankValues.T, truefalseEmpty.Value);
            Assert.Equal(xvml.BooleanEntryWithBlankValues.T, (xvml.BooleanEntryWithBlankValues)truefalseEmpty);
            Assert.Equal("t", truefalseEmpty.ToString());

            truefalseEmpty.InnerText = string.Empty;
            Assert.True(truefalseEmpty.HasValue);
            Assert.Equal("", truefalseEmpty.InnerText);
            Assert.Equal(xvml.BooleanEntryWithBlankValues.Empty, truefalseEmpty.Value);
            Assert.Equal(xvml.BooleanEntryWithBlankValues.Empty, (xvml.BooleanEntryWithBlankValues)truefalseEmpty);
            Assert.Equal("", truefalseEmpty.ToString());

            // Clone constructor for EnumValue
            HeaderFooterValues validValue0 = HeaderFooterValues.Default;
            var objA = new EnumValue<HeaderFooterValues>(validValue0);
            var objB = new EnumValue<HeaderFooterValues>(objA);
            Assert.True(objA.HasValue);
            Assert.True(objB.HasValue);
            Assert.Equal("default", objA.InnerText);
            Assert.Equal("default", objB.InnerText);

            // Clone() for EnumValue.
            objA = new EnumValue<HeaderFooterValues>(validValue0);
            objB = (EnumValue<HeaderFooterValues>)(objA.Clone());
            Assert.True(objA.HasValue);
            Assert.True(objB.HasValue);
            Assert.Equal("default", objA.InnerText);
            Assert.Equal("default", objB.InnerText);
        }