public void ResourceFolder_Should_FindFolders()
        {
            // A/B/C
            var a = new ResourceFolder() { Name= "A" };
            var b = new ResourceFolder() { Name = "B" };
            var c = new ResourceFolder() { Name = "C" };
            var d = new ResourceFolder() { Name = "D" };
            var e = new ResourceFolder() { Name = "E" };
            var f = new ResourceFolder() { Name = "F" };
            var g = new ResourceFolder() { Name = "G" };
            var h = new ResourceFolder() { Name = "H" };
            var i = new ResourceFolder() { Name = "I" };
            a.AddFolder(b);
            b.AddFolder(c);
            b.AddFolder(d);
            c.AddFolder(e);
            c.AddFolder(f);
            e.AddFolder(g);
            f.AddFolder(h);
            g.AddFolder(i);

            var found = a.FindFolder(@"B\C\F\H");

            found.Should().Be(h);

            found = a.FindFolder(@"B/C/F\H");

            found.Should().Be(h);

            found = a.FindFolder(@"B/C/F/H");

            found.Should().Be(h);
        }
        public void ResourceFolder_Should_AddFiles()
        {
            var folder = new ResourceFolder();

            var file = Substitute.For<IResourceFile>();
            folder.AddFile(file);

            folder.Files.Count().Should().Be(1);

            file = Substitute.For<IResourceFile>();
            folder.AddFile(file);

            folder.Files.Count().Should().Be(2);
        }
        public void ResourceFolder_Should_AddFolders()
        {
            var folder = new ResourceFolder();

            var newFolder = Substitute.For<IResourceFolder>();
            folder.AddFolder(newFolder);

            folder.Folders.Count().Should().Be(1);

            newFolder = Substitute.For<IResourceFolder>();
            folder.AddFolder(newFolder);

            folder.Folders.Count().Should().Be(2);
        }
        /// <summary>
        /// Processes the file part.
        /// This helps recursively create our directory structure.
        /// </summary>
        /// <param name="resourceName">Name of the file.</param>
        /// <param name="parts">The parts.</param>
        /// <param name="folder">The folder.</param>
        /// <exception cref="System.Collections.Generic.KeyNotFoundException"></exception>
        private void ProcessFilePart(string resourceName, IEnumerable<string> parts, ResourceFolder folder)
        {
            resourceName = resourceName.Replace("\\", "/");

            if (parts.Count() == 1)
            {
                IResourceFile item = null;

                this._embeddedResourceItems.TryGetValue(GetResourceItemKey(resourceName), out item);

                var embeddedResourceFile = item as ResourceFile;
                if (embeddedResourceFile == null && !resourceName.EndsWith(".resx", StringComparison.OrdinalIgnoreCase))
                {
                    System.Diagnostics.Trace.TraceWarning("Could not find an embedded file {0} yet it was defined in embedded project file.", resourceName);
                }

                if (item != null)
                {
                    folder.AddFile(item);

                    // we can only infer the virtual path once we know the file location.
                    embeddedResourceFile.VirtualPath = "~/" + resourceName;
                    embeddedResourceFile.FileName = parts.First();
                }
            }
            else if (parts.Count() > 1)
            {
                var originalPart = parts.First();
                var firstPart = originalPart
                    .Replace("-", "_"); // this is a MSBuild convention, folder paths cannot contain a -, they are converted to _ at build time.
                // File names can contain dashes on the other hand... go figure.

                var nextParts = parts.Skip(1);

                var childFolder = folder.Folders
                    .OfType<ResourceFolder>()
                    .FirstOrDefault(x => x.Name.Equals(firstPart, StringComparison.OrdinalIgnoreCase));

                if (childFolder == null)
                {
                    var folderParts = resourceName.Split('/');
                    folderParts = folderParts.Take(folderParts.Length - 1).ToArray();
                    var virtualPath = "~/" + String.Join("/", folderParts);
                    var resourcePath = "~/" + String.Join("/", folderParts.Select(GetFolderPathDelegate));

                    childFolder = new ResourceFolder()
                    {
                        Name = firstPart,
                        VirtualPath = virtualPath,
                        ResourcePath = resourcePath,
                    };

                    folder.AddFolder(childFolder);
                }

                this.ProcessFilePart(resourceName, nextParts, childFolder);
            }
        }