private static SampleFolderViewModel PopulateRandomly(string path, int numFiles, int numFolders, int nestedLevels)
        {
            var result = new SampleFolderViewModel
            {
                Name = Path.GetFileName(path)
            };

            for (var i = 0; i < numFiles; ++i)
            {
                var name       = Path.GetRandomFileName();
                var nestedPath = Path.Combine(path, name + ".xml");
                File.WriteAllText(nestedPath, "N/A");
                result.Items.Add(new FileSampleViewModel(nestedPath));
            }

            if (nestedLevels <= 0)
            {
                return(result);
            }

            for (var i = 0; i < numFolders; ++i)
            {
                var name       = Path.GetRandomFileName();
                var nestedPath = Path.Combine(path, name);
                Directory.CreateDirectory(nestedPath);
                result.Items.Add(PopulateRandomly(nestedPath, numFiles, numFolders, nestedLevels - 1));
            }

            return(result);
        }
        private static SampleFolderViewModel?ScanSampleFolder(string path)
        {
            var result = new SampleFolderViewModel
            {
                Name = new DirectoryInfo(path).Name,
            };

            foreach (var directory in Directory.GetDirectories(path))
            {
                var folder = ScanSampleFolder(directory);
                if (folder == null)
                {
                    continue;
                }

                result.Items.Add(folder);
            }

            foreach (var file in Directory.GetFiles(path, "*.xml"))
            {
                result.Items.Add(new FileSampleViewModel(file));
            }

            return(result.Items.Count > 0 ? result : null);
        }
        private static void ScanResult(SampleFolderViewModel result, Action <ISampleMenuItem> action)
        {
            action(result);

            foreach (var item in result.Items)
            {
                if (item is SampleFolderViewModel folder)
                {
                    ScanResult(folder, action);
                }
                else
                {
                    action(item);
                }
            }
        }
        public static SampleFolderViewModel?LoadXmlSamples(IEnumerable <string> sources, bool showDefault)
        {
            var root = new SampleFolderViewModel
            {
                Name = "XML Sample",
            };

            foreach (var source in sources)
            {
                if (string.IsNullOrWhiteSpace(source))
                {
                    continue;
                }

                var trimmed = source.Trim();

                if (trimmed.EndsWith(".xml", StringComparison.InvariantCultureIgnoreCase) && File.Exists(trimmed))
                {
                    root.Items.Add(new FileSampleViewModel(trimmed));
                }

                if (!Directory.Exists(trimmed))
                {
                    continue;
                }

                var folder = ScanSampleFolder(trimmed);
                if (folder == null)
                {
                    continue;
                }

                root.Items.Add(folder);
            }

            if (showDefault)
            {
                foreach (var sample in EmbeddedSampleViewModel.GetFromAssembly())
                {
                    root.Items.Add(sample);
                }
            }

            return(root.Items.Count > 0 ? root : null);
        }
        private static void AssertConsistency(SampleFolderViewModel expected, SampleFolderViewModel actual, string path = null)
        {
            path = $"{path}/{expected.Name}";

            // For simplicity, it is not checked whether actual contains more items than expected
            foreach (var item in expected.Items)
            {
                if (item is SampleFolderViewModel folder)
                {
                    var other = actual.Items.OfType <SampleFolderViewModel>().FirstOrDefault(x => x.Name == item.Name);
                    Assert.NotNull(other, $"Could not find folder {path}/{item.Name}");
                    AssertConsistency(folder, other, path);
                }
                else
                {
                    var other = actual.Items.OfType <FileSampleViewModel>().FirstOrDefault(x => x.Name == item.Name);
                    Assert.NotNull(other, $"Could not find file {path}/{item.Name}");
                }
            }
        }