Пример #1
0
        public async Task <LoggerResult> SaveProject()
        {
            if (PackageSession == null)
            {
                throw new InvalidOperationException("Cannot save the project before it was loaded.");
            }

            // TODO: check asset consistency

            // TODO: read more about Stride.Core.Assets.Editor.PackageViewModel
            //// Prepare packages to be saved by setting their dirty flag correctly
            //foreach (var package in LocalPackages)
            //{
            //    package.PreparePackageForSaving();
            //}

            var viewUpdater = Services.GetService <IViewUpdater>();

            PackageSessionResult sessionResult = await SetupResultProgress(viewUpdater, SaveProjectScope);

            // TODO: display a dialog with save progress

            // Force PackageSession.Save to be executed on the thread pool
            // otherwise it would block execution and we want this process to be async
            using (var scope = new TimedScope(SaveProjectScope, TimedScope.Status.Success))
            {
                await Task.Run(() =>
                {
                    try
                    {
                        var saveParameters = PackageSaveParameters.Default();

                        // TODO: read more about Stride.Core.Assets.Editor.AssetViewModel
                        // AllAssets.ForEach(x => x.PrepareSave(sessionResult));
                        PackageSession.Save(sessionResult, saveParameters);
                    }
                    catch (Exception e)
                    {
                        sessionResult.Error(string.Format("There was a problem saving the solution. {0}", e.Message), e);
                        scope.Result = TimedScope.Status.Failure;
                    }
                });

                if (sessionResult.HasErrors)
                {
                    scope.Result = TimedScope.Status.Failure;
                }
            }

            EditorViewModel.LoadingStatus = null;
            await viewUpdater.UpdateView();

            ProjectSaved?.Invoke(sessionResult);

            return(sessionResult);
        }
Пример #2
0
        public void TestBasicPackageCreateSaveLoad()
        {
            PackageSessionPublicHelper.FindAndSetMSBuildVersion();

            var dirPath = DirectoryTestBase + @"TestBasicPackageCreateSaveLoad";

            string testGenerated1 = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated1.sdpkg");

            // Force the PackageId to be the same each time we run the test
            // Usually the PackageId is unique and generated each time we create a new project
            var project = new Package {
                FullPath = testGenerated1
            };

            project.AssetFolders.Clear();
            project.AssetFolders.Add(new AssetFolder("."));

            var session = new PackageSession(project);

            // Write the solution when saving
            session.SolutionPath = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated1.sln");

            // Delete the solution before saving it
            if (File.Exists(session.SolutionPath))
            {
                File.Delete(session.SolutionPath);
            }

            var result = new LoggerResult();

            session.Save(result);
            Assert.False(result.HasErrors);

            // Reload the raw package and if UFile and UDirectory were saved relative
            var rawPackage      = AssetFileSerializer.Load <Package>(testGenerated1).Asset;
            var rawSourceFolder = rawPackage.AssetFolders.FirstOrDefault();

            Assert.NotNull(rawSourceFolder);
            Assert.Equal(".", (string)rawSourceFolder.Path);

            // Reload the package directly from the sdpkg
            var project2Result = PackageSession.Load(testGenerated1);

            AssertResult(project2Result);
            var project2 = project2Result.Session.LocalPackages.FirstOrDefault();

            Assert.NotNull(project2);
            Assert.True(project2.AssetFolders.Count > 0);
            var sourceFolder = project.AssetFolders.First().Path;

            Assert.Equal(sourceFolder, project2.AssetFolders.First().Path);
        }
        public async Task <LoggerResult> SaveProject()
        {
            if (PackageSession == null)
            {
                throw new InvalidOperationException("Cannot save the project before it was loaded.");
            }

            // TODO: check asset consistency

            // TODO: read more about Stride.Core.Assets.Editor.PackageViewModel
            //// Prepare packages to be saved by setting their dirty flag correctly
            //foreach (var package in LocalPackages)
            //{
            //    package.PreparePackageForSaving();
            //}

            var sessionResult = new LoggerResult();

            // TODO: display a dialog with save progress

            // Force PackageSession.Save to be executed on the thread pool
            // otherwise it would block execution and we want this process to be async
            await Task.Run(() =>
            {
                try
                {
                    var saveParameters = PackageSaveParameters.Default();

                    // TODO: read more about Stride.Core.Assets.Editor.AssetViewModel
                    // AllAssets.ForEach(x => x.PrepareSave(sessionResult));
                    PackageSession.Save(sessionResult, saveParameters);
                }
                catch (Exception e)
                {
                    sessionResult.Error(string.Format("There was a problem saving the solution. {0}", e.Message), e);
                }
            });

            return(sessionResult);
        }
