diff options
author | wplong11 <wplong11@naver.com> | 2017-03-20 21:06:20 +0900 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-03-20 12:06:20 +0000 |
commit | f98e1525c15ca77ec9840c2b5c8020b1b320b141 (patch) | |
tree | 46bbe9afc82c275da3828f486dcf63821f7e2a0a | |
parent | ce068193286c5fcebe3fe01fd5edfbbac88e4058 (diff) | |
download | xamarin-forms-f98e1525c15ca77ec9840c2b5c8020b1b320b141.tar.gz xamarin-forms-f98e1525c15ca77ec9840c2b5c8020b1b320b141.tar.bz2 xamarin-forms-f98e1525c15ca77ec9840c2b5c8020b1b320b141.zip |
[Core] Fix internal children clear logic (#820)
* Fix InternalChildren clear logic
* Improve InternalChildren clear logic
* Add test code to verify InternalChildren clear logic
* Add missing test cases
* Improve time complexity of clear logic
* Fix the test case where InvalidOperationException occurs.
* Correct the name casing of the test case
* Modify a wrong test code
6 files changed, 101 insertions, 5 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/ContentFormUnitTests.cs b/Xamarin.Forms.Core.UnitTests/ContentFormUnitTests.cs index 5b6f3e60..e52b5dbf 100644 --- a/Xamarin.Forms.Core.UnitTests/ContentFormUnitTests.cs +++ b/Xamarin.Forms.Core.UnitTests/ContentFormUnitTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NUnit.Framework; @@ -64,5 +65,21 @@ namespace Xamarin.Forms.Core.UnitTests Assert.AreEqual (context, toolbarItem.BindingContext); } + + [Test] + public void ContentPage_should_have_the_InternalChildren_correctly_when_Content_changed() + { + var sut = new ContentPage(); + IList<Element> internalChildren = ((IControlTemplated)sut).InternalChildren; + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + + var expected = new View(); + sut.Content = expected; + + Assert.AreEqual(1, internalChildren.Count); + Assert.AreSame(expected, internalChildren[0]); + } } } diff --git a/Xamarin.Forms.Core.UnitTests/ContentViewUnitTest.cs b/Xamarin.Forms.Core.UnitTests/ContentViewUnitTest.cs index 73bb531b..5d7dd651 100644 --- a/Xamarin.Forms.Core.UnitTests/ContentViewUnitTest.cs +++ b/Xamarin.Forms.Core.UnitTests/ContentViewUnitTest.cs @@ -388,6 +388,21 @@ namespace Xamarin.Forms.Core.UnitTests Assert.AreEqual ("Foo", child.BindingContext); } - } + [Test] + public void ContentView_should_have_the_InternalChildren_correctly_when_Content_changed() + { + var sut = new ContentView(); + IList<Element> internalChildren = ((IControlTemplated)sut).InternalChildren; + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + + var expected = new View(); + sut.Content = expected; + + Assert.AreEqual(1, internalChildren.Count); + Assert.AreSame(expected, internalChildren[0]); + } + } } diff --git a/Xamarin.Forms.Core.UnitTests/TemplatedPageUnitTests.cs b/Xamarin.Forms.Core.UnitTests/TemplatedPageUnitTests.cs new file mode 100644 index 00000000..306abf0d --- /dev/null +++ b/Xamarin.Forms.Core.UnitTests/TemplatedPageUnitTests.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using NUnit.Framework; + +namespace Xamarin.Forms.Core.UnitTests +{ + [TestFixture] + public class TemplatedPageUnitTests : BaseTestFixture + { + [Test] + public void TemplatedPage_should_have_the_InternalChildren_correctly_when_ControlTemplate_changed() + { + var sut = new TemplatedPage(); + IList<Element> internalChildren = ((IControlTemplated)sut).InternalChildren; + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + + sut.ControlTemplate = new ControlTemplate(typeof(ExpectedView)); + + Assert.AreEqual(1, internalChildren.Count); + Assert.IsInstanceOf<ExpectedView>(internalChildren[0]); + } + + private class ExpectedView : View + { + public ExpectedView() + { + } + } + } +} diff --git a/Xamarin.Forms.Core.UnitTests/TemplatedViewUnitTests.cs b/Xamarin.Forms.Core.UnitTests/TemplatedViewUnitTests.cs new file mode 100644 index 00000000..6255edaf --- /dev/null +++ b/Xamarin.Forms.Core.UnitTests/TemplatedViewUnitTests.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using NUnit.Framework; + +namespace Xamarin.Forms.Core.UnitTests +{ + [TestFixture] + public class TemplatedViewUnitTests : BaseTestFixture + { + [Test] + public void TemplatedView_should_have_the_InternalChildren_correctly_when_ControlTemplate_changed() + { + var sut = new TemplatedView(); + IList<Element> internalChildren = ((IControlTemplated)sut).InternalChildren; + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + internalChildren.Add(new VisualElement()); + + sut.ControlTemplate = new ControlTemplate(typeof(ExpectedView)); + + Assert.AreEqual(1, internalChildren.Count); + Assert.IsInstanceOf<ExpectedView>(internalChildren[0]); + } + + private class ExpectedView : View + { + public ExpectedView() + { + } + } + } +} diff --git a/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj b/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj index 243cbce3..8727b984 100644 --- a/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj +++ b/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj @@ -80,6 +80,8 @@ <Compile Include="ColorUnitTests.cs" /> <Compile Include="CommandSourceTests.cs" /> <Compile Include="CommandTests.cs" /> + <Compile Include="TemplatedViewUnitTests.cs" /> + <Compile Include="TemplatedPageUnitTests.cs" /> <Compile Include="ContentFormUnitTests.cs" /> <Compile Include="ContraintTypeConverterTests.cs" /> <Compile Include="ControlTemplateTests.cs" /> diff --git a/Xamarin.Forms.Core/TemplateUtilities.cs b/Xamarin.Forms.Core/TemplateUtilities.cs index 4a8d21b9..e78f4836 100644 --- a/Xamarin.Forms.Core/TemplateUtilities.cs +++ b/Xamarin.Forms.Core/TemplateUtilities.cs @@ -58,9 +58,9 @@ namespace Xamarin.Forms var newElement = (Element)newValue; if (self.ControlTemplate == null) { - for (var i = 0; i < self.InternalChildren.Count; i++) + while (self.InternalChildren.Count > 0) { - self.InternalChildren.Remove(self.InternalChildren[i]); + self.InternalChildren.RemoveAt(self.InternalChildren.Count - 1); } if (newValue != null) @@ -104,9 +104,9 @@ namespace Xamarin.Forms } // Now remove all remnants of any other children just to be sure - for (var i = 0; i < self.InternalChildren.Count; i++) + while (self.InternalChildren.Count > 0) { - self.InternalChildren.Remove(self.InternalChildren[i]); + self.InternalChildren.RemoveAt(self.InternalChildren.Count - 1); } ControlTemplate template = self.ControlTemplate; |