/// <exception cref="System.Exception"/>
 internal Node(Path path, int level, SnapshotTestHelper.TestDirectoryTree.Node parent
               , FileSystem fs)
 {
     this.nodePath            = path;
     this.level               = level;
     this.parent              = parent;
     this.nonSnapshotChildren = new AList <SnapshotTestHelper.TestDirectoryTree.Node>();
     fs.Mkdirs(nodePath);
 }
 public override bool Equals(object o)
 {
     if (o != null && o is SnapshotTestHelper.TestDirectoryTree.Node)
     {
         SnapshotTestHelper.TestDirectoryTree.Node node = (SnapshotTestHelper.TestDirectoryTree.Node
                                                           )o;
         return(node.nodePath.Equals(nodePath));
     }
     return(false);
 }
 /// <summary>
 /// Constructor to build a tree of given
 /// <paramref name="height"/>
 /// </summary>
 /// <exception cref="System.Exception"/>
 internal TestDirectoryTree(int height, FileSystem fs)
 {
     this.height  = height;
     this.topNode = new SnapshotTestHelper.TestDirectoryTree.Node(new Path("/TestSnapshot"
                                                                           ), 0, null, fs);
     this.levelMap = new Dictionary <int, AList <SnapshotTestHelper.TestDirectoryTree.Node
                                                 > >();
     AddDirNode(topNode, 0);
     GenChildren(topNode, height - 1, fs);
 }
            /// <summary>Add a node into the levelMap</summary>
            private void AddDirNode(SnapshotTestHelper.TestDirectoryTree.Node node, int atLevel
                                    )
            {
                AList <SnapshotTestHelper.TestDirectoryTree.Node> list = levelMap[atLevel];

                if (list == null)
                {
                    list = new AList <SnapshotTestHelper.TestDirectoryTree.Node>();
                    levelMap[atLevel] = list;
                }
                list.AddItem(node);
            }
 /// <summary>Randomly retrieve a node from the directory tree.</summary>
 /// <param name="random">A random instance passed by user.</param>
 /// <param name="excludedList">
 /// Excluded list, i.e., the randomly generated node
 /// cannot be one of the nodes in this list.
 /// </param>
 /// <returns>a random node from the tree.</returns>
 internal virtual SnapshotTestHelper.TestDirectoryTree.Node GetRandomDirNode(Random
                                                                             random, IList <SnapshotTestHelper.TestDirectoryTree.Node> excludedList)
 {
     while (true)
     {
         int level = random.Next(height);
         AList <SnapshotTestHelper.TestDirectoryTree.Node> levelList = levelMap[level];
         int index = random.Next(levelList.Count);
         SnapshotTestHelper.TestDirectoryTree.Node randomNode = levelList[index];
         if (excludedList == null || !excludedList.Contains(randomNode))
         {
             return(randomNode);
         }
     }
 }
 /// <summary>Recursively generate the tree based on the height.</summary>
 /// <param name="parent">The parent node</param>
 /// <param name="level">The remaining levels to generate</param>
 /// <param name="fs">The FileSystem where to generate the files/dirs</param>
 /// <exception cref="System.Exception"/>
 private void GenChildren(SnapshotTestHelper.TestDirectoryTree.Node parent, int level
                          , FileSystem fs)
 {
     if (level == 0)
     {
         return;
     }
     parent.leftChild = new SnapshotTestHelper.TestDirectoryTree.Node(new Path(parent.
                                                                               nodePath, "left" + ++id), height - level, parent, fs);
     parent.rightChild = new SnapshotTestHelper.TestDirectoryTree.Node(new Path(parent
                                                                                .nodePath, "right" + ++id), height - level, parent, fs);
     AddDirNode(parent.leftChild, parent.leftChild.level);
     AddDirNode(parent.rightChild, parent.rightChild.level);
     GenChildren(parent.leftChild, level - 1, fs);
     GenChildren(parent.rightChild, level - 1, fs);
 }