Пример #4
0
        private static void GenerateUnitTestProject(string outputDirectory, string templateFile, string name)
        {
            var projectTemplate = ProjectTemplate.Load(templateFile);

            // Force reference to Paradox.Assets (to have acess to SolutionPlatform)
            projectTemplate.Assemblies.Add(typeof(GraphicsProfile).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(ParadoxConfig).Assembly.FullName);

            var options = new Dictionary <string, object>();

            var session = new PackageSession();
            var result  = new LoggerResult();

            var templateGeneratorParameters = new TemplateGeneratorParameters();

            templateGeneratorParameters.OutputDirectory = outputDirectory;
            templateGeneratorParameters.Session         = session;
            templateGeneratorParameters.Name            = name;
            templateGeneratorParameters.Logger          = result;
            templateGeneratorParameters.Description     = new TemplateDescription();

            PackageUnitTestGenerator.Default.Generate(templateGeneratorParameters);
            if (result.HasErrors)
            {
                Console.WriteLine("Error generating package: {0}", result.ToText());
                return;
            }

            var package = templateGeneratorParameters.Package;

            var previousCurrent = session.CurrentPackage;

            session.CurrentPackage = package;

            // Compute Paradox Sdk relative path
            // We are supposed to be in standard output binary folder, so Paradox root should be at ..\..
            var paradoxPath         = UDirectory.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), new UDirectory(@"..\.."));
            var paradoxRelativePath = new UDirectory(paradoxPath)
                                      .MakeRelative(outputDirectory)
                                      .ToString()
                                      .Replace('/', '\\');

            paradoxRelativePath = paradoxRelativePath.TrimEnd('\\');

            options["Namespace"]             = name;
            options["Package"]               = package;
            options["Platforms"]             = new List <SolutionPlatform>(AssetRegistry.SupportedPlatforms);
            options["ParadoxSdkRelativeDir"] = paradoxRelativePath;

            // Generate project template
            var projectGuid = Guid.NewGuid();

            result = projectTemplate.Generate(outputDirectory, name, projectGuid, options);
            if (result.HasErrors)
            {
                Console.WriteLine("Error generating solution: {0}", result.ToText());
                return;
            }

            var sharedProfile = package.Profiles[PlatformType.Shared];

            // Setup the assets folder
            Directory.CreateDirectory(UPath.Combine(outputDirectory, (UDirectory)"Assets/Shared"));

            // Add Windows test as Shared library
            var projectWindowsRef = new ProjectReference();

            projectWindowsRef.Id       = projectGuid;
            projectWindowsRef.Location = UPath.Combine(outputDirectory, (UFile)(name + ".Windows.csproj"));
            projectWindowsRef.Type     = SiliconStudio.Assets.ProjectType.Library;
            sharedProfile.ProjectReferences.Add(projectWindowsRef);

            // Generate executable projects for each platform
            foreach (var platform in AssetRegistry.SupportedPlatforms)
            {
                var platformProfile = new PackageProfile(platform.Name)
                {
                    Platform = platform.Type
                };
                platformProfile.AssetFolders.Add(new AssetFolder("Assets/" + platform.Name));

                // Log progress
                var projectName = name + "." + platform.Type;

                // Create project reference
                var projectPlatformRef = new ProjectReference();
                projectPlatformRef.Id       = projectGuid;
                projectPlatformRef.Location = UPath.Combine(outputDirectory, (UFile)(projectName + ".csproj"));
                projectPlatformRef.Type     = SiliconStudio.Assets.ProjectType.Executable;

                platformProfile.ProjectReferences.Add(projectPlatformRef);

                // Add build configuration per platform
                platform.Properties.CopyTo(platformProfile.Properties, true);

                package.Profiles.Add(platformProfile);
            }

            session.CurrentPackage = previousCurrent;

            result = session.Save();
            if (result.HasErrors)
            {
                Console.WriteLine("Error saving package: {0}", result.ToText());
                return;
            }
        }
