144 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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 | ||
|  | { | ||
|  |     /// <summary> | ||
|  |     /// This is meant to be a utility class for MultiplayerCenter tests (including the project tests). | ||
|  |     /// </summary> | ||
|  |     internal static class UtilsForMultiplayerCenterTests | ||
|  |     { | ||
|  |         public static void CloseMultiplayerCenterWindow() | ||
|  |         { | ||
|  |             var allWindows = Resources.FindObjectsOfTypeAll<MultiplayerCenterWindow>(); | ||
|  |             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<MultiplayerCenterWindow>(); | ||
|  |             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"); | ||
|  |         } | ||
|  |     } | ||
|  | } |