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); }
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); }
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; } }
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); } } }
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; } }
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]); }
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; } }
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); } } }
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]); }