using System; using System.IO; using NUnit.Framework; using Unity.Multiplayer.Center.Common; using Unity.Multiplayer.Center.Questionnaire; using Unity.Multiplayer.Center.Window; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace Unity.MultiplayerCenterTests { /// /// This is meant to be a utility class for MultiplayerCenter tests (including the project tests). /// internal static class UtilsForMultiplayerCenterTests { public static void CloseMultiplayerCenterWindow() { var allWindows = Resources.FindObjectsOfTypeAll(); if (allWindows.Length <= 0) return; foreach (var window in allWindows) { window.Close(); UnityEngine.Object.DestroyImmediate(window); } } public static void ResetUserChoices() { UserChoicesObject.instance.UserAnswers = new AnswerData(); UserChoicesObject.instance.Preset = new Preset(); UserChoicesObject.instance.SelectedSolutions = new SelectedSolutionsData(); UserChoicesObject.instance.Save(); } public static void PopulateUserAnswersForPresetAndPlayerCount(Preset preset, int playerCount) { //TODO: also assert player count has proper value Assert.AreNotEqual(Preset.None, preset); UserChoicesObject.instance.Preset = preset; Logic.Update(UserChoicesObject.instance.UserAnswers, CreatePlayerCountAnswer(playerCount)); UserChoicesObject.instance.Save(); var (resultAnswerData, recommendation) = Logic.ApplyPresetToAnswerData( UserChoicesObject.instance.UserAnswers, preset, QuestionnaireObject.instance.Questionnaire); Assert.NotNull(recommendation); UserChoicesObject.instance.UserAnswers = resultAnswerData; UserChoicesObject.instance.Save(); } public static AnsweredQuestion CreatePlayerCountAnswer(int playerCount) { // simplified validation for the sake of the test Assert.True(playerCount is 2 or 4 or 8, "Please use a player count of 2, 4 or 8."); return new AnsweredQuestion() {QuestionId = "PlayerCount", Answers = new() {playerCount.ToString()}}; } public static AnsweredQuestion GetAnsweredQuestionThatIsNotInAdventurePreset() { // Corresponds to answer "I do not know" for the question "Netcode Architecture" return new AnsweredQuestion() { QuestionId = "NetcodeArchitecture", Answers = new() {"NoNetcode"}}; } // Copy the UserChoices file to a temp file to be able to restore it after the tests. public static void CopyUserChoicesToTempFile() { var sourceFilePath = GetUserChoicesFullFilePath(); var tempFilePath = GetUserChoicesTempFilePath(); // Can happen if the there are no UserChoices saved to disk yet. if (!File.Exists(sourceFilePath)) { // Save to have something to copy. UserChoicesObject.instance.Save(); } try { File.Copy(sourceFilePath, tempFilePath, true); } catch (Exception e) { Assert.Fail($"Could not create Temp File from {sourceFilePath} {e.Message}"); } } // Restore the UserChoices file from the temp file and delete the temp file. public static void RestoreUserChoicesFromTempFile() { var sourceFilePath = GetUserChoicesFullFilePath(); var tempFilePath = GetUserChoicesTempFilePath(); try { File.Copy(tempFilePath,sourceFilePath, true); File.Delete(tempFilePath); } catch (Exception e) { Assert.Fail($"Could not restore UserChoices from temp file {tempFilePath}, or could not delete temp file {tempFilePath} {e.Message}"); } Object.DestroyImmediate(UserChoicesObject.instance); } public static void OpenTabByIndex(int tabIndex) { var multiplayerWindow = EditorWindow.GetWindow(); multiplayerWindow.CurrentTabTest = tabIndex; } public static void SetNetcodeSolutionToCustomNetcode(bool flag) { UserChoicesObject.instance.SelectedSolutions.SelectedNetcodeSolution = flag ? SelectedSolutionsData.NetcodeSolution.CustomNetcode : SelectedSolutionsData.NetcodeSolution.NGO; } public static void SetSelectedSolutionToDistributedAuthority(bool flag) { if (!flag) { UserChoicesObject.instance.SelectedSolutions.SelectedHostingModel = SelectedSolutionsData.HostingModel.ClientHosted; return; } UserChoicesObject.instance.SelectedSolutions.SelectedNetcodeSolution = SelectedSolutionsData.NetcodeSolution.NGO; UserChoicesObject.instance.SelectedSolutions.SelectedHostingModel = SelectedSolutionsData.HostingModel.DistributedAuthority; } static string GetUserChoicesFullFilePath() { var choicesObject = UserChoicesObject.instance; var dirName = Path.GetDirectoryName(Application.dataPath); return Path.Combine(dirName, choicesObject.FilePath); } static string GetUserChoicesTempFilePath() { return Path.ChangeExtension(GetUserChoicesFullFilePath(), ".tmp"); } } }