Пример #5
0
        public void TestTrackingPackageWithAssetsAndSave()
        {
            var dirPath = Path.Combine(Environment.CurrentDirectory, DirectoryTestBase + @"TestTracking");
            TryDeleteDirectory(dirPath);

            string testGenerated1 = Path.Combine(dirPath, "TestTracking.xkpkg");

            var project = new Package { FullPath = testGenerated1 };
            project.Profiles.Add(new PackageProfile("Shared", new AssetFolder(".")));
            var asset1 = new AssetObjectTest();
            var assetItem1 = new AssetItem("asset-1", asset1);
            project.Assets.Add(assetItem1);

            using (var session = new PackageSession(project))
            {

                var dependencies = session.DependencyManager;
                dependencies.TrackingSleepTime = 10;
                dependencies.EnableTracking = true;

                // Save the session
                {
                    var result = session.Save();
                    Assert.IsFalse(result.HasErrors);

                    // Wait enough time for events
                    Thread.Sleep(100);

                    // Make sure that save is not generating events
                    var events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(0, events.Count);

                    // Check tracked directories
                    var directoriesTracked = dependencies.DirectoryWatcher.GetTrackedDirectories();
                    Assert.AreEqual(1, directoriesTracked.Count);
                    Assert.AreEqual(dirPath.ToLowerInvariant(), directoriesTracked[0].ToLowerInvariant());

                    // Simulate multiple change an asset on the disk
                    File.SetLastWriteTime(assetItem1.FullPath, DateTime.Now);
                    Thread.Sleep(100);

                    // Check that we are capturing this event
                    events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(1, events.Count);
                    Assert.AreEqual(assetItem1.Location, events[0].AssetLocation);
                    Assert.AreEqual(AssetFileChangedType.Updated, events[0].ChangeType);
                }

                // Save the project to another location
                {
                    var dirPath2 = Path.Combine(Environment.CurrentDirectory, DirectoryTestBase + @"TestTracking2");
                    TryDeleteDirectory(dirPath2);
                    string testGenerated2 = Path.Combine(dirPath2, "TestTracking.xkpkg");

                    project.FullPath = testGenerated2;
                    var result = session.Save();
                    Assert.IsFalse(result.HasErrors);

                    // Wait enough time for events
                    Thread.Sleep(200);

                    // Make sure that save is not generating events
                    var events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(0, events.Count);

                    // Check tracked directories
                    var directoriesTracked = dependencies.DirectoryWatcher.GetTrackedDirectories();
                    Assert.AreEqual(1, directoriesTracked.Count);
                    Assert.AreEqual(dirPath2.ToLowerInvariant(), directoriesTracked[0].ToLowerInvariant());
                }

                // Copy file to simulate a new file on the disk (we will not try to load it as it has the same guid 
                {
                    var fullPath = assetItem1.FullPath;
                    var newPath = Path.Combine(Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath) + "2" + Path.GetExtension(fullPath));
                    File.Copy(fullPath, newPath);

                    // Wait enough time for events
                    Thread.Sleep(200);

                    // Make sure that save is not generating events
                    var events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(1, events.Count);
                    Assert.IsTrue((events[0].ChangeType & AssetFileChangedType.Added) != 0);
                }
            }
        }
