From bfee2dfe137b07e64ebd46baf71d932d58d01b1f Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Tue, 23 Jun 2015 16:09:27 +0100 Subject: Implement freezing for messages and repeated fields. Fixes issue #523. --- .../src/ProtocolBuffers.Test/RepeatedFieldTest.cs | 47 +++++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'csharp/src/ProtocolBuffers.Test/RepeatedFieldTest.cs') diff --git a/csharp/src/ProtocolBuffers.Test/RepeatedFieldTest.cs b/csharp/src/ProtocolBuffers.Test/RepeatedFieldTest.cs index cbe79294..c01cd8ff 100644 --- a/csharp/src/ProtocolBuffers.Test/RepeatedFieldTest.cs +++ b/csharp/src/ProtocolBuffers.Test/RepeatedFieldTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using Google.Protobuf.Collections; +using Google.Protobuf.TestProtos; using NUnit.Framework; namespace Google.Protobuf @@ -11,8 +12,8 @@ namespace Google.Protobuf public void NullValuesRejected() { var list = new RepeatedField(); - Assert.Throws(() => list.Add((string) null)); - Assert.Throws(() => list.Add((IEnumerable) null)); + Assert.Throws(() => list.Add((string)null)); + Assert.Throws(() => list.Add((IEnumerable)null)); Assert.Throws(() => list.Add((RepeatedField)null)); Assert.Throws(() => list.Contains(null)); Assert.Throws(() => list.IndexOf(null)); @@ -47,5 +48,47 @@ namespace Google.Protobuf Assert.AreEqual("foo", list[1]); Assert.AreEqual("bar", list[2]); } + + [Test] + public void Freeze_FreezesElements() + { + var list = new RepeatedField { new TestAllTypes() }; + Assert.IsFalse(list[0].IsFrozen); + list.Freeze(); + Assert.IsTrue(list[0].IsFrozen); + } + + [Test] + public void Freeze_PreventsMutations() + { + var list = new RepeatedField { 0 }; + list.Freeze(); + Assert.Throws(() => list.Add(1)); + Assert.Throws(() => list[0] = 1); + Assert.Throws(() => list.Clear()); + Assert.Throws(() => list.RemoveAt(0)); + Assert.Throws(() => list.Remove(0)); + Assert.Throws(() => list.Insert(0, 0)); + } + + [Test] + public void Freeze_ReportsFrozen() + { + var list = new RepeatedField { 0 }; + Assert.IsFalse(list.IsFrozen); + Assert.IsFalse(list.IsReadOnly); + list.Freeze(); + Assert.IsTrue(list.IsFrozen); + Assert.IsTrue(list.IsReadOnly); + } + + [Test] + public void Clone_ReturnsMutable() + { + var list = new RepeatedField { 0 }; + list.Freeze(); + var clone = list.Clone(); + clone[0] = 1; + } } } -- cgit v1.2.3