public void CanCompareForEquality()
        {
            var aAlias = TestEnum.A;    // Resolve compiler warning

            Assert.True(TestEnum.A.Equals(TestEnum.A));
            Assert.True(TestEnum.A.Equals((object)TestEnum.A));
            Assert.True(aAlias == TestEnum.A);
            Assert.False(aAlias != TestEnum.A);

            Assert.False(TestEnum.A.Equals(TestEnum.B));
            Assert.False(TestEnum.A.Equals((object)TestEnum.B));
            Assert.False(TestEnum.A == TestEnum.B);
            Assert.True(TestEnum.A != TestEnum.B);

            Assert.False(TestEnum.A.Equals(TestEnum.Create("c")));
            Assert.False(TestEnum.A.Equals((object)TestEnum.Create("c")));
            Assert.False(TestEnum.A == TestEnum.Create("c"));
            Assert.True(TestEnum.A != TestEnum.Create("c"));

            Assert.True(TestEnum.Create("a").Equals(TestEnum.A));
            Assert.True(TestEnum.Create("a").Equals((object)TestEnum.A));
            Assert.True(TestEnum.Create("a") == TestEnum.A);
            Assert.False(TestEnum.Create("a") != TestEnum.A);

            Assert.True(TestEnum.Special(TestEnum.A).Equals(TestEnum.Special(TestEnum.A)));
            Assert.True(TestEnum.Special(TestEnum.A).Equals((object)TestEnum.Special(TestEnum.A)));
            Assert.True(TestEnum.Special(TestEnum.A) == TestEnum.Special(TestEnum.A));
            Assert.False(TestEnum.Special(TestEnum.A) != TestEnum.Special(TestEnum.A));

            Assert.False(TestEnum.Special(TestEnum.A).Equals(TestEnum.Special(TestEnum.B)));
            Assert.False(TestEnum.Special(TestEnum.A).Equals((object)TestEnum.Special(TestEnum.B)));
            Assert.False(TestEnum.Special(TestEnum.A) == TestEnum.Special(TestEnum.B));
            Assert.True(TestEnum.Special(TestEnum.A) != TestEnum.Special(TestEnum.B));
        }
        public void CanConvertEnumToString()
        {
            Assert.Equal("a", TestEnum.A.ToString());
            Assert.Equal("b", TestEnum.B.ToString());
            Assert.Equal("c", TestEnum.Create("c").ToString());

            Assert.Equal("a", (string)TestEnum.A);
            Assert.Equal("b", (string)TestEnum.B);
            Assert.Equal("c", (string)TestEnum.Create("c"));
        }
        public void CanSerializeUnknownValue()
        {
            const string ExpectedJson = @"{""ID"":1,""Test"":""unknown""}";

            var model = new Model()
            {
                ID = 1, Test = TestEnum.Create("unknown")
            };
            string actualJson = JsonConvert.SerializeObject(model);

            Assert.Equal(ExpectedJson, actualJson);
        }
        public void CanDeserializeUnknownValue()
        {
            const string Json = @"{""ID"":0,""Test"":""unknown""}";

            var expectedModel = new Model()
            {
                ID = 0, Test = TestEnum.Create("unknown")
            };
            Model actualModel = JsonConvert.DeserializeObject <Model>(Json);

            Assert.Equal(expectedModel.ID, actualModel.ID);

            // Value equality should work, but reference equality shouldn't.
            Assert.NotSame(expectedModel.Test, actualModel.Test);
            Assert.Equal(expectedModel.Test, actualModel.Test);
        }