Пример #6
0
        private static void GenerateUnitTestProject(string outputDirectory, string templateFile, string name, string projectNamespace)
        {
            var projectTemplate = ProjectTemplate.Load(templateFile);

            // Force reference to Stride.Assets (to have acess to SolutionPlatform)
            projectTemplate.Assemblies.Add(typeof(GraphicsProfile).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(StrideConfig).Assembly.FullName);

            var options = new Dictionary <string, object>();

            // When generating over an existing set of files, retrieve the existing IDs
            // for better incrementality
            Guid projectGuid, assetId;

            GetExistingGuid(outputDirectory, name + ".Windows.csproj", out projectGuid);
            GetExistingAssetId(outputDirectory, name + ".sdpkg", out assetId);

            var session = new PackageSession();
            var result  = new LoggerResult();

            var templateGeneratorParameters = new SessionTemplateGeneratorParameters();

            templateGeneratorParameters.OutputDirectory = outputDirectory;
            templateGeneratorParameters.Session         = session;
            templateGeneratorParameters.Name            = name;
            templateGeneratorParameters.Logger          = result;
            templateGeneratorParameters.Description     = new TemplateDescription();
            templateGeneratorParameters.Id        = assetId;
            templateGeneratorParameters.Namespace = projectNamespace;

            if (!PackageUnitTestGenerator.Default.PrepareForRun(templateGeneratorParameters).Result)
            {
                Console.WriteLine(@"Error generating package: PackageUnitTestGenerator.PrepareForRun returned false");
                return;
            }
            if (!PackageUnitTestGenerator.Default.Run(templateGeneratorParameters))
            {
                Console.WriteLine(@"Error generating package: PackageUnitTestGenerator.Run returned false");
                return;
            }
            if (result.HasErrors)
            {
                Console.WriteLine($"Error generating package: {result.ToText()}");
                return;
            }

            var project = session.Projects.OfType <SolutionProject>().Single();

            var previousCurrent = session.CurrentProject;

            session.CurrentProject = project;

            // Compute Stride Sdk relative path
            // We are supposed to be in standard output binary folder, so Stride root should be at ..\..
            var stridePath         = UPath.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), new UDirectory(@"..\.."));
            var strideRelativePath = new UDirectory(stridePath)
                                     .MakeRelative(outputDirectory)
                                     .ToString()
                                     .Replace('/', '\\');

            strideRelativePath = strideRelativePath.TrimEnd('\\');

            options["Namespace"]            = projectNamespace ?? name;
            options["Package"]              = project.Package;
            options["Platforms"]            = new List <SolutionPlatform>(AssetRegistry.SupportedPlatforms);
            options["StrideSdkRelativeDir"] = strideRelativePath;

            // Generate project template
            result = projectTemplate.Generate(outputDirectory, name, projectGuid, options);
            if (result.HasErrors)
            {
                Console.WriteLine("Error generating solution: {0}", result.ToText());
                return;
            }

            // Setup the assets folder
            Directory.CreateDirectory(UPath.Combine(outputDirectory, (UDirectory)"Assets/Shared"));

            session.CurrentProject = previousCurrent;

            session.Save(result);
            if (result.HasErrors)
            {
                Console.WriteLine("Error saving package: {0}", result.ToText());
                return;
            }
        }
Пример #7
0
        public void TestBasicPackageCreateSaveLoad()
        {
            var dirPath = DirectoryTestBase + @"TestBasicPackageCreateSaveLoad";

            string testGenerated1 = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated1.pdxpkg");
            string testGenerated2 = Path.Combine(dirPath,"TestPackage_TestBasicPackageCreateSaveLoad_Generated2.pdxpkg");
            string referenceFilePath = Path.Combine(dirPath,"TestPackage_TestBasicPackageCreateSaveLoad_Reference.pdxpkg");

            // Force the PackageId to be the same each time we run the test
            // Usually the PackageId is unique and generated each time we create a new project
            var project = new Package { Id = Guid.Empty, FullPath = testGenerated1 };
            var sharedProfile = new PackageProfile("Shared", new AssetFolder("."));
            project.Profiles.Add(sharedProfile);
            var projectReference = new ProjectReference(Guid.Empty, Path.Combine(dirPath, "test.csproj"), ProjectType.Executable);
            sharedProfile.ProjectReferences.Add(projectReference);

            var session = new PackageSession(project);
            // Write the solution when saving
            session.SolutionPath = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated1.sln");

            // Delete the solution before saving it 
            if (File.Exists(session.SolutionPath))
            {
                File.Delete(session.SolutionPath);
            }

            var result = session.Save();
            Assert.IsFalse(result.HasErrors);

            // Reload the raw package and if UFile and UDirectory were saved relative
            var rawPackage = (Package)AssetSerializer.Load(testGenerated1);
            var rawPackageSharedProfile = rawPackage.Profiles.FirstOrDefault();
            Assert.IsNotNull(rawPackageSharedProfile);
            var rawSourceFolder = rawPackage.Profiles.First().AssetFolders.FirstOrDefault();
            Assert.IsNotNull(rawSourceFolder);
            Assert.AreEqual(".", (string)rawSourceFolder.Path);
            Assert.AreEqual("test.csproj", (string)rawPackageSharedProfile.ProjectReferences[0].Location);

            // Reload the package directly from the pdxpkg
            var project2Result = PackageSession.Load(testGenerated1);
            AssertResult(project2Result);
            var project2 = project2Result.Session.LocalPackages.FirstOrDefault();
            Assert.IsNotNull(project2);
            Assert.AreEqual(project.Id, project2.Id);
            Assert.IsTrue(project2.Profiles.Count > 0);
            Assert.IsTrue(project2.Profiles.First().AssetFolders.Count > 0);
            var sourceFolder = project.Profiles.First().AssetFolders.First().Path;
            Assert.AreEqual(sourceFolder, project2.Profiles.First().AssetFolders.First().Path);

            // Reload the package from the sln
            var sessionResult = PackageSession.Load(session.SolutionPath);
            Assert.IsFalse(sessionResult.HasErrors);

            var sessionReload = sessionResult.Session;
            Assert.AreEqual(1, sessionReload.LocalPackages.Count());
            Assert.AreEqual(project.Id, sessionReload.LocalPackages.First().Id);
            Assert.AreEqual(1, sessionReload.LocalPackages.First().Profiles.Count);

            var sharedProfileReload = sessionReload.LocalPackages.First().Profiles.First();
            Assert.AreEqual(1, sharedProfileReload.ProjectReferences.Count);
            Assert.AreEqual(projectReference, sharedProfileReload.ProjectReferences[0]);
        }
