using System.Collections.Generic;
using System.Collections;
public static void Main()
Console.WriteLine("Hello World");
TreeItem a111 = new TreeItem("a111");
TreeItem a11 = new TreeItem("a11", new List<TreeItem>{a111});
TreeItem a12 = new TreeItem("a12");
TreeItem a1 = new TreeItem("a1", new List<TreeItem>{a11, a12});
TreeItem b111 = new TreeItem("b111");
TreeItem b11 = new TreeItem("b11", new List<TreeItem>{b111});
TreeItem b12 = new TreeItem("b12");
TreeItem b1 = new TreeItem("b1", new List<TreeItem>{b11, b12});
Console.WriteLine("===== Test 1 =====");
a1.IsShowAlternateColor = false;
RunTest(new List<TreeItem> {a1, b1}, a1, new List<Tuple<string, bool>>
Tuple.Create("a1", false),
Tuple.Create("a11", true),
Tuple.Create("a111", false),
Tuple.Create("a12", true),
Tuple.Create("b1", false),
Tuple.Create("b11", true),
Tuple.Create("b111", false),
Tuple.Create("b12", true),
Console.WriteLine("===== Test 2 =====");
RunTest(new List<TreeItem> {a1, b1}, a11, new List<Tuple<string, bool>>
Tuple.Create("a1", false),
Tuple.Create("a11", true),
Tuple.Create("a111", false),
Tuple.Create("a12", false),
Tuple.Create("b1", true),
Tuple.Create("b11", false),
Tuple.Create("b111", true),
Tuple.Create("b12", false),
Console.WriteLine("===== Test 3 =====");
RunTest(new List<TreeItem> {a1, b1}, a1, new List<Tuple<string, bool>>
Tuple.Create("a1", false),
Tuple.Create("a11", true),
Tuple.Create("a111", false),
Tuple.Create("a12", false),
Tuple.Create("b1", true),
Tuple.Create("b11", false),
Tuple.Create("b111", true),
Tuple.Create("b12", true),
public static void RunTest(IEnumerable<TreeItem> treeItems, TreeItem modifiedTreeItem, IEnumerable<Tuple<string, bool>> expectedResults)
AlternateColorSetter target = new AlternateColorSetter(treeItems);
target.Start(modifiedTreeItem);
List<Tuple<string, bool>> actuals = new List<Tuple<string, bool>>();
Program.Iterate(actuals, treeItems);
if(actuals.Count() != expectedResults.Count())
throw new Exception("The number of elements was wrong.");
for(int i = 0 ; i < actuals.Count; i++)
if(actuals.ElementAt(i).Item1 != expectedResults.ElementAt(i).Item1)
throw new Exception("The " + (i + 1) + "th element has a wrong id.");
if(actuals.ElementAt(i).Item2 != expectedResults.ElementAt(i).Item2)
throw new Exception("The " + (i + 1) + "th element has a wrong alternate color setting.");
Console.WriteLine("Test passed");
private static void Iterate(List<Tuple<string, bool>> actuals, IEnumerable<TreeItem> treeItems)
foreach (TreeItem treeItem in treeItems)
actuals.Add(Tuple.Create(treeItem.Id, treeItem.IsShowAlternateColor));
Program.Iterate(actuals, treeItem.GetChildren());
public class AlternateColorSetter
private bool isStartingTreeItemLocated = false;
private TreeItem startingTreeItem = null;
private bool isShowAlternateColor = false;
private IEnumerable<TreeItem> treeItems;
public AlternateColorSetter(IEnumerable<TreeItem> treeItems)
this.treeItems = treeItems;
public void Start(TreeItem startingTreeItem)
this.isStartingTreeItemLocated = false;
this.startingTreeItem = startingTreeItem;
this.Iterate(this.treeItems);
private void Iterate(IEnumerable<TreeItem> treeItems)
foreach (TreeItem treeItem in treeItems)
if (!this.isStartingTreeItemLocated)
this.isStartingTreeItemLocated = treeItem == this.startingTreeItem;
if(this.isStartingTreeItemLocated)
this.isShowAlternateColor = treeItem.IsShowAlternateColor;
this.Iterate(treeItem.GetChildren());
treeItem.IsShowAlternateColor = !this.isShowAlternateColor;
this.isShowAlternateColor = treeItem.IsShowAlternateColor;
this.Iterate(treeItem.GetChildren());
public IEnumerable<TreeItem> Children {get; private set; }
public string Id {get; private set;}
public TreeItem(string id, IEnumerable<TreeItem> children)
this.Children = children;
public TreeItem(string id)
this.Children = new List<TreeItem>();
public IEnumerable<TreeItem> GetChildren()
public bool IsShowAlternateColor { get; set; }
public bool IsExpanded {get; set;}