public void AsFrozenTest()
        {
            var fo = new FreezableObject();

            Assert.False(fo.IsFrozen());
            FreezableExtensions.ThrowIfFrozen(fo);
            Assert.Same(fo, FreezableExtensions.AsFrozen(fo));
            Assert.True(fo.IsFrozen());
            Assert.Throws <System.InvalidOperationException>(() => FreezableExtensions.ThrowIfFrozen(fo));
            Assert.False(fo.Freeze());
        }
        public void SetStringPropertyTest()
        {
            const string TextValue1 = "aa";
            string       TextValue2 = TextValue1.Substring(0, 1) + TextValue1.Substring(0, 1);
            const string TextValue3 = "bb";

            Assert.NotSame(TextValue1, TextValue2);
            {
                var sut = new TestFreezableObject();
                Assert.Null(sut.Text);
                sut.Text = TextValue1;
                Assert.Same(TextValue1, sut.Text);
                sut.Text = TextValue2;
                Assert.Same(TextValue1, sut.Text);
                sut.Text = TextValue3;
                Assert.Same(TextValue3, sut.Text);
                sut.Freeze();
                Assert.Throws <System.InvalidOperationException>(() => sut.Text = TextValue1);
                Assert.Same(TextValue3, sut.Text);
            }
            {
                var sut = new TestFreezableObject();
                Assert.Null(sut.Text);
                Assert.True(FreezableExtensions.SetStringProperty(sut, ref sut._Text, TextValue1));
                Assert.Same(TextValue1, sut.Text);
                Assert.False(FreezableExtensions.SetStringProperty(sut, ref sut._Text, TextValue1));
                Assert.Same(TextValue1, sut.Text);
                Assert.False(FreezableExtensions.SetStringProperty(sut, ref sut._Text, TextValue2));
                Assert.Same(TextValue1, sut.Text);
                Assert.True(FreezableExtensions.SetStringProperty(sut, ref sut._Text, TextValue3));
                Assert.Same(TextValue3, sut.Text);
                sut.Freeze();
                Assert.Throws <System.InvalidOperationException>(() => FreezableExtensions.SetStringProperty(sut, ref sut._Text, TextValue1));
                Assert.Same(TextValue3, sut.Text);
            }
        }
        public void ThrowIfFrozenTest()
        {
            var fo = new FreezableObject();

            Assert.False(fo.IsFrozen());
            FreezableExtensions.ThrowIfFrozen(fo);
            Assert.Throws <System.InvalidOperationException>(() => FreezableExtensions.ThrowIfNotFrozen(fo));
            try {
                FreezableExtensions.ThrowIfNotFrozen(fo);
            } catch (System.Exception error) {
                Assert.Equal("Brimborium.Extensions.Freezable.FreezableObject is NOT frozen.", error.Message);
            }
            try {
                FreezableExtensions.ThrowIfNotFrozen(fo, "xxx");
            } catch (System.Exception error) {
                Assert.Equal("xxx is NOT frozen.", error.Message);
            }


            Assert.True(fo.Freeze());
            Assert.True(fo.IsFrozen());
            Assert.Throws <System.InvalidOperationException>(() => FreezableExtensions.ThrowIfFrozen(fo));
            FreezableExtensions.ThrowIfNotFrozen(fo);
            try {
                FreezableExtensions.ThrowIfFrozen(fo);
            } catch (System.Exception error) {
                Assert.Equal("Brimborium.Extensions.Freezable.FreezableObject is frozen.", error.Message);
            }
            try {
                FreezableExtensions.ThrowIfFrozen(fo, "xxx");
            } catch (System.Exception error) {
                Assert.Equal("xxx is frozen.", error.Message);
            }

            Assert.False(fo.Freeze());
        }