Пример #8
0
        private static void GenerateUnitTestProject(string outputDirectory, string templateFile, string name, string projectNamespace)
        {
            var projectTemplate = ProjectTemplate.Load(templateFile);

            // Force reference to Xenko.Assets (to have acess to SolutionPlatform)
            projectTemplate.Assemblies.Add(typeof(GraphicsProfile).Assembly.FullName);
            projectTemplate.Assemblies.Add(typeof(XenkoConfig).Assembly.FullName);

            var options = new Dictionary <string, object>();

            // When generating over an existing set of files, retrieve the existing IDs
            // for better incrementality
            Guid projectGuid, assetId;

            GetExistingGuid(outputDirectory, name + ".Windows.csproj", out projectGuid);
            GetExistingAssetId(outputDirectory, name + ".xkpkg", out assetId);

            var session = new PackageSession();
            var result  = new LoggerResult();

            var templateGeneratorParameters = new SessionTemplateGeneratorParameters();

            templateGeneratorParameters.OutputDirectory = outputDirectory;
            templateGeneratorParameters.Session         = session;
            templateGeneratorParameters.Name            = name;
            templateGeneratorParameters.Logger          = result;
            templateGeneratorParameters.Description     = new TemplateDescription();
            templateGeneratorParameters.Id = assetId;

            if (!PackageUnitTestGenerator.Default.PrepareForRun(templateGeneratorParameters).Result)
            {
                Console.WriteLine(@"Error generating package: PackageUnitTestGenerator.PrepareForRun returned false");
                return;
            }
            if (!PackageUnitTestGenerator.Default.Run(templateGeneratorParameters))
            {
                Console.WriteLine(@"Error generating package: PackageUnitTestGenerator.Run returned false");
                return;
            }
            if (result.HasErrors)
            {
                Console.WriteLine($"Error generating package: {result.ToText()}");
                return;
            }

            var package = session.LocalPackages.Single();

            var previousCurrent = session.CurrentPackage;

            session.CurrentPackage = package;

            // Compute Xenko Sdk relative path
            // We are supposed to be in standard output binary folder, so Xenko root should be at ..\..
            var xenkoPath         = UPath.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), new UDirectory(@"..\.."));
            var xenkoRelativePath = new UDirectory(xenkoPath)
                                    .MakeRelative(outputDirectory)
                                    .ToString()
                                    .Replace('/', '\\');

            xenkoRelativePath = xenkoRelativePath.TrimEnd('\\');

            options["Namespace"]           = projectNamespace ?? name;
            options["Package"]             = package;
            options["Platforms"]           = new List <SolutionPlatform>(AssetRegistry.SupportedPlatforms);
            options["XenkoSdkRelativeDir"] = xenkoRelativePath;

            // Generate project template
            result = projectTemplate.Generate(outputDirectory, name, projectGuid, options);
            if (result.HasErrors)
            {
                Console.WriteLine("Error generating solution: {0}", result.ToText());
                return;
            }

            var sharedProfile = package.Profiles.FindSharedProfile();

            // Setup the assets folder
            Directory.CreateDirectory(UPath.Combine(outputDirectory, (UDirectory)"Assets/Shared"));

            // Add Windows test as Shared library
            var projectWindowsRef = new ProjectReference(projectGuid, UPath.Combine(outputDirectory, (UFile)(name + ".Windows.csproj")), SiliconStudio.Assets.ProjectType.Library);

            sharedProfile.ProjectReferences.Add(projectWindowsRef);

            // Generate executable projects for each platform
            foreach (var platform in AssetRegistry.SupportedPlatforms)
            {
                var platformProfile = new PackageProfile(platform.Name)
                {
                    Platform = platform.Type
                };
                platformProfile.AssetFolders.Add(new AssetFolder("Assets/" + platform.Name));

                // Log progress
                var projectName = name + "." + platform.Type;

                // Create project reference
                var projectPlatformRef = new ProjectReference(projectGuid, UPath.Combine(outputDirectory, (UFile)(projectName + ".csproj")), SiliconStudio.Assets.ProjectType.Executable);

                platformProfile.ProjectReferences.Add(projectPlatformRef);

                package.Profiles.Add(platformProfile);
            }

            session.CurrentPackage = previousCurrent;

            session.Save(result);
            if (result.HasErrors)
            {
                Console.WriteLine("Error saving package: {0}", result.ToText());
                return;
            }
        }
