public void cloning_two_levels() { var root = new YogaNode { Width = 100, Height = 100 }; var root_child0 = new YogaNode { FlexGrow = 1, FlexBasis = 15 }; root.Children.Add(root_child0); var root_child1 = new YogaNode { FlexGrow = 1 }; root.Children.Insert(1, root_child1); var root_child1_0 = new YogaNode { FlexBasis = 10, FlexGrow = 1 }; root_child1.Children.Add(root_child1_0); var root_child1_1 = new YogaNode { FlexBasis = 25 }; root_child1.Children.Insert(1, root_child1_1); root.Calc.CalculateLayout(float.NaN, float.NaN, DirectionType.LTR); Assert.AreEqual(40, root_child0.Layout.Height); Assert.AreEqual(60, root_child1.Layout.Height); Assert.AreEqual(35, root_child1_0.Layout.Height); Assert.AreEqual(25, root_child1_1.Layout.Height); var root2_child0 = new YogaNode(root_child0) { FlexGrow = 0, FlexBasis = 40 }; var root2_child1 = new YogaNode(root_child1); var root2 = new YogaNode(root); root2.ClearChildren(); root2.Children.Add(root2_child0); root2.Children.Insert(1, root2_child1); Assert.AreEqual(2, root2.Children.Count); root2.Calc.CalculateLayout(float.NaN, float.NaN, DirectionType.LTR); // Original root is unchanged Assert.AreEqual(40, root_child0.Layout.Height); Assert.AreEqual(60, root_child1.Layout.Height); Assert.AreEqual(35, root_child1_0.Layout.Height); Assert.AreEqual(25, root_child1_1.Layout.Height); // New root has new layout at the top Assert.AreEqual(40, root2_child0.Layout.Height); Assert.AreEqual(60, root2_child1.Layout.Height); // The deeper children are untouched. Assert.AreEqual(root2_child1.Children[0], root_child1_0); Assert.AreEqual(root2_child1.Children[1], root_child1_1); }