Пример #9
0
        public void TestTrackingPackageWithAssetsAndSave()
        {
            var dirPath = Path.Combine(Environment.CurrentDirectory, DirectoryTestBase + @"TestTracking");

            TryDeleteDirectory(dirPath);

            string testGenerated1 = Path.Combine(dirPath, "TestTracking.pdxpkg");

            var project = new Package {
                FullPath = testGenerated1
            };

            project.Profiles.Add(new PackageProfile("Shared", new AssetFolder(".")));
            var asset1     = new AssetObjectTest();
            var assetItem1 = new AssetItem("asset-1", asset1);

            project.Assets.Add(assetItem1);

            using (var session = new PackageSession(project))
            {
                var dependencies = session.DependencyManager;
                dependencies.TrackingSleepTime = 10;
                dependencies.EnableTracking    = true;

                // Save the session
                {
                    var result = session.Save();
                    Assert.IsFalse(result.HasErrors);

                    // Wait enough time for events
                    Thread.Sleep(100);

                    // Make sure that save is not generating events
                    var events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(0, events.Count);

                    // Check tracked directories
                    var directoriesTracked = dependencies.DirectoryWatcher.GetTrackedDirectories();
                    Assert.AreEqual(1, directoriesTracked.Count);
                    Assert.AreEqual(dirPath.ToLowerInvariant(), directoriesTracked[0].ToLowerInvariant());

                    // Simulate multiple change an asset on the disk
                    File.SetLastWriteTime(assetItem1.FullPath, DateTime.Now);
                    Thread.Sleep(100);

                    // Check that we are capturing this event
                    events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(1, events.Count);
                    Assert.AreEqual(assetItem1.Location, events[0].AssetLocation);
                    Assert.AreEqual(AssetFileChangedType.Updated, events[0].ChangeType);
                }

                // Save the project to another location
                {
                    var dirPath2 = Path.Combine(Environment.CurrentDirectory, DirectoryTestBase + @"TestTracking2");
                    TryDeleteDirectory(dirPath2);
                    string testGenerated2 = Path.Combine(dirPath2, "TestTracking.pdxpkg");

                    project.FullPath = testGenerated2;
                    var result = session.Save();
                    Assert.IsFalse(result.HasErrors);

                    // Wait enough time for events
                    Thread.Sleep(200);

                    // Make sure that save is not generating events
                    var events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(0, events.Count);

                    // Check tracked directories
                    var directoriesTracked = dependencies.DirectoryWatcher.GetTrackedDirectories();
                    Assert.AreEqual(1, directoriesTracked.Count);
                    Assert.AreEqual(dirPath2.ToLowerInvariant(), directoriesTracked[0].ToLowerInvariant());
                }

                // Copy file to simulate a new file on the disk (we will not try to load it as it has the same guid
                {
                    var fullPath = assetItem1.FullPath;
                    var newPath  = Path.Combine(Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath) + "2" + Path.GetExtension(fullPath));
                    File.Copy(fullPath, newPath);

                    // Wait enough time for events
                    Thread.Sleep(200);

                    // Make sure that save is not generating events
                    var events = dependencies.FindAssetFileChangedEvents().ToList();
                    Assert.AreEqual(1, events.Count);
                    Assert.IsTrue((events[0].ChangeType & AssetFileChangedType.Added) != 0);
                }
            }
        }
Пример #10
0
        public void TestBasicPackageCreateSaveLoad()
        {
            PackageSessionPublicHelper.FindAndSetMSBuildVersion();

            var dirPath = DirectoryTestBase + @"TestBasicPackageCreateSaveLoad";

            string testGenerated1    = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated1.xkpkg");
            string testGenerated2    = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated2.xkpkg");
            string referenceFilePath = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Reference.xkpkg");

            // Force the PackageId to be the same each time we run the test
            // Usually the PackageId is unique and generated each time we create a new project
            var project = new Package {
                Id = Guid.Empty, FullPath = testGenerated1
            };
            var sharedProfile = new PackageProfile("Shared", new AssetFolder("."));

            project.Profiles.Add(sharedProfile);
            var projectReference = new ProjectReference(Guid.Empty, Path.Combine(dirPath, "test.csproj"), ProjectType.Executable);

            sharedProfile.ProjectReferences.Add(projectReference);

            var session = new PackageSession(project);

            // Write the solution when saving
            session.SolutionPath = Path.Combine(dirPath, "TestPackage_TestBasicPackageCreateSaveLoad_Generated1.sln");

            // Delete the solution before saving it
            if (File.Exists(session.SolutionPath))
            {
                File.Delete(session.SolutionPath);
            }

            var result = new LoggerResult();

            session.Save(result);
            Assert.False(result.HasErrors);

            // Reload the raw package and if UFile and UDirectory were saved relative
            var rawPackage = AssetFileSerializer.Load <Package>(testGenerated1).Asset;
            var rawPackageSharedProfile = rawPackage.Profiles.FirstOrDefault();

            Assert.NotNull(rawPackageSharedProfile);
            var rawSourceFolder = rawPackage.Profiles.First().AssetFolders.FirstOrDefault();

            Assert.NotNull(rawSourceFolder);
            Assert.Equal(".", (string)rawSourceFolder.Path);
            Assert.Equal("test.csproj", (string)rawPackageSharedProfile.ProjectReferences[0].Location);

            // Reload the package directly from the xkpkg
            var project2Result = PackageSession.Load(testGenerated1);

            AssertResult(project2Result);
            var project2 = project2Result.Session.LocalPackages.FirstOrDefault();

            Assert.NotNull(project2);
            Assert.Equal(project.Id, project2.Id);
            Assert.True(project2.Profiles.Count > 0);
            Assert.True(project2.Profiles.First().AssetFolders.Count > 0);
            Assert.Equal(project2, project2Result.Session.CurrentPackage); // Check that the current package is setup when loading a single package
            var sourceFolder = project.Profiles.First().AssetFolders.First().Path;

            Assert.Equal(sourceFolder, project2.Profiles.First().AssetFolders.First().Path);

            // Reload the package from the sln
            var sessionResult = PackageSession.Load(session.SolutionPath);

            Assert.False(sessionResult.HasErrors);

            var sessionReload = sessionResult.Session;

            Assert.Equal(1, sessionReload.LocalPackages.Count());
            Assert.Equal(project.Id, sessionReload.LocalPackages.First().Id);
            Assert.Equal(1, sessionReload.LocalPackages.First().Profiles.Count);

            var sharedProfileReload = sessionReload.LocalPackages.First().Profiles.First();

            Assert.Equal(1, sharedProfileReload.ProjectReferences.Count);
            Assert.Equal(projectReference, sharedProfileReload.ProjectReferences[0]);
        }