diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b183e5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,82 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore +# +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Mm]emoryCaptures/ + + + +# Asset meta data should only be ignored when the corresponding asset is also ignored +!/[Aa]ssets/**/*.meta + + + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + + + +# Autogenerated Jetbrains Rider plugin +[Aa]ssets/Plugins/Editor/JetBrains* + + + +# Visual Studio cache directory +.vs/ + + + +# Gradle cache directory +.gradle/ + + + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + + + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + + + +# Unity3D generated file on crash reports +sysinfo.txt + + + +# Builds +*.apk + + + +# Crashlytics generated file +crashlytics-build.properties + + + +*.idea \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab.meta b/PatchTestProject/Assets/MHLab.meta new file mode 100644 index 0000000..e260386 --- /dev/null +++ b/PatchTestProject/Assets/MHLab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c697d87bccf9b94fa32b87068fc77e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch.meta b/PatchTestProject/Assets/MHLab/Patch.meta new file mode 100644 index 0000000..57653e9 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a391d8cb054dc6b459390dc939d66a08 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin.meta b/PatchTestProject/Assets/MHLab/Patch/Admin.meta new file mode 100644 index 0000000..9c1a632 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 93be55d5e63ae8547a6b8e54ad8ed165 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor.meta new file mode 100644 index 0000000..7218b38 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a0b8906b5578f447a3aebe673f0ac30 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/AdminWindow.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/AdminWindow.cs new file mode 100644 index 0000000..496aec0 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/AdminWindow.cs @@ -0,0 +1,163 @@ +using System; +using System.IO; +using MHLab.Patch.Admin.Editor.Components; +using MHLab.Patch.Admin.Editor.EditorHelpers; +using MHLab.Patch.Admin.Editor.Localization; +using MHLab.Patch.Core.Admin; +using MHLab.Patch.Core.Admin.Localization; +using MHLab.Patch.Core.IO; +using UnityEditor; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor +{ + public sealed class AdminWindow : EditorWindow + { + public static class AdminWindowMenu + { + [MenuItem("Window/PATCH/Admin Tool #&p")] + public static void ShowAdminWindow() + { + ShowWindow(); + } + + [MenuItem("Window/PATCH/Go to workspace folder #&o")] + public static void OpenWorkspaceFolder() + { + System.Diagnostics.Process.Start(Path.Combine(Path.GetDirectoryName(Application.dataPath), WorkspaceFolderName)); + } + + [MenuItem("Window/PATCH/Read the manual")] + public static void OpenDocumentation() + { + System.Diagnostics.Process.Start("https://github.com/manhunterita/PATCH/wiki"); + } + } + + private static EditorWindow _currentWindow; + private static bool _isInitialized = false; + private const string WorkspaceFolderName = "PATCHWorkspace"; + + public IAdminSettings AdminSettings; + public IAdminLocalizedMessages Localization; + + private WidgetContainer _widgets; + + private static void ShowWindow() + { + const int minWidth = 800; + const int minHeight = 600; + const string windowTitle = "PATCH - Admin Tool"; + + var window = GetWindow(false, windowTitle); + window.minSize = GetWindowSize(minWidth, minHeight); + _currentWindow = window; + + window.Initialize(); + + window.Show(); + } + + private static Vector2 GetWindowSize(int minWidth, int minHeight) + { + if (Screen.currentResolution.width < minWidth) + minWidth = Screen.currentResolution.width; + if (Screen.currentResolution.height < minHeight) + minHeight = Screen.currentResolution.height; + + return new Vector2(minWidth, minHeight); + } + + private void Initialize() + { + if (!_isInitialized) + { + InitializeSettings(); + + InitializeInterface(); + + _isInitialized = true; + } + } + + private void InitializeSettings() + { + AdminSettings = new AdminSettings(); + + AdminSettings.RootPath = Path.Combine(Path.GetDirectoryName(Application.dataPath), WorkspaceFolderName); + AdminSettings.AppDataPath = PathsManager.GetSpecialPath(Environment.SpecialFolder.ApplicationData); + + Localization = new EnglishAdminLocalizedMessages(); + } + + private void InitializeInterface() + { + _widgets = WidgetContainer.Create(this); + _widgets.MinSize = _currentWindow.minSize; + + _widgets.AddSkin(ThemeHelper.MainColorName, Resources.Load("PatchMainGUISkin")); + _widgets.AddSkin(ThemeHelper.SecondaryColorName, Resources.Load("PatchSecondaryGUISkin")); + _widgets.AddSkin(ThemeHelper.DarkColorName, Resources.Load("PatchDarkGUISkin")); + _widgets.AddSkin(ThemeHelper.PopupColorName, Resources.Load("PatchPopupGUISkin")); + + ThemeHelper.InitializeContent(_widgets); + + SetContainerComponents(_widgets); + } + + public static void SetContainerComponents(WidgetContainer widgets) + { + widgets.ClearComponents(); + + if (ThemeHelper.HasToShowErrorPopup(out var type)) + { + widgets.Push(); + } + /*else if (ThemeHelper.HasToSetProjectName()) + { + widgets.Push(); + }*/ + else if (ThemeHelper.HasToShowTutorial()) + { + widgets.Push(); + } + else + { + widgets.Push(); + widgets.Push(); + widgets.Push(); + widgets.Push(); + widgets.Push(); + widgets.Push(); + } + } + + private void OnInspectorUpdate() + { + if (_isInitialized) + { + _widgets.Update(); + Repaint(); + } + + if (EditorApplication.isCompiling) + { + Close(); + } + } + + private void OnGUI() + { + if (_isInitialized) + { + _widgets.Render(); + } + } + + private void OnDestroy() + { + _isInitialized = false; + _currentWindow = null; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/AdminWindow.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/AdminWindow.cs.meta new file mode 100644 index 0000000..80ec471 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/AdminWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e771fd2426d482543b337a811bb8d16d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components.meta new file mode 100644 index 0000000..b5860d3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa660fd62eca30644a2c0257c586d174 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents.meta new file mode 100644 index 0000000..6ea0a97 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2add0c0f570751d4cbd7b23bae6461b1 +folderAsset: yes +timeCreated: 1499004212 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchBuildsContent.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchBuildsContent.cs new file mode 100644 index 0000000..41fbf7b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchBuildsContent.cs @@ -0,0 +1,344 @@ +using System; +using System.Threading.Tasks; +using MHLab.Patch.Core.Admin; +using MHLab.Patch.Core.Admin.Progresses; +using MHLab.Patch.Core.IO; +using MHLab.Patch.Utilities.Serializing; +using UnityEditor; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components.Contents +{ + public class PatchBuildsContent : PatchContent + { + private Vector2 _scrollPosition; + + private float _margin = 4f; + + private Rect _helpBoxArea; + private Rect _lastVersionArea; + + private readonly string[] _releaseTypes = new string[] { "Patch release", "Minor release", "Major release" }; + private readonly string[] _releaseTypesText = new string[] { string.Empty, string.Empty, string.Empty }; + private int _releaseTypeIndex = 0; + private Rect _releaseTypeArea; + private Rect _releaseTypeTextArea; + + private Rect _cleaningTextArea; + private Rect _cleaningToggleArea; + private bool _cleaningFlag = true; + + private Rect _versionDescriptionArea; + private Rect _versionArea; + + private Rect _filesCountArea; + private Rect _filesSizeArea; + + private Rect _buildButtonArea; + + private bool _isTaskStarted = false; + private float _progress = 0f; + private bool _isCompleted = false; + private bool _isFailed = false; + private bool _isStopped = false; + + private Exception _currentError; + + private int _skippedTicks = 10; + private int _filesCount; + private string _filesSize; + + private string _lastVersion; + + private string _buildingLog = string.Empty; + + private AdminBuildContext _context; + private BuildBuilder _builder; + + public override void Initialize() + { + base.Initialize(); + + var progress = new Progress(); + progress.ProgressChanged += ProgressChanged; + + _context = new AdminBuildContext(CurrentWindow.AdminSettings, progress); + _context.Logger = new MHLab.Patch.Utilities.Logging.Logger(CurrentWindow.AdminSettings.GetLogsFilePath(), CurrentWindow.AdminSettings.DebugMode); + _context.Serializer = new NewtonsoftSerializer(); + _context.LocalizedMessages = CurrentWindow.Localization; + _context.Initialize(); + + _builder = new BuildBuilder(_context); + } + + private void ProgressChanged(object sender, BuilderProgress e) + { + _progress = (float)e.CurrentSteps / e.TotalSteps; + _buildingLog = e.StepMessage; + } + + private void BuilderOnFailed(Exception e) + { + _isFailed = true; + _currentError = e; + } + + private void BuilderOnCompleted() + { + _isCompleted = true; + + if (_cleaningFlag) + { + DirectoriesManager.Clean(CurrentWindow.AdminSettings.GetApplicationFolderPath()); + } + } + + private void BuilderOnStarted() + { + _isTaskStarted = true; + } + + private void UpdateProgress() + { + if (_isStopped) + { + _isTaskStarted = false; + _isCompleted = false; + _isFailed = false; + _progress = 0; + _isStopped = false; + } + + if (_isTaskStarted) + { + if (_isCompleted) + { + if (!_isStopped) + { + Host.CurrentWindow.ShowNotification(new GUIContent("Nice! Build " + _context.BuildVersion + " has been successfully processed!")); + EditorUtility.ClearProgressBar(); + _isStopped = true; + _isTaskStarted = false; + } + } + else if (_isFailed) + { + if (!_isStopped) + { + EditorUtility.ClearProgressBar(); + Host.CurrentWindow.ShowNotification(new GUIContent("Ooops! Build " + _context.BuildVersion + " triggered an error! Check the console!")); + Debug.Log(_currentError); + + _currentError = null; + _isStopped = true; + _isTaskStarted = false; + } + } + else + { + EditorUtility.DisplayProgressBar("PATCH - Build creator", _buildingLog, _progress); + } + } + } + + public override void UpdateUISize() + { + base.UpdateUISize(); + + var height = ContentArea.position.y; + + _helpBoxArea = new Rect(ContentArea.position.x, ContentArea.position.y, ContentArea.width, 30); + + if (_lastVersion != "none") + { + _lastVersionArea = new Rect(ContentArea.position.x, height, ContentArea.width, 30); + + height += 40 + _margin; + + _filesCountArea = new Rect(ContentArea.position.x, height, ContentArea.width, 40); + + height += 40 + _margin; + + _filesSizeArea = new Rect(ContentArea.position.x, height, ContentArea.width, 40); + + height += 40 + _margin; + + _cleaningTextArea = new Rect(ContentArea.position.x, height, ContentArea.width * 9 / 12, 40); + _cleaningToggleArea = new Rect(ContentArea.position.x + ContentArea.width * 9 / 12, height, ContentArea.width * 3 / 12, 40); + + height += 40 + _margin; + + _releaseTypeTextArea = new Rect(ContentArea.position.x, height, ContentArea.width * 9 / 12, 40); + _releaseTypeArea = new Rect(ContentArea.position.x + ContentArea.width * 9 / 12, height, + ContentArea.width * 3 / 12, 40); + + height += 40 + _margin; + } + + _buildButtonArea = new Rect(ContentArea.position.x, height, ContentArea.width, 40); + } + + private void UpdateAfterTicks() + { + if (_skippedTicks >= 10) + { + _skippedTicks = 0; + + UpdateRecognizedFiles(); + UpdateLastVersion(); + UpdateReleaseTypes(); + } + + _skippedTicks++; + } + + private void UpdateRecognizedFiles() + { + try + { + _filesSize = _builder.GetCurrentFilesToProcessSize(); + _filesCount = _builder.GetCurrentFilesToProcessAmount(); + } + catch + { + _filesSize = "0B"; + _filesCount = 0; + } + } + + private void UpdateLastVersion() + { + string lastVersionString = "none"; + try + { + var lastVersion = _context.GetLastVersion(); + if (lastVersion != null) + { + lastVersionString = lastVersion.ToString(); + } + } + catch + { + } + + _lastVersion = lastVersionString; + } + + private void UpdateReleaseTypes() + { + var currentVersion = _context.GetLastVersion(); + + if (currentVersion == null) return; + + var version = _context.VersionFactory.Create(currentVersion); + version.UpdatePatch(); + _releaseTypesText[0] = $"{_releaseTypes[0]}: {version}"; + + version = _context.VersionFactory.Create(currentVersion); + version.UpdateMinor(); + _releaseTypesText[1] = $"{_releaseTypes[1]}: {version}"; + + version = _context.VersionFactory.Create(currentVersion); + version.UpdateMajor(); + _releaseTypesText[2] = $"{_releaseTypes[2]}: {version}"; + } + + public override void Update() + { + base.Update(); + + UpdateProgress(); + UpdateAfterTicks(); + } + + public override void Render() + { + base.Render(); + + _scrollPosition = GUI.BeginScrollView(ContentArea, _scrollPosition, ContentArea); + + if (_filesCount > 0) + { + var buttonText = "Initial build"; + + if (_lastVersion != "none") + { + EditorGUI.HelpBox(_lastVersionArea, "Last created version: " + _lastVersion, MessageType.Info); + + GUI.Label(_filesCountArea, + "Recognized files count: " + _filesCount + ""); + + GUI.Label(_filesSizeArea, + "Recognized files size: " + _filesSize + ""); + + GUI.Label(_cleaningTextArea, + "Clean after build - This will clean the \"" + CurrentWindow.AdminSettings.ApplicationFolderName + "\" folder after build"); + _cleaningFlag = EditorGUI.Toggle(_cleaningToggleArea, _cleaningFlag); + + GUI.Label(_releaseTypeTextArea, + "Release type - This will affect how the version number is increased"); + _releaseTypeIndex = EditorGUI.Popup(_releaseTypeArea, _releaseTypeIndex, _releaseTypesText); + + buttonText = "Build new version"; + } + + if (!_isTaskStarted) + { + if (GUI.Button(_buildButtonArea, buttonText)) + { + Task.Run(() => + { + BuilderOnStarted(); + + try + { + TriggerBuild(); + + BuilderOnCompleted(); + } + catch (Exception e) + { + BuilderOnFailed(e); + } + }); + } + } + } + else + { + EditorGUI.HelpBox(_helpBoxArea, "Hey! There are no files ready to be built. You should build your game first and put it in \"" + _context.Settings.ApplicationFolderName +"\" folder! Read the doc if you are not sure how to do it!", MessageType.Warning); + } + + GUI.EndScrollView(); + } + + private void TriggerBuild() + { + var currentVersion = _context.VersionFactory.Create(_context.GetLastVersion()); + + if (currentVersion != null) + { + switch (_releaseTypeIndex) + { + case 0: + currentVersion.UpdatePatch(); + break; + case 1: + currentVersion.UpdateMinor(); + break; + case 2: + currentVersion.UpdateMajor(); + break; + } + } + else + { + currentVersion = _context.VersionFactory.Create(); + } + + _context.BuildVersion = currentVersion; + _context.Initialize(); + _builder.Build(); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchBuildsContent.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchBuildsContent.cs.meta new file mode 100644 index 0000000..81108fb --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchBuildsContent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebe67b776f0d4e446b4548c566ed3c77 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchContent.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchContent.cs new file mode 100644 index 0000000..56f9b2e --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchContent.cs @@ -0,0 +1,44 @@ +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components.Contents +{ + public class PatchContent : Widget + { + private float _padding = 30; + + private Rect _contentArea; + protected Vector2 _previousHostSize; + + protected Rect ContentArea + { + get { return _contentArea; } + } + + protected AdminWindow CurrentWindow => (AdminWindow)Host.CurrentWindow; + + public override void Initialize() + { + base.Initialize(); + + UpdateUISize(); + } + + public virtual void UpdateUISize() + { + Size = new Vector2(Host.Width - (Host.MinSize.x * 20) / 100 - _padding * 2, Host.Height - (Host.MinSize.y * 15) / 100 - _padding * 2); + _contentArea = new Rect((Host.MinSize.x * 20) / 100 + _padding, (Host.MinSize.y * 15) / 100 + _padding, Width, Height); + _previousHostSize = Host.Size; + } + + public override void Render() + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + UpdateUISize(); + } + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchContent.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchContent.cs.meta new file mode 100644 index 0000000..94dc1dd --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchContent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 258c6a2e3b506e14e8f44e9de669062f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchInfoContent.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchInfoContent.cs new file mode 100644 index 0000000..c44e8b5 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchInfoContent.cs @@ -0,0 +1,118 @@ +using System.IO; +using MHLab.Patch.Core.Utilities; +using MHLab.Patch.Utilities; +using MHLab.Patch.Utilities.Serializing; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components.Contents +{ + public class PatchInfoContent : PatchContent + { + private const string Email = "m4nu.91@gmail.com"; + private const string Skype = "manhunterita"; + private const string Twitter = "@MHLabSoftware"; + private const string Discord = "https://discord.gg/0ndGBjvogdY5SnIw"; + private const string UnityForum = "http://forum.unity3d.com/threads/p-a-t-c-h-ultimate-patching-system.342320"; + private Vector2 _scrollPosition; + + private float _margin = 4f; + + private Rect _emailDescriptionArea; + private Rect _emailArea; + + private Rect _skypeDescriptionArea; + private Rect _skypeArea; + + private Rect _twitterDescriptionArea; + private Rect _twitterArea; + + private Rect _discordDescriptionArea; + private Rect _discordArea; + + private Rect _unityForumDescriptionArea; + private Rect _unityForumArea; + + private Rect _debugDescriptionArea; + private Rect _debugButtonArea; + + public override void Initialize() + { + base.Initialize(); + } + + public override void UpdateUISize() + { + base.UpdateUISize(); + var height = ContentArea.position.y; + + _emailDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 8 / 12, 40); + _emailArea = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 4 / 12, 30); + + height += 40 + _margin; + + _skypeDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 8 / 12, 40); + _skypeArea = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 4 / 12, 30); + + height += 40 + _margin; + + _twitterDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 9 / 12, 40); + _twitterArea = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 4 / 12, 30); + + height += 40 + _margin; + + _discordDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 8 / 12, 40); + _discordArea = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 4 / 12, 30); + + height += 40 + _margin; + + _unityForumDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 8 / 12, 40); + _unityForumArea = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 4 / 12, 30); + + height += 40 + _margin; + + _debugDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 8 / 12, 40); + _debugButtonArea = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 4 / 12, 30); + } + + public override void Render() + { + base.Render(); + _scrollPosition = GUI.BeginScrollView(ContentArea, _scrollPosition, ContentArea); + + GUI.Label(_emailDescriptionArea, "Email - Contact me here for private support."); + GUI.TextField(_emailArea, Email); + + GUI.Label(_skypeDescriptionArea, "Skype - Contact me here for private realtime support."); + GUI.TextField(_skypeArea, Skype); + + GUI.Label(_twitterDescriptionArea, "Twitter - Follow me to receive info and news about P.A.T.C.H.!"); + GUI.TextField(_twitterArea, Twitter); + + GUI.Label(_discordDescriptionArea, "Discord - Join us: here we discuss about bugs, beta versions, fixes, new features, etc."); + GUI.TextField(_discordArea, Discord); + + GUI.Label(_unityForumDescriptionArea, "Unity Forum - The official Unity Forum thread!"); + GUI.TextField(_unityForumArea, UnityForum); + + GUI.Label(_debugDescriptionArea, "Debug report - If you contact me for support, remember to include the debug report!"); + if (GUI.Button(_debugButtonArea, "Generate debug report")) + { + TriggerDebugReportCollection(); + } + + GUI.EndScrollView(); + } + + private void TriggerDebugReportCollection() + { + var system = DebugHelper.GetSystemInfo(); + var report = Debugger.GenerateDebugReport(CurrentWindow.AdminSettings, system, new NewtonsoftSerializer()); + + File.WriteAllText(CurrentWindow.AdminSettings.GetDebugReportFilePath(), report); + +#if UNITY_EDITOR_WIN + System.Diagnostics.Process.Start("explorer.exe", "/select, \"" + CurrentWindow.AdminSettings.GetDebugReportFilePath() + "\""); +#endif + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchInfoContent.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchInfoContent.cs.meta new file mode 100644 index 0000000..5c57b0a --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchInfoContent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4435cd34a5234eb43a71eb2ec4367082 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchLauncherContent.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchLauncherContent.cs new file mode 100644 index 0000000..6c0b752 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchLauncherContent.cs @@ -0,0 +1,248 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MHLab.Patch.Core.Admin; +using MHLab.Patch.Core.Admin.Progresses; +using MHLab.Patch.Utilities.Serializing; +using UnityEditor; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components.Contents +{ + public class PatchLauncherContent : PatchContent + { + public const string LauncherNameKey = "DeployLauncherName"; + + private Vector2 _scrollPosition; + + private Rect _helpBoxArea; + + private string _archiveNameText = ""; + private Rect _deployDescriptionArea; + private Rect _archiveTextArea; + private Rect _deployButtonArea; + + private Rect _compressionTextArea; + private Rect _compressionSelectorArea; + private int _compressionValue = 9; + + private Rect _filesCountArea; + private Rect _filesSizeArea; + + private int _filesCount; + private string _filesSize; + + private bool _isTaskStarted = false; + private float _progress = 0f; + private string _buildingLog = string.Empty; + private bool _isCompleted = false; + private bool _isFailed = false; + private bool _isStopped = false; + + private Exception _currentError; + + private int _skippedTicks = 10; + + private AdminPatcherUpdateContext _context; + private UpdaterBuilder _builder; + + public override void Initialize() + { + base.Initialize(); + + var progress = new Progress(); + progress.ProgressChanged += BuilderOnProgress; + + _context = new AdminPatcherUpdateContext(CurrentWindow.AdminSettings, progress); + _context.Logger = new MHLab.Patch.Utilities.Logging.Logger(CurrentWindow.AdminSettings.GetLogsFilePath(), CurrentWindow.AdminSettings.DebugMode); + _context.Serializer = new NewtonsoftSerializer(); + _context.LocalizedMessages = CurrentWindow.Localization; + _context.Initialize(); + + _builder = new UpdaterBuilder(_context); + + if (PlayerPrefs.HasKey(LauncherNameKey)) + _archiveNameText = PlayerPrefs.GetString(LauncherNameKey); + } + + private void BuilderOnFailed(Exception e) + { + _isFailed = true; + _currentError = e; + } + + private void BuilderOnCompleted() + { + _isCompleted = true; + } + + private void BuilderOnProgress(object sender, BuilderProgress e) + { + _progress = (float)e.CurrentSteps / e.TotalSteps; + _buildingLog = e.StepMessage; + } + + private void BuilderOnStarted() + { + _isTaskStarted = true; + } + + private void UpdateProgress() + { + if (_isStopped) + { + _isTaskStarted = false; + _isCompleted = false; + _isFailed = false; + _progress = 0; + _isStopped = false; + } + + if (_isTaskStarted) + { + if (_isCompleted) + { + if (!_isStopped) + { + Host.CurrentWindow.ShowNotification(new GUIContent("Nice! Launcher " + _archiveNameText + " deployment has been successfully processed!")); + EditorUtility.ClearProgressBar(); + _isStopped = true; + _isTaskStarted = false; + } + } + else if (_isFailed) + { + if (!_isStopped) + { + EditorUtility.ClearProgressBar(); + Host.CurrentWindow.ShowNotification(new GUIContent("Ooops! Launcher " + _archiveNameText + " deploying triggered an error! Check the console!")); + Debug.Log(_currentError); + + _currentError = null; + _isStopped = true; + _isTaskStarted = false; + } + } + else + { + EditorUtility.DisplayProgressBar("PATCH - Launcher creator", _buildingLog, _progress); + } + } + } + + public override void UpdateUISize() + { + base.UpdateUISize(); + + var height = ContentArea.position.y; + + _helpBoxArea = new Rect(ContentArea.position.x, height, ContentArea.width, 30); + + _deployDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 9 / 12, 40); + _archiveTextArea = new Rect(ContentArea.position.x + ContentArea.width * 9 / 12, height, ContentArea.width * 3 / 12, 25); + + height += 40; + + _compressionTextArea = new Rect(ContentArea.position.x, height, ContentArea.width * 9 / 12, 40); + _compressionSelectorArea = new Rect(ContentArea.position.x + ContentArea.width * 9 / 12, height, ContentArea.width * 3 / 12, 25); + + height += 40; + + _filesCountArea = new Rect(ContentArea.position.x, height, ContentArea.width * 6 / 12, 40); + _filesSizeArea = new Rect(ContentArea.position.x + ContentArea.width * 6 / 12, height, ContentArea.width * 6 / 12, 40); + + height += 40; + + _deployButtonArea = new Rect(ContentArea.position.x, height, ContentArea.width, 40); + } + + private void UpdateAfterTicks() + { + if (_skippedTicks >= 10) + { + _skippedTicks = 0; + + UpdateFilesData(); + } + + _skippedTicks++; + } + + private void UpdateFilesData() + { + _filesCount = _builder.GetCurrentFilesToProcessAmount(); + _filesSize = _builder.GetCurrentFilesToProcessSize(); + } + + public override void Update() + { + base.Update(); + + UpdateProgress(); + UpdateAfterTicks(); + } + + public override void Render() + { + base.Render(); + + UpdateUISize(); + + if (_filesCount > 0) + { + GUI.Label(_deployDescriptionArea, "Launcher archive name - Building a new launcher update generates an archive you can distribute. Set its name!"); + _archiveNameText = EditorGUI.TextField(_archiveTextArea, _archiveNameText, Host.GetSkin(ThemeHelper.SecondaryColorName).textField); + + GUI.Label(_compressionTextArea, "Compression Level - Set the compression level for the deployed archive."); + _compressionValue = EditorGUI.IntSlider(_compressionSelectorArea, _compressionValue, 1, 9); + + GUI.Label(_filesCountArea, "Files count: " + _filesCount + ""); + GUI.Label(_filesSizeArea, "Files size: " + _filesSize + ""); + + if (!_isTaskStarted) + { + if (GUI.Button(_deployButtonArea, "Build Launcher update")) + { + if (string.IsNullOrWhiteSpace(_archiveNameText)) + { + Host.CurrentWindow.ShowNotification(new GUIContent("You must set Launcher archive name!")); + } + else + { + PlayerPrefs.SetString(LauncherNameKey, _archiveNameText); + Task.Run(() => + { + BuilderOnStarted(); + + try + { + TriggerBuilder(); + + BuilderOnCompleted(); + } + catch (Exception e) + { + BuilderOnFailed(e); + } + }); + } + } + } + } + else + { + EditorGUI.HelpBox(_helpBoxArea, + "Hey! There are no files ready in \"" + _context.Settings.UpdaterFolderName + "\" folder. You should build your launcher first and then put it in \"" + _context.Settings.UpdaterFolderName + "\" folder! Read the doc if you are not sure how to do it!", + MessageType.Warning); + } + } + + private void TriggerBuilder() + { + _context.CompressionLevel = _compressionValue; + _context.LauncherArchiveName = _archiveNameText; + _context.Initialize(); + _builder.Build(); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchLauncherContent.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchLauncherContent.cs.meta new file mode 100644 index 0000000..c8c431e --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchLauncherContent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 39647c4d05f89df4f8a78fb1c2376512 +timeCreated: 1508884059 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchOptionsContent.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchOptionsContent.cs new file mode 100644 index 0000000..d53926f --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchOptionsContent.cs @@ -0,0 +1,105 @@ +using System; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components.Contents +{ + public class PatchOptionsContent : PatchContent + { + public const string NoobModeKey = "NoobModeEnabled"; + public const string TipsEnabledKey = "TipsEnabled"; + + private Vector2 _scrollPosition; + + private float _margin = 4f; + + private Rect _noobModeDescriptionArea; + private Rect _noobModeArea; + private bool _isNoobMode; + private bool _previousIsNoobMode; + + private Rect _disableTipsDescriptionArea; + private Rect _disableTipsArea; + private bool _isTipEnabled; + private bool _previousIsTipEnabled; + + private Rect _tutorialDescriptionArea; + private Rect _tutorialArea; + + public override void Initialize() + { + base.Initialize(); + + if (PlayerPrefs.HasKey(NoobModeKey)) + { + _isNoobMode = PlayerPrefs.GetInt(NoobModeKey) == 1; + _previousIsNoobMode = _isNoobMode; + } + else + { + _isNoobMode = false; + _previousIsNoobMode = false; + } + + if (PlayerPrefs.HasKey(TipsEnabledKey)) + { + _isTipEnabled = PlayerPrefs.GetInt(TipsEnabledKey) == 1; + _previousIsTipEnabled = _isNoobMode; + } + else + { + _isTipEnabled = true; + _previousIsTipEnabled = true; + } + } + + public override void UpdateUISize() + { + base.UpdateUISize(); + var height = ContentArea.position.y; + + _noobModeDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 11 / 12, 40); + _noobModeArea = new Rect(ContentArea.position.x + ContentArea.width * 11 / 12, height, ContentArea.width * 1 / 12, 30); + + height += 40 + _margin; + + _disableTipsDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 11 / 12, 40); + _disableTipsArea = new Rect(ContentArea.position.x + ContentArea.width * 11 / 12, height, ContentArea.width * 1 / 12, 30); + + height += 40 + _margin; + + _tutorialDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 10 / 12, 40); + _tutorialArea = new Rect(ContentArea.position.x + ContentArea.width * 10 / 12, height, ContentArea.width * 2 / 12, 30); + } + + public override void Render() + { + base.Render(); + _scrollPosition = GUI.BeginScrollView(ContentArea, _scrollPosition, ContentArea); + + GUI.Label(_noobModeDescriptionArea, "Beginner mode (coming soon) - Allows you to simplify the process of building patches, etc by automatizing some tasks."); + _isNoobMode = GUI.Toggle(_noobModeArea, _isNoobMode, ""); + if (_isNoobMode != _previousIsNoobMode) + { + PlayerPrefs.SetInt(NoobModeKey, (_isNoobMode) ? 1 : 0); + _previousIsNoobMode = _isNoobMode; + } + + GUI.Label(_disableTipsDescriptionArea, "Enable tips - Allows you to see some tips on Admin Tool startup."); + _isTipEnabled = GUI.Toggle(_disableTipsArea, _isTipEnabled, ""); + if (_isTipEnabled != _previousIsTipEnabled) + { + PlayerPrefs.SetInt(TipsEnabledKey, (_isTipEnabled) ? 1 : 0); + _previousIsTipEnabled = _isTipEnabled; + } + + GUI.Label(_tutorialDescriptionArea, "Tutorial - Press this button to play again the tutorial! I know you love it! :-)"); + if (GUI.Button(_tutorialArea, "Play it!")) + { + ThemeHelper.ToggleHasBeenOpened(false); + AdminWindow.SetContainerComponents(Host); + } + + GUI.EndScrollView(); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchOptionsContent.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchOptionsContent.cs.meta new file mode 100644 index 0000000..c84b1a6 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchOptionsContent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 84972dfa833b7c540a8080185209ec8d +timeCreated: 1508884059 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchPatchesContent.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchPatchesContent.cs new file mode 100644 index 0000000..233c2bf --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchPatchesContent.cs @@ -0,0 +1,254 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using MHLab.Patch.Core.Admin; +using MHLab.Patch.Core.Admin.Progresses; +using MHLab.Patch.Utilities.Serializing; +using UnityEditor; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components.Contents +{ + public class PatchPatchesContent : PatchContent + { + private Vector2 _scrollPosition; + + private float _margin = 4f; + + private Rect _helpBoxArea; + private Rect _patchesDescriptionArea; + private Rect _patchesArea1; + private Rect _patchesArea2; + private int _patchesIndex1; + private int _patchesIndex2; + + private string[] _versions; + + private Rect _compressionTextArea; + private Rect _compressionSelectorArea; + private int _compressionValue = 9; + + private int _skippedTicks = 10; + + private bool _isTaskStarted = false; + private float _progress = 0f; + private string _buildingLog = string.Empty; + private bool _isCompleted = false; + private bool _isFailed = false; + private bool _isStopped = false; + + private Exception _currentError; + + private Rect _patchButtonArea; + + private AdminPatchContext _context; + private PatchBuilder _builder; + + public override void Initialize() + { + base.Initialize(); + + var progress = new Progress(); + progress.ProgressChanged += ProgressChanged; + + _context = new AdminPatchContext(CurrentWindow.AdminSettings, progress); + _context.Logger = new MHLab.Patch.Utilities.Logging.Logger(CurrentWindow.AdminSettings.GetLogsFilePath(), CurrentWindow.AdminSettings.DebugMode); + _context.Serializer = new NewtonsoftSerializer(); + _context.LocalizedMessages = CurrentWindow.Localization; + + _builder = new PatchBuilder(_context); + + InitializePatches(); + } + + private void BuilderOnFailed(Exception e) + { + _isFailed = true; + _currentError = e; + } + + private void BuilderOnCompleted() + { + _isCompleted = true; + } + + private void ProgressChanged(object sender, BuilderProgress e) + { + _progress = (float)e.CurrentSteps / e.TotalSteps; + _buildingLog = e.StepMessage; + } + + private void BuilderOnStarted() + { + _isTaskStarted = true; + } + + private void UpdateProgress() + { + if (_isStopped) + { + _isTaskStarted = false; + _isCompleted = false; + _isFailed = false; + _progress = 0; + _isStopped = false; + } + + if (_isTaskStarted) + { + if (_isCompleted) + { + if (!_isStopped) + { + Host.CurrentWindow.ShowNotification(new GUIContent("Nice! Patch from " + _versions[_patchesIndex1] + " to " + _versions[_patchesIndex2] + " has been successfully processed!")); + EditorUtility.ClearProgressBar(); + _isStopped = true; + _isTaskStarted = false; + } + } + else if (_isFailed) + { + if (!_isStopped) + { + EditorUtility.ClearProgressBar(); + Host.CurrentWindow.ShowNotification(new GUIContent("Ooops! Patch from " + _versions[_patchesIndex1] + " to " + _versions[_patchesIndex2] + " triggered an error! Check the console!")); + Debug.Log(_currentError); + + _currentError = null; + _isStopped = true; + _isTaskStarted = false; + } + } + else + { + EditorUtility.DisplayProgressBar("PATCH - Patch creator", _buildingLog, _progress); + } + } + } + + private void InitializePatches() + { + RefreshPatches(); + + if (_versions.Length > 1) + { + _patchesIndex1 = _versions.Length - 2; + _patchesIndex2 = _versions.Length - 1; + } + else + { + _patchesIndex1 = 0; + _patchesIndex2 = 0; + } + } + + private void RefreshPatches() + { + _versions = _context.GetVersions().Select(v => v.ToString()).ToArray(); + } + + public override void OnShow() + { + base.OnShow(); + InitializePatches(); + } + + private void UpdateAfterTicks() + { + if (_skippedTicks >= 10) + { + _skippedTicks = 0; + + RefreshPatches(); + } + + _skippedTicks++; + } + + public override void Update() + { + base.Update(); + + UpdateProgress(); + UpdateAfterTicks(); + } + + public override void UpdateUISize() + { + base.UpdateUISize(); + + var height = ContentArea.position.y; + + _helpBoxArea = new Rect(ContentArea.position.x, ContentArea.position.y, ContentArea.width, 30); + _patchesDescriptionArea = new Rect(ContentArea.position.x, height, ContentArea.width * 8 / 12, 40); + _patchesArea1 = new Rect(ContentArea.position.x + ContentArea.width * 8 / 12, height, ContentArea.width * 2 / 12 - 10, 30); + _patchesArea2 = new Rect(ContentArea.position.x + ContentArea.width * 10 / 12 + 10, height, ContentArea.width * 2 / 12 - 10, 30); + + height += 40; + + _compressionTextArea = new Rect(ContentArea.position.x, height, ContentArea.width * 9 / 12, 40); + _compressionSelectorArea = new Rect(ContentArea.position.x + ContentArea.width * 9 / 12, height, ContentArea.width * 3 / 12, 25); + + height += 40 + _margin; + + _patchButtonArea = new Rect(ContentArea.position.x, height, ContentArea.width, 40); + } + + public override void Render() + { + base.Render(); + _scrollPosition = GUI.BeginScrollView(ContentArea, _scrollPosition, ContentArea); + + + if (_versions.Length > 1) + { + GUI.Label(_patchesDescriptionArea, + "Patches - This allows you to generate a patch between selected builds."); + + _patchesIndex1 = EditorGUI.Popup(_patchesArea1, _patchesIndex1, _versions); + _patchesIndex2 = EditorGUI.Popup(_patchesArea2, _patchesIndex2, _versions); + + GUI.Label(_compressionTextArea, "Compression Level - Sets the compression level for the patch archive."); + _compressionValue = EditorGUI.IntSlider(_compressionSelectorArea, _compressionValue, 1, 9); + + if (!_isTaskStarted) + { + if (GUI.Button(_patchButtonArea, "Build new patch")) + { + Task.Run(() => + { + BuilderOnStarted(); + + try + { + TriggerBuilder(); + + BuilderOnCompleted(); + } + catch (Exception e) + { + BuilderOnFailed(e); + } + }); + } + } + } + else + { + EditorGUI.HelpBox(_helpBoxArea, "Hey! You need at least two builds to create a patch. Read the doc if you are not sure how to do it!", MessageType.Warning); + } + + GUI.EndScrollView(); + } + + private void TriggerBuilder() + { + _context.VersionFrom = _context.VersionFactory.Parse(_versions[_patchesIndex1]); + _context.VersionTo = _context.VersionFactory.Parse(_versions[_patchesIndex2]); + _context.CompressionLevel = _compressionValue; + + _context.Initialize(); + _builder.Build(); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchPatchesContent.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchPatchesContent.cs.meta new file mode 100644 index 0000000..3d8926f --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/Contents/PatchPatchesContent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08eb48a768451f44b9545cb2e2cf7468 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchErrorPopup.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchErrorPopup.cs new file mode 100644 index 0000000..761773e --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchErrorPopup.cs @@ -0,0 +1,91 @@ +using MHLab.PATCH.Admin.Editor; +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchErrorPopup : Widget + { + private bool _shouldBeRendered = false; + + private GUIStyle _style; + private Rect _backdropArea; + + private Texture2D _logo; + private Vector2 _logoSize; + private Rect _logoArea; + + private Rect _textArea; + + private Vector2 _previousHostSize; + + private string _errorText; + private PopupErrorType _errorType; + + public override void Initialize() + { + base.Initialize(); + Size = new Vector2(Host.Width, Host.Height); + _previousHostSize = Host.Size; + + CheckForPopupOpening(); + + if (_shouldBeRendered) + { + _style = new GUIStyle(); + _style.wordWrap = true; + _style.fontSize = 15; + _style.richText = true; + _style.alignment = TextAnchor.MiddleCenter; + + _backdropArea = new Rect(0, 0, Width, Height); + + _logo = Resources.Load("Images/patch_little"); + _logoSize = new Vector2(250, 74); + _logoArea = new Rect((Width / 2) - (_logoSize.x / 2), (Height / 2) - (_logoSize.y * 2), _logoSize.x, _logoSize.y); + + _textArea = new Rect((Width / 2) - (200), (Height / 2) - (30), 400, 60); + + switch (_errorType) + { + case PopupErrorType.DotNetSubset: + _errorText = "Hey! P.A.T.C.H. doesn't work with .NET 2.0 Subset! Let's switch to .NET 2.0 atleast! You can find it in Player Settings!"; + break; + } + } + } + + public override void Render() + { + if (_shouldBeRendered) + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + Size = new Vector2(Host.Width, Host.Height); + _backdropArea = new Rect(0, 0, Width, Height); + _logoArea = new Rect((Width / 2) - (_logoSize.x / 2), (Height / 2) - (_logoSize.y * 2), _logoSize.x, _logoSize.y); + + _textArea = new Rect((Width / 2) - (200), (Height / 2) - (30), 400, 60); + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.PopupColorName); + + GUI.Box(_backdropArea, ""); + + GUI.DrawTexture(_logoArea, _logo, ScaleMode.ScaleToFit); + + GUI.Label(_textArea, "" + _errorText + "", _style); + + GUI.skin = previous; + } + } + + private void CheckForPopupOpening() + { + _shouldBeRendered = ThemeHelper.HasToShowErrorPopup(out _errorType); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchErrorPopup.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchErrorPopup.cs.meta new file mode 100644 index 0000000..31f6f94 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchErrorPopup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5fd7837dafc8ae447bf496547ad32d27 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchPopup.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchPopup.cs new file mode 100644 index 0000000..bbb34a6 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchPopup.cs @@ -0,0 +1,140 @@ +using System.Diagnostics; +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchPopup : Widget + { + private const string PatchPopupKeyName = "PatchPopupOpeningsAmount"; + private const string PatchPopupFlag = "PatchPopupDontAskAgain"; + private const int PatchPopupOpeningsAmount = 10; + + private const string PatchReviewUrl = "https://assetstore.unity.com/packages/tools/user-tools/utilities/p-a-t-c-h-ultimate-patching-system-41417";//"https://www.assetstore.unity3d.com/en/#!/account/downloads/search=#PACKAGES%20PATCH%20ultimate"; + + private bool _shouldBeRendered = false; + + private GUIStyle _style; + private Rect _backdropArea; + + private Texture2D _logo; + private Vector2 _logoSize; + private Rect _logoArea; + + private Rect _textArea; + + private Rect _letsgoButtonArea; + private Rect _remindMeButtonArea; + private Rect _dontAskAgainButtonArea; + + private Vector2 _previousHostSize; + + public override void Initialize() + { + base.Initialize(); + Size = new Vector2(Host.Width, Host.Height); + _previousHostSize = Host.Size; + + CheckForPopupOpenings(); + + if (_shouldBeRendered) + { + _style = new GUIStyle(); + _style.wordWrap = true; + _style.fontSize = 15; + _style.richText = true; + _style.alignment = TextAnchor.MiddleCenter; + + _backdropArea = new Rect(0, 0, Width, Height); + + _logo = Resources.Load("Images/logo_editor"); + _logoSize = new Vector2(250, 220); + _logoArea = new Rect((Width / 2) - (_logoSize.x / 2), (Height / 2) - 230, _logoSize.x, _logoSize.y); + + _textArea = new Rect((Width / 2) - (200), (Height / 2) - (30), 400, 60); + + _letsgoButtonArea = new Rect((Width / 2) - 250, (Height / 2) + 85, 150, 30); + _remindMeButtonArea = new Rect((Width / 2) - 75, (Height / 2) + 85, 150, 30); + _dontAskAgainButtonArea = new Rect((Width / 2) + 100, (Height / 2) + 85, 150, 30); + } + } + + public override void Render() + { + if (_shouldBeRendered) + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + Size = new Vector2(Host.Width, Host.Height); + _backdropArea = new Rect(0, 0, Width, Height); + _logoArea = new Rect((Width / 2) - (_logoSize.x / 2), (Height / 2) - 230, _logoSize.x, _logoSize.y); + + _textArea = new Rect((Width / 2) - (200), (Height / 2) - (30), 400, 60); + + _letsgoButtonArea = new Rect((Width / 2) - 250, (Height / 2) + 85, 150, 30); + _remindMeButtonArea = new Rect((Width / 2) - 75, (Height / 2) + 85, 150, 30); + _dontAskAgainButtonArea = new Rect((Width / 2) + 100, (Height / 2) + 85, 150, 30); + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.PopupColorName); + + GUI.Box(_backdropArea, ""); + + GUI.DrawTexture(_logoArea, _logo, ScaleMode.ScaleToFit); + + GUI.Label(_textArea, "Hey! If you love P.A.T.C.H. help us! Leave a review on Asset Store!", _style); + + if (GUI.Button(_letsgoButtonArea, "Let's go!")) + { + Process.Start(PatchReviewUrl); + _shouldBeRendered = false; + } + + if (GUI.Button(_remindMeButtonArea, "Remind me later!")) + { + _shouldBeRendered = false; + } + + if (GUI.Button(_dontAskAgainButtonArea, "I did it!")) + { + PlayerPrefs.SetInt(PatchPopupFlag, 1); + _shouldBeRendered = false; + } + + GUI.skin = previous; + } + } + + private void CheckForPopupOpenings() + { + if (PlayerPrefs.HasKey(PatchPopupFlag)) + { + _shouldBeRendered = false; + return; + } + + int amount = 1; + if (PlayerPrefs.HasKey(PatchPopupKeyName)) + { + amount = PlayerPrefs.GetInt(PatchPopupKeyName); + if (amount >= PatchPopupOpeningsAmount) + amount = 1; + } + else + { + PlayerPrefs.SetInt(PatchPopupKeyName, 1); + } + + if (amount == 1) + { + _shouldBeRendered = true; + } + + amount = amount + 1; + PlayerPrefs.SetInt(PatchPopupKeyName, amount); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchPopup.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchPopup.cs.meta new file mode 100644 index 0000000..02ec251 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchPopup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1934938c6f73f414baf98f0a2a76892d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchSidebar.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchSidebar.cs new file mode 100644 index 0000000..0f81d0d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchSidebar.cs @@ -0,0 +1,91 @@ +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchSidebar : Widget + { + public const string SelectedView = "PatchSelectedView"; + + private Rect _sidebarArea; + private Vector2 _buttonSize; + private Rect _buttonsArea; + + private Vector2 _previousHostSize; + + private Vector2 _arrowSize; + private Rect _arrowArea; + private Texture2D _arrow; + + private int _previousIndex; + + public override void Initialize() + { + base.Initialize(); + Size = new Vector2((Host.MinSize.x * 20) / 100, Host.Height); + _previousHostSize = Host.Size; + + _sidebarArea = new Rect(0, (Host.MinSize.y * 15) / 100, Width, Height); + _buttonSize = new Vector2(Width, 40); + + if (PlayerPrefs.HasKey(SelectedView)) + { + Host.AddData(SelectedView, PlayerPrefs.GetInt(SelectedView)); + } + else + { + Host.AddData(SelectedView, 0); + } + + float buttonsHeight = 0; + for (int i = 0; i < ThemeHelper.SidebarButtons.Length; i++) + { + buttonsHeight += _buttonSize.y; + } + _buttonsArea = new Rect(_sidebarArea.position.x, _sidebarArea.position.y, Width, buttonsHeight); + + _arrowSize = new Vector2(20, _buttonSize.y); + + _arrow = Resources.Load("Images/editor_arrow"); + + _previousIndex = Host.GetData(SelectedView); + _arrowArea = new Rect(Width, _sidebarArea.y + (Host.GetData(SelectedView) * _buttonSize.y), _arrowSize.x, _arrowSize.y); + } + + public override void Render() + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + _previousHostSize = Host.Size; + Size = new Vector2((Host.MinSize.x * 20) / 100, Host.Height); + _sidebarArea = new Rect(0, (Host.MinSize.y * 15) / 100, Width, Height); + _buttonSize = new Vector2(Width, 40); + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.MainColorName); + GUI.Box(_sidebarArea, ""); + + var index = GUI.SelectionGrid(_buttonsArea, Host.GetData(SelectedView), ThemeHelper.SidebarButtons, 1); + if (index != Host.GetData(SelectedView)) + { + PlayerPrefs.SetInt(SelectedView, index); + ThemeHelper.WindowContents[ThemeHelper.SidebarButtons[Host.GetData(PatchSidebar.SelectedView)]].OnShow(); + } + Host.AddData(SelectedView, index); + + if (_previousIndex != Host.GetData(SelectedView)) + { + _arrowArea = new Rect(Width, _sidebarArea.y + (Host.GetData(SelectedView) * _buttonSize.y), + _arrowSize.x, _arrowSize.y); + _previousIndex = Host.GetData(SelectedView); + } + + GUI.DrawTexture(_arrowArea, _arrow, ScaleMode.ScaleToFit); + + GUI.skin = previous; + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchSidebar.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchSidebar.cs.meta new file mode 100644 index 0000000..dd12414 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchSidebar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b065ed0a73c906a47a893562bb95e1a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTipPopup.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTipPopup.cs new file mode 100644 index 0000000..84a1341 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTipPopup.cs @@ -0,0 +1,141 @@ +using MHLab.Patch.Admin.Editor.Components.Contents; +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchTipPopup : Widget + { + private bool _shouldBeRendered = false; + + private GUIStyle _style; + private Rect _backdropArea; + private Vector2 _backdropSize; + + private Rect _titleArea; + private Rect _textArea; + + private Rect _closeButton; + private Vector2 _closeButtonSize; + private Rect _moreButton; + private Vector2 _moreButtonSize; + + private Vector2 _previousHostSize; + + private string _phrase; + private int _currentPhraseIndex; + + private static readonly string[] Phrases = new string[] + { + string.Format("You should write a review on Asset Store to help other customers!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("Doc contains a lot of useful information! Read it, make me proud of you!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("Did I already say you should read the doc one more time? :)", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("You can join our Discord server to chat with us!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("You can send me a mail to ask for help! But read the doc first :)", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("You can use PATCH not only with Unity! UE, CE, MonoGame, etc: everything works with PATCH!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("You can sell your own PATCH skins and plugins on Asset Store!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("You must set .NET Standard 2.0 as your API Compatibility Level!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("It is a good practice to run PATCH Launcher as admin!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + string.Format("You must not run your Launcher in the Editor!", ThemeHelper.ConvertToStringFormat(ThemeHelper.TextColor)), + }; + + public override void Initialize() + { + base.Initialize(); + Size = new Vector2(Host.Width, Host.Height); + _previousHostSize = Host.Size; + + _shouldBeRendered = true; + if (PlayerPrefs.HasKey(PatchOptionsContent.TipsEnabledKey)) + _shouldBeRendered = PlayerPrefs.GetInt(PatchOptionsContent.TipsEnabledKey) == 1; + _backdropSize = new Vector2(250, 130); + _closeButtonSize = new Vector2(20, 20); + _moreButtonSize = new Vector2(20, 20); + + //_backdropArea = new Rect(Width - _backdropSize.x - 10, Height - _backdropSize.y - 10, _backdropSize.x, _backdropSize.y); + _backdropArea = new Rect(10, Height - _backdropSize.y - 10, _backdropSize.x, _backdropSize.y); + + _titleArea = new Rect(_backdropArea.x + 10, _backdropArea.y + 10, _backdropArea.width - 20, 15); + _textArea = new Rect(_backdropArea.x + 10, _backdropArea.y + 15, _backdropArea.width - 20, _backdropArea.height - 25); + + _closeButton = new Rect(_backdropArea.x + _backdropArea.width - 10 - _closeButtonSize.x, _backdropArea.y + 10, _closeButtonSize.x, _closeButtonSize.y); + _moreButton = new Rect(_backdropArea.x + _backdropArea.width - 10 - _moreButtonSize.x, _backdropArea.y + _backdropArea.height - _moreButtonSize.y - 10, _moreButtonSize.x, _moreButtonSize.y); + + _style = new GUIStyle(); + _style.wordWrap = true; + _style.fontSize = 12; + _style.richText = true; + _style.alignment = TextAnchor.MiddleCenter; + + _phrase = GetRandomPhrase(); + } + + public override void Render() + { + if (_shouldBeRendered) + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + Size = new Vector2(Host.Width, Host.Height); + //_backdropArea = new Rect(Width - _backdropSize.x - 10, Height - _backdropSize.y - 10, _backdropSize.x, _backdropSize.y); + _backdropArea = new Rect(10, Height - _backdropSize.y - 10, _backdropSize.x, _backdropSize.y); + + _titleArea = new Rect(_backdropArea.x + 10, _backdropArea.y + 10, _backdropArea.width - 20, 15); + _textArea = new Rect(_backdropArea.x + 10, _backdropArea.y + 15, _backdropArea.width - 20, _backdropArea.height - 25); + + _closeButton = new Rect(_backdropArea.x + _backdropArea.width - 10 - _closeButtonSize.x, _backdropArea.y + 10, _closeButtonSize.x, _closeButtonSize.y); + _moreButton = new Rect(_backdropArea.x + _backdropArea.width - 10 - _moreButtonSize.x, _backdropArea.y + _backdropArea.height - _moreButtonSize.y - 10, _moreButtonSize.x, _moreButtonSize.y); + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.DarkColorName); + + GUI.Box(_backdropArea, ""); + + GUI.Label(_titleArea, "Did you know?", _style); + GUI.Label(_textArea, _phrase, _style); + + if (GUI.Button(_closeButton, "X")) + { + _shouldBeRendered = false; + } + + if (GUI.Button(_moreButton, ">")) + { + _phrase = GetRandomPhrase(); + } + + GUI.skin = previous; + } + } + + private string GetRandomPhrase() + { + if (Phrases.Length == 0) + { + _shouldBeRendered = false; + return ""; + } + + if (Phrases.Length == 1) + { + return Phrases[0]; + } + else + { + int index; + do + { + index = (int)Random.Range(0, Phrases.Length); + if (index > Phrases.Length - 1) index = Phrases.Length - 1; + } while (_currentPhraseIndex == index); + + _currentPhraseIndex = index; + return Phrases[index]; + } + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTipPopup.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTipPopup.cs.meta new file mode 100644 index 0000000..2144707 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTipPopup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: feac8e30099aed643ad276a8133fa98f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTopbar.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTopbar.cs new file mode 100644 index 0000000..bc9d1cb --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTopbar.cs @@ -0,0 +1,87 @@ +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchTopbar : Widget + { + private Rect _topbarArea; + private Vector2 _previousHostSize; + + private Rect _borderArea; + + private Texture2D _logo; + private Texture2D _underLogo; + private Vector2 _logoSize; + private Rect _logoArea; + private Rect _underLogoArea; + + private Rect _openWorkspaceButtonArea; + private Rect _openDocButtonArea; + private Vector2 _topbarButtonSize; + + public override void Initialize() + { + base.Initialize(); + Size = new Vector2(Host.Width, (Host.MinSize.y * 15) / 100); + _previousHostSize = Host.Size; + + _topbarArea = new Rect(0, 0, Width, Height); + + _borderArea = new Rect(0, Height - 10, Width, 10); + + _logo = Resources.Load("Images/logo_editor"); + _underLogo = Resources.Load("Images/oblique_filler"); + _logoSize = new Vector2(140, Height * 80 / 100); + //_logoArea = new Rect(Host.Width / 2 - _logoSize.x / 2, 0, _logoSize.x, _logoSize.y); + _underLogoArea = new Rect(0, 0, _logoSize.x + 50, Height - 10); + _logoArea = new Rect(10, 5, _logoSize.x, _logoSize.y); + + _topbarButtonSize = new Vector2(120, 24); + _openWorkspaceButtonArea = new Rect(Width - 10 - _topbarButtonSize.x, 8, _topbarButtonSize.x, _topbarButtonSize.y); + _openDocButtonArea = new Rect(Width - 10 - _topbarButtonSize.x, 16 + _topbarButtonSize.y, _topbarButtonSize.x, _topbarButtonSize.y); + } + + public override void Render() + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + _previousHostSize = Host.Size; + Size = new Vector2(Host.Width, (Host.MinSize.y * 15) / 100); + _topbarArea = new Rect(0, 0, Width, Height); + _borderArea = new Rect(0, Height - 10, Width, 10); + _underLogoArea = new Rect(0, 0, _logoSize.x + 50, Height - 10); + //_logoArea = new Rect(Host.Width / 2 - _logoSize.x / 2, 0, _logoSize.x, _logoSize.y); + _logoArea = new Rect(10, 5, _logoSize.x, _logoSize.y); + _openWorkspaceButtonArea = new Rect(Width - 10 - _topbarButtonSize.x, 10, _topbarButtonSize.x, _topbarButtonSize.y); + _openDocButtonArea = new Rect(Width - 10 - _topbarButtonSize.x, 16 + _topbarButtonSize.y, _topbarButtonSize.x, _topbarButtonSize.y); + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.SecondaryColorName); + GUI.Box(_topbarArea, ""); + + GUI.skin = Host.GetSkin(ThemeHelper.DarkColorName); + GUI.Box(_borderArea, ""); + + GUI.DrawTexture(_underLogoArea, _underLogo, ScaleMode.StretchToFill); + GUI.DrawTexture(_logoArea, _logo, ScaleMode.ScaleToFit); + + GUI.skin = Host.GetSkin(ThemeHelper.SecondaryColorName); + if (GUI.Button(_openWorkspaceButtonArea, "Go to workspace")) + { + AdminWindow.AdminWindowMenu.OpenWorkspaceFolder(); + } + + if (GUI.Button(_openDocButtonArea, "Open the doc")) + { + AdminWindow.AdminWindowMenu.OpenDocumentation(); + } + + + GUI.skin = previous; + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTopbar.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTopbar.cs.meta new file mode 100644 index 0000000..bf701f3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTopbar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 523966ee1ea88fa4794a21fa77ebbf2d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTutorial.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTutorial.cs new file mode 100644 index 0000000..13edb08 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTutorial.cs @@ -0,0 +1,324 @@ +using System.Collections.Generic; +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchTutorial : Widget + { + private bool _shouldBeRendered = false; + + private GUIStyle _style; + private Rect _backdropArea; + + private Texture2D _logo; + private Vector2 _logoSize; + private Rect _logoArea; + private Rect _logoTopArea; + + private Rect _textArea; + private Rect _nextButtonArea; + private Rect _previousButtonArea; + private Rect _skipTutorialButtonArea; + + private Vector2 _previousHostSize; + + private int _tutorialCurrentPage = 1; + + private int TutorialCurrentPage + { + get { return _tutorialCurrentPage; } + set + { + if (value > _tutorialPages.Count) + _tutorialCurrentPage = _tutorialPages.Count; + else if (value < 1) + _tutorialCurrentPage = 1; + else + _tutorialCurrentPage = value; + } + } + + private Rect _firstBoxArea; + private Rect _secondBoxArea; + + private List _tutorialPages = new List(); + + private Texture2D _branchesImage; + private Texture2D _branchesImage2; + private Texture2D _buildsImage; + private Texture2D _buildsImage2; + private Texture2D _patchesImage; + private Texture2D _patchesImage2; + private Texture2D _launcherImage; + private Texture2D _launcherImage2; + private Texture2D _configurationImage; + private Texture2D _serverImage; + private Texture2D _optionsImage; + private Texture2D _logsImage; + private Texture2D _logsImage2; + + public override void Initialize() + { + base.Initialize(); + Size = new Vector2(Host.Width, Host.Height); + _previousHostSize = Host.Size; + + CheckForPopupOpening(); + + _tutorialPages.Add(new WelcomeTutorialPage()); + + _tutorialPages.Add(new BuildsTutorialPage()); + _tutorialPages.Add(new Builds2TutorialPage()); + _tutorialPages.Add(new PatchesTutorialPage()); + _tutorialPages.Add(new Patches2TutorialPage()); + _tutorialPages.Add(new LauncherTutorialPage()); + _tutorialPages.Add(new Launcher2TutorialPage()); + _tutorialPages.Add(new OptionsTutorialPage()); + + _tutorialPages.Add(new ReadDocumentationTutorialPage()); + _tutorialPages.Add(new EndTutorialPage()); + + if (_shouldBeRendered) + { + _style = new GUIStyle(); + _style.wordWrap = true; + _style.fontSize = 15; + _style.richText = true; + _style.alignment = TextAnchor.MiddleCenter; + + _backdropArea = new Rect(0, 0, Width, Height); + + _logo = Resources.Load("Images/logo_editor"); + _logoSize = new Vector2(250, 220); + _logoArea = new Rect((Width / 2) - (_logoSize.x / 2), (Height / 2) - 300, _logoSize.x, _logoSize.y); + _logoTopArea = new Rect((Width / 2) - (_logoSize.x / 2), 20, _logoSize.x, _logoSize.y); + + _textArea = new Rect((Width / 2) - (200), (Height / 2) - (30), 400, 60); + + _nextButtonArea = new Rect(Width - 20 - 100, Height - 20 - 30, 100, 30); + _previousButtonArea = new Rect(20, Height - 20 - 30, 100, 30); + _skipTutorialButtonArea = new Rect(Width / 2 - 50, Height - 20 - 30, 100, 30); + + _firstBoxArea = new Rect(20, _logoTopArea.y + _logoSize.y + 10, Width / 2 - 40, Height / 2); + _secondBoxArea = new Rect(Width / 2 + 20, _logoTopArea.y + _logoSize.y + 10, Width / 2 - 40, Height / 2); + + _buildsImage = Resources.Load("Images/Tutorial/Builds"); + _buildsImage2 = Resources.Load("Images/Tutorial/Builds2"); + _patchesImage = Resources.Load("Images/Tutorial/Patches"); + _patchesImage2 = Resources.Load("Images/Tutorial/Patches2"); + _launcherImage = Resources.Load("Images/Tutorial/Launcher"); + _launcherImage2 = Resources.Load("Images/Tutorial/Launcher2"); + _optionsImage = Resources.Load("Images/Tutorial/Options"); + } + } + + public override void Render() + { + if (_shouldBeRendered) + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + Size = new Vector2(Host.Width, Host.Height); + _backdropArea = new Rect(0, 0, Width, Height); + _logoArea = new Rect((Width / 2) - (_logoSize.x / 2), (Height / 2) - 300, _logoSize.x, _logoSize.y); + _logoTopArea = new Rect((Width / 2) - (_logoSize.x / 2), 20, _logoSize.x, _logoSize.y); + + _textArea = new Rect((Width / 2) - (200), (Height / 2) - (30), 400, 60); + + _nextButtonArea = new Rect(Width - 20 - 100, Height - 20 - 30, 100, 30); + _previousButtonArea = new Rect(20, Height - 20 - 30, 100, 30); + _skipTutorialButtonArea = new Rect(Width / 2 - 50, Height - 20 - 30, 100, 30); + + _firstBoxArea = new Rect(20, _logoTopArea.y + _logoSize.y + 10, Width / 2 - 40, Height / 2); + _secondBoxArea = new Rect(Width / 2 + 20, _logoTopArea.y + _logoSize.y + 10, Width / 2 - 40, Height / 2); + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.PopupColorName); + + GUI.Box(_backdropArea, ""); + + RenderTutorial(); + + if (TutorialCurrentPage < _tutorialPages.Count) + { + if (GUI.Button(_nextButtonArea, "Next")) + { + TutorialCurrentPage++; + } + } + else + { + if (GUI.Button(_nextButtonArea, "Complete!")) + { + ThemeHelper.ToggleHasBeenOpened(true); + AdminWindow.SetContainerComponents(Host); + } + } + + if (TutorialCurrentPage > 1) + { + if (GUI.Button(_previousButtonArea, "Previous")) + { + TutorialCurrentPage--; + } + } + + if (GUI.Button(_skipTutorialButtonArea, "Skip tutorial")) + { + ThemeHelper.ToggleHasBeenOpened(true); + AdminWindow.SetContainerComponents(Host); + } + + GUI.skin = previous; + } + } + + private void CheckForPopupOpening() + { + _shouldBeRendered = ThemeHelper.HasToShowTutorial(); + } + + private void RenderTutorial() + { + _tutorialPages[TutorialCurrentPage - 1].Render(this); + + } + + protected abstract class TutorialPage + { + public abstract void Render(PatchTutorial host); + } + + protected class WelcomeTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoArea, host._logo, ScaleMode.ScaleToFit); + + GUI.Label(host._textArea, "Hey! It seems like this is your first time here, so: welcome in PATCH!\n\n" + + "I prepared a little tutorial to help you getting started with it. I don't want to be boring, so let's go: I hope you enjoy this tour!\n\n" + + "Click on the \"Next\" button or on \"Skip tutorial\" if you don't need it!", host._style); + } + } + + protected class BuildsTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.Label(host._firstBoxArea, "Builds\n\nA build is one of the main units in PATCH's workflow. It represents your" + + " game's current state.\nPATCH's engine performs some computations on your game to generate all needed metadata, packages and version files. " + + "To start using this tool, you need to build your game and place it in \"" + ((AdminWindow)host.Host.CurrentWindow).AdminSettings.ApplicationFolderName + "\" folder, under the PATCH's workspace.\n\n" + + "You're ready to start now!", host._style); + GUI.DrawTexture(host._secondBoxArea, host._buildsImage, ScaleMode.ScaleToFit); + } + } + + protected class Builds2TutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.DrawTexture(host._firstBoxArea, host._buildsImage2, ScaleMode.ScaleToFit); + + GUI.Label(host._secondBoxArea, "In the Builds tab - after you placed your built game in the correct folder - you can create your first PATCH " + + "build by pressing the \"Build new version\" button.\n\"Release type\" regulates the versioning number of your next build: you can read more about it in the doc.", host._style); + } + } + + protected class PatchesTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.Label(host._firstBoxArea, "Patches\n\nA patch is the second main unit in PATCH's workflow. It represents " + + "the binary difference between two builds.\nThis concept is really important: it allows you to publish small updates for your game. It is a lot more convenient than downloading the whole new build everytime!\n" + + "To start using this tool, you must have at least two builds: then you will be able to generate the patch!", host._style); + GUI.DrawTexture(host._secondBoxArea, host._patchesImage, ScaleMode.ScaleToFit); + } + } + + protected class Patches2TutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.DrawTexture(host._firstBoxArea, host._patchesImage2, ScaleMode.ScaleToFit); + + GUI.Label(host._secondBoxArea, "Patches generation is really straightforward: just select game builds (PATCH automatically " + + "selects current one and previous one), the compression level and press the button! You did it! :)", host._style); + } + } + + protected class LauncherTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.DrawTexture(host._firstBoxArea, host._launcherImage, ScaleMode.ScaleToFit); + + GUI.Label(host._secondBoxArea, "Launcher\n\nYou may need to publish updates not only for your game, but for your Launcher too." + + "That's really important to fix bugs or to extend Launcher's functionalities over time.", host._style); + } + } + + protected class Launcher2TutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.Label(host._firstBoxArea, "Just place your built Launcher in the \"Updater\" folder, set a name for the archive, " + + "the compression level and hit the \"Build Launcher update\" button. Your update for your Launcher is ready!", host._style); + GUI.DrawTexture(host._secondBoxArea, host._launcherImage2, ScaleMode.ScaleToFit); + } + } + + protected class OptionsTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoTopArea, host._logo, ScaleMode.ScaleToFit); + + GUI.DrawTexture(host._firstBoxArea, host._optionsImage, ScaleMode.ScaleToFit); + + GUI.Label(host._secondBoxArea, "Options\n\nOptions tab contains all options and settings for this Admin Tool: " + + "they only influence its behavior. Also, here you can find the button to relaunch this tutorial! I know you're happy now! :D", host._style); + } + } + + protected class ReadDocumentationTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoArea, host._logo, ScaleMode.ScaleToFit); + + GUI.Label(host._textArea, "The last advice for you is: you really, really, REALLY should read the documentation " + + "to get a full guide and a deep look into this software.\n\nDocumentation contains a lot of useful information and explanations about this tools and best practices!\n" + + "Also, I wrote it with love: don't disappoint me! :)", host._style); + } + } + + protected class EndTutorialPage : TutorialPage + { + public override void Render(PatchTutorial host) + { + GUI.DrawTexture(host._logoArea, host._logo, ScaleMode.ScaleToFit); + + GUI.Label(host._textArea, "This journey through PATCH's features is finally at its end!\n" + + "I want to thank you for your patience and I hope you are not too much confused.\n" + + "Also, remember that you can contact me to report problems or to ask for help!\n" + + "Now it's time for me to leave and let you alone with your new, shining PATCH! Have fun and enjoy it! :)", host._style); + } + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTutorial.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTutorial.cs.meta new file mode 100644 index 0000000..0551946 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchTutorial.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 4616d084c4b0f5746b05da5616a31f10 +timeCreated: 1511879315 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchWindow.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchWindow.cs new file mode 100644 index 0000000..eea7f33 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchWindow.cs @@ -0,0 +1,53 @@ +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public class PatchWindow : Widget + { + private Rect _contentArea; + private Vector2 _previousHostSize; + + public override void Initialize() + { + base.Initialize(); + + Size = new Vector2(Host.Width - (Host.MinSize.x * 20) / 100, Host.Height - (Host.MinSize.y * 15) / 100); + + _previousHostSize = Host.Size; + _contentArea = new Rect((Host.MinSize.x * 20) / 100, (Host.MinSize.y * 15) / 100, Width, Height); + } + + public override void Update() + { + base.Update(); + ThemeHelper.WindowContents[ThemeHelper.SidebarButtons[Host.GetData(PatchSidebar.SelectedView)]].Update(); + } + + public override void Render() + { + base.Render(); + + if (_previousHostSize != Host.Size) + { + Size = new Vector2(Host.Width - (Host.MinSize.x * 20) / 100, Host.Height - (Host.MinSize.y * 15) / 100); + _contentArea = new Rect((Host.MinSize.x * 20) / 100, (Host.MinSize.y * 15) / 100, Width, Height); + _previousHostSize = Host.Size; + } + + var previous = GUI.skin; + GUI.skin = Host.GetSkin(ThemeHelper.SecondaryColorName); + + GUI.Box(_contentArea, ""); + + RenderContent(Host.GetData(PatchSidebar.SelectedView)); + + GUI.skin = previous; + } + + private void RenderContent(int view) + { + ThemeHelper.WindowContents[ThemeHelper.SidebarButtons[view]].Render(); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchWindow.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchWindow.cs.meta new file mode 100644 index 0000000..99f67e3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PatchWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a9ab7a1ad82d824c99fe2842912fd67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PopupErrorType.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PopupErrorType.cs new file mode 100644 index 0000000..b76d40a --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PopupErrorType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MHLab.PATCH.Admin.Editor +{ + public enum PopupErrorType + { + None, + DotNetSubset + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PopupErrorType.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PopupErrorType.cs.meta new file mode 100644 index 0000000..ad0f2b7 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/PopupErrorType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f64e1b7e4c1701e45828862f9e5c3cf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/ThemeHelper.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/ThemeHelper.cs new file mode 100644 index 0000000..d58e4aa --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/ThemeHelper.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using MHLab.PATCH.Admin.Editor; +using MHLab.Patch.Admin.Editor.Components.Contents; +using MHLab.Patch.Admin.Editor.EditorHelpers; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.Components +{ + public static class ThemeHelper + { + public static string MainColorName = "MainColor"; + public static string SecondaryColorName = "SecondaryColor"; + public static string DarkColorName = "DarkColor"; + public static string PopupColorName = "PopupColor"; + + public static readonly string[] SidebarButtons = new string[] + { + "Builds", + "Patches", + "Launcher", + "Options", + "Info" + }; + public static Dictionary WindowContents; + + public static Color MainColor = new Color32(82, 82, 82, 255); + public static Color SecondaryColor = new Color32(62, 62, 62, 255); + + public static Color TextColor = new Color32(240, 240, 240, 255); + public static Color TipTitleColor = new Color32(200, 200, 200, 255); + + public static Color PopupColor = new Color32(0, 0, 0, 230); + + public static string ConvertToStringFormat(Color c) + { + return string.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", ToByte(c.r), ToByte(c.g), ToByte(c.b), ToByte(c.a)); + } + + private static byte ToByte(float f) + { + f = Mathf.Clamp01(f); + return (byte)(f * 255); + } + + public static void InitializeContent(WidgetContainer container) + { + WindowContents = new Dictionary() + { + { "Builds", WidgetFactory.CreateWidget(container) }, + { "Patches", WidgetFactory.CreateWidget(container) }, + { "Launcher", WidgetFactory.CreateWidget(container) }, + { "Options", WidgetFactory.CreateWidget(container) }, + { "Info", WidgetFactory.CreateWidget(container) }, + }; + } + + public static bool HasToShowErrorPopup(out PopupErrorType type) + { +#if NET_2_0_SUBSET + type = PopupErrorType.DotNetSubset; + return true; +#else + type = PopupErrorType.None; + return false; +#endif + } + + private const string HasBeenOpenedKey = "PatchHasBeenOpened"; + + public static bool HasToShowTutorial() + { + if (PlayerPrefs.HasKey(HasBeenOpenedKey)) + { + return false; + } + else + { + return true; + } + } + + public static void ToggleHasBeenOpened(bool opened) + { + if(opened) + PlayerPrefs.SetInt(HasBeenOpenedKey, 1); + else + PlayerPrefs.DeleteKey(HasBeenOpenedKey); + PlayerPrefs.Save(); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/ThemeHelper.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/ThemeHelper.cs.meta new file mode 100644 index 0000000..5def76d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Components/ThemeHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f321b68227062746a4367cba0e60223 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers.meta new file mode 100644 index 0000000..4397dde --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5927f00fac579724d89149bb86f4d21a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/Widget.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/Widget.cs new file mode 100644 index 0000000..b0c4be0 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/Widget.cs @@ -0,0 +1,35 @@ +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.EditorHelpers +{ + public abstract class Widget + { + public WidgetContainer Host { get; set; } + + public Widget Parent { get; set; } + + public Vector2 Size { get; set; } + public float Width { get { return Size.x; } } + public float Height { get { return Size.y; } } + + public virtual void Initialize() + { + + } + + public virtual void OnShow() + { + + } + + public virtual void Render() + { + + } + + public virtual void Update() + { + + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/Widget.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/Widget.cs.meta new file mode 100644 index 0000000..9a2cbea --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/Widget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0e704e9980d9d44f882886e5137dc89 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetContainer.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetContainer.cs new file mode 100644 index 0000000..3d9e9b0 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetContainer.cs @@ -0,0 +1,108 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace MHLab.Patch.Admin.Editor.EditorHelpers +{ + public sealed class WidgetContainer + { + private EditorWindow _host; + + public EditorWindow CurrentWindow + { + get { return _host; } + } + + private Vector2 _minSize = new Vector2(-1, -1); + public Vector2 MinSize + { + get { return _minSize; } + set { _minSize = value; } + } + + private Vector2 _maxSize = new Vector2(-1, -1); + public Vector2 MaxSize + { + get { return _maxSize; } + set { _maxSize = value; } + } + + public Vector2 Size + { + get { return _host.position.size; } + } + + public float Width { get { return Size.x; } } + public float Height { get { return Size.y; } } + + private readonly List _uiComponents; + + private readonly Dictionary _data; + + private readonly Dictionary _skins; + + public static WidgetContainer Create(EditorWindow host) + { + return new WidgetContainer(host); + } + + private WidgetContainer(EditorWindow host) + { + _host = host; + _uiComponents = new List(); + _data = new Dictionary(); + _skins = new Dictionary(); + } + + public void Push() where T : Widget + { + _uiComponents.Add(WidgetFactory.CreateWidget(this)); + } + + public void ClearComponents() + { + _uiComponents.Clear(); + } + + public void Render() + { + for (int i = 0; i < _uiComponents.Count; i++) + { + _uiComponents[i].Render(); + } + } + + public void Update() + { + for (int i = 0; i < _uiComponents.Count; i++) + { + _uiComponents[i].Update(); + } + } + + public void AddData(string key, object val) + { + _data[key] = val; + } + + public T GetData(string key) + { + return (T) _data[key]; + } + + public bool HasData(string key) + { + return _data.ContainsKey(key); + } + + public void AddSkin(string key, GUISkin val) + { + _skins[key] = val; + } + + public GUISkin GetSkin(string key) + { + return _skins[key]; + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetContainer.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetContainer.cs.meta new file mode 100644 index 0000000..73f3479 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetContainer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd81f59de17da554fa68946e8fa0a8a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetFactory.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetFactory.cs new file mode 100644 index 0000000..524b949 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetFactory.cs @@ -0,0 +1,16 @@ +using System; + +namespace MHLab.Patch.Admin.Editor.EditorHelpers +{ + public class WidgetFactory + { + public static T CreateWidget(WidgetContainer host) where T : Widget + { + var widget = (T)Activator.CreateInstance(); + widget.Host = host; + widget.Initialize(); + + return widget; + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetFactory.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetFactory.cs.meta new file mode 100644 index 0000000..65366cd --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/EditorHelpers/WidgetFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea4d7077538397d47bf119a6c56c4bbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization.meta new file mode 100644 index 0000000..09a26c8 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c100db2edbc99b04cba35f233c45e6f4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization/EnglishAdminLocalizedMessages.cs b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization/EnglishAdminLocalizedMessages.cs new file mode 100644 index 0000000..460e650 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization/EnglishAdminLocalizedMessages.cs @@ -0,0 +1,45 @@ +using MHLab.Patch.Core.Admin.Localization; + +namespace MHLab.Patch.Admin.Editor.Localization +{ + public sealed class EnglishAdminLocalizedMessages : IAdminLocalizedMessages + { + public string NewVersionBuilding => "Building new {0} version..."; + public string BuildFileProcessed => "Processed file {0}."; + public string BuildDefinitionProcessed => "Processed definition for {0}."; + public string NewVersionBuilt => "New {0} version built."; + public string VersionFileBuilding => "Building version file..."; + public string VersionFileBuilt => "Version file built."; + public string BuildDefinitionBuilding => "Building build definition..."; + public string BuildDefinitionBuilt => "Build definition built."; + public string BuildIndexBuilding => "Updating build index..."; + public string BuildCompletedSuccessfully => "Process completed! Version {0} ready!"; + + public string PatchCollectingDefinitions => "Collecting builds definitions..."; + public string PatchCollectingPatchData => "Collecting patch data..."; + public string PatchCollectedPatchData => "Collected {0} data: {1}"; + public string PatchBuildingPatch => "Building patch {0}_{1}..."; + public string PatchSkippingFile => "Skipping files..."; + public string PatchAddingFile => "Adding {0} file..."; + public string PatchAddedFile => "Added {0} file."; + public string PatchPatchingFile => "Generating diff for {0} file..."; + public string PatchPatchedFile => "Generated diff for {0} file."; + public string PatchChangingAttributesFile => "Tracking attributes for {0} file..."; + public string PatchChangedAttributesFile => "Tracked attributes for {0} file."; + public string PatchCompressing => "Compressing patch {0}_{1}..."; + public string PatchCompressed => "Compressed patch {0}_{1}."; + public string PatchCleaningWorkspace => "Cleaning workspace from signature files..."; + public string PatchCleanedWorkspace => "Workspace is now clean."; + public string PatchBuildingDefinition => "Building patch definition..."; + public string PatchBuiltDefinition => "Patch definition built successfully."; + public string PatchBuildingIndex => "Updating patch index..."; + public string PatchBuiltIndex => "Patch index updated successfully."; + + public string UpdaterCollectingOldDefinition => "Collecting old definition..."; + public string UpdaterCollectingFiles => "Collecting new files..."; + public string UpdaterProcessedFile => "Processed file {0}"; + public string UpdaterCompressingArchive => "Compressing Launcher archive..."; + public string UpdaterCompressedArchive => "Compressed Launcher archive."; + public string UpdaterSavedDefinition => "Saved Launcher update definition."; + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization/EnglishAdminLocalizedMessages.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization/EnglishAdminLocalizedMessages.cs.meta new file mode 100644 index 0000000..81c9799 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Localization/EnglishAdminLocalizedMessages.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e13e8c1eee685f146acd4336f63ab466 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources.meta new file mode 100644 index 0000000..3260204 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f9f5c11494c4b3f4681c367a36ba74a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images.meta new file mode 100644 index 0000000..cc587d3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 31e6d7418087ab74caae97cac6097163 +folderAsset: yes +timeCreated: 1512010593 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial.meta new file mode 100644 index 0000000..ae39b22 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 05cd917067545c9459b92fdcda309f2a +folderAsset: yes +timeCreated: 1512006892 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds.png new file mode 100644 index 0000000..fb47a05 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds.png.meta new file mode 100644 index 0000000..060812c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: 1cd6866fae17a5e45b8969091a5f4e8f +timeCreated: 1512008262 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds2.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds2.png new file mode 100644 index 0000000..319ecc7 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds2.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds2.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds2.png.meta new file mode 100644 index 0000000..0e25ac3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Builds2.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: 74b1306148e4d6e498c59ecd7ff435fb +timeCreated: 1512008262 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher.png new file mode 100644 index 0000000..9d02963 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher.png.meta new file mode 100644 index 0000000..19b22e1 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: bffe628f3b03a6846921fb459f900d42 +timeCreated: 1512010508 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher2.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher2.png new file mode 100644 index 0000000..710f572 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher2.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher2.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher2.png.meta new file mode 100644 index 0000000..dc3d561 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Launcher2.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: ab12fbbb315a9f8428a823d1f87663d0 +timeCreated: 1512010508 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Options.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Options.png new file mode 100644 index 0000000..5ab77de Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Options.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Options.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Options.png.meta new file mode 100644 index 0000000..2832d45 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Options.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: 151c1934302830f42befe29d1b854a74 +timeCreated: 1512010508 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches.png new file mode 100644 index 0000000..185c41c Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches.png.meta new file mode 100644 index 0000000..5885e7c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: b935df20c0f54ed40a283ea037b10077 +timeCreated: 1512010508 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches2.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches2.png new file mode 100644 index 0000000..6a2b963 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches2.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches2.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches2.png.meta new file mode 100644 index 0000000..db8b81a --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/Tutorial/Patches2.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: 1d26404efb1a3e04d83baa11cc330720 +timeCreated: 1512010508 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/editor_arrow.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/editor_arrow.png new file mode 100644 index 0000000..dd68fe1 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/editor_arrow.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/editor_arrow.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/editor_arrow.png.meta new file mode 100644 index 0000000..1cf7c0f --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/editor_arrow.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: b86d0173c3b813a469acea14652751e0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/logo_editor.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/logo_editor.png new file mode 100644 index 0000000..2fa5eff Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/logo_editor.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/logo_editor.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/logo_editor.png.meta new file mode 100644 index 0000000..310bcfd --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/logo_editor.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 10904e6be7f736946b078f752c133210 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/oblique_filler.png b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/oblique_filler.png new file mode 100644 index 0000000..f10b5b3 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/oblique_filler.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/oblique_filler.png.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/oblique_filler.png.meta new file mode 100644 index 0000000..614f095 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/Editor/Resources/Images/oblique_filler.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: d899bcfdbebec324685dedf5a7eca93e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/MHLab.Patch.Admin.Commandline.7z b/PatchTestProject/Assets/MHLab/Patch/Admin/MHLab.Patch.Admin.Commandline.7z new file mode 100644 index 0000000..8e0e503 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Admin/MHLab.Patch.Admin.Commandline.7z differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Admin/MHLab.Patch.Admin.Commandline.7z.meta b/PatchTestProject/Assets/MHLab/Patch/Admin/MHLab.Patch.Admin.Commandline.7z.meta new file mode 100644 index 0000000..5383d31 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Admin/MHLab.Patch.Admin.Commandline.7z.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f3020b630f9c9374cbd109deabf0eea2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher.meta new file mode 100644 index 0000000..226814b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6df33328866fe804c859b4c0c1020087 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Art.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art.meta new file mode 100644 index 0000000..1b78c52 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3f8cd9f769a9934a88b6646d9ff412a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites.meta new file mode 100644 index 0000000..502f3e2 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aba403d739ff82b478c6deedd134a5ef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/close-icon.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/close-icon.png new file mode 100644 index 0000000..308af9c Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/close-icon.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/close-icon.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/close-icon.png.meta new file mode 100644 index 0000000..55dcefe --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/close-icon.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 18eac3492b6d0544993f9dadac8a67db +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 9f7049d2db67c2749a21a742238a9186 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/options-icon.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/options-icon.png new file mode 100644 index 0000000..839640f Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/options-icon.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/options-icon.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/options-icon.png.meta new file mode 100644 index 0000000..39aa07c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Art/Sprites/options-icon.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 9e937721f17cc7247bb05c33aedd7c12 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: be480f56c7f366b4ea3d5b202be14449 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/MHLab.Patch.Launcher.Wpf.7z b/PatchTestProject/Assets/MHLab/Patch/Launcher/MHLab.Patch.Launcher.Wpf.7z new file mode 100644 index 0000000..2fffce8 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/MHLab.Patch.Launcher.Wpf.7z differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/MHLab.Patch.Launcher.Wpf.7z.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/MHLab.Patch.Launcher.Wpf.7z.meta new file mode 100644 index 0000000..b9ac764 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/MHLab.Patch.Launcher.Wpf.7z.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c73998605239ceb4db8c36af595022de +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs.meta new file mode 100644 index 0000000..d692995 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0721dc8bbb3eb7e4b9ecb11b8d99098a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dialog.prefab b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dialog.prefab new file mode 100644 index 0000000..9a533b3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dialog.prefab @@ -0,0 +1,631 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6893855097309311515 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855097309311514} + - component: {fileID: 6893855097309311519} + - component: {fileID: 6893855097309311516} + - component: {fileID: 6893855097309311517} + m_Layer: 5 + m_Name: ContinueButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855097309311514 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097309311515} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6893855098746619395} + m_Father: {fileID: 6893855098814380239} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.62600005, y: 0.053333335} + m_AnchorMax: {x: 0.89000005, y: 0.22333334} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0.000015258789} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855097309311519 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097309311515} + m_CullTransparentMesh: 0 +--- !u!114 &6893855097309311516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097309311515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5019608, g: 0.2, b: 0.15294118, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &6893855097309311517 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097309311515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6893855097309311516} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &6893855097483646681 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855097483646680} + - component: {fileID: 6893855097483646682} + - component: {fileID: 6893855097483646683} + m_Layer: 5 + m_Name: Details + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855097483646680 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097483646681} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 6893855098814380239} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.040000003, y: 0.26666668} + m_AnchorMax: {x: 0.9620001, y: 0.5366667} + m_AnchoredPosition: {x: -0.0000076293945, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855097483646682 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097483646681} + m_CullTransparentMesh: 0 +--- !u!114 &6893855097483646683 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097483646681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.49056602, g: 0.49056602, b: 0.49056602, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Detail message +--- !u!1 &6893855097671372748 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855097671372751} + - component: {fileID: 6893855097671372737} + - component: {fileID: 6893855097671372750} + m_Layer: 5 + m_Name: MainMessage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855097671372751 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097671372748} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 6893855098814380239} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.040000003, y: 0.5366667} + m_AnchorMax: {x: 0.9620001, y: 0.94000006} + m_AnchoredPosition: {x: -0.0000076293945, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855097671372737 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097671372748} + m_CullTransparentMesh: 0 +--- !u!114 &6893855097671372750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097671372748} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8679245, g: 0.8679245, b: 0.8679245, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Main message +--- !u!1 &6893855097978241875 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855097978241874} + - component: {fileID: 6893855097978241876} + - component: {fileID: 6893855097978241877} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855097978241874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097978241875} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 6893855098912965455} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855097978241876 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097978241875} + m_CullTransparentMesh: 0 +--- !u!114 &6893855097978241877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855097978241875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8962264, g: 0.8962264, b: 0.8962264, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: CLOSE +--- !u!1 &6893855098746619392 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855098746619395} + - component: {fileID: 6893855098746619397} + - component: {fileID: 6893855098746619394} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855098746619395 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098746619392} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 6893855097309311514} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855098746619397 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098746619392} + m_CullTransparentMesh: 0 +--- !u!114 &6893855098746619394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098746619392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8962264, g: 0.8962264, b: 0.8962264, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: CONTINUE +--- !u!1 &6893855098814380236 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855098814380239} + - component: {fileID: 6893855098814380225} + - component: {fileID: 6893855098814380238} + - component: {fileID: 4186148103158800825} + m_Layer: 5 + m_Name: Dialog + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855098814380239 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098814380236} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6893855097671372751} + - {fileID: 6893855097483646680} + - {fileID: 6893855098912965455} + - {fileID: 6893855097309311514} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855098814380225 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098814380236} + m_CullTransparentMesh: 0 +--- !u!114 &6893855098814380238 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098814380236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.9254902} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &4186148103158800825 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098814380236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 84c300a775c74286ac59ccdd38282212, type: 3} + m_Name: + m_EditorClassIdentifier: + MainMessage: {fileID: 6893855097671372750} + DetailsMessage: {fileID: 6893855097483646683} + CloseButton: {fileID: 6893855098912965454} + ContinueButton: {fileID: 6893855097309311517} +--- !u!1 &6893855098912965452 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6893855098912965455} + - component: {fileID: 6893855098912965440} + - component: {fileID: 6893855098912965441} + - component: {fileID: 6893855098912965454} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6893855098912965455 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098912965452} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6893855097978241874} + m_Father: {fileID: 6893855098814380239} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.11800001, y: 0.053333335} + m_AnchorMax: {x: 0.374, y: 0.22333334} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0.000015258789} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6893855098912965440 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098912965452} + m_CullTransparentMesh: 0 +--- !u!114 &6893855098912965441 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098912965452} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5019608, g: 0.2, b: 0.15294118, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &6893855098912965454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6893855098912965452} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6893855098912965441} + m_OnClick: + m_PersistentCalls: + m_Calls: [] diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dialog.prefab.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dialog.prefab.meta new file mode 100644 index 0000000..618093b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dialog.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c986e1974f10e59479942a8a386ba786 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dispatcher.prefab b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dispatcher.prefab new file mode 100644 index 0000000..1c5f101 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dispatcher.prefab @@ -0,0 +1,45 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8958825008603355779 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8958825008603355789} + - component: {fileID: 8958825008603355778} + m_Layer: 0 + m_Name: Dispatcher + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8958825008603355789 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8958825008603355779} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 535.0774, y: 218.24922, z: -21.752525} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8958825008603355778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8958825008603355779} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51eba96383bf4c9ea700d55c421c1ce8, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dispatcher.prefab.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dispatcher.prefab.meta new file mode 100644 index 0000000..9208122 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Dispatcher.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fd7d8275f834ca46b9815b96a3d38e1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/InfoSection.prefab b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/InfoSection.prefab new file mode 100644 index 0000000..61ec08c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/InfoSection.prefab @@ -0,0 +1,597 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6286318120376159818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1295875036366435857} + - component: {fileID: 4867935731249847624} + m_Layer: 5 + m_Name: InfoSection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1295875036366435857 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6286318120376159818} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3350000074041389514} + - {fileID: 4196767889177056772} + - {fileID: 7052135052208211838} + - {fileID: 3187819048435962374} + - {fileID: 1283423682327801047} + - {fileID: 6912810397826661772} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.35} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4867935731249847624 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6286318120376159818} + m_CullTransparentMesh: 0 +--- !u!1 &6865146701784963098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6912810397826661772} + - component: {fileID: 1338781633664958989} + - component: {fileID: 6647468504519189179} + m_Layer: 5 + m_Name: SizeProgress + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6912810397826661772 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6865146701784963098} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1295875036366435857} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.7273981, y: 0.3562953} + m_AnchorMax: {x: 0.98, y: 0.52847624} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1338781633664958989 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6865146701784963098} + m_CullTransparentMesh: 0 +--- !u!114 &6647468504519189179 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6865146701784963098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6431373, g: 0.6431373, b: 0.6431373, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 238.43KB/2.34GB +--- !u!1 &7733160073940175137 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3187819048435962374} + - component: {fileID: 3345848096334669924} + - component: {fileID: 7733160073940175167} + m_Layer: 5 + m_Name: DownloadSpeed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3187819048435962374 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175137} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1295875036366435857} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.33626541, y: 0.39439052} + m_AnchorMax: {x: 0.67286736, y: 0.7} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3345848096334669924 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175137} + m_CullTransparentMesh: 0 +--- !u!114 &7733160073940175167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175137} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6431373, g: 0.6431373, b: 0.6431373, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 21 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 5.4MB/s +--- !u!1 &7733160073940175139 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7052135052208211838} + - component: {fileID: 3972140632872879609} + - component: {fileID: 7733160073940175136} + m_Layer: 5 + m_Name: ElapsedTime + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7052135052208211838 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1295875036366435857} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.7273981, y: 0.52847624} + m_AnchorMax: {x: 0.98, y: 0.7} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3972140632872879609 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175139} + m_CullTransparentMesh: 0 +--- !u!114 &7733160073940175136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9137255, g: 0.9137255, b: 0.9137255, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 16 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 00:21 +--- !u!1 &7733160073940175141 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4196767889177056772} + - component: {fileID: 940548757972838249} + - component: {fileID: 7733160073940175138} + m_Layer: 5 + m_Name: Percentage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4196767889177056772 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175141} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1295875036366435857} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.02, y: 0.39439052} + m_AnchorMax: {x: 0.28033656, y: 0.7} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &940548757972838249 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175141} + m_CullTransparentMesh: 0 +--- !u!114 &7733160073940175138 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175141} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9137255, g: 0.9137255, b: 0.9137255, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 38% +--- !u!1 &7733160073940175143 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3350000074041389514} + - component: {fileID: 5400967395172429169} + - component: {fileID: 7733160073940175140} + m_Layer: 5 + m_Name: Logs + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3350000074041389514 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175143} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1295875036366435857} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.02, y: 0.7} + m_AnchorMax: {x: 0.98, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5400967395172429169 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175143} + m_CullTransparentMesh: 0 +--- !u!114 &7733160073940175140 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175143} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6431373, g: 0.6431373, b: 0.6431373, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Logs here +--- !u!1 &7733160073940175165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7252714744354080693} + - component: {fileID: 5424311926268040417} + - component: {fileID: 7733160073940175162} + m_Layer: 5 + m_Name: ProgressBarInner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7252714744354080693 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175165} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1283423682327801047} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5424311926268040417 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175165} + m_CullTransparentMesh: 0 +--- !u!114 &7733160073940175162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175165} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5019608, g: 0.2, b: 0.15294118, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!1 &7733160073940175166 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1283423682327801047} + - component: {fileID: 5869884500957062232} + - component: {fileID: 1295875035295068219} + - component: {fileID: 7733160073940175164} + m_Layer: 5 + m_Name: ProgressBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1283423682327801047 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175166} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 7252714744354080693} + m_Father: {fileID: 1295875036366435857} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.31520715} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5869884500957062232 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175166} + m_CullTransparentMesh: 0 +--- !u!114 &1295875035295068219 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5eb1a4d80b297d9409285b5bb649ae7b, type: 3} + m_Name: + m_EditorClassIdentifier: + InnerProgressBar: {fileID: 7252714744354080693} + Progress: 0 +--- !u!114 &7733160073940175164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7733160073940175166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/InfoSection.prefab.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/InfoSection.prefab.meta new file mode 100644 index 0000000..f36c64c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/InfoSection.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d3bc67d7be55e3641ab9d760158dbaa1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/OpenOptionsButton.prefab b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/OpenOptionsButton.prefab new file mode 100644 index 0000000..5da3cd3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/OpenOptionsButton.prefab @@ -0,0 +1,126 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7285532898085601760 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7285532898085601761} + - component: {fileID: 7285532898085601764} + - component: {fileID: 7285532898085601763} + - component: {fileID: 7285532898085601762} + m_Layer: 5 + m_Name: OpenOptionsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7285532898085601761 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7285532898085601760} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.025867304, y: 0.8884895} + m_AnchorMax: {x: 0.0711327, y: 0.96700007} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7285532898085601764 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7285532898085601760} + m_CullTransparentMesh: 0 +--- !u!114 &7285532898085601763 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7285532898085601760} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.4245283, g: 0.4245283, b: 0.4245283, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 9e937721f17cc7247bb05c33aedd7c12, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &7285532898085601762 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7285532898085601760} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 7285532898085601763} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_MethodName: OpenOptions + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/OpenOptionsButton.prefab.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/OpenOptionsButton.prefab.meta new file mode 100644 index 0000000..bc6f9b9 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/OpenOptionsButton.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e7e9cecf3346de54eaf807fbe6724a3e +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Options.prefab b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Options.prefab new file mode 100644 index 0000000..3ec284b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Options.prefab @@ -0,0 +1,529 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1768244043319828345 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768244043319828346} + - component: {fileID: 1768244043319828325} + - component: {fileID: 1768244043319828324} + - component: {fileID: 1768244043319828347} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1768244043319828346 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043319828345} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1768244043511495786} + m_Father: {fileID: 1768244043452718609} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.82689285, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1768244043319828325 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043319828345} + m_CullTransparentMesh: 0 +--- !u!114 &1768244043319828324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043319828345} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.5019608, g: 0.2, b: 0.15294118, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &1768244043319828347 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043319828345} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1768244043319828324} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_MethodName: GenerateDebugReport + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1768244043417327898 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768244043417327899} + - component: {fileID: 1768244043417327877} + - component: {fileID: 1768244043417327876} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1768244043417327899 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043417327898} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1768244043452718609} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.82689285, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1768244043417327877 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043417327898} + m_CullTransparentMesh: 0 +--- !u!114 &1768244043417327876 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043417327898} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8867924, g: 0.8867924, b: 0.8867924, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Generate a debug report to help with the troubleshooting of issues. +--- !u!1 &1768244043452718608 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768244043452718609} + m_Layer: 5 + m_Name: Option + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1768244043452718609 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043452718608} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1768244043417327899} + - {fileID: 1768244043319828346} + m_Father: {fileID: 5608193023077120176} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.090132706, y: 0.7374472} + m_AnchorMax: {x: 0.9142039, y: 0.855} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1768244043511495785 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768244043511495786} + - component: {fileID: 1768244043511495764} + - component: {fileID: 1768244043511495787} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1768244043511495786 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043511495785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1768244043319828346} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1768244043511495764 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043511495785} + m_CullTransparentMesh: 0 +--- !u!114 &1768244043511495787 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043511495785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8962264, g: 0.8962264, b: 0.8962264, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: GENERATE +--- !u!1 &1768244043584248284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768244043584248285} + - component: {fileID: 1768244043584248280} + - component: {fileID: 1768244043584248287} + - component: {fileID: 1768244043584248286} + m_Layer: 5 + m_Name: CloseOptionsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1768244043584248285 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043584248284} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5608193023077120176} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.024734609, y: 0.88516915} + m_AnchorMax: {x: 0.0743981, y: 0.9664228} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1768244043584248280 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043584248284} + m_CullTransparentMesh: 0 +--- !u!114 &1768244043584248287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043584248284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 18eac3492b6d0544993f9dadac8a67db, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &1768244043584248286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768244043584248284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1768244043584248287} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 5608193023077120188} + m_MethodName: CloseOptions + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &5608193023077120179 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5608193023077120176} + - component: {fileID: 5608193023077120190} + - component: {fileID: 5608193023077120177} + - component: {fileID: 5608193023077120188} + m_Layer: 5 + m_Name: Options + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5608193023077120176 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5608193023077120179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1768244043584248285} + - {fileID: 1768244043452718609} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5608193023077120190 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5608193023077120179} + m_CullTransparentMesh: 0 +--- !u!114 &5608193023077120177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5608193023077120179} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.9254902} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!114 &5608193023077120188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5608193023077120179} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed55f3b98d344f95a0bb314cbff1fb16, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Options.prefab.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Options.prefab.meta new file mode 100644 index 0000000..00621bb --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Prefabs/Options.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6b73aca0282ba4d45ba9d9096b5c93f5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources.meta new file mode 100644 index 0000000..7336d02 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a5892536127d2b04d9211467836159b5 +folderAsset: yes +timeCreated: 1498599430 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images.meta new file mode 100644 index 0000000..836881b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ab598bd6ba7976647a20cb332472282f +folderAsset: yes +timeCreated: 1495587664 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/logo.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/logo.png new file mode 100644 index 0000000..2fa5eff Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/logo.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/logo.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/logo.png.meta new file mode 100644 index 0000000..5ac801f --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/logo.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: bed45c7d4326f6b4da3400538798b569 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/mhlab_logo.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/mhlab_logo.png new file mode 100644 index 0000000..fa9c898 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/mhlab_logo.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/mhlab_logo.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/mhlab_logo.png.meta new file mode 100644 index 0000000..9a8904a --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/Images/mhlab_logo.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 1b18d97d7f8d08a4eb78757e30d1ac53 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchDarkGUISkin.guiskin b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchDarkGUISkin.guiskin new file mode 100644 index 0000000..af580b6 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchDarkGUISkin.guiskin @@ -0,0 +1,1428 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PatchDarkGUISkin + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 5f6ec36a3d5d4604880d7823e4847ffb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 14 + m_Right: 0 + m_Top: 14 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 1, g: 1, b: 1, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 1, g: 0.38403907, b: 0, a: 0.7} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchDarkGUISkin.guiskin.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchDarkGUISkin.guiskin.meta new file mode 100644 index 0000000..b7ad83d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchDarkGUISkin.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff7551007ce631f4f9050d726f4ea9a2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchMainGUISkin.guiskin b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchMainGUISkin.guiskin new file mode 100644 index 0000000..b2e4d59 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchMainGUISkin.guiskin @@ -0,0 +1,1428 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PatchMainGUISkin + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2800000, guid: 5f6ec36a3d5d4604880d7823e4847ffb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 5f6ec36a3d5d4604880d7823e4847ffb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.90196085, g: 0.90196085, b: 0.90196085, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 14 + m_Right: 0 + m_Top: 14 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 1, g: 1, b: 1, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 1, g: 0.38403907, b: 0, a: 0.7} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchMainGUISkin.guiskin.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchMainGUISkin.guiskin.meta new file mode 100644 index 0000000..49999dd --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchMainGUISkin.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a15d910eca00a2b4dafd5a143eb7204d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchPopupGUISkin.guiskin b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchPopupGUISkin.guiskin new file mode 100644 index 0000000..945b541 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchPopupGUISkin.guiskin @@ -0,0 +1,1428 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PatchPopupGUISkin + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2800000, guid: 350ed4910ac26aa458a0c68c2826b618, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 5f6ec36a3d5d4604880d7823e4847ffb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 14 + m_Right: 0 + m_Top: 14 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 1, g: 1, b: 1, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 1, g: 0.38403907, b: 0, a: 0.7} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchPopupGUISkin.guiskin.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchPopupGUISkin.guiskin.meta new file mode 100644 index 0000000..bf7fbce --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchPopupGUISkin.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5f288d322666f046a3798eb46fe874a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchSecondaryGUISkin.guiskin b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchSecondaryGUISkin.guiskin new file mode 100644 index 0000000..dd28a9a --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchSecondaryGUISkin.guiskin @@ -0,0 +1,1428 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PatchSecondaryGUISkin + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2800000, guid: bacc441943c3ce9498dee621cd6c86bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 5f6ec36a3d5d4604880d7823e4847ffb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: cffbc02df5e02004b83fa673f9bcacd5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 14 + m_Right: 0 + m_Top: 14 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 10 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: e7569a8f0d457a142aa49f29a470cbee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 1, g: 1, b: 1, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 1, g: 0.38403907, b: 0, a: 0.7} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchSecondaryGUISkin.guiskin.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchSecondaryGUISkin.guiskin.meta new file mode 100644 index 0000000..bed178b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/PatchSecondaryGUISkin.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e7c10a90729ddb4b84b532d7d1d9a09 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/black.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/black.png new file mode 100644 index 0000000..1158583 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/black.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/black.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/black.png.meta new file mode 100644 index 0000000..0c6380b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/black.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: e7569a8f0d457a142aa49f29a470cbee +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 6 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/main_color.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/main_color.png new file mode 100644 index 0000000..b5247d1 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/main_color.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/main_color.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/main_color.png.meta new file mode 100644 index 0000000..71801ff --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/main_color.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 5f6ec36a3d5d4604880d7823e4847ffb +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 6 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/on_focus.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/on_focus.png new file mode 100644 index 0000000..196cd16 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/on_focus.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/on_focus.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/on_focus.png.meta new file mode 100644 index 0000000..89ae782 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/on_focus.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: cffbc02df5e02004b83fa673f9bcacd5 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 6 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/popup_backdrop.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/popup_backdrop.png new file mode 100644 index 0000000..798900f Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/popup_backdrop.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/popup_backdrop.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/popup_backdrop.png.meta new file mode 100644 index 0000000..d9dc3c5 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/popup_backdrop.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 350ed4910ac26aa458a0c68c2826b618 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 6 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/secondary_color.png b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/secondary_color.png new file mode 100644 index 0000000..0233896 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/secondary_color.png differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/secondary_color.png.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/secondary_color.png.meta new file mode 100644 index 0000000..ca543bd --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Resources/secondary_color.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: bacc441943c3ce9498dee621cd6c86bb +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 6 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes.meta new file mode 100644 index 0000000..69a83c3 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 30ac62cc41b4de5428418212e71f10bb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity new file mode 100644 index 0000000..64f958d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity @@ -0,0 +1,1607 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 512 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &30337966 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 30337967} + - component: {fileID: 30337969} + - component: {fileID: 30337968} + m_Layer: 5 + m_Name: Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &30337967 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 30337966} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 244576353} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.2, y: 0.39666668} + m_AnchorMax: {x: 0.80200005, y: 0.8} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &30337968 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 30337966} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: bed45c7d4326f6b4da3400538798b569, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &30337969 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 30337966} + m_CullTransparentMesh: 0 +--- !u!1 &101162735 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 101162736} + - component: {fileID: 1257051039} + m_Layer: 0 + m_Name: LauncherData + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &101162736 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101162735} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &244576349 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 244576353} + - component: {fileID: 244576352} + - component: {fileID: 244576351} + - component: {fileID: 244576350} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &244576350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244576349} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &244576351 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244576349} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &244576352 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244576349} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &244576353 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244576349} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1618093373} + - {fileID: 1188532784} + - {fileID: 30337967} + - {fileID: 1504680957} + - {fileID: 984727039} + - {fileID: 2140772753} + - {fileID: 1152861206} + - {fileID: 6151456678300401028} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &492959807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 492959809} + - component: {fileID: 492959808} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &492959808 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492959807} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &492959809 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492959807} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!224 &984727039 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} +--- !u!224 &1152861206 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + m_PrefabInstance: {fileID: 6893855097800883417} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1188532783 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1188532784} + - component: {fileID: 1188532786} + - component: {fileID: 1188532785} + m_Layer: 5 + m_Name: Background (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1188532784 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188532783} + m_LocalRotation: {x: -0, y: -0, z: 0.07873184, w: -0.99689585} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 244576353} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -9.031} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -30.324951, y: -4.799988} + m_SizeDelta: {x: 60.65005, y: 109.55} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1188532785 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188532783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.1882353, g: 0.1882353, b: 0.1882353, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1188532786 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188532783} + m_CullTransparentMesh: 0 +--- !u!114 &1257051039 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101162735} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 41e0c81bd484498eaa6f04bb77af227d, type: 3} + m_Name: + m_EditorClassIdentifier: + RemoteUrl: http://localhost/patch + LauncherExecutableName: PatchTestPatch.exe + GameExecutableName: PatchTest.exe + LaunchAnywayOnError: 0 + Dispatcher: {fileID: 1654408391} + ProgressBar: {fileID: 1700035541} + DownloadSpeed: {fileID: 8838995311128691409} + ProgressPercentage: {fileID: 8838995311128691404} + Logs: {fileID: 8838995311128691402} + ElapsedTime: {fileID: 8838995311128691406} + Dialog: {fileID: 6893855097800883418} + SizeProgress: {fileID: 1295875036994554863} +--- !u!1 &1433036427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1433036429} + - component: {fileID: 1433036428} + m_Layer: 0 + m_Name: Launcher + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1433036428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1433036427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5c2b193deeef4689a7b7ed5282f5e4c4, type: 3} + m_Name: + m_EditorClassIdentifier: + Data: {fileID: 1257051039} +--- !u!4 &1433036429 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1433036427} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1504680956 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1504680957} + - component: {fileID: 1504680959} + - component: {fileID: 1504680958} + m_Layer: 5 + m_Name: CompanyLogo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1504680957 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1504680956} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 244576353} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.8821327, y: 0.8976011} + m_AnchorMax: {x: 0.98613274, y: 0.98045874} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1504680958 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1504680956} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 1b18d97d7f8d08a4eb78757e30d1ac53, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1504680959 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1504680956} + m_CullTransparentMesh: 0 +--- !u!1 &1618093372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1618093373} + - component: {fileID: 1618093375} + - component: {fileID: 1618093374} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1618093373 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618093372} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 244576353} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1618093374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618093372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.21568628, g: 0.21568628, b: 0.21568628, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1618093375 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618093372} + m_CullTransparentMesh: 0 +--- !u!114 &1654408391 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 8958825008603355778, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + m_PrefabInstance: {fileID: 8958825009098006085} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51eba96383bf4c9ea700d55c421c1ce8, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1659317948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1659317951} + - component: {fileID: 1659317950} + - component: {fileID: 1659317949} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1659317949 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659317948} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1659317950 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659317948} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1659317951 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659317948} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1690121964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1690121967} + - component: {fileID: 1690121966} + - component: {fileID: 1690121965} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1690121965 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1690121964} + m_Enabled: 1 +--- !u!20 &1690121966 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1690121964} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1690121967 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1690121964} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1700035541 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 1295875035295068219, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5eb1a4d80b297d9409285b5bb649ae7b, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &2140772753 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + m_PrefabInstance: {fileID: 7285532900039661680} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1295875036994554862 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 244576353} + m_Modifications: + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.35 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6286318120376159818, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_Name + value: InfoSection + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: d3bc67d7be55e3641ab9d760158dbaa1, type: 3} +--- !u!114 &1295875036994554863 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 6647468504519189179, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &1768244042763158836 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 244576353} + m_Modifications: + - target: {fileID: 1768244043319828346, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.21801758 + objectReference: {fileID: 0} + - target: {fileID: 1768244043319828346, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0.099998474 + objectReference: {fileID: 0} + - target: {fileID: 1768244043319828347, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1433036428} + - target: {fileID: 1768244043417327899, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.20465088 + objectReference: {fileID: 0} + - target: {fileID: 1768244043452718609, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 1.7000122 + objectReference: {fileID: 0} + - target: {fileID: 1768244043452718609, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -1.8780212 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120179, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_Name + value: Options + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120179, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, type: 3} +--- !u!224 &6151456678300401028 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + m_PrefabInstance: {fileID: 1768244042763158836} + m_PrefabAsset: {fileID: 0} +--- !u!114 &6151456678300401032 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5608193023077120188, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + m_PrefabInstance: {fileID: 1768244042763158836} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed55f3b98d344f95a0bb314cbff1fb16, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &6893855097800883417 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 244576353} + m_Modifications: + - target: {fileID: 6893855097483646680, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 6893855097483646680, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -23.699997 + objectReference: {fileID: 0} + - target: {fileID: 6893855097671372751, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380236, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_Name + value: Dialog + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380236, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098912965455, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -14.875946 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c986e1974f10e59479942a8a386ba786, type: 3} +--- !u!114 &6893855097800883418 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4186148103158800825, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + m_PrefabInstance: {fileID: 6893855097800883417} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 84c300a775c74286ac59ccdd38282212, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &7285532900039661680 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 244576353} + m_Modifications: + - target: {fileID: 7285532898085601760, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_Name + value: OpenOptionsButton + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.0711327 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.96700007 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.025867304 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.8884895 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601762, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 6151456678300401032} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: e7e9cecf3346de54eaf807fbe6724a3e, type: 3} +--- !u!114 &8838995311128691402 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175140, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &8838995311128691404 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175138, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &8838995311128691406 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175136, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &8838995311128691409 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175167, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 1295875036994554862} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &8958825009098006085 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 8958825008603355779, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_Name + value: Dispatcher + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9fd7d8275f834ca46b9815b96a3d38e1, type: 3} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity.meta new file mode 100644 index 0000000..66e3f25 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 62bbf456ac1f00d47a1374cb8f720350 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/PreGame.unity b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/PreGame.unity new file mode 100644 index 0000000..1da6650 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/PreGame.unity @@ -0,0 +1,1499 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!114 &245386805 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1064955501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 41e0c81bd484498eaa6f04bb77af227d, type: 3} + m_Name: + m_EditorClassIdentifier: + RemoteUrl: http://localhost/patch + LauncherExecutableName: MHLab.Patch.exe + GameExecutableName: YourGame.exe + LaunchAnywayOnError: 0 + Dispatcher: {fileID: 1744635116} + ProgressBar: {fileID: 2071246689} + DownloadSpeed: {fileID: 2071246688} + ProgressPercentage: {fileID: 2071246687} + Logs: {fileID: 2071246686} + ElapsedTime: {fileID: 2071246685} + Dialog: {fileID: 1020542263} + SizeProgress: {fileID: 2071246690} +--- !u!1 &445368266 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 445368267} + - component: {fileID: 445368269} + - component: {fileID: 445368268} + m_Layer: 5 + m_Name: Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &445368267 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 445368266} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1050413322} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -4.8, y: 65.1} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &445368268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 445368266} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8784314, g: 0.8784314, b: 0.8784314, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: YOURGAME +--- !u!222 &445368269 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 445368266} + m_CullTransparentMesh: 0 +--- !u!1001 &740630649 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1050413322} + m_Modifications: + - target: {fileID: 7285532898085601760, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_Name + value: OpenOptionsButton + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.025867304 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.8884895 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.0711327 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.96700007 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7285532898085601762, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1811189257} + - target: {fileID: 7285532898085601762, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OpenOptions + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: e7e9cecf3346de54eaf807fbe6724a3e, type: 3} +--- !u!224 &740630650 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7285532898085601761, guid: e7e9cecf3346de54eaf807fbe6724a3e, + type: 3} + m_PrefabInstance: {fileID: 740630649} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1020542262 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1050413322} + m_Modifications: + - target: {fileID: 6893855097483646680, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855097671372751, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380236, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_Name + value: Dialog + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380236, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c986e1974f10e59479942a8a386ba786, type: 3} +--- !u!114 &1020542263 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4186148103158800825, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + m_PrefabInstance: {fileID: 1020542262} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 84c300a775c74286ac59ccdd38282212, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &1020542264 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6893855098814380239, guid: c986e1974f10e59479942a8a386ba786, + type: 3} + m_PrefabInstance: {fileID: 1020542262} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1050413318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1050413322} + - component: {fileID: 1050413321} + - component: {fileID: 1050413320} + - component: {fileID: 1050413319} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1050413319 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050413318} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1050413320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050413318} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1050413321 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050413318} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1050413322 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050413318} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1968639759} + - {fileID: 445368267} + - {fileID: 1361441804} + - {fileID: 2071246684} + - {fileID: 740630650} + - {fileID: 1020542264} + - {fileID: 1811189256} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1064955501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1064955502} + - component: {fileID: 245386805} + m_Layer: 0 + m_Name: LauncherData + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1064955502 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1064955501} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1314225635 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1314225637} + - component: {fileID: 1314225636} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1314225636 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314225635} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1314225637 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314225635} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1361441803 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1361441804} + - component: {fileID: 1361441806} + - component: {fileID: 1361441805} + m_Layer: 5 + m_Name: Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1361441804 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361441803} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1050413322} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -4.800003, y: 25.210022} + m_SizeDelta: {x: 160, y: 49.78} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1361441805 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361441803} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8784314, g: 0.8784314, b: 0.8784314, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 41 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 41 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: LOGO +--- !u!222 &1361441806 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361441803} + m_CullTransparentMesh: 0 +--- !u!1 &1493466157 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1493466160} + - component: {fileID: 1493466159} + - component: {fileID: 1493466158} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1493466158 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493466157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1493466159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493466157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1493466160 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493466157} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1744635115 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 8958825008603355779, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_Name + value: Dispatcher + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8958825008603355789, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9fd7d8275f834ca46b9815b96a3d38e1, type: 3} +--- !u!114 &1744635116 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 8958825008603355778, guid: 9fd7d8275f834ca46b9815b96a3d38e1, + type: 3} + m_PrefabInstance: {fileID: 1744635115} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51eba96383bf4c9ea700d55c421c1ce8, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &1811189255 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1050413322} + m_Modifications: + - target: {fileID: 1768244043319828346, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.21798706 + objectReference: {fileID: 0} + - target: {fileID: 1768244043319828346, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0.099998474 + objectReference: {fileID: 0} + - target: {fileID: 1768244043319828347, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1883558648} + - target: {fileID: 1768244043319828347, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: GenerateDebugReport + objectReference: {fileID: 0} + - target: {fileID: 1768244043417327899, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.20465088 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120179, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_Name + value: Options + objectReference: {fileID: 0} + - target: {fileID: 5608193023077120179, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, type: 3} +--- !u!224 &1811189256 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5608193023077120176, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + m_PrefabInstance: {fileID: 1811189255} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1811189257 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5608193023077120188, guid: 6b73aca0282ba4d45ba9d9096b5c93f5, + type: 3} + m_PrefabInstance: {fileID: 1811189255} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed55f3b98d344f95a0bb314cbff1fb16, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1883558646 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1883558647} + - component: {fileID: 1883558648} + m_Layer: 0 + m_Name: LauncherUpdater + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1883558647 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883558646} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1883558648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883558646} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b1341d01b3e245e687df84b294a9aeb4, type: 3} + m_Name: + m_EditorClassIdentifier: + Data: {fileID: 245386805} + SceneToLoad: 1 +--- !u!1 &1961734160 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1961734163} + - component: {fileID: 1961734162} + - component: {fileID: 1961734161} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1961734161 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961734160} + m_Enabled: 1 +--- !u!20 &1961734162 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961734160} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1961734163 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961734160} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1968639758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1968639759} + - component: {fileID: 1968639761} + - component: {fileID: 1968639760} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1968639759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1968639758} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1050413322} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1968639760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1968639758} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.21568628, g: 0.21568628, b: 0.21568628, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!222 &1968639761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1968639758} + m_CullTransparentMesh: 0 +--- !u!1001 &2071246683 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1050413322} + m_Modifications: + - target: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548342, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_Name + value: InfoSection + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.35 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 8838995311773548343, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: d3bc67d7be55e3641ab9d760158dbaa1, type: 3} +--- !u!224 &2071246684 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1295875036366435857, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2071246685 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175136, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2071246686 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175140, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2071246687 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175138, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2071246688 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7733160073940175167, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2071246689 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 1295875035295068219, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5eb1a4d80b297d9409285b5bb649ae7b, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2071246690 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 6647468504519189179, guid: d3bc67d7be55e3641ab9d760158dbaa1, + type: 3} + m_PrefabInstance: {fileID: 2071246683} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/PreGame.unity.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/PreGame.unity.meta new file mode 100644 index 0000000..49c6d40 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/PreGame.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 98697cd740c1eb148b123f3c1128479b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/SampleGame.unity b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/SampleGame.unity new file mode 100644 index 0000000..c285f93 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/SampleGame.unity @@ -0,0 +1,580 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &428805460 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 428805461} + - component: {fileID: 428805463} + - component: {fileID: 428805462} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &428805461 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 428805460} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1033106030} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -245.37, y: -178.13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &428805462 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 428805460} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8666667, g: 0.8666667, b: 0.8666667, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 31 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: HERE IS YOUR GAME SAMPLE +--- !u!222 &428805463 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 428805460} + m_CullTransparentMesh: 0 +--- !u!1 &1033106026 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1033106030} + - component: {fileID: 1033106029} + - component: {fileID: 1033106028} + - component: {fileID: 1033106027} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1033106027 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033106026} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1033106028 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033106026} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1033106029 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033106026} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1033106030 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033106026} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1794165007} + - {fileID: 428805461} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1557022330 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1557022333} + - component: {fileID: 1557022332} + - component: {fileID: 1557022331} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1557022331 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557022330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1557022332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557022330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1557022333 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557022330} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1568528966 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1568528968} + - component: {fileID: 1568528967} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1568528967 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568528966} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1568528968 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568528966} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1794165006 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1794165007} + - component: {fileID: 1794165009} + - component: {fileID: 1794165008} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1794165007 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1794165006} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1033106030} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1794165008 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1794165006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.16862746, g: 0.16862746, b: 0.16862746, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 +--- !u!222 &1794165009 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1794165006} + m_CullTransparentMesh: 0 +--- !u!1 &2074282481 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2074282484} + - component: {fileID: 2074282483} + - component: {fileID: 2074282482} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2074282482 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2074282481} + m_Enabled: 1 +--- !u!20 &2074282483 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2074282481} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &2074282484 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2074282481} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/SampleGame.unity.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/SampleGame.unity.meta new file mode 100644 index 0000000..156f089 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scenes/SampleGame.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2d231d506b60ca0419713c385506ca74 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts.meta new file mode 100644 index 0000000..abe96a8 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1bef147b122fbef46b4d96cb0c1dda6f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Dispatcher.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Dispatcher.cs new file mode 100644 index 0000000..22b1043 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Dispatcher.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace MHLab.Patch.Launcher.Scripts +{ + public sealed class Dispatcher : MonoBehaviour + { + private readonly Queue _actions = new Queue(); + + public void Invoke(Action action) + { + lock (_actions) + { + _actions.Enqueue(action); + } + } + + private void Update() + { + lock (_actions) + { + while (_actions.Count > 0) + { + var action = _actions.Dequeue(); + action.Invoke(); + } + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Dispatcher.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Dispatcher.cs.meta new file mode 100644 index 0000000..a08737b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Dispatcher.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 51eba96383bf4c9ea700d55c421c1ce8 +timeCreated: 1586132979 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Launcher.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Launcher.cs new file mode 100644 index 0000000..d684c4c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Launcher.cs @@ -0,0 +1,193 @@ +using System; +using System.IO; +using MHLab.Patch.Core; +using MHLab.Patch.Core.Client; +using MHLab.Patch.Core.Client.IO; +using MHLab.Patch.Core.IO; +using MHLab.Patch.Launcher.Scripts.Utilities; +using UnityEngine; + +namespace MHLab.Patch.Launcher.Scripts +{ + public sealed class Launcher : LauncherBase + { + private Repairer _repairer; + private Updater _updater; + + protected override void Initialize(UpdatingContext context) + { + context.OverrideSettings((originalSettings, settingsOverride) => + { + originalSettings.DebugMode = settingsOverride.DebugMode; + originalSettings.PatcherUpdaterSafeMode = settingsOverride.PatcherUpdaterSafeMode; + }); + + NetworkChecker = new NetworkChecker(); + + _repairer = new Repairer(context); + _repairer.Downloader.DownloadComplete += Data.DownloadComplete; + + _updater = new Updater(context); + _updater.Downloader.DownloadComplete += Data.DownloadComplete; + + context.RegisterUpdateStep(_repairer); + context.RegisterUpdateStep(_updater); + + context.Runner.PerformedStep += (sender, updater) => + { + if (context.IsDirty(out var reasons, out var data)) + { + var stringReasons = ""; + + foreach (var reason in reasons) + { + stringReasons += $"{reason}, "; + } + + stringReasons = stringReasons.Substring(0, stringReasons.Length - 2); + context.Logger.Debug($"Context is set to dirty: updater restart required. The files {stringReasons} have been replaced."); + + if (data.Count > 0) + { + if (data[0] is UpdaterSafeModeDefinition) + { + var definition = (UpdaterSafeModeDefinition) data[0]; + UpdateRestartNeeded(definition.ExecutableToRun); + return; + } + } + + UpdateRestartNeeded(); + } + }; + } + + protected override string UpdateProcessName => "Game updating"; + + protected override void OverrideSettings(ILauncherSettings settings) + { + string rootPath = string.Empty; + +#if UNITY_EDITOR + rootPath = Path.Combine(Path.GetDirectoryName(Application.dataPath), LauncherData.WorkspaceFolderName, "TestLauncher"); + Directory.CreateDirectory(rootPath); +#elif UNITY_STANDALONE_WIN + rootPath = Directory.GetParent(Application.dataPath).FullName; +#elif UNITY_STANDALONE_LINUX + rootPath = Directory.GetParent(Application.dataPath).FullName; +#elif UNITY_STANDALONE_OSX + rootPath = Directory.GetParent(Directory.GetParent(Application.dataPath).FullName).FullName; +#endif + + settings.RootPath = FilesManager.SanitizePath(rootPath); + } + + protected override void UpdateStarted() + { + Data.StartTimer(UpdateDownloadSpeed); + } + + protected override void UpdateDownloadSpeed() + { + _repairer.Downloader.DownloadSpeedMeter.Tick(); + _updater.Downloader.DownloadSpeedMeter.Tick(); + + if (_repairer.Downloader.DownloadSpeedMeter.DownloadSpeed > 0) + { + Data.DownloadSpeed.text = _repairer.Downloader.DownloadSpeedMeter.FormattedDownloadSpeed; + } + else if (_updater.Downloader.DownloadSpeedMeter.DownloadSpeed > 0) + { + Data.DownloadSpeed.text = _updater.Downloader.DownloadSpeedMeter.FormattedDownloadSpeed; + } + else + { + Data.DownloadSpeed.text = string.Empty; + } + } + + protected override void UpdateCompleted() + { + Data.Log(Context.LocalizedMessages.UpdateProcessCompleted); + Context.Logger.Info($"===> [{UpdateProcessName}] process COMPLETED! <==="); + + Data.Dispatcher.Invoke(() => + { + Data.ProgressBar.Progress = 1; + Data.ProgressPercentage.text = "100%"; + }); + + EnsureExecutePrivileges(PathsManager.Combine(Context.Settings.GetGamePath(), Data.GameExecutableName)); + EnsureExecutePrivileges(PathsManager.Combine(Context.Settings.RootPath, Data.LauncherExecutableName)); + + Data.Dispatcher.Invoke(() => + { + Invoke(nameof(StartGame), 1.5f); + }); + } + + protected override void UpdateFailed(Exception e) + { + Data.Log(Context.LocalizedMessages.UpdateProcessFailed); + Context.Logger.Error(e, $"===> [{UpdateProcessName}] process FAILED! <=== - {e.Message} - {e.StackTrace}"); + + if (Data.LaunchAnywayOnError) + { + StartGame(); + } + } + + protected override void UpdateRestartNeeded(string executableName = "") + { + Data.Log(Context.LocalizedMessages.UpdateRestartNeeded); + Context.Logger.Info($"===> [{UpdateProcessName}] process INCOMPLETE: restart is needed! <==="); + + string filePath; + + if (!string.IsNullOrWhiteSpace(executableName)) + { + filePath = PathsManager.Combine(Context.Settings.RootPath, executableName); + } + else + { + filePath = PathsManager.Combine(Context.Settings.RootPath, Data.LauncherExecutableName); + } + + try + { + ApplicationStarter.StartApplication( + Path.Combine(Context.Settings.RootPath, Data.LauncherExecutableName), ""); + + Data.Dispatcher.Invoke(Application.Quit); + } + catch (Exception ex) + { + Context.Logger.Error(null, $"Unable to start the Launcher at {filePath}."); + UpdateFailed(ex); + } + } + + protected override void StartApp() + { + StartGame(); + } + + private void StartGame() + { + var filePath = PathsManager.Combine(Context.Settings.GetGamePath(), Data.GameExecutableName); + ApplicationStarter.StartApplication(filePath, $"{Context.Settings.LaunchArgumentParameter}={Context.Settings.LaunchArgumentValue}"); + Application.Quit(); + } + + public void GenerateDebugReport() + { + GenerateDebugReport("debug_report_launcher.txt"); + } + + private void OnDestroy() + { + _repairer.Downloader.Cancel(); + Debug.Log("Download canceled"); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Launcher.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Launcher.cs.meta new file mode 100644 index 0000000..969dc72 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Launcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c2b193deeef4689a7b7ed5282f5e4c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherBase.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherBase.cs new file mode 100644 index 0000000..19a7f80 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherBase.cs @@ -0,0 +1,204 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using MHLab.Patch.Core.Client; +using MHLab.Patch.Core.Client.IO; +using MHLab.Patch.Core.IO; +using MHLab.Patch.Core.Utilities; +using MHLab.Patch.Launcher.Scripts.Localization; +using MHLab.Patch.Launcher.Scripts.Utilities; +using MHLab.Patch.Utilities; +using MHLab.Patch.Utilities.Serializing; +using UnityEngine; + +namespace MHLab.Patch.Launcher.Scripts +{ + public abstract class LauncherBase : MonoBehaviour + { + public LauncherData Data; + + protected UpdatingContext Context; + protected INetworkChecker NetworkChecker; + protected abstract string UpdateProcessName { get; } + + private ILauncherSettings CreateSettings() + { + var settings = new LauncherSettings(); + settings.RemoteUrl = Data.RemoteUrl; + settings.PatchDownloadAttempts = 3; + settings.AppDataPath = Application.persistentDataPath; + +#if DEBUG + settings.DebugMode = true; +#else + settings.DebugMode = false; +#endif + + OverrideSettings(settings); + + return settings; + } + + protected abstract void OverrideSettings(ILauncherSettings settings); + + protected UpdatingContext CreateContext(ILauncherSettings settings) + { + var progress = new ProgressReporter(); + progress.ProgressChanged.AddListener(Data.UpdateProgressChanged); + + var context = new UpdatingContext(settings, progress); + context.Logger = new MHLab.Patch.Utilities.Logging.Logger(settings.GetLogsFilePath(), settings.DebugMode); + context.Serializer = new NewtonsoftSerializer(); + context.LocalizedMessages = new EnglishUpdaterLocalizedMessages(); + + return context; + } + + private void Initialize(ILauncherSettings settings) + { + Context = CreateContext(settings); + + Initialize(Context); + } + + protected abstract void Initialize(UpdatingContext context); + + protected void GenerateDebugReport(string path) + { + var system = DebugHelper.GetSystemInfo(); + var report = Debugger.GenerateDebugReport(Context.Settings, system, new NewtonsoftSerializer()); + + File.WriteAllText(path, report); + } + + private void Awake() + { + Initialize(CreateSettings()); + Data.ResetComponents(); + } + + private void Start() + { + if (FilesManager.IsDirectoryWritable(Context.Settings.GetLogsDirectoryPath())) + { + StartUpdateProcess(); + } + else + { + Data.Log(Context.LocalizedMessages.LogsFileNotWritable); + Context.Logger.Error(null, "Updating process FAILED! The Launcher has not enough privileges to write into its folder!"); + + if (Data.LaunchAnywayOnError) + { + Data.Dialog.ShowDialog(Context.LocalizedMessages.LogsFileNotWritable, + Context.Settings.GetLogsFilePath(), + Application.Quit, + StartUpdateProcess); + } + else + { + StartApp(); + } + } + } + + private void StartUpdateProcess() + { + try + { + Context.Logger.Info($"===> [{UpdateProcessName}] process STARTED! <==="); + + if (!NetworkChecker.IsNetworkAvailable()) + { + Data.Log(Context.LocalizedMessages.NotAvailableNetwork); + Context.Logger.Error(null, $"[{UpdateProcessName}] process FAILED! Network is not available or connectivity is low/weak... Check your connection!"); + + if (Data.LaunchAnywayOnError) + { + StartApp(); + } + else + { + Data.Dialog.ShowCloseDialog(Context.LocalizedMessages.NotAvailableNetwork, string.Empty, Application.Quit); + } + return; + } + + if (!NetworkChecker.IsRemoteServiceAvailable(Context.Settings.GetRemoteBuildsIndexUrl())) + { + Data.Log(Context.LocalizedMessages.NotAvailableServers); + Context.Logger.Error(null, $"[{UpdateProcessName}] process FAILED! Our servers are not responding... Wait some minutes and retry!"); + + if (Data.LaunchAnywayOnError) + { + StartApp(); + } + else + { + Data.Dialog.ShowCloseDialog(Context.LocalizedMessages.NotAvailableServers, string.Empty, Application.Quit); + } + + return; + } + + Context.Initialize(); + + Task.Run(CheckForUpdates); + } + catch (Exception ex) + { + UpdateFailed(ex); + + if (Data.LaunchAnywayOnError) + { + StartApp(); + } + } + } + + private void CheckForUpdates() + { + UpdateStarted(); + + try + { + Context.Update(); + + UpdateCompleted(); + } + catch (Exception ex) + { + Debug.LogError(ex); + UpdateFailed(ex); + } + finally + { + Data.StopTimer(); + } + } + + protected abstract void UpdateStarted(); + + protected abstract void UpdateCompleted(); + + protected abstract void UpdateFailed(Exception e); + + protected abstract void UpdateRestartNeeded(string executableName = ""); + + protected abstract void UpdateDownloadSpeed(); + + protected abstract void StartApp(); + + protected void EnsureExecutePrivileges(string filePath) + { + try + { + PrivilegesSetter.EnsureExecutePrivileges(filePath); + } + catch (Exception ex) + { + Context.Logger.Error(ex, "Unable to set executing privileges on {FilePath}.", filePath); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherBase.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherBase.cs.meta new file mode 100644 index 0000000..8202724 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1e38b36b56f54b438925928208900f48 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherData.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherData.cs new file mode 100644 index 0000000..87ccada --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherData.cs @@ -0,0 +1,98 @@ +using System; +using System.IO; +using System.Threading; +using MHLab.Patch.Core.Client; +using MHLab.Patch.Core.Client.IO; +using MHLab.Patch.Core.Client.Progresses; +using MHLab.Patch.Core.Utilities; +using MHLab.Patch.Launcher.Scripts.UI; +using UnityEngine; +using UnityEngine.Serialization; +using UnityEngine.UI; + +namespace MHLab.Patch.Launcher.Scripts +{ + public sealed class LauncherData : MonoBehaviour + { + public string RemoteUrl; + public string LauncherExecutableName; + public string GameExecutableName; + + public bool LaunchAnywayOnError; + + public Dispatcher Dispatcher; + public ProgressBar ProgressBar; + public Text DownloadSpeed; + public Text ProgressPercentage; + public Text Logs; + public Text ElapsedTime; + public Dialog Dialog; + public Text SizeProgress; + + public const string WorkspaceFolderName = "PATCHWorkspace"; + + private Timer _timer; + private int _elapsed; + + public void DownloadComplete(object sender, EventArgs e) + { + + } + + public void UpdateProgressChanged(UpdateProgress e) + { + Dispatcher.Invoke(() => + { + var totalSteps = Math.Max(e.TotalSteps, 1); + ProgressBar.Progress = (float) e.CurrentSteps / totalSteps; + + ProgressPercentage.text = (e.CurrentSteps * 100 / totalSteps) + "%"; + + SizeProgress.text = FormatUtility.FormatSizeDecimal(e.CurrentSteps, 2) + "/" + + FormatUtility.FormatSizeDecimal(e.TotalSteps, 2); + }); + + Log(e.StepMessage); + } + + public void Log(string message) + { + Dispatcher.Invoke(() => + { + Logs.text = message; + }); + } + + public void ResetComponents() + { + ProgressPercentage.text = string.Empty; + DownloadSpeed.text = string.Empty; + ElapsedTime.text = string.Empty; + Logs.text = string.Empty; + + ProgressBar.Progress = 0; + } + + public void StartTimer(Action updateDownloadSpeed) + { + _timer = new Timer((state) => + { + _elapsed++; + Dispatcher.Invoke(() => + { + var minutes = _elapsed / 60; + var seconds = _elapsed % 60; + + ElapsedTime.text = string.Format("{0}:{1}", (minutes < 10) ? "0" + minutes : minutes.ToString(), (seconds < 10) ? "0" + seconds : seconds.ToString()); + + updateDownloadSpeed.Invoke(); + }); + }, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); + } + + public void StopTimer() + { + _timer.Dispose(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherData.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherData.cs.meta new file mode 100644 index 0000000..0a788de --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 41e0c81bd484498eaa6f04bb77af227d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherUpdater.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherUpdater.cs new file mode 100644 index 0000000..673057d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherUpdater.cs @@ -0,0 +1,191 @@ +using System; +using System.IO; +using MHLab.Patch.Core; +using MHLab.Patch.Core.Client; +using MHLab.Patch.Core.Client.IO; +using MHLab.Patch.Core.IO; +using MHLab.Patch.Launcher.Scripts.Utilities; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace MHLab.Patch.Launcher.Scripts +{ + public sealed class LauncherUpdater : LauncherBase + { + public int SceneToLoad; + + private PatcherUpdater _patcherUpdater; + + protected override void Initialize(UpdatingContext context) + { + context.OverrideSettings((originalSettings, settingsOverride) => + { + originalSettings.DebugMode = settingsOverride.DebugMode; + originalSettings.PatcherUpdaterSafeMode = settingsOverride.PatcherUpdaterSafeMode; + }); + + NetworkChecker = new NetworkChecker(); + + _patcherUpdater = new PatcherUpdater(context); + _patcherUpdater.Downloader.DownloadComplete += Data.DownloadComplete; + + context.RegisterUpdateStep(_patcherUpdater); + + context.Runner.PerformedStep += (sender, updater) => + { + if (context.IsDirty(out var reasons, out var data)) + { + var stringReasons = ""; + + foreach (var reason in reasons) + { + stringReasons += $"{reason}, "; + } + + stringReasons = stringReasons.Substring(0, stringReasons.Length - 2); + + context.Logger.Debug($"Context is set to dirty: updater restart required. The files {stringReasons} have been replaced."); + + if (data.Count > 0) + { + if (data[0] is UpdaterSafeModeDefinition) + { + var definition = (UpdaterSafeModeDefinition) data[0]; + UpdateRestartNeeded(definition.ExecutableToRun); + return; + } + } + + UpdateRestartNeeded(); + } + }; + } + + protected override string UpdateProcessName => "Launcher updating"; + + protected override void OverrideSettings(ILauncherSettings settings) + { + string rootPath = string.Empty; + +#if UNITY_EDITOR + rootPath = Path.Combine(Path.GetDirectoryName(Application.dataPath), LauncherData.WorkspaceFolderName, "TestLauncher"); + Directory.CreateDirectory(rootPath); +#elif UNITY_STANDALONE_WIN + rootPath = Directory.GetParent(Directory.GetParent(Application.dataPath).FullName).FullName; +#elif UNITY_STANDALONE_LINUX + rootPath = Directory.GetParent(Directory.GetParent(Application.dataPath).FullName).FullName; +#elif UNITY_STANDALONE_OSX + rootPath = Directory.GetParent(Directory.GetParent(Directory.GetParent(Application.dataPath).FullName).FullName).FullName; +#endif + + settings.RootPath = FilesManager.SanitizePath(rootPath); + } + + protected override void UpdateStarted() + { + Data.StartTimer(UpdateDownloadSpeed); + } + + protected override void UpdateDownloadSpeed() + { + _patcherUpdater.Downloader.DownloadSpeedMeter.Tick(); + + if (_patcherUpdater.Downloader.DownloadSpeedMeter.DownloadSpeed > 0) + { + Data.DownloadSpeed.text = _patcherUpdater.Downloader.DownloadSpeedMeter.FormattedDownloadSpeed; + } + else + { + Data.DownloadSpeed.text = string.Empty; + } + } + + protected override void UpdateCompleted() + { + Data.Dispatcher.Invoke(() => + { + Data.ProgressBar.Progress = 1; + Data.ProgressPercentage.text = "100%"; + }); + + var repairer = new Repairer(Context); + var updater = new Updater(Context); + + if (repairer.IsRepairNeeded() || updater.IsUpdateAvailable()) + { + UpdateRestartNeeded(); + return; + } + + Data.Log(Context.LocalizedMessages.UpdateProcessCompleted); + Context.Logger.Info($"===> [{UpdateProcessName}] process COMPLETED! <==="); + StartGameScene(); + } + + protected override void StartApp() + { + StartGameScene(); + } + + private void StartGameScene() + { + Data.Dispatcher.Invoke(() => + { + SceneManager.LoadScene(SceneToLoad); + }); + } + + protected override void UpdateFailed(Exception e) + { + Data.Log(Context.LocalizedMessages.UpdateProcessFailed); + Context.Logger.Error(e, $"===> [{UpdateProcessName}] process FAILED! <=== - {e.Message} - {e.StackTrace}"); + + if (Data.LaunchAnywayOnError) + { + StartGameScene(); + } + } + + protected override void UpdateRestartNeeded(string executableName = "") + { + Data.Log(Context.LocalizedMessages.UpdateRestartNeeded); + Context.Logger.Info($"===> [{UpdateProcessName}] process INCOMPLETE: restart is needed! <==="); + + EnsureExecutePrivileges(PathsManager.Combine(Context.Settings.RootPath, Data.LauncherExecutableName)); + + string filePath; + + if (!string.IsNullOrWhiteSpace(executableName)) + { + filePath = PathsManager.Combine(Context.Settings.RootPath, executableName); + } + else + { + filePath = PathsManager.Combine(Context.Settings.RootPath, Data.LauncherExecutableName); + } + + try + { + ApplicationStarter.StartApplication( + Path.Combine(Context.Settings.RootPath, Data.LauncherExecutableName), ""); + + Data.Dispatcher.Invoke(Application.Quit); + } + catch (Exception ex) + { + Context.Logger.Error(null, $"Unable to start the Launcher at {filePath}."); + UpdateFailed(ex); + } + } + + public void GenerateDebugReport() + { + GenerateDebugReport("debug_report_pregame.txt"); + } + + private void OnDisable() + { + _patcherUpdater.Downloader.Cancel(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherUpdater.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherUpdater.cs.meta new file mode 100644 index 0000000..f27dad8 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/LauncherUpdater.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b1341d01b3e245e687df84b294a9aeb4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization.meta new file mode 100644 index 0000000..18fcf1d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6a7511420ddb43b88fdaa934f5808e50 +timeCreated: 1586132753 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization/EnglishUpdaterLocalizedMessages.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization/EnglishUpdaterLocalizedMessages.cs new file mode 100644 index 0000000..36da77d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization/EnglishUpdaterLocalizedMessages.cs @@ -0,0 +1,27 @@ +using MHLab.Patch.Core.Client.Localization; + +namespace MHLab.Patch.Launcher.Scripts.Localization +{ + public sealed class EnglishUpdaterLocalizedMessages : IUpdaterLocalizedMessages + { + public string UpdateDownloadingArchive => "Downloading patch {0} to {1}..."; + public string UpdateDownloadedArchive => "Downloaded patch archive {0}_{1}."; + public string UpdateDecompressingArchive => "Decompressing patch {0} to {1}..."; + public string UpdateDecompressedArchive => "Decompressed patch {0} to {1}."; + public string UpdateUnchangedFile => "Unchanged file: {0}"; + public string UpdateProcessingNewFile => "Adding new file: {0}"; + public string UpdateProcessedNewFile => "Added new file: {0}"; + public string UpdateProcessingDeletedFile => "Deleting file: {0}"; + public string UpdateProcessedDeletedFile => "Deleted file: {0}"; + public string UpdateProcessingUpdatedFile => "Updating file: {0}"; + public string UpdateProcessedUpdatedFile => "Updated file: {0}"; + public string UpdateProcessingChangedAttributesFile => "Fixing file attributes: {0}"; + public string UpdateProcessedChangedAttributesFile => "Fixed file attributes: {0}"; + public string NotAvailableNetwork => "Network is not available or connectivity is low/weak... Check your connection!"; + public string NotAvailableServers => "Our servers are not responding... Wait some minutes and retry!"; + public string LogsFileNotWritable => "Cannot write to the logs file. Probably the Launcher has not sufficient privileges. Continue anyway?"; + public string UpdateProcessCompleted => "Updating process completed successfully!"; + public string UpdateProcessFailed => "Updating process failed!"; + public string UpdateRestartNeeded => "A restart is needed!"; + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization/EnglishUpdaterLocalizedMessages.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization/EnglishUpdaterLocalizedMessages.cs.meta new file mode 100644 index 0000000..1d7722e --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Localization/EnglishUpdaterLocalizedMessages.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 551c509c0da34bbeaaff8c9681477032 +timeCreated: 1586132762 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI.meta new file mode 100644 index 0000000..794fa73 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd9b790c644e97c42885df45cc2462f4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/Dialog.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/Dialog.cs new file mode 100644 index 0000000..0ebf413 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/Dialog.cs @@ -0,0 +1,54 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +namespace MHLab.Patch.Launcher.Scripts.UI +{ + public sealed class Dialog : MonoBehaviour + { + public Text MainMessage; + public Text DetailsMessage; + public Button CloseButton; + public Button ContinueButton; + + public void ShowDialog(string main, string detail, Action onClose, Action onContinue) + { + MainMessage.text = main; + DetailsMessage.text = detail; + CloseButton.onClick.AddListener(() => + { + CloseButton.onClick.RemoveAllListeners(); + onClose?.Invoke(); + gameObject.SetActive(false); + }); + CloseButton.gameObject.SetActive(true); + + ContinueButton.onClick.AddListener(() => + { + ContinueButton.onClick.RemoveAllListeners(); + onContinue?.Invoke(); + gameObject.SetActive(false); + }); + ContinueButton.gameObject.SetActive(true); + + gameObject.SetActive(true); + } + + public void ShowCloseDialog(string main, string detail, Action onClose) + { + MainMessage.text = main; + DetailsMessage.text = detail; + CloseButton.onClick.AddListener(() => + { + CloseButton.onClick.RemoveAllListeners(); + onClose?.Invoke(); + gameObject.SetActive(false); + }); + CloseButton.gameObject.SetActive(true); + + ContinueButton.gameObject.SetActive(false); + + gameObject.SetActive(true); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/Dialog.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/Dialog.cs.meta new file mode 100644 index 0000000..fab2ab0 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/Dialog.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 84c300a775c74286ac59ccdd38282212 +timeCreated: 1593199848 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/OptionsScreen.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/OptionsScreen.cs new file mode 100644 index 0000000..80ecc3d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/OptionsScreen.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace MHLab.Patch.Launcher.Scripts.UI +{ + public sealed class OptionsScreen : MonoBehaviour + { + public void OpenOptions() + { + gameObject.SetActive(true); + Debug.Log("Opened"); + } + + public void CloseOptions() + { + gameObject.SetActive(false); + Debug.Log("Closed"); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/OptionsScreen.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/OptionsScreen.cs.meta new file mode 100644 index 0000000..f99d13c --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/OptionsScreen.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ed55f3b98d344f95a0bb314cbff1fb16 +timeCreated: 1593213692 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/ProgressBar.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/ProgressBar.cs new file mode 100644 index 0000000..4a4bb06 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/ProgressBar.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +namespace MHLab.Patch.Launcher.Scripts.UI +{ + public sealed class ProgressBar : MonoBehaviour + { + public RectTransform InnerProgressBar; + [Range(0, 1)] + public float Progress; + + private void Update() + { + InnerProgressBar.anchorMax = new Vector2(Progress, InnerProgressBar.anchorMax.y); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/ProgressBar.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/ProgressBar.cs.meta new file mode 100644 index 0000000..d9cb637 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/UI/ProgressBar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5eb1a4d80b297d9409285b5bb649ae7b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities.meta new file mode 100644 index 0000000..4c9efd8 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4f1493bc39b14e5fb8232128a6777a81 +timeCreated: 1587324728 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/ApplicationStarter.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/ApplicationStarter.cs new file mode 100644 index 0000000..42ad83b --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/ApplicationStarter.cs @@ -0,0 +1,53 @@ +using System.Diagnostics; +using System.IO; + +namespace MHLab.Patch.Launcher.Scripts.Utilities +{ + public static class ApplicationStarter + { + public static void StartApplication(string filePath, string arguments) + { +#if UNITY_STANDALONE_OSX + PrepareApplicationMac(filePath, arguments).Start(); +#elif UNITY_STANDALONE_LINUX + PrepareApplicationLinux(filePath, arguments).Start(); +#else + PrepareStartApplicationWindows(filePath, arguments).Start(); +#endif + } + + private static Process PrepareStartApplicationWindows(string filePath, string arguments) + { + var process = new Process(); + process.StartInfo.FileName = filePath; + process.StartInfo.Arguments = arguments; + process.StartInfo.UseShellExecute = false; + process.StartInfo.Verb = "runas"; + process.StartInfo.WorkingDirectory = Path.GetDirectoryName(filePath); + + return process; + } + + private static Process PrepareApplicationMac(string filePath, string arguments) + { + var process = new Process(); + process.StartInfo.FileName = "open"; + process.StartInfo.Arguments = $"-a '{filePath}' -n --args '{arguments}'"; + process.StartInfo.UseShellExecute = false; + process.StartInfo.WorkingDirectory = Path.GetDirectoryName(filePath); + + return process; + } + + private static Process PrepareApplicationLinux(string filePath, string arguments) + { + var process = new Process(); + process.StartInfo.FileName = filePath; + process.StartInfo.Arguments = arguments; + process.StartInfo.UseShellExecute = false; + process.StartInfo.WorkingDirectory = Path.GetDirectoryName(filePath); + + return process; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/ApplicationStarter.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/ApplicationStarter.cs.meta new file mode 100644 index 0000000..32e8664 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/ApplicationStarter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1946830104be40f4a5ab4ac781cff211 +timeCreated: 1587325606 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/PrivilegesSetter.cs b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/PrivilegesSetter.cs new file mode 100644 index 0000000..e06c630 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/PrivilegesSetter.cs @@ -0,0 +1,50 @@ +using System.Diagnostics; +using MHLab.Patch.Core.IO; + +namespace MHLab.Patch.Launcher.Scripts.Utilities +{ + public static class PrivilegesSetter + { + public static void EnsureExecutePrivileges(string filePath) + { +#if UNITY_STANDALONE_OSX + EnsurePrivilegesMac(filePath); +#elif UNITY_STANDALONE_LINUX + EnsurePrivilegesLinux(filePath); +#else + EnsurePrivilegesWindows(filePath); +#endif + } + + private static void EnsurePrivilegesWindows(string filePath) + { + var processChmod = new Process(); + processChmod.StartInfo.FileName = "ICACLS"; + processChmod.StartInfo.Arguments = "\"" + filePath + "\" /grant \"Users\":M"; + processChmod.Start(); + } + + private static void EnsurePrivilegesMac(string filePath) + { + var filename = filePath + "/Contents/MacOS/" + PathsManager.GetFilename(filePath).Replace(".app", ""); + + var processChmod = new Process(); + processChmod.StartInfo.FileName = "chmod"; + processChmod.StartInfo.Arguments = "+x \"" + filename + "\""; + processChmod.Start(); + + var processAttr = new Process(); + processAttr.StartInfo.FileName = "xattr"; + processAttr.StartInfo.Arguments = "-d com.apple.quarantine \"" + filePath + "\""; + processAttr.Start(); + } + + private static void EnsurePrivilegesLinux(string filePath) + { + var processChmod = new Process(); + processChmod.StartInfo.FileName = "chmod"; + processChmod.StartInfo.Arguments = "+x \"" + filePath + "\""; + processChmod.Start(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/PrivilegesSetter.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/PrivilegesSetter.cs.meta new file mode 100644 index 0000000..77b8d46 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Launcher/Scripts/Utilities/PrivilegesSetter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 943267feeaaa47d8bb52264ce3e958b0 +timeCreated: 1587324771 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/PATCH - Updating System User Manual.pdf b/PatchTestProject/Assets/MHLab/Patch/PATCH - Updating System User Manual.pdf new file mode 100644 index 0000000..67e9395 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/PATCH - Updating System User Manual.pdf differ diff --git a/PatchTestProject/Assets/MHLab/Patch/PATCH - Updating System User Manual.pdf.meta b/PatchTestProject/Assets/MHLab/Patch/PATCH - Updating System User Manual.pdf.meta new file mode 100644 index 0000000..7bdeb7a --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/PATCH - Updating System User Manual.pdf.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0a3c646620e20a741adf61817f01a160 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins.meta new file mode 100644 index 0000000..d2af5ad --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0acf1aa7103711b4c8bf64d55ba56137 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/ICSharpCode.SharpZipLib.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000..58893ba Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/ICSharpCode.SharpZipLib.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/ICSharpCode.SharpZipLib.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/ICSharpCode.SharpZipLib.dll.meta new file mode 100644 index 0000000..a5c7e48 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/ICSharpCode.SharpZipLib.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f8c2ccd7b4fafb843974e47780dd7cf7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Admin.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Admin.dll new file mode 100644 index 0000000..f5c3649 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Admin.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Admin.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Admin.dll.meta new file mode 100644 index 0000000..3fea3a9 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Admin.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6c8f3a9ee5224544c881b042c7c73942 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Client.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Client.dll new file mode 100644 index 0000000..7537cb7 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Client.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Client.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Client.dll.meta new file mode 100644 index 0000000..adb4634 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.Client.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f94a4c93f8111f54793e0096134c8525 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.dll new file mode 100644 index 0000000..73b526a Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.dll.meta new file mode 100644 index 0000000..741ddcf --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/MHLab.Patch.Core.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7323958c42a39b14ca571eb9eab63b61 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/Newtonsoft.Json.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/Newtonsoft.Json.dll new file mode 100644 index 0000000..b501fb6 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/Newtonsoft.Json.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/Newtonsoft.Json.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/Newtonsoft.Json.dll.meta new file mode 100644 index 0000000..35052ba --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/Newtonsoft.Json.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 71c1c00acbc147f40a0122ec61eb0bdb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.Sinks.File.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.Sinks.File.dll new file mode 100644 index 0000000..1600c05 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.Sinks.File.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.Sinks.File.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.Sinks.File.dll.meta new file mode 100644 index 0000000..53d8dd7 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.Sinks.File.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 0c56563958a156145b708466db0e35cc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.dll b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.dll new file mode 100644 index 0000000..b1fec98 Binary files /dev/null and b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.dll differ diff --git a/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.dll.meta b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.dll.meta new file mode 100644 index 0000000..15ec598 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Plugins/Serilog.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8ce309b030ff4ec4cb218f06a87c0fd2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities.meta new file mode 100644 index 0000000..f6d1ba7 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 53bb191abbdc42faad6bf53354189ba3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/ArgumentChecker.cs b/PatchTestProject/Assets/MHLab/Patch/Utilities/ArgumentChecker.cs new file mode 100644 index 0000000..dcab471 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/ArgumentChecker.cs @@ -0,0 +1,23 @@ +using System; + +namespace MHLab.Patch.Utilities +{ + public static class ArgumentChecker + { + public static bool IsLaunchedWithCorrectParameter(string parameter, string expectedValue) + { + var args = Environment.GetCommandLineArgs(); + + foreach (var arg in args) + { + if (!arg.StartsWith(parameter)) continue; + + var retrievedValue = arg.Replace(parameter + "=", ""); + + return retrievedValue == expectedValue; + } + + return false; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/ArgumentChecker.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/ArgumentChecker.cs.meta new file mode 100644 index 0000000..21e7fa1 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/ArgumentChecker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d26e81968a7d4efca2a972a4d2c64065 +timeCreated: 1587306536 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/DebugHelper.cs b/PatchTestProject/Assets/MHLab/Patch/Utilities/DebugHelper.cs new file mode 100644 index 0000000..d516d89 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/DebugHelper.cs @@ -0,0 +1,24 @@ +using System; +using UnityEngine; + +namespace MHLab.Patch.Utilities +{ + public static class DebugHelper + { + public static string GetSystemInfo() + { + string info = "OS: " + SystemInfo.operatingSystem + " - Family: " + SystemInfo.operatingSystemFamily + "\n"; + info += "Processor: " + SystemInfo.processorType + " " + SystemInfo.processorFrequency + "MHz (" + + SystemInfo.processorCount + " vcore)\n"; + info += "Device: " + SystemInfo.deviceModel + " - Type: " + SystemInfo.deviceType + "\n"; + info += "System Memory: " + SystemInfo.systemMemorySize + "MB\n"; + info += "GPU: " + SystemInfo.graphicsDeviceName + " - Vendor: " + SystemInfo.graphicsDeviceVendor + " - Type: " + + SystemInfo.graphicsDeviceType + " - Version: " + SystemInfo.graphicsDeviceVersion + " - Memory: " + + SystemInfo.graphicsMemorySize + "MB - Shader: " + SystemInfo.graphicsShaderLevel + "\n"; + info += "Process: " + (Environment.Is64BitProcess ? 64 : 32) + " bits - CLR Version: " + Environment.Version + "\n"; + info += "Commandline arguments: " + Environment.CommandLine; + + return info; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/DebugHelper.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/DebugHelper.cs.meta new file mode 100644 index 0000000..01592b7 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/DebugHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 11a75ab7a4c3480f8ac6046b85ae9a5b +timeCreated: 1586126427 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging.meta new file mode 100644 index 0000000..8e114c9 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b46e144d59f3654eb2d641d8001efd1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging/Logger.cs b/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging/Logger.cs new file mode 100644 index 0000000..a338163 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging/Logger.cs @@ -0,0 +1,61 @@ +using Serilog; +using System; +using System.IO; +using System.Runtime.CompilerServices; +using MHLab.Patch.Core.IO; +using ILogger = MHLab.Patch.Core.Logging.ILogger; + +namespace MHLab.Patch.Utilities.Logging +{ + public sealed class Logger : ILogger + { + private readonly Serilog.Core.Logger _logger; + + private bool _isDebug; + + public Logger(string logfilePath, bool isDebug) + { + _isDebug = isDebug; + + var configuration = new LoggerConfiguration(); + if (isDebug) + configuration.MinimumLevel.Debug(); + else + configuration.MinimumLevel.Information(); + + configuration.WriteTo.File(logfilePath, rollingInterval: RollingInterval.Day, shared: true); + + _logger = configuration.CreateLogger(); + } + + public void Debug(string messageTemplate, [CallerFilePath] string callerPath = "", [CallerLineNumber] long callerLine = 0, [CallerMemberName] string callerMember = "") + { + _logger.Debug(BuildMessage(messageTemplate, callerPath, callerLine, callerMember)); + } + + public void Info(string messageTemplate, [CallerFilePath] string callerPath = "", [CallerLineNumber] long callerLine = 0, [CallerMemberName] string callerMember = "") + { + _logger.Information(BuildMessage(messageTemplate, callerPath, callerLine, callerMember)); + } + + public void Warning(string messageTemplate, [CallerFilePath] string callerPath = "", [CallerLineNumber] long callerLine = 0, [CallerMemberName] string callerMember = "") + { + _logger.Warning(BuildMessage(messageTemplate, callerPath, callerLine, callerMember)); + } + + public void Error(Exception exception, string messageTemplate, [CallerFilePath] string callerPath = "", [CallerLineNumber] long callerLine = 0, [CallerMemberName] string callerMember = "") + { + _logger.Error(exception, BuildMessage(messageTemplate, callerPath, callerLine, callerMember)); + } + + private string BuildMessage(string messageTemplate, string callerPath, long callerLine, string callerMember) + { + if (_isDebug) + { + var caller = Path.GetFileName(callerPath); + messageTemplate = $"[{caller}::{callerMember}@{callerLine}] {messageTemplate}"; + } + return messageTemplate; + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging/Logger.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging/Logger.cs.meta new file mode 100644 index 0000000..fa29926 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Logging/Logger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 129efa05217b5b54b82b2070fb77b480 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/ProgressReporter.cs b/PatchTestProject/Assets/MHLab/Patch/Utilities/ProgressReporter.cs new file mode 100644 index 0000000..db07957 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/ProgressReporter.cs @@ -0,0 +1,41 @@ +using System; +using MHLab.Patch.Core.Client.Progresses; +using UnityEngine.Events; + +namespace MHLab.Patch.Utilities +{ + public sealed class ProgressReporterEvent : UnityEvent + { + + } + + public sealed class ProgressReporter : IProgress + { + public ProgressReporterEvent ProgressChanged; + + public ProgressReporter() + { + ProgressChanged = new ProgressReporterEvent(); + } + + private void OnProgressChanged(UpdateProgress progress) + { + var handler = ProgressChanged; + + if (handler != null) + { + try + { + handler.Invoke(progress); + } + catch + {} + } + } + + public void Report(UpdateProgress value) + { + OnProgressChanged(value); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/ProgressReporter.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/ProgressReporter.cs.meta new file mode 100644 index 0000000..95ad61d --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/ProgressReporter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1f6753971b3d400da467f9b57b6a38f7 +timeCreated: 1586186970 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing.meta new file mode 100644 index 0000000..2de24bd --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9cdb023d43e9447b962fe844fbf45a0d +timeCreated: 1592384498 \ No newline at end of file diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/NewtonsoftSerializer.cs b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/NewtonsoftSerializer.cs new file mode 100644 index 0000000..044a567 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/NewtonsoftSerializer.cs @@ -0,0 +1,18 @@ +using MHLab.Patch.Core.Serializing; +using Newtonsoft.Json; + +namespace MHLab.Patch.Utilities.Serializing +{ + public sealed class NewtonsoftSerializer : ISerializer + { + public string Serialize(TObject obj) + { + return JsonConvert.SerializeObject(obj, Formatting.Indented, new VersionConverter()); + } + + public TObject Deserialize(string data) + { + return JsonConvert.DeserializeObject(data, new VersionConverter()); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/NewtonsoftSerializer.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/NewtonsoftSerializer.cs.meta new file mode 100644 index 0000000..c94c878 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/NewtonsoftSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d4d0f8c5331680479d91a031eb562f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/VersionConverter.cs b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/VersionConverter.cs new file mode 100644 index 0000000..3613571 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/VersionConverter.cs @@ -0,0 +1,22 @@ +using Newtonsoft.Json; +using System; +using MHLab.Patch.Core.Versioning; +using Version = MHLab.Patch.Core.Versioning.Version; + +namespace MHLab.Patch.Utilities.Serializing +{ + public sealed class VersionConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, IVersion value, JsonSerializer serializer) + { + writer.WriteValue(value.ToString()); + } + + public override IVersion ReadJson(JsonReader reader, Type objectType, IVersion existingValue, bool hasExistingValue, + JsonSerializer serializer) + { + var data = (string)reader.Value; + return new Version(data); + } + } +} diff --git a/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/VersionConverter.cs.meta b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/VersionConverter.cs.meta new file mode 100644 index 0000000..3487772 --- /dev/null +++ b/PatchTestProject/Assets/MHLab/Patch/Utilities/Serializing/VersionConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0553cefff806f743891908b66b45cd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/Scenes.meta b/PatchTestProject/Assets/Scenes.meta new file mode 100644 index 0000000..a27cf2b --- /dev/null +++ b/PatchTestProject/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67e5fe60b41649644b39f1fac81daf0b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Assets/Scenes/SampleScene.unity b/PatchTestProject/Assets/Scenes/SampleScene.unity new file mode 100644 index 0000000..d7548dd --- /dev/null +++ b/PatchTestProject/Assets/Scenes/SampleScene.unity @@ -0,0 +1,259 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 705507994} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/PatchTestProject/Assets/Scenes/SampleScene.unity.meta b/PatchTestProject/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000..952bd1e --- /dev/null +++ b/PatchTestProject/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fc0d4010bbf28b4594072e72b8655ab +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/APIUpdater/project-dependencies.graph b/PatchTestProject/Library/APIUpdater/project-dependencies.graph new file mode 100644 index 0000000..3feac70 Binary files /dev/null and b/PatchTestProject/Library/APIUpdater/project-dependencies.graph differ diff --git a/PatchTestProject/Library/AnnotationManager b/PatchTestProject/Library/AnnotationManager new file mode 100644 index 0000000..44c9fc0 Binary files /dev/null and b/PatchTestProject/Library/AnnotationManager differ diff --git a/PatchTestProject/Library/ArtifactDB b/PatchTestProject/Library/ArtifactDB new file mode 100644 index 0000000..c027574 Binary files /dev/null and b/PatchTestProject/Library/ArtifactDB differ diff --git a/PatchTestProject/Library/ArtifactDB-lock b/PatchTestProject/Library/ArtifactDB-lock new file mode 100644 index 0000000..55c396c Binary files /dev/null and b/PatchTestProject/Library/ArtifactDB-lock differ diff --git a/PatchTestProject/Library/Artifacts/00/0019db2611aed046daabcbd575193956 b/PatchTestProject/Library/Artifacts/00/0019db2611aed046daabcbd575193956 new file mode 100644 index 0000000..9bdb78a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/00/0019db2611aed046daabcbd575193956 differ diff --git a/PatchTestProject/Library/Artifacts/00/0042f563008c1bfd2e972c01b17df323 b/PatchTestProject/Library/Artifacts/00/0042f563008c1bfd2e972c01b17df323 new file mode 100644 index 0000000..adde3a9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/00/0042f563008c1bfd2e972c01b17df323 differ diff --git a/PatchTestProject/Library/Artifacts/00/0047d0b364eb6dbfe0202067ca09da2c b/PatchTestProject/Library/Artifacts/00/0047d0b364eb6dbfe0202067ca09da2c new file mode 100644 index 0000000..8b941a7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/00/0047d0b364eb6dbfe0202067ca09da2c differ diff --git a/PatchTestProject/Library/Artifacts/00/005252ecd1eb70be46ad27af274b68e2 b/PatchTestProject/Library/Artifacts/00/005252ecd1eb70be46ad27af274b68e2 new file mode 100644 index 0000000..80269cc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/00/005252ecd1eb70be46ad27af274b68e2 differ diff --git a/PatchTestProject/Library/Artifacts/00/006b419d07f85462fd19a7c3df27417d b/PatchTestProject/Library/Artifacts/00/006b419d07f85462fd19a7c3df27417d new file mode 100644 index 0000000..3158190 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/00/006b419d07f85462fd19a7c3df27417d differ diff --git a/PatchTestProject/Library/Artifacts/00/0078c1af0ba40e16d14fa8ca01e51ad4 b/PatchTestProject/Library/Artifacts/00/0078c1af0ba40e16d14fa8ca01e51ad4 new file mode 100644 index 0000000..6ce159f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/00/0078c1af0ba40e16d14fa8ca01e51ad4 differ diff --git a/PatchTestProject/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f b/PatchTestProject/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f new file mode 100644 index 0000000..b659762 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f differ diff --git a/PatchTestProject/Library/Artifacts/01/0162bf00290464536d249b1a732112dd b/PatchTestProject/Library/Artifacts/01/0162bf00290464536d249b1a732112dd new file mode 100644 index 0000000..63eda6c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/01/0162bf00290464536d249b1a732112dd differ diff --git a/PatchTestProject/Library/Artifacts/01/01ad3db0ed67f817948eaea3cb2ae4c2 b/PatchTestProject/Library/Artifacts/01/01ad3db0ed67f817948eaea3cb2ae4c2 new file mode 100644 index 0000000..d4f44d7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/01/01ad3db0ed67f817948eaea3cb2ae4c2 differ diff --git a/PatchTestProject/Library/Artifacts/02/02c351dd0640e61d3d4d9b8dc9fe433b b/PatchTestProject/Library/Artifacts/02/02c351dd0640e61d3d4d9b8dc9fe433b new file mode 100644 index 0000000..1e0dc17 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/02/02c351dd0640e61d3d4d9b8dc9fe433b differ diff --git a/PatchTestProject/Library/Artifacts/03/03688eba8ef236992cc250a0802b96d0 b/PatchTestProject/Library/Artifacts/03/03688eba8ef236992cc250a0802b96d0 new file mode 100644 index 0000000..d6c2797 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/03/03688eba8ef236992cc250a0802b96d0 differ diff --git a/PatchTestProject/Library/Artifacts/03/03dcfe5fe0183f1ae561e1f16361237c b/PatchTestProject/Library/Artifacts/03/03dcfe5fe0183f1ae561e1f16361237c new file mode 100644 index 0000000..acbf9a3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/03/03dcfe5fe0183f1ae561e1f16361237c differ diff --git a/PatchTestProject/Library/Artifacts/04/0443ff3bd3481825d6e7c9af190315da b/PatchTestProject/Library/Artifacts/04/0443ff3bd3481825d6e7c9af190315da new file mode 100644 index 0000000..b03683d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/0443ff3bd3481825d6e7c9af190315da differ diff --git a/PatchTestProject/Library/Artifacts/04/0451550c3bdd657caaa0e0fe5f1e965a b/PatchTestProject/Library/Artifacts/04/0451550c3bdd657caaa0e0fe5f1e965a new file mode 100644 index 0000000..a28f30a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/0451550c3bdd657caaa0e0fe5f1e965a differ diff --git a/PatchTestProject/Library/Artifacts/04/046413085abf0445fc05f7b114642349 b/PatchTestProject/Library/Artifacts/04/046413085abf0445fc05f7b114642349 new file mode 100644 index 0000000..99a65fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/046413085abf0445fc05f7b114642349 differ diff --git a/PatchTestProject/Library/Artifacts/04/04bf0c0ac85a333fcd1ac3353394a0b0 b/PatchTestProject/Library/Artifacts/04/04bf0c0ac85a333fcd1ac3353394a0b0 new file mode 100644 index 0000000..b37b7d1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/04bf0c0ac85a333fcd1ac3353394a0b0 differ diff --git a/PatchTestProject/Library/Artifacts/04/04e0195a9ef7c24baf47a349a0f9137b b/PatchTestProject/Library/Artifacts/04/04e0195a9ef7c24baf47a349a0f9137b new file mode 100644 index 0000000..77f09a4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/04e0195a9ef7c24baf47a349a0f9137b differ diff --git a/PatchTestProject/Library/Artifacts/04/04e03b1c2f680eda29f545016febbf00 b/PatchTestProject/Library/Artifacts/04/04e03b1c2f680eda29f545016febbf00 new file mode 100644 index 0000000..a56f443 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/04e03b1c2f680eda29f545016febbf00 differ diff --git a/PatchTestProject/Library/Artifacts/04/04f6b105f3b0bc8fe4f251e568b6fc1a b/PatchTestProject/Library/Artifacts/04/04f6b105f3b0bc8fe4f251e568b6fc1a new file mode 100644 index 0000000..3a766ec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/04/04f6b105f3b0bc8fe4f251e568b6fc1a differ diff --git a/PatchTestProject/Library/Artifacts/05/053d16e21d78c7a52a3dbcddbabba2f4 b/PatchTestProject/Library/Artifacts/05/053d16e21d78c7a52a3dbcddbabba2f4 new file mode 100644 index 0000000..108470b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/053d16e21d78c7a52a3dbcddbabba2f4 differ diff --git a/PatchTestProject/Library/Artifacts/05/055d08f1535322fab46e0784d706f8f5 b/PatchTestProject/Library/Artifacts/05/055d08f1535322fab46e0784d706f8f5 new file mode 100644 index 0000000..1f05ed7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/055d08f1535322fab46e0784d706f8f5 differ diff --git a/PatchTestProject/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 b/PatchTestProject/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 new file mode 100644 index 0000000..d1d4170 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 differ diff --git a/PatchTestProject/Library/Artifacts/05/056893c198c34c8251e86c7495bfa21e b/PatchTestProject/Library/Artifacts/05/056893c198c34c8251e86c7495bfa21e new file mode 100644 index 0000000..1828711 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/056893c198c34c8251e86c7495bfa21e differ diff --git a/PatchTestProject/Library/Artifacts/05/0596f320ba3b7bd8da0527def55a3c46 b/PatchTestProject/Library/Artifacts/05/0596f320ba3b7bd8da0527def55a3c46 new file mode 100644 index 0000000..0e02a6e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/0596f320ba3b7bd8da0527def55a3c46 differ diff --git a/PatchTestProject/Library/Artifacts/05/059dc2a524abf5f1a9a30996c649fbd3 b/PatchTestProject/Library/Artifacts/05/059dc2a524abf5f1a9a30996c649fbd3 new file mode 100644 index 0000000..7dcd328 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/059dc2a524abf5f1a9a30996c649fbd3 differ diff --git a/PatchTestProject/Library/Artifacts/05/05b70a50575baa55db24d343b52a8a00 b/PatchTestProject/Library/Artifacts/05/05b70a50575baa55db24d343b52a8a00 new file mode 100644 index 0000000..2274fae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/05b70a50575baa55db24d343b52a8a00 differ diff --git a/PatchTestProject/Library/Artifacts/05/05f0b17669c2be59089f1c9b70bf21cc b/PatchTestProject/Library/Artifacts/05/05f0b17669c2be59089f1c9b70bf21cc new file mode 100644 index 0000000..6553643 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/05/05f0b17669c2be59089f1c9b70bf21cc differ diff --git a/PatchTestProject/Library/Artifacts/06/06123b93b84aa22d847b9b595eb2868c b/PatchTestProject/Library/Artifacts/06/06123b93b84aa22d847b9b595eb2868c new file mode 100644 index 0000000..3c57aac Binary files /dev/null and b/PatchTestProject/Library/Artifacts/06/06123b93b84aa22d847b9b595eb2868c differ diff --git a/PatchTestProject/Library/Artifacts/06/065d080465a13da0028c4f7b4e6903c0 b/PatchTestProject/Library/Artifacts/06/065d080465a13da0028c4f7b4e6903c0 new file mode 100644 index 0000000..b2aeba8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/06/065d080465a13da0028c4f7b4e6903c0 differ diff --git a/PatchTestProject/Library/Artifacts/06/0663f33deebbcb0a3b75234733b223df b/PatchTestProject/Library/Artifacts/06/0663f33deebbcb0a3b75234733b223df new file mode 100644 index 0000000..4c4f216 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/06/0663f33deebbcb0a3b75234733b223df differ diff --git a/PatchTestProject/Library/Artifacts/06/06800663da895a6b365e57fe55561616 b/PatchTestProject/Library/Artifacts/06/06800663da895a6b365e57fe55561616 new file mode 100644 index 0000000..f135480 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/06/06800663da895a6b365e57fe55561616 differ diff --git a/PatchTestProject/Library/Artifacts/06/06b2d95a01d3a21b7efd3b7a10bd8596 b/PatchTestProject/Library/Artifacts/06/06b2d95a01d3a21b7efd3b7a10bd8596 new file mode 100644 index 0000000..2b6a254 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/06/06b2d95a01d3a21b7efd3b7a10bd8596 differ diff --git a/PatchTestProject/Library/Artifacts/06/06cda5c22c32edb15d459e00e96ee28b b/PatchTestProject/Library/Artifacts/06/06cda5c22c32edb15d459e00e96ee28b new file mode 100644 index 0000000..cd1a318 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/06/06cda5c22c32edb15d459e00e96ee28b differ diff --git a/PatchTestProject/Library/Artifacts/07/072a278e4b14dcd97830cfc3fd920dc2 b/PatchTestProject/Library/Artifacts/07/072a278e4b14dcd97830cfc3fd920dc2 new file mode 100644 index 0000000..51e7ae7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/07/072a278e4b14dcd97830cfc3fd920dc2 differ diff --git a/PatchTestProject/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 b/PatchTestProject/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 new file mode 100644 index 0000000..d6a6183 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 differ diff --git a/PatchTestProject/Library/Artifacts/08/080fa1a0f7e12a42dc771948efe1d042 b/PatchTestProject/Library/Artifacts/08/080fa1a0f7e12a42dc771948efe1d042 new file mode 100644 index 0000000..1f60eb5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/08/080fa1a0f7e12a42dc771948efe1d042 differ diff --git a/PatchTestProject/Library/Artifacts/08/0859595a50f6150f7df2ba8a4e605f04 b/PatchTestProject/Library/Artifacts/08/0859595a50f6150f7df2ba8a4e605f04 new file mode 100644 index 0000000..30f69db Binary files /dev/null and b/PatchTestProject/Library/Artifacts/08/0859595a50f6150f7df2ba8a4e605f04 differ diff --git a/PatchTestProject/Library/Artifacts/08/08c52c5fead18563cb97770fec8c6d90 b/PatchTestProject/Library/Artifacts/08/08c52c5fead18563cb97770fec8c6d90 new file mode 100644 index 0000000..8eca57a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/08/08c52c5fead18563cb97770fec8c6d90 differ diff --git a/PatchTestProject/Library/Artifacts/08/08f4e6255de183265c5257e064c4330c b/PatchTestProject/Library/Artifacts/08/08f4e6255de183265c5257e064c4330c new file mode 100644 index 0000000..72eae6d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/08/08f4e6255de183265c5257e064c4330c differ diff --git a/PatchTestProject/Library/Artifacts/09/092f4a78a41f4943cd625eefb07928e7 b/PatchTestProject/Library/Artifacts/09/092f4a78a41f4943cd625eefb07928e7 new file mode 100644 index 0000000..1bf0c40 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/09/092f4a78a41f4943cd625eefb07928e7 differ diff --git a/PatchTestProject/Library/Artifacts/09/09462b05ca43e4d9f0136f55d5779c7d b/PatchTestProject/Library/Artifacts/09/09462b05ca43e4d9f0136f55d5779c7d new file mode 100644 index 0000000..28c1606 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/09/09462b05ca43e4d9f0136f55d5779c7d differ diff --git a/PatchTestProject/Library/Artifacts/09/09ae297010d75a2162b0bd5c84cac4da b/PatchTestProject/Library/Artifacts/09/09ae297010d75a2162b0bd5c84cac4da new file mode 100644 index 0000000..099e02f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/09/09ae297010d75a2162b0bd5c84cac4da differ diff --git a/PatchTestProject/Library/Artifacts/09/09b461540f00e06cd5f70ba7f57ee3b2 b/PatchTestProject/Library/Artifacts/09/09b461540f00e06cd5f70ba7f57ee3b2 new file mode 100644 index 0000000..f7a452e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/09/09b461540f00e06cd5f70ba7f57ee3b2 differ diff --git a/PatchTestProject/Library/Artifacts/09/09fa9b9cebcfda64c97e5f8e51e5a5c4 b/PatchTestProject/Library/Artifacts/09/09fa9b9cebcfda64c97e5f8e51e5a5c4 new file mode 100644 index 0000000..1395f6b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/09/09fa9b9cebcfda64c97e5f8e51e5a5c4 differ diff --git a/PatchTestProject/Library/Artifacts/0a/0a0e9831acab2d1d1310fb8d35223f53 b/PatchTestProject/Library/Artifacts/0a/0a0e9831acab2d1d1310fb8d35223f53 new file mode 100644 index 0000000..e3db1cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0a/0a0e9831acab2d1d1310fb8d35223f53 differ diff --git a/PatchTestProject/Library/Artifacts/0a/0a1a739fedc36417b8e3aeb5a44c4d77 b/PatchTestProject/Library/Artifacts/0a/0a1a739fedc36417b8e3aeb5a44c4d77 new file mode 100644 index 0000000..e43ff3c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0a/0a1a739fedc36417b8e3aeb5a44c4d77 differ diff --git a/PatchTestProject/Library/Artifacts/0a/0a4a2b9ae8224ccab760d053b548b5c6 b/PatchTestProject/Library/Artifacts/0a/0a4a2b9ae8224ccab760d053b548b5c6 new file mode 100644 index 0000000..62d8374 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0a/0a4a2b9ae8224ccab760d053b548b5c6 differ diff --git a/PatchTestProject/Library/Artifacts/0a/0af523d87406581a5773fc6ee1f8f79f b/PatchTestProject/Library/Artifacts/0a/0af523d87406581a5773fc6ee1f8f79f new file mode 100644 index 0000000..6a86754 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0a/0af523d87406581a5773fc6ee1f8f79f differ diff --git a/PatchTestProject/Library/Artifacts/0a/0afc3a2299f9f03e729702ed88979396 b/PatchTestProject/Library/Artifacts/0a/0afc3a2299f9f03e729702ed88979396 new file mode 100644 index 0000000..5f6294e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0a/0afc3a2299f9f03e729702ed88979396 differ diff --git a/PatchTestProject/Library/Artifacts/0b/0b61d1148dbf1d1a6feb548e9d62ec26 b/PatchTestProject/Library/Artifacts/0b/0b61d1148dbf1d1a6feb548e9d62ec26 new file mode 100644 index 0000000..d6985cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0b/0b61d1148dbf1d1a6feb548e9d62ec26 differ diff --git a/PatchTestProject/Library/Artifacts/0b/0b86be10a936a81cb6288a2614f1199f b/PatchTestProject/Library/Artifacts/0b/0b86be10a936a81cb6288a2614f1199f new file mode 100644 index 0000000..ff2bc65 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0b/0b86be10a936a81cb6288a2614f1199f differ diff --git a/PatchTestProject/Library/Artifacts/0b/0bd44ff2ee7e3247a09b0b6631f43279 b/PatchTestProject/Library/Artifacts/0b/0bd44ff2ee7e3247a09b0b6631f43279 new file mode 100644 index 0000000..d004a8e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0b/0bd44ff2ee7e3247a09b0b6631f43279 differ diff --git a/PatchTestProject/Library/Artifacts/0c/0c1e268b917ea91b05b8583e17e0d20d b/PatchTestProject/Library/Artifacts/0c/0c1e268b917ea91b05b8583e17e0d20d new file mode 100644 index 0000000..5e13fde Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0c1e268b917ea91b05b8583e17e0d20d differ diff --git a/PatchTestProject/Library/Artifacts/0c/0c1eb45ed122a8654d1c2daef9f5408e b/PatchTestProject/Library/Artifacts/0c/0c1eb45ed122a8654d1c2daef9f5408e new file mode 100644 index 0000000..777f910 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0c1eb45ed122a8654d1c2daef9f5408e differ diff --git a/PatchTestProject/Library/Artifacts/0c/0c213acb4e9fb1fb952f7b5cb26b39bb b/PatchTestProject/Library/Artifacts/0c/0c213acb4e9fb1fb952f7b5cb26b39bb new file mode 100644 index 0000000..2b24e4d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0c213acb4e9fb1fb952f7b5cb26b39bb differ diff --git a/PatchTestProject/Library/Artifacts/0c/0c7db109ca5ff3a0139e74eb7e5e4e07 b/PatchTestProject/Library/Artifacts/0c/0c7db109ca5ff3a0139e74eb7e5e4e07 new file mode 100644 index 0000000..00d22cf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0c7db109ca5ff3a0139e74eb7e5e4e07 differ diff --git a/PatchTestProject/Library/Artifacts/0c/0c8066f94a0e89f2fbbf1e19c80134ba b/PatchTestProject/Library/Artifacts/0c/0c8066f94a0e89f2fbbf1e19c80134ba new file mode 100644 index 0000000..9ea6a5f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0c8066f94a0e89f2fbbf1e19c80134ba differ diff --git a/PatchTestProject/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 b/PatchTestProject/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 new file mode 100644 index 0000000..019e876 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 differ diff --git a/PatchTestProject/Library/Artifacts/0c/0cac0837b400a2c54140bbd4746734b8 b/PatchTestProject/Library/Artifacts/0c/0cac0837b400a2c54140bbd4746734b8 new file mode 100644 index 0000000..62427c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0cac0837b400a2c54140bbd4746734b8 differ diff --git a/PatchTestProject/Library/Artifacts/0c/0ce3761569930637554471506b5382be b/PatchTestProject/Library/Artifacts/0c/0ce3761569930637554471506b5382be new file mode 100644 index 0000000..872cbec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0ce3761569930637554471506b5382be differ diff --git a/PatchTestProject/Library/Artifacts/0c/0cf678ca4d70e22d791045a894e2999b b/PatchTestProject/Library/Artifacts/0c/0cf678ca4d70e22d791045a894e2999b new file mode 100644 index 0000000..d2015b2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0c/0cf678ca4d70e22d791045a894e2999b differ diff --git a/PatchTestProject/Library/Artifacts/0d/0d299c1f8f7df19d67f8b0db7c09eafa b/PatchTestProject/Library/Artifacts/0d/0d299c1f8f7df19d67f8b0db7c09eafa new file mode 100644 index 0000000..19f7d2b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0d299c1f8f7df19d67f8b0db7c09eafa differ diff --git a/PatchTestProject/Library/Artifacts/0d/0d3610da650fefe6d1148d274c25589f b/PatchTestProject/Library/Artifacts/0d/0d3610da650fefe6d1148d274c25589f new file mode 100644 index 0000000..4544a3c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0d3610da650fefe6d1148d274c25589f differ diff --git a/PatchTestProject/Library/Artifacts/0d/0d3df06397777cbef3dcf1c656b0a291 b/PatchTestProject/Library/Artifacts/0d/0d3df06397777cbef3dcf1c656b0a291 new file mode 100644 index 0000000..3f89e2d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0d3df06397777cbef3dcf1c656b0a291 differ diff --git a/PatchTestProject/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 b/PatchTestProject/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 new file mode 100644 index 0000000..3f93384 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 differ diff --git a/PatchTestProject/Library/Artifacts/0d/0d9b7a426fdc314ed892f0e4edd227d7 b/PatchTestProject/Library/Artifacts/0d/0d9b7a426fdc314ed892f0e4edd227d7 new file mode 100644 index 0000000..71f1b41 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0d9b7a426fdc314ed892f0e4edd227d7 differ diff --git a/PatchTestProject/Library/Artifacts/0d/0db08cfac11e9659f470a42c9b96f6c8 b/PatchTestProject/Library/Artifacts/0d/0db08cfac11e9659f470a42c9b96f6c8 new file mode 100644 index 0000000..295109c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0db08cfac11e9659f470a42c9b96f6c8 differ diff --git a/PatchTestProject/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 b/PatchTestProject/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 new file mode 100644 index 0000000..5d5f867 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 differ diff --git a/PatchTestProject/Library/Artifacts/0e/0e0d66b6b69936c9972df552effa3268 b/PatchTestProject/Library/Artifacts/0e/0e0d66b6b69936c9972df552effa3268 new file mode 100644 index 0000000..81c3276 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0e/0e0d66b6b69936c9972df552effa3268 differ diff --git a/PatchTestProject/Library/Artifacts/0e/0e5b4eead28569e6f5797b43b63fda90 b/PatchTestProject/Library/Artifacts/0e/0e5b4eead28569e6f5797b43b63fda90 new file mode 100644 index 0000000..3753410 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0e/0e5b4eead28569e6f5797b43b63fda90 differ diff --git a/PatchTestProject/Library/Artifacts/0e/0e87fc48c8d2e6dded372f8c6a36e6d8 b/PatchTestProject/Library/Artifacts/0e/0e87fc48c8d2e6dded372f8c6a36e6d8 new file mode 100644 index 0000000..165f7ad Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0e/0e87fc48c8d2e6dded372f8c6a36e6d8 differ diff --git a/PatchTestProject/Library/Artifacts/0e/0eb1149914c9e1a75881a53ce47cdeb3 b/PatchTestProject/Library/Artifacts/0e/0eb1149914c9e1a75881a53ce47cdeb3 new file mode 100644 index 0000000..cf31e07 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0e/0eb1149914c9e1a75881a53ce47cdeb3 differ diff --git a/PatchTestProject/Library/Artifacts/0e/0efc38f177e4289e644ad823d9940815 b/PatchTestProject/Library/Artifacts/0e/0efc38f177e4289e644ad823d9940815 new file mode 100644 index 0000000..9522778 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0e/0efc38f177e4289e644ad823d9940815 differ diff --git a/PatchTestProject/Library/Artifacts/0f/0f1147cbc8c4dd416014133e181fa7ca b/PatchTestProject/Library/Artifacts/0f/0f1147cbc8c4dd416014133e181fa7ca new file mode 100644 index 0000000..bfd996a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0f/0f1147cbc8c4dd416014133e181fa7ca differ diff --git a/PatchTestProject/Library/Artifacts/0f/0f11c0db6b2cef651f2b8c836e0a79bc b/PatchTestProject/Library/Artifacts/0f/0f11c0db6b2cef651f2b8c836e0a79bc new file mode 100644 index 0000000..07301c3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0f/0f11c0db6b2cef651f2b8c836e0a79bc differ diff --git a/PatchTestProject/Library/Artifacts/0f/0f479a16916e7b8d41e8b06791f8ee23 b/PatchTestProject/Library/Artifacts/0f/0f479a16916e7b8d41e8b06791f8ee23 new file mode 100644 index 0000000..912da0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0f/0f479a16916e7b8d41e8b06791f8ee23 differ diff --git a/PatchTestProject/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e b/PatchTestProject/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e new file mode 100644 index 0000000..0a07fb7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e differ diff --git a/PatchTestProject/Library/Artifacts/10/102bed11ef891a4b0c7548288f09f495 b/PatchTestProject/Library/Artifacts/10/102bed11ef891a4b0c7548288f09f495 new file mode 100644 index 0000000..f0f3fbb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/10/102bed11ef891a4b0c7548288f09f495 differ diff --git a/PatchTestProject/Library/Artifacts/10/10373102fc26da2e3f402b72221437aa b/PatchTestProject/Library/Artifacts/10/10373102fc26da2e3f402b72221437aa new file mode 100644 index 0000000..10ede66 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/10/10373102fc26da2e3f402b72221437aa differ diff --git a/PatchTestProject/Library/Artifacts/10/104464c5bdfcd4192034daa96f980f0d b/PatchTestProject/Library/Artifacts/10/104464c5bdfcd4192034daa96f980f0d new file mode 100644 index 0000000..4b0366a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/10/104464c5bdfcd4192034daa96f980f0d differ diff --git a/PatchTestProject/Library/Artifacts/10/105e0b10f82371ba16fdfb4d4bd3a28c b/PatchTestProject/Library/Artifacts/10/105e0b10f82371ba16fdfb4d4bd3a28c new file mode 100644 index 0000000..fc06a95 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/10/105e0b10f82371ba16fdfb4d4bd3a28c differ diff --git a/PatchTestProject/Library/Artifacts/10/108b15b86e1aaa10e055a40eedbb03fb b/PatchTestProject/Library/Artifacts/10/108b15b86e1aaa10e055a40eedbb03fb new file mode 100644 index 0000000..bcd5b59 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/10/108b15b86e1aaa10e055a40eedbb03fb differ diff --git a/PatchTestProject/Library/Artifacts/11/11136e8dc3caafbcbd6ff4d569acef60 b/PatchTestProject/Library/Artifacts/11/11136e8dc3caafbcbd6ff4d569acef60 new file mode 100644 index 0000000..e64154b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/11136e8dc3caafbcbd6ff4d569acef60 differ diff --git a/PatchTestProject/Library/Artifacts/11/1122ed9db27e35d272a4605489945d1a b/PatchTestProject/Library/Artifacts/11/1122ed9db27e35d272a4605489945d1a new file mode 100644 index 0000000..e8ed153 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/1122ed9db27e35d272a4605489945d1a differ diff --git a/PatchTestProject/Library/Artifacts/11/1132f4026abc1a71c5e97612ad272fd5 b/PatchTestProject/Library/Artifacts/11/1132f4026abc1a71c5e97612ad272fd5 new file mode 100644 index 0000000..a504489 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/1132f4026abc1a71c5e97612ad272fd5 differ diff --git a/PatchTestProject/Library/Artifacts/11/113e9ff7cfe6729c15c9717df21c22fd b/PatchTestProject/Library/Artifacts/11/113e9ff7cfe6729c15c9717df21c22fd new file mode 100644 index 0000000..3b324b7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/113e9ff7cfe6729c15c9717df21c22fd differ diff --git a/PatchTestProject/Library/Artifacts/11/1155cdfc949f1736968dc4936ce3a85a b/PatchTestProject/Library/Artifacts/11/1155cdfc949f1736968dc4936ce3a85a new file mode 100644 index 0000000..aaa87ba Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/1155cdfc949f1736968dc4936ce3a85a differ diff --git a/PatchTestProject/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 b/PatchTestProject/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 new file mode 100644 index 0000000..6d9b313 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 differ diff --git a/PatchTestProject/Library/Artifacts/11/119636ffd0067ff2d278518e5eb7fd70 b/PatchTestProject/Library/Artifacts/11/119636ffd0067ff2d278518e5eb7fd70 new file mode 100644 index 0000000..66f071c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/119636ffd0067ff2d278518e5eb7fd70 differ diff --git a/PatchTestProject/Library/Artifacts/11/119959ee837b30548baef2ec0c7b5018 b/PatchTestProject/Library/Artifacts/11/119959ee837b30548baef2ec0c7b5018 new file mode 100644 index 0000000..760bdc5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/119959ee837b30548baef2ec0c7b5018 differ diff --git a/PatchTestProject/Library/Artifacts/11/11ecd2e291024248f632ccb1c56b51ce b/PatchTestProject/Library/Artifacts/11/11ecd2e291024248f632ccb1c56b51ce new file mode 100644 index 0000000..b21818d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/11/11ecd2e291024248f632ccb1c56b51ce differ diff --git a/PatchTestProject/Library/Artifacts/12/121f10ec66df18f9cf551cdcb8f57b43 b/PatchTestProject/Library/Artifacts/12/121f10ec66df18f9cf551cdcb8f57b43 new file mode 100644 index 0000000..7081363 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/121f10ec66df18f9cf551cdcb8f57b43 differ diff --git a/PatchTestProject/Library/Artifacts/12/123527805ae007ac9c8e67f86faae3f6 b/PatchTestProject/Library/Artifacts/12/123527805ae007ac9c8e67f86faae3f6 new file mode 100644 index 0000000..d094086 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/123527805ae007ac9c8e67f86faae3f6 differ diff --git a/PatchTestProject/Library/Artifacts/12/127fd1ed7854863e07f81597f05d87e8 b/PatchTestProject/Library/Artifacts/12/127fd1ed7854863e07f81597f05d87e8 new file mode 100644 index 0000000..9a52131 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/127fd1ed7854863e07f81597f05d87e8 differ diff --git a/PatchTestProject/Library/Artifacts/12/128c9e74bfa798eeca48d9296416f99b b/PatchTestProject/Library/Artifacts/12/128c9e74bfa798eeca48d9296416f99b new file mode 100644 index 0000000..c74de88 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/128c9e74bfa798eeca48d9296416f99b differ diff --git a/PatchTestProject/Library/Artifacts/12/1296feddf62c9bab7ec89e0cc10b21ff b/PatchTestProject/Library/Artifacts/12/1296feddf62c9bab7ec89e0cc10b21ff new file mode 100644 index 0000000..9fb5511 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/1296feddf62c9bab7ec89e0cc10b21ff differ diff --git a/PatchTestProject/Library/Artifacts/12/12a0cb46b6da62c9aaaddbac0f5dc4ef b/PatchTestProject/Library/Artifacts/12/12a0cb46b6da62c9aaaddbac0f5dc4ef new file mode 100644 index 0000000..a0e177f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/12a0cb46b6da62c9aaaddbac0f5dc4ef differ diff --git a/PatchTestProject/Library/Artifacts/12/12a0fbddd2ff6c9b4965af7b39c76bf3 b/PatchTestProject/Library/Artifacts/12/12a0fbddd2ff6c9b4965af7b39c76bf3 new file mode 100644 index 0000000..0532f94 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/12a0fbddd2ff6c9b4965af7b39c76bf3 differ diff --git a/PatchTestProject/Library/Artifacts/12/12a596762fde1e876d967f6fc3313844 b/PatchTestProject/Library/Artifacts/12/12a596762fde1e876d967f6fc3313844 new file mode 100644 index 0000000..fc43d2d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/12/12a596762fde1e876d967f6fc3313844 differ diff --git a/PatchTestProject/Library/Artifacts/13/138107c4bd1f41686079a554cdd92a52 b/PatchTestProject/Library/Artifacts/13/138107c4bd1f41686079a554cdd92a52 new file mode 100644 index 0000000..ed27826 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/13/138107c4bd1f41686079a554cdd92a52 differ diff --git a/PatchTestProject/Library/Artifacts/13/13a4e5c0eac6954ede20d492d253461f b/PatchTestProject/Library/Artifacts/13/13a4e5c0eac6954ede20d492d253461f new file mode 100644 index 0000000..37a5442 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/13/13a4e5c0eac6954ede20d492d253461f differ diff --git a/PatchTestProject/Library/Artifacts/13/13b1b515f6c5c93cf73286b2550e1716 b/PatchTestProject/Library/Artifacts/13/13b1b515f6c5c93cf73286b2550e1716 new file mode 100644 index 0000000..4344042 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/13/13b1b515f6c5c93cf73286b2550e1716 differ diff --git a/PatchTestProject/Library/Artifacts/13/13e3c1ec8ab63d530525209af96b20c4 b/PatchTestProject/Library/Artifacts/13/13e3c1ec8ab63d530525209af96b20c4 new file mode 100644 index 0000000..a2329fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/13/13e3c1ec8ab63d530525209af96b20c4 differ diff --git a/PatchTestProject/Library/Artifacts/14/1411e750971497eb8e485dbde507a6b9 b/PatchTestProject/Library/Artifacts/14/1411e750971497eb8e485dbde507a6b9 new file mode 100644 index 0000000..ce41aef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/14/1411e750971497eb8e485dbde507a6b9 differ diff --git a/PatchTestProject/Library/Artifacts/14/144c1ccdf6b8ad9b1301609ca91e7ad4 b/PatchTestProject/Library/Artifacts/14/144c1ccdf6b8ad9b1301609ca91e7ad4 new file mode 100644 index 0000000..ebb9ffa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/14/144c1ccdf6b8ad9b1301609ca91e7ad4 differ diff --git a/PatchTestProject/Library/Artifacts/14/14ab16114219e92326a2728f606c7cd6 b/PatchTestProject/Library/Artifacts/14/14ab16114219e92326a2728f606c7cd6 new file mode 100644 index 0000000..cef809e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/14/14ab16114219e92326a2728f606c7cd6 differ diff --git a/PatchTestProject/Library/Artifacts/14/14c0d0c771f8fb1cde9a2708afee49c5 b/PatchTestProject/Library/Artifacts/14/14c0d0c771f8fb1cde9a2708afee49c5 new file mode 100644 index 0000000..7b1d540 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/14/14c0d0c771f8fb1cde9a2708afee49c5 differ diff --git a/PatchTestProject/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 b/PatchTestProject/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 new file mode 100644 index 0000000..da35bff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 differ diff --git a/PatchTestProject/Library/Artifacts/14/14ee8569007f60434fdc86d2119b5f64 b/PatchTestProject/Library/Artifacts/14/14ee8569007f60434fdc86d2119b5f64 new file mode 100644 index 0000000..8a66c32 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/14/14ee8569007f60434fdc86d2119b5f64 differ diff --git a/PatchTestProject/Library/Artifacts/15/15800ff31e7ab8ff25dc3816234150bf b/PatchTestProject/Library/Artifacts/15/15800ff31e7ab8ff25dc3816234150bf new file mode 100644 index 0000000..18650fa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/15/15800ff31e7ab8ff25dc3816234150bf differ diff --git a/PatchTestProject/Library/Artifacts/15/1596c7f65482a42459ef7de341ad1cd2 b/PatchTestProject/Library/Artifacts/15/1596c7f65482a42459ef7de341ad1cd2 new file mode 100644 index 0000000..ab57d3d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/15/1596c7f65482a42459ef7de341ad1cd2 differ diff --git a/PatchTestProject/Library/Artifacts/15/15a890232c7e955c54c1641030b17687 b/PatchTestProject/Library/Artifacts/15/15a890232c7e955c54c1641030b17687 new file mode 100644 index 0000000..9308adb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/15/15a890232c7e955c54c1641030b17687 differ diff --git a/PatchTestProject/Library/Artifacts/15/15c2c3e1bc542f7415634cd47818b681 b/PatchTestProject/Library/Artifacts/15/15c2c3e1bc542f7415634cd47818b681 new file mode 100644 index 0000000..3670bde Binary files /dev/null and b/PatchTestProject/Library/Artifacts/15/15c2c3e1bc542f7415634cd47818b681 differ diff --git a/PatchTestProject/Library/Artifacts/15/15ec4b0ec52b5c6b08a9b467b80c0eac b/PatchTestProject/Library/Artifacts/15/15ec4b0ec52b5c6b08a9b467b80c0eac new file mode 100644 index 0000000..88e44bc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/15/15ec4b0ec52b5c6b08a9b467b80c0eac differ diff --git a/PatchTestProject/Library/Artifacts/16/160cb6a7dca04f53e84a62a55cb75626 b/PatchTestProject/Library/Artifacts/16/160cb6a7dca04f53e84a62a55cb75626 new file mode 100644 index 0000000..b76b11c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/160cb6a7dca04f53e84a62a55cb75626 differ diff --git a/PatchTestProject/Library/Artifacts/16/16148d175156c150ba924017094c31e0 b/PatchTestProject/Library/Artifacts/16/16148d175156c150ba924017094c31e0 new file mode 100644 index 0000000..e3697de Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/16148d175156c150ba924017094c31e0 differ diff --git a/PatchTestProject/Library/Artifacts/16/1640a4a527f63658a38d1874e702c397 b/PatchTestProject/Library/Artifacts/16/1640a4a527f63658a38d1874e702c397 new file mode 100644 index 0000000..046d6ec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/1640a4a527f63658a38d1874e702c397 differ diff --git a/PatchTestProject/Library/Artifacts/16/1649ca8df41c1b9f541cb1b9666277d6 b/PatchTestProject/Library/Artifacts/16/1649ca8df41c1b9f541cb1b9666277d6 new file mode 100644 index 0000000..4e604cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/1649ca8df41c1b9f541cb1b9666277d6 differ diff --git a/PatchTestProject/Library/Artifacts/16/166f83f85d4acbaacb4f075cd32d0efd b/PatchTestProject/Library/Artifacts/16/166f83f85d4acbaacb4f075cd32d0efd new file mode 100644 index 0000000..c3de114 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/166f83f85d4acbaacb4f075cd32d0efd differ diff --git a/PatchTestProject/Library/Artifacts/16/167bb397a4efb39a37923c1e10fbb421 b/PatchTestProject/Library/Artifacts/16/167bb397a4efb39a37923c1e10fbb421 new file mode 100644 index 0000000..aeaa16d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/167bb397a4efb39a37923c1e10fbb421 differ diff --git a/PatchTestProject/Library/Artifacts/16/16b633a86db5cfd3d5742d8881a7e15a b/PatchTestProject/Library/Artifacts/16/16b633a86db5cfd3d5742d8881a7e15a new file mode 100644 index 0000000..98d2b8f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/16b633a86db5cfd3d5742d8881a7e15a differ diff --git a/PatchTestProject/Library/Artifacts/16/16f45da5e60a4d62419a698954f2a7bc b/PatchTestProject/Library/Artifacts/16/16f45da5e60a4d62419a698954f2a7bc new file mode 100644 index 0000000..1236ea3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/16/16f45da5e60a4d62419a698954f2a7bc differ diff --git a/PatchTestProject/Library/Artifacts/17/17122f323838d903669ffb9643f56484 b/PatchTestProject/Library/Artifacts/17/17122f323838d903669ffb9643f56484 new file mode 100644 index 0000000..915dc93 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/17122f323838d903669ffb9643f56484 differ diff --git a/PatchTestProject/Library/Artifacts/17/171504a735495b97c83e747bcaacf240 b/PatchTestProject/Library/Artifacts/17/171504a735495b97c83e747bcaacf240 new file mode 100644 index 0000000..e47008e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/171504a735495b97c83e747bcaacf240 differ diff --git a/PatchTestProject/Library/Artifacts/17/17318d7060d2fd474f9ac2216c74c79b b/PatchTestProject/Library/Artifacts/17/17318d7060d2fd474f9ac2216c74c79b new file mode 100644 index 0000000..57d0827 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/17318d7060d2fd474f9ac2216c74c79b differ diff --git a/PatchTestProject/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 b/PatchTestProject/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 new file mode 100644 index 0000000..26ed746 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 differ diff --git a/PatchTestProject/Library/Artifacts/17/177aaa193cfcacd255749f625d87ef80 b/PatchTestProject/Library/Artifacts/17/177aaa193cfcacd255749f625d87ef80 new file mode 100644 index 0000000..ae6d5ed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/177aaa193cfcacd255749f625d87ef80 differ diff --git a/PatchTestProject/Library/Artifacts/17/17a7fef874c1392d4dfc01e0bb30b4ad b/PatchTestProject/Library/Artifacts/17/17a7fef874c1392d4dfc01e0bb30b4ad new file mode 100644 index 0000000..785f912 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/17a7fef874c1392d4dfc01e0bb30b4ad differ diff --git a/PatchTestProject/Library/Artifacts/17/17b2d6b1247e21048d7e56fbc668f497 b/PatchTestProject/Library/Artifacts/17/17b2d6b1247e21048d7e56fbc668f497 new file mode 100644 index 0000000..dcf927e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/17b2d6b1247e21048d7e56fbc668f497 differ diff --git a/PatchTestProject/Library/Artifacts/17/17e0382d5601977021ed146b1c010efe b/PatchTestProject/Library/Artifacts/17/17e0382d5601977021ed146b1c010efe new file mode 100644 index 0000000..24037d0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/17e0382d5601977021ed146b1c010efe differ diff --git a/PatchTestProject/Library/Artifacts/17/17fdb03faa0092a41bbe798407374d69 b/PatchTestProject/Library/Artifacts/17/17fdb03faa0092a41bbe798407374d69 new file mode 100644 index 0000000..5d399d2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/17/17fdb03faa0092a41bbe798407374d69 differ diff --git a/PatchTestProject/Library/Artifacts/18/1805e27581ade78f79f40808329b3f1e b/PatchTestProject/Library/Artifacts/18/1805e27581ade78f79f40808329b3f1e new file mode 100644 index 0000000..0c84835 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/1805e27581ade78f79f40808329b3f1e differ diff --git a/PatchTestProject/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 b/PatchTestProject/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 new file mode 100644 index 0000000..255a529 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 differ diff --git a/PatchTestProject/Library/Artifacts/18/1851bf1d35e1dfc3fc5dd01a5719a4d4 b/PatchTestProject/Library/Artifacts/18/1851bf1d35e1dfc3fc5dd01a5719a4d4 new file mode 100644 index 0000000..f970345 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/1851bf1d35e1dfc3fc5dd01a5719a4d4 differ diff --git a/PatchTestProject/Library/Artifacts/18/187718abc7f01fa60cb59e6b96ccf849 b/PatchTestProject/Library/Artifacts/18/187718abc7f01fa60cb59e6b96ccf849 new file mode 100644 index 0000000..21527b2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/187718abc7f01fa60cb59e6b96ccf849 differ diff --git a/PatchTestProject/Library/Artifacts/18/18927db76b075b1c877ae506e982fdb4 b/PatchTestProject/Library/Artifacts/18/18927db76b075b1c877ae506e982fdb4 new file mode 100644 index 0000000..f7d3dbe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/18927db76b075b1c877ae506e982fdb4 differ diff --git a/PatchTestProject/Library/Artifacts/18/18e570a9d445ab3260823072d3de6d80 b/PatchTestProject/Library/Artifacts/18/18e570a9d445ab3260823072d3de6d80 new file mode 100644 index 0000000..19ef771 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/18e570a9d445ab3260823072d3de6d80 differ diff --git a/PatchTestProject/Library/Artifacts/18/18fe5808be5a4bf60f2493bc6106b47f b/PatchTestProject/Library/Artifacts/18/18fe5808be5a4bf60f2493bc6106b47f new file mode 100644 index 0000000..5628b49 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/18/18fe5808be5a4bf60f2493bc6106b47f differ diff --git a/PatchTestProject/Library/Artifacts/19/1913d17fce35b46ad13c496b58ad6074 b/PatchTestProject/Library/Artifacts/19/1913d17fce35b46ad13c496b58ad6074 new file mode 100644 index 0000000..31bbe2f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/19/1913d17fce35b46ad13c496b58ad6074 differ diff --git a/PatchTestProject/Library/Artifacts/19/1949c064812d3615922cd6b0fadee860 b/PatchTestProject/Library/Artifacts/19/1949c064812d3615922cd6b0fadee860 new file mode 100644 index 0000000..f22fb27 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/19/1949c064812d3615922cd6b0fadee860 differ diff --git a/PatchTestProject/Library/Artifacts/19/1990baf8500b16e96eb2e1d122fe96f4 b/PatchTestProject/Library/Artifacts/19/1990baf8500b16e96eb2e1d122fe96f4 new file mode 100644 index 0000000..9201f7a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/19/1990baf8500b16e96eb2e1d122fe96f4 differ diff --git a/PatchTestProject/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 b/PatchTestProject/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 new file mode 100644 index 0000000..83a512b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 differ diff --git a/PatchTestProject/Library/Artifacts/19/19b798780f8ba85e6ea65d0f0a0f3bcc b/PatchTestProject/Library/Artifacts/19/19b798780f8ba85e6ea65d0f0a0f3bcc new file mode 100644 index 0000000..60aa83b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/19/19b798780f8ba85e6ea65d0f0a0f3bcc differ diff --git a/PatchTestProject/Library/Artifacts/1a/1a6b708f29be0cf4586752ed82058015 b/PatchTestProject/Library/Artifacts/1a/1a6b708f29be0cf4586752ed82058015 new file mode 100644 index 0000000..fbe9087 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1a/1a6b708f29be0cf4586752ed82058015 differ diff --git a/PatchTestProject/Library/Artifacts/1a/1a7d9ca9de7123e7a5bb7523d80a2ffb b/PatchTestProject/Library/Artifacts/1a/1a7d9ca9de7123e7a5bb7523d80a2ffb new file mode 100644 index 0000000..b24a756 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1a/1a7d9ca9de7123e7a5bb7523d80a2ffb differ diff --git a/PatchTestProject/Library/Artifacts/1a/1a7f82771e9eeabc3d06a0fc5475b0fb b/PatchTestProject/Library/Artifacts/1a/1a7f82771e9eeabc3d06a0fc5475b0fb new file mode 100644 index 0000000..6e7b7c4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1a/1a7f82771e9eeabc3d06a0fc5475b0fb differ diff --git a/PatchTestProject/Library/Artifacts/1a/1a8cb566f332a0b954f374b1d9f86c79 b/PatchTestProject/Library/Artifacts/1a/1a8cb566f332a0b954f374b1d9f86c79 new file mode 100644 index 0000000..5cc09b5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1a/1a8cb566f332a0b954f374b1d9f86c79 differ diff --git a/PatchTestProject/Library/Artifacts/1b/1b1c0367b062e2ad58d7df655de30646 b/PatchTestProject/Library/Artifacts/1b/1b1c0367b062e2ad58d7df655de30646 new file mode 100644 index 0000000..0e5e888 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1b/1b1c0367b062e2ad58d7df655de30646 differ diff --git a/PatchTestProject/Library/Artifacts/1b/1b36f88e6ed3ab427d9b8f2bcd7eb738 b/PatchTestProject/Library/Artifacts/1b/1b36f88e6ed3ab427d9b8f2bcd7eb738 new file mode 100644 index 0000000..336eb49 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1b/1b36f88e6ed3ab427d9b8f2bcd7eb738 differ diff --git a/PatchTestProject/Library/Artifacts/1b/1b680c2d29fa111ad11d21a878de5266 b/PatchTestProject/Library/Artifacts/1b/1b680c2d29fa111ad11d21a878de5266 new file mode 100644 index 0000000..5c0f27f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1b/1b680c2d29fa111ad11d21a878de5266 differ diff --git a/PatchTestProject/Library/Artifacts/1b/1b80855accfa00d40ea3cbd8d3897e4d b/PatchTestProject/Library/Artifacts/1b/1b80855accfa00d40ea3cbd8d3897e4d new file mode 100644 index 0000000..c481324 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1b/1b80855accfa00d40ea3cbd8d3897e4d differ diff --git a/PatchTestProject/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 b/PatchTestProject/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 new file mode 100644 index 0000000..b1bbc14 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 differ diff --git a/PatchTestProject/Library/Artifacts/1c/1c1d191cde6c2ed7f37631ee30ed3594 b/PatchTestProject/Library/Artifacts/1c/1c1d191cde6c2ed7f37631ee30ed3594 new file mode 100644 index 0000000..5c79872 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1c/1c1d191cde6c2ed7f37631ee30ed3594 differ diff --git a/PatchTestProject/Library/Artifacts/1c/1cad7ffafdde164c106e31e0835ffeff b/PatchTestProject/Library/Artifacts/1c/1cad7ffafdde164c106e31e0835ffeff new file mode 100644 index 0000000..f7c6bab Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1c/1cad7ffafdde164c106e31e0835ffeff differ diff --git a/PatchTestProject/Library/Artifacts/1c/1cd0f8a058c1d32b3ea9c0be87650195 b/PatchTestProject/Library/Artifacts/1c/1cd0f8a058c1d32b3ea9c0be87650195 new file mode 100644 index 0000000..428ec38 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1c/1cd0f8a058c1d32b3ea9c0be87650195 differ diff --git a/PatchTestProject/Library/Artifacts/1c/1ce5a099400a11838bedd557b3bbbf33 b/PatchTestProject/Library/Artifacts/1c/1ce5a099400a11838bedd557b3bbbf33 new file mode 100644 index 0000000..ec8eeca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1c/1ce5a099400a11838bedd557b3bbbf33 differ diff --git a/PatchTestProject/Library/Artifacts/1c/1ced2685907d49aacd0fbe7059f235e0 b/PatchTestProject/Library/Artifacts/1c/1ced2685907d49aacd0fbe7059f235e0 new file mode 100644 index 0000000..f2d63eb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1c/1ced2685907d49aacd0fbe7059f235e0 differ diff --git a/PatchTestProject/Library/Artifacts/1d/1d532ede66a03544c3e97a1b93a8000a b/PatchTestProject/Library/Artifacts/1d/1d532ede66a03544c3e97a1b93a8000a new file mode 100644 index 0000000..b0c2813 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1d/1d532ede66a03544c3e97a1b93a8000a differ diff --git a/PatchTestProject/Library/Artifacts/1d/1d61610c2c8a525a593c4427e84ce69b b/PatchTestProject/Library/Artifacts/1d/1d61610c2c8a525a593c4427e84ce69b new file mode 100644 index 0000000..2001d4b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1d/1d61610c2c8a525a593c4427e84ce69b differ diff --git a/PatchTestProject/Library/Artifacts/1d/1dafe61e7748b01b5f6fef9287ba5733 b/PatchTestProject/Library/Artifacts/1d/1dafe61e7748b01b5f6fef9287ba5733 new file mode 100644 index 0000000..68fa6d9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1d/1dafe61e7748b01b5f6fef9287ba5733 differ diff --git a/PatchTestProject/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 b/PatchTestProject/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 new file mode 100644 index 0000000..b1ff76c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 differ diff --git a/PatchTestProject/Library/Artifacts/1e/1e1546331a4f9019801b414638714325 b/PatchTestProject/Library/Artifacts/1e/1e1546331a4f9019801b414638714325 new file mode 100644 index 0000000..1412960 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1e1546331a4f9019801b414638714325 differ diff --git a/PatchTestProject/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 b/PatchTestProject/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 new file mode 100644 index 0000000..c96d671 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 differ diff --git a/PatchTestProject/Library/Artifacts/1e/1eac4793de8f65162e464dbfaa66aae3 b/PatchTestProject/Library/Artifacts/1e/1eac4793de8f65162e464dbfaa66aae3 new file mode 100644 index 0000000..4c743e8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1eac4793de8f65162e464dbfaa66aae3 differ diff --git a/PatchTestProject/Library/Artifacts/1e/1ebcf8880807aa46f35435da3f9bed2c b/PatchTestProject/Library/Artifacts/1e/1ebcf8880807aa46f35435da3f9bed2c new file mode 100644 index 0000000..97889f8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1ebcf8880807aa46f35435da3f9bed2c differ diff --git a/PatchTestProject/Library/Artifacts/1e/1ebe173214880dff19b4ecec2631e528 b/PatchTestProject/Library/Artifacts/1e/1ebe173214880dff19b4ecec2631e528 new file mode 100644 index 0000000..6006342 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1ebe173214880dff19b4ecec2631e528 differ diff --git a/PatchTestProject/Library/Artifacts/1e/1ec94a3a1f22ab7b2216aba49ffd9800 b/PatchTestProject/Library/Artifacts/1e/1ec94a3a1f22ab7b2216aba49ffd9800 new file mode 100644 index 0000000..1304817 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1ec94a3a1f22ab7b2216aba49ffd9800 differ diff --git a/PatchTestProject/Library/Artifacts/1e/1ecdd1742c05209227b9df67dfa5b0cf b/PatchTestProject/Library/Artifacts/1e/1ecdd1742c05209227b9df67dfa5b0cf new file mode 100644 index 0000000..395898f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1ecdd1742c05209227b9df67dfa5b0cf differ diff --git a/PatchTestProject/Library/Artifacts/1e/1efb18c783b65759517bb82cab12a4bf b/PatchTestProject/Library/Artifacts/1e/1efb18c783b65759517bb82cab12a4bf new file mode 100644 index 0000000..dfd65bd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1e/1efb18c783b65759517bb82cab12a4bf differ diff --git a/PatchTestProject/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 b/PatchTestProject/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 new file mode 100644 index 0000000..058d5e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 differ diff --git a/PatchTestProject/Library/Artifacts/1f/1f4c394ba1fb702dfb1d8061b0557314 b/PatchTestProject/Library/Artifacts/1f/1f4c394ba1fb702dfb1d8061b0557314 new file mode 100644 index 0000000..19afa50 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1f/1f4c394ba1fb702dfb1d8061b0557314 differ diff --git a/PatchTestProject/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 b/PatchTestProject/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 new file mode 100644 index 0000000..67ce8dd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 differ diff --git a/PatchTestProject/Library/Artifacts/1f/1ff8452a9b7c5b36fd52cd778edc1dda b/PatchTestProject/Library/Artifacts/1f/1ff8452a9b7c5b36fd52cd778edc1dda new file mode 100644 index 0000000..2ef71b9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/1f/1ff8452a9b7c5b36fd52cd778edc1dda differ diff --git a/PatchTestProject/Library/Artifacts/20/209d739f69ea947dbc07839e0e680357 b/PatchTestProject/Library/Artifacts/20/209d739f69ea947dbc07839e0e680357 new file mode 100644 index 0000000..98c33ee Binary files /dev/null and b/PatchTestProject/Library/Artifacts/20/209d739f69ea947dbc07839e0e680357 differ diff --git a/PatchTestProject/Library/Artifacts/20/20bcad662895ebc9a24e0f3d320955ef b/PatchTestProject/Library/Artifacts/20/20bcad662895ebc9a24e0f3d320955ef new file mode 100644 index 0000000..fe8d144 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/20/20bcad662895ebc9a24e0f3d320955ef differ diff --git a/PatchTestProject/Library/Artifacts/20/20ef6273403f14e5ea56debd5c54b948 b/PatchTestProject/Library/Artifacts/20/20ef6273403f14e5ea56debd5c54b948 new file mode 100644 index 0000000..ad1bcc4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/20/20ef6273403f14e5ea56debd5c54b948 differ diff --git a/PatchTestProject/Library/Artifacts/21/2120996177741e5efa4b24ffbd744d57 b/PatchTestProject/Library/Artifacts/21/2120996177741e5efa4b24ffbd744d57 new file mode 100644 index 0000000..e2d3298 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/2120996177741e5efa4b24ffbd744d57 differ diff --git a/PatchTestProject/Library/Artifacts/21/21275837cd63b873f65ad27f9c687773 b/PatchTestProject/Library/Artifacts/21/21275837cd63b873f65ad27f9c687773 new file mode 100644 index 0000000..c931448 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/21275837cd63b873f65ad27f9c687773 differ diff --git a/PatchTestProject/Library/Artifacts/21/216281da886a83c17434d1f1be41eeac b/PatchTestProject/Library/Artifacts/21/216281da886a83c17434d1f1be41eeac new file mode 100644 index 0000000..b351192 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/216281da886a83c17434d1f1be41eeac differ diff --git a/PatchTestProject/Library/Artifacts/21/2172692a3f7abf0ea83264e4034baad9 b/PatchTestProject/Library/Artifacts/21/2172692a3f7abf0ea83264e4034baad9 new file mode 100644 index 0000000..8e02434 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/2172692a3f7abf0ea83264e4034baad9 differ diff --git a/PatchTestProject/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e b/PatchTestProject/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e new file mode 100644 index 0000000..131dd5e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e differ diff --git a/PatchTestProject/Library/Artifacts/21/219f4bd6c89fc938cc9d4b39ba188be2 b/PatchTestProject/Library/Artifacts/21/219f4bd6c89fc938cc9d4b39ba188be2 new file mode 100644 index 0000000..0d73641 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/219f4bd6c89fc938cc9d4b39ba188be2 differ diff --git a/PatchTestProject/Library/Artifacts/21/21c2cf8ee6142a089f5ac61b1d11e3d5 b/PatchTestProject/Library/Artifacts/21/21c2cf8ee6142a089f5ac61b1d11e3d5 new file mode 100644 index 0000000..175175a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/21c2cf8ee6142a089f5ac61b1d11e3d5 differ diff --git a/PatchTestProject/Library/Artifacts/21/21e33f18205238deee40ee32261995db b/PatchTestProject/Library/Artifacts/21/21e33f18205238deee40ee32261995db new file mode 100644 index 0000000..28e5775 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/21e33f18205238deee40ee32261995db differ diff --git a/PatchTestProject/Library/Artifacts/21/21ea03c4516837910de1f512949f867f b/PatchTestProject/Library/Artifacts/21/21ea03c4516837910de1f512949f867f new file mode 100644 index 0000000..e5ecbbb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/21ea03c4516837910de1f512949f867f differ diff --git a/PatchTestProject/Library/Artifacts/21/21f3ac964b368dff56d337f1bbbb0f49 b/PatchTestProject/Library/Artifacts/21/21f3ac964b368dff56d337f1bbbb0f49 new file mode 100644 index 0000000..d79f78c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/21/21f3ac964b368dff56d337f1bbbb0f49 differ diff --git a/PatchTestProject/Library/Artifacts/22/2206a2066ee290bdddb77a486175dca1 b/PatchTestProject/Library/Artifacts/22/2206a2066ee290bdddb77a486175dca1 new file mode 100644 index 0000000..ed55414 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/22/2206a2066ee290bdddb77a486175dca1 differ diff --git a/PatchTestProject/Library/Artifacts/22/220d4f2ab8b7be2dce0dfd160d74c8e3 b/PatchTestProject/Library/Artifacts/22/220d4f2ab8b7be2dce0dfd160d74c8e3 new file mode 100644 index 0000000..5fe737c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/22/220d4f2ab8b7be2dce0dfd160d74c8e3 differ diff --git a/PatchTestProject/Library/Artifacts/22/2222a95909e9b933e757234872c2d530 b/PatchTestProject/Library/Artifacts/22/2222a95909e9b933e757234872c2d530 new file mode 100644 index 0000000..2826093 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/22/2222a95909e9b933e757234872c2d530 differ diff --git a/PatchTestProject/Library/Artifacts/22/22bbfca1da76989abb103329791d5a69 b/PatchTestProject/Library/Artifacts/22/22bbfca1da76989abb103329791d5a69 new file mode 100644 index 0000000..c9cea5b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/22/22bbfca1da76989abb103329791d5a69 differ diff --git a/PatchTestProject/Library/Artifacts/22/22e2fb5b52cbeec0d9d2f8ebf3e74f18 b/PatchTestProject/Library/Artifacts/22/22e2fb5b52cbeec0d9d2f8ebf3e74f18 new file mode 100644 index 0000000..8f64522 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/22/22e2fb5b52cbeec0d9d2f8ebf3e74f18 differ diff --git a/PatchTestProject/Library/Artifacts/22/22fc9c2202cba1e9c4bff8776a1ed33f b/PatchTestProject/Library/Artifacts/22/22fc9c2202cba1e9c4bff8776a1ed33f new file mode 100644 index 0000000..aabd3e5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/22/22fc9c2202cba1e9c4bff8776a1ed33f differ diff --git a/PatchTestProject/Library/Artifacts/23/23183c6a372374782903103350c4eee7 b/PatchTestProject/Library/Artifacts/23/23183c6a372374782903103350c4eee7 new file mode 100644 index 0000000..319ef4c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/23183c6a372374782903103350c4eee7 differ diff --git a/PatchTestProject/Library/Artifacts/23/231917ecd101a664d9a7107abff93170 b/PatchTestProject/Library/Artifacts/23/231917ecd101a664d9a7107abff93170 new file mode 100644 index 0000000..1b008c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/231917ecd101a664d9a7107abff93170 differ diff --git a/PatchTestProject/Library/Artifacts/23/232153d724337d1740726b407e7c6a98 b/PatchTestProject/Library/Artifacts/23/232153d724337d1740726b407e7c6a98 new file mode 100644 index 0000000..f3585ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/232153d724337d1740726b407e7c6a98 differ diff --git a/PatchTestProject/Library/Artifacts/23/2347a0355e1b8c2b889f9dca701d95fc b/PatchTestProject/Library/Artifacts/23/2347a0355e1b8c2b889f9dca701d95fc new file mode 100644 index 0000000..0046996 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/2347a0355e1b8c2b889f9dca701d95fc differ diff --git a/PatchTestProject/Library/Artifacts/23/23625b1ad84facda0d1d8403b3a35984 b/PatchTestProject/Library/Artifacts/23/23625b1ad84facda0d1d8403b3a35984 new file mode 100644 index 0000000..ecdfcbb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/23625b1ad84facda0d1d8403b3a35984 differ diff --git a/PatchTestProject/Library/Artifacts/23/2397e2c92300a792a9b8661a76d5416c b/PatchTestProject/Library/Artifacts/23/2397e2c92300a792a9b8661a76d5416c new file mode 100644 index 0000000..586338a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/2397e2c92300a792a9b8661a76d5416c differ diff --git a/PatchTestProject/Library/Artifacts/23/23b4177f54f90b2098e8fed878266c5b b/PatchTestProject/Library/Artifacts/23/23b4177f54f90b2098e8fed878266c5b new file mode 100644 index 0000000..673f212 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/23b4177f54f90b2098e8fed878266c5b differ diff --git a/PatchTestProject/Library/Artifacts/23/23b87792036fbd3383c0fdb01d5d3ebe b/PatchTestProject/Library/Artifacts/23/23b87792036fbd3383c0fdb01d5d3ebe new file mode 100644 index 0000000..f7d1153 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/23/23b87792036fbd3383c0fdb01d5d3ebe differ diff --git a/PatchTestProject/Library/Artifacts/24/24670f2383861acadb18ffbcec02deed b/PatchTestProject/Library/Artifacts/24/24670f2383861acadb18ffbcec02deed new file mode 100644 index 0000000..edf4140 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/24670f2383861acadb18ffbcec02deed differ diff --git a/PatchTestProject/Library/Artifacts/24/246ae776008ca49b7fca4623d14f4e67 b/PatchTestProject/Library/Artifacts/24/246ae776008ca49b7fca4623d14f4e67 new file mode 100644 index 0000000..55cb171 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/246ae776008ca49b7fca4623d14f4e67 differ diff --git a/PatchTestProject/Library/Artifacts/24/246b5b23a9ac896f0dcea9446b012ca4 b/PatchTestProject/Library/Artifacts/24/246b5b23a9ac896f0dcea9446b012ca4 new file mode 100644 index 0000000..67f3cb1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/246b5b23a9ac896f0dcea9446b012ca4 differ diff --git a/PatchTestProject/Library/Artifacts/24/249585055027bb64510661a79f19d1ec b/PatchTestProject/Library/Artifacts/24/249585055027bb64510661a79f19d1ec new file mode 100644 index 0000000..89e139f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/249585055027bb64510661a79f19d1ec differ diff --git a/PatchTestProject/Library/Artifacts/24/249b6b7f3cfd4a3b14f2529ea6110fa9 b/PatchTestProject/Library/Artifacts/24/249b6b7f3cfd4a3b14f2529ea6110fa9 new file mode 100644 index 0000000..9206a12 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/249b6b7f3cfd4a3b14f2529ea6110fa9 differ diff --git a/PatchTestProject/Library/Artifacts/24/24a31020954e9e24aaa6b2fa6c4ae5c4 b/PatchTestProject/Library/Artifacts/24/24a31020954e9e24aaa6b2fa6c4ae5c4 new file mode 100644 index 0000000..6591dc7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/24a31020954e9e24aaa6b2fa6c4ae5c4 differ diff --git a/PatchTestProject/Library/Artifacts/24/24d5689dd09e6e0bc06a8321474e58be b/PatchTestProject/Library/Artifacts/24/24d5689dd09e6e0bc06a8321474e58be new file mode 100644 index 0000000..274bbb3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/24d5689dd09e6e0bc06a8321474e58be differ diff --git a/PatchTestProject/Library/Artifacts/24/24e34b298d98b5c2b0b42597a413f02c b/PatchTestProject/Library/Artifacts/24/24e34b298d98b5c2b0b42597a413f02c new file mode 100644 index 0000000..5dc78a3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/24/24e34b298d98b5c2b0b42597a413f02c differ diff --git a/PatchTestProject/Library/Artifacts/25/25014c2ec2277c4ead9383f2f3824d8d b/PatchTestProject/Library/Artifacts/25/25014c2ec2277c4ead9383f2f3824d8d new file mode 100644 index 0000000..96ca229 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/25/25014c2ec2277c4ead9383f2f3824d8d differ diff --git a/PatchTestProject/Library/Artifacts/25/2509dcab9ed371c0eaa018f06125be17 b/PatchTestProject/Library/Artifacts/25/2509dcab9ed371c0eaa018f06125be17 new file mode 100644 index 0000000..4ccd342 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/25/2509dcab9ed371c0eaa018f06125be17 differ diff --git a/PatchTestProject/Library/Artifacts/25/252d3878c652220b863c97f37645b371 b/PatchTestProject/Library/Artifacts/25/252d3878c652220b863c97f37645b371 new file mode 100644 index 0000000..b205878 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/25/252d3878c652220b863c97f37645b371 differ diff --git a/PatchTestProject/Library/Artifacts/25/254563c82c7a3c81b47d76611078aac4 b/PatchTestProject/Library/Artifacts/25/254563c82c7a3c81b47d76611078aac4 new file mode 100644 index 0000000..64db91a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/25/254563c82c7a3c81b47d76611078aac4 differ diff --git a/PatchTestProject/Library/Artifacts/25/25f0f4de869b35670a7082d4ebad2ea9 b/PatchTestProject/Library/Artifacts/25/25f0f4de869b35670a7082d4ebad2ea9 new file mode 100644 index 0000000..e046079 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/25/25f0f4de869b35670a7082d4ebad2ea9 differ diff --git a/PatchTestProject/Library/Artifacts/26/261af59bcab83f3e997aba68627cb05a b/PatchTestProject/Library/Artifacts/26/261af59bcab83f3e997aba68627cb05a new file mode 100644 index 0000000..3f0e8b2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/26/261af59bcab83f3e997aba68627cb05a differ diff --git a/PatchTestProject/Library/Artifacts/26/2624f82fd6f58d0e7a3b0e1e559bb641 b/PatchTestProject/Library/Artifacts/26/2624f82fd6f58d0e7a3b0e1e559bb641 new file mode 100644 index 0000000..acac10f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/26/2624f82fd6f58d0e7a3b0e1e559bb641 differ diff --git a/PatchTestProject/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 b/PatchTestProject/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 new file mode 100644 index 0000000..5c2fb6c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 differ diff --git a/PatchTestProject/Library/Artifacts/26/2638eae764a6b552755a752c6d843c7b b/PatchTestProject/Library/Artifacts/26/2638eae764a6b552755a752c6d843c7b new file mode 100644 index 0000000..4fd254f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/26/2638eae764a6b552755a752c6d843c7b differ diff --git a/PatchTestProject/Library/Artifacts/26/26eb032f28f73f3847df2e93a334714e b/PatchTestProject/Library/Artifacts/26/26eb032f28f73f3847df2e93a334714e new file mode 100644 index 0000000..c6b58e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/26/26eb032f28f73f3847df2e93a334714e differ diff --git a/PatchTestProject/Library/Artifacts/27/270a691d37f0d9fa8e004e74a987f548 b/PatchTestProject/Library/Artifacts/27/270a691d37f0d9fa8e004e74a987f548 new file mode 100644 index 0000000..e03b83d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/27/270a691d37f0d9fa8e004e74a987f548 differ diff --git a/PatchTestProject/Library/Artifacts/27/27417ef1592560d4a12ac1b5042b9a5b b/PatchTestProject/Library/Artifacts/27/27417ef1592560d4a12ac1b5042b9a5b new file mode 100644 index 0000000..51f0749 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/27/27417ef1592560d4a12ac1b5042b9a5b differ diff --git a/PatchTestProject/Library/Artifacts/27/27c233b6c41738e11fc26a9cb864c85f b/PatchTestProject/Library/Artifacts/27/27c233b6c41738e11fc26a9cb864c85f new file mode 100644 index 0000000..f17017b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/27/27c233b6c41738e11fc26a9cb864c85f differ diff --git a/PatchTestProject/Library/Artifacts/28/2838f035419f75a28ad6cca0e539be74 b/PatchTestProject/Library/Artifacts/28/2838f035419f75a28ad6cca0e539be74 new file mode 100644 index 0000000..52c6272 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/28/2838f035419f75a28ad6cca0e539be74 differ diff --git a/PatchTestProject/Library/Artifacts/29/294d190cec74576f66ad214620589021 b/PatchTestProject/Library/Artifacts/29/294d190cec74576f66ad214620589021 new file mode 100644 index 0000000..8468a4b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/29/294d190cec74576f66ad214620589021 differ diff --git a/PatchTestProject/Library/Artifacts/29/29673e8d5a3ea16413a8fe6c560e5751 b/PatchTestProject/Library/Artifacts/29/29673e8d5a3ea16413a8fe6c560e5751 new file mode 100644 index 0000000..1341dd7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/29/29673e8d5a3ea16413a8fe6c560e5751 differ diff --git a/PatchTestProject/Library/Artifacts/29/29989e8b11e68ffd2a04c75b0f51e994 b/PatchTestProject/Library/Artifacts/29/29989e8b11e68ffd2a04c75b0f51e994 new file mode 100644 index 0000000..8393d57 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/29/29989e8b11e68ffd2a04c75b0f51e994 differ diff --git a/PatchTestProject/Library/Artifacts/2a/2a0a0113790a3ae3547465a491818bab b/PatchTestProject/Library/Artifacts/2a/2a0a0113790a3ae3547465a491818bab new file mode 100644 index 0000000..2c79a80 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2a0a0113790a3ae3547465a491818bab differ diff --git a/PatchTestProject/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 b/PatchTestProject/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 new file mode 100644 index 0000000..b70fff4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 differ diff --git a/PatchTestProject/Library/Artifacts/2a/2a659cd26fc2c6215a8ccaca7accff92 b/PatchTestProject/Library/Artifacts/2a/2a659cd26fc2c6215a8ccaca7accff92 new file mode 100644 index 0000000..2651fbc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2a659cd26fc2c6215a8ccaca7accff92 differ diff --git a/PatchTestProject/Library/Artifacts/2a/2a69c23ae6e222818ada118f360ba15a b/PatchTestProject/Library/Artifacts/2a/2a69c23ae6e222818ada118f360ba15a new file mode 100644 index 0000000..c9483ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2a69c23ae6e222818ada118f360ba15a differ diff --git a/PatchTestProject/Library/Artifacts/2a/2a70b2fb1773ebc63de93a2a430add12 b/PatchTestProject/Library/Artifacts/2a/2a70b2fb1773ebc63de93a2a430add12 new file mode 100644 index 0000000..1ac3d83 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2a70b2fb1773ebc63de93a2a430add12 differ diff --git a/PatchTestProject/Library/Artifacts/2a/2abfc79d1789b13180e7743bcd18b38d b/PatchTestProject/Library/Artifacts/2a/2abfc79d1789b13180e7743bcd18b38d new file mode 100644 index 0000000..2385795 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2abfc79d1789b13180e7743bcd18b38d differ diff --git a/PatchTestProject/Library/Artifacts/2a/2ad8f4f34bee0a7cffb3e4eed71e256b b/PatchTestProject/Library/Artifacts/2a/2ad8f4f34bee0a7cffb3e4eed71e256b new file mode 100644 index 0000000..9d433ec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2ad8f4f34bee0a7cffb3e4eed71e256b differ diff --git a/PatchTestProject/Library/Artifacts/2a/2af46030d6074895d3db03704757df44 b/PatchTestProject/Library/Artifacts/2a/2af46030d6074895d3db03704757df44 new file mode 100644 index 0000000..abade61 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2a/2af46030d6074895d3db03704757df44 differ diff --git a/PatchTestProject/Library/Artifacts/2b/2b09d1a916920ce8af7977d979e5f374 b/PatchTestProject/Library/Artifacts/2b/2b09d1a916920ce8af7977d979e5f374 new file mode 100644 index 0000000..8cfbb2f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2b/2b09d1a916920ce8af7977d979e5f374 differ diff --git a/PatchTestProject/Library/Artifacts/2b/2b44a955d07d148e70df9c4ad34b0b19 b/PatchTestProject/Library/Artifacts/2b/2b44a955d07d148e70df9c4ad34b0b19 new file mode 100644 index 0000000..cd93904 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2b/2b44a955d07d148e70df9c4ad34b0b19 differ diff --git a/PatchTestProject/Library/Artifacts/2b/2baa88356d2d1a1fc4c599262bd937e6 b/PatchTestProject/Library/Artifacts/2b/2baa88356d2d1a1fc4c599262bd937e6 new file mode 100644 index 0000000..2a6991d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2b/2baa88356d2d1a1fc4c599262bd937e6 differ diff --git a/PatchTestProject/Library/Artifacts/2b/2bba2adf993a53e942fbf1698efb73c5 b/PatchTestProject/Library/Artifacts/2b/2bba2adf993a53e942fbf1698efb73c5 new file mode 100644 index 0000000..1cf78ea Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2b/2bba2adf993a53e942fbf1698efb73c5 differ diff --git a/PatchTestProject/Library/Artifacts/2c/2c96e208971eb0f1643e9f840bee729e b/PatchTestProject/Library/Artifacts/2c/2c96e208971eb0f1643e9f840bee729e new file mode 100644 index 0000000..c54ad26 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2c/2c96e208971eb0f1643e9f840bee729e differ diff --git a/PatchTestProject/Library/Artifacts/2c/2c9f628a874c6cec73de65d30aba370f b/PatchTestProject/Library/Artifacts/2c/2c9f628a874c6cec73de65d30aba370f new file mode 100644 index 0000000..483129c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2c/2c9f628a874c6cec73de65d30aba370f differ diff --git a/PatchTestProject/Library/Artifacts/2c/2cfdb3c93fb603b527bb51bd8c58407c b/PatchTestProject/Library/Artifacts/2c/2cfdb3c93fb603b527bb51bd8c58407c new file mode 100644 index 0000000..d1dac1f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2c/2cfdb3c93fb603b527bb51bd8c58407c differ diff --git a/PatchTestProject/Library/Artifacts/2d/2d232fe62a430a4c1b02828b3397df09 b/PatchTestProject/Library/Artifacts/2d/2d232fe62a430a4c1b02828b3397df09 new file mode 100644 index 0000000..18e4697 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2d/2d232fe62a430a4c1b02828b3397df09 differ diff --git a/PatchTestProject/Library/Artifacts/2d/2d514d0db573c0cf81fbb3bc94a8d730 b/PatchTestProject/Library/Artifacts/2d/2d514d0db573c0cf81fbb3bc94a8d730 new file mode 100644 index 0000000..8132092 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2d/2d514d0db573c0cf81fbb3bc94a8d730 differ diff --git a/PatchTestProject/Library/Artifacts/2d/2d77b1cbe59c90e662d3d6fc0190347e b/PatchTestProject/Library/Artifacts/2d/2d77b1cbe59c90e662d3d6fc0190347e new file mode 100644 index 0000000..ae834f9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2d/2d77b1cbe59c90e662d3d6fc0190347e differ diff --git a/PatchTestProject/Library/Artifacts/2d/2d8297dd078ef22e16073fd6ef025f8b b/PatchTestProject/Library/Artifacts/2d/2d8297dd078ef22e16073fd6ef025f8b new file mode 100644 index 0000000..55b60b2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2d/2d8297dd078ef22e16073fd6ef025f8b differ diff --git a/PatchTestProject/Library/Artifacts/2d/2d98fb19755a4ff490b527ab10265ce8 b/PatchTestProject/Library/Artifacts/2d/2d98fb19755a4ff490b527ab10265ce8 new file mode 100644 index 0000000..132da87 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2d/2d98fb19755a4ff490b527ab10265ce8 differ diff --git a/PatchTestProject/Library/Artifacts/2d/2db14538379e025f1e8278eef4c569f5 b/PatchTestProject/Library/Artifacts/2d/2db14538379e025f1e8278eef4c569f5 new file mode 100644 index 0000000..19d8c19 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2d/2db14538379e025f1e8278eef4c569f5 differ diff --git a/PatchTestProject/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f b/PatchTestProject/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f new file mode 100644 index 0000000..45ed57e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f differ diff --git a/PatchTestProject/Library/Artifacts/2e/2e69c3eaef26d81889704a9f6628f18e b/PatchTestProject/Library/Artifacts/2e/2e69c3eaef26d81889704a9f6628f18e new file mode 100644 index 0000000..600d607 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2e/2e69c3eaef26d81889704a9f6628f18e differ diff --git a/PatchTestProject/Library/Artifacts/2e/2e80e9bda23e2c153b58dcf54fd85d71 b/PatchTestProject/Library/Artifacts/2e/2e80e9bda23e2c153b58dcf54fd85d71 new file mode 100644 index 0000000..edbde84 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2e/2e80e9bda23e2c153b58dcf54fd85d71 differ diff --git a/PatchTestProject/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f b/PatchTestProject/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f new file mode 100644 index 0000000..09dae98 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f differ diff --git a/PatchTestProject/Library/Artifacts/2e/2ef3c9875cf9b81d16b547cb7bda721a b/PatchTestProject/Library/Artifacts/2e/2ef3c9875cf9b81d16b547cb7bda721a new file mode 100644 index 0000000..1d3de87 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2e/2ef3c9875cf9b81d16b547cb7bda721a differ diff --git a/PatchTestProject/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d b/PatchTestProject/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d new file mode 100644 index 0000000..8dd2456 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d differ diff --git a/PatchTestProject/Library/Artifacts/2f/2f55ee1a02b2289dd2d1dd84b124eea2 b/PatchTestProject/Library/Artifacts/2f/2f55ee1a02b2289dd2d1dd84b124eea2 new file mode 100644 index 0000000..c250739 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2f55ee1a02b2289dd2d1dd84b124eea2 differ diff --git a/PatchTestProject/Library/Artifacts/2f/2f63a3f267060f3ccbba761fd6fd4661 b/PatchTestProject/Library/Artifacts/2f/2f63a3f267060f3ccbba761fd6fd4661 new file mode 100644 index 0000000..4f1e4f6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2f63a3f267060f3ccbba761fd6fd4661 differ diff --git a/PatchTestProject/Library/Artifacts/2f/2f923244240538de6ed96fa5684ba5cd b/PatchTestProject/Library/Artifacts/2f/2f923244240538de6ed96fa5684ba5cd new file mode 100644 index 0000000..0be9078 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2f923244240538de6ed96fa5684ba5cd differ diff --git a/PatchTestProject/Library/Artifacts/2f/2fa2f552f229af0a5b424d3cd80d2747 b/PatchTestProject/Library/Artifacts/2f/2fa2f552f229af0a5b424d3cd80d2747 new file mode 100644 index 0000000..1058a9c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2fa2f552f229af0a5b424d3cd80d2747 differ diff --git a/PatchTestProject/Library/Artifacts/2f/2fd51277a69c97149a2c0c8e55422a61 b/PatchTestProject/Library/Artifacts/2f/2fd51277a69c97149a2c0c8e55422a61 new file mode 100644 index 0000000..d426f2c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2fd51277a69c97149a2c0c8e55422a61 differ diff --git a/PatchTestProject/Library/Artifacts/2f/2fe5833c5bd0945286ecbd0f592c720a b/PatchTestProject/Library/Artifacts/2f/2fe5833c5bd0945286ecbd0f592c720a new file mode 100644 index 0000000..a3dab35 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/2f/2fe5833c5bd0945286ecbd0f592c720a differ diff --git a/PatchTestProject/Library/Artifacts/30/3014c23a971b4c923c6275afa128ce4b b/PatchTestProject/Library/Artifacts/30/3014c23a971b4c923c6275afa128ce4b new file mode 100644 index 0000000..4b9a498 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/3014c23a971b4c923c6275afa128ce4b differ diff --git a/PatchTestProject/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 b/PatchTestProject/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 new file mode 100644 index 0000000..162bf34 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 differ diff --git a/PatchTestProject/Library/Artifacts/30/302583d80c632e1df9de493b0e538b36 b/PatchTestProject/Library/Artifacts/30/302583d80c632e1df9de493b0e538b36 new file mode 100644 index 0000000..99bc8bc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/302583d80c632e1df9de493b0e538b36 differ diff --git a/PatchTestProject/Library/Artifacts/30/30394bb118d4ebd2c8df61324e927dcf b/PatchTestProject/Library/Artifacts/30/30394bb118d4ebd2c8df61324e927dcf new file mode 100644 index 0000000..f6d6454 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/30394bb118d4ebd2c8df61324e927dcf differ diff --git a/PatchTestProject/Library/Artifacts/30/307994d86abc7216791eac39e68bbc0c b/PatchTestProject/Library/Artifacts/30/307994d86abc7216791eac39e68bbc0c new file mode 100644 index 0000000..7bd9855 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/307994d86abc7216791eac39e68bbc0c differ diff --git a/PatchTestProject/Library/Artifacts/30/307b8b9200074236a7b7801a4d0d8921 b/PatchTestProject/Library/Artifacts/30/307b8b9200074236a7b7801a4d0d8921 new file mode 100644 index 0000000..ce39a70 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/307b8b9200074236a7b7801a4d0d8921 differ diff --git a/PatchTestProject/Library/Artifacts/30/30932b60b813ef9a024450ca7867684e b/PatchTestProject/Library/Artifacts/30/30932b60b813ef9a024450ca7867684e new file mode 100644 index 0000000..5241ae5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/30932b60b813ef9a024450ca7867684e differ diff --git a/PatchTestProject/Library/Artifacts/30/309b9308a2df31acdc3f5660389c2864 b/PatchTestProject/Library/Artifacts/30/309b9308a2df31acdc3f5660389c2864 new file mode 100644 index 0000000..c4d8ad3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/309b9308a2df31acdc3f5660389c2864 differ diff --git a/PatchTestProject/Library/Artifacts/30/30af4de2e44fbd2c5e50543c33b598fb b/PatchTestProject/Library/Artifacts/30/30af4de2e44fbd2c5e50543c33b598fb new file mode 100644 index 0000000..b5a5404 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/30af4de2e44fbd2c5e50543c33b598fb differ diff --git a/PatchTestProject/Library/Artifacts/30/30b194cac5d16adef0af6133c9d25276 b/PatchTestProject/Library/Artifacts/30/30b194cac5d16adef0af6133c9d25276 new file mode 100644 index 0000000..d916487 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/30b194cac5d16adef0af6133c9d25276 differ diff --git a/PatchTestProject/Library/Artifacts/30/30ecccd30162056930f4ed9b68135218 b/PatchTestProject/Library/Artifacts/30/30ecccd30162056930f4ed9b68135218 new file mode 100644 index 0000000..4479ccf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/30/30ecccd30162056930f4ed9b68135218 differ diff --git a/PatchTestProject/Library/Artifacts/31/31069287b5efc54c4ea9304c879f0a3f b/PatchTestProject/Library/Artifacts/31/31069287b5efc54c4ea9304c879f0a3f new file mode 100644 index 0000000..d3d97cb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/31/31069287b5efc54c4ea9304c879f0a3f differ diff --git a/PatchTestProject/Library/Artifacts/31/3155ca7435100b07b968e6d25e3db564 b/PatchTestProject/Library/Artifacts/31/3155ca7435100b07b968e6d25e3db564 new file mode 100644 index 0000000..27dc76f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/31/3155ca7435100b07b968e6d25e3db564 differ diff --git a/PatchTestProject/Library/Artifacts/31/316122de579d82e0738b1bfee17e945c b/PatchTestProject/Library/Artifacts/31/316122de579d82e0738b1bfee17e945c new file mode 100644 index 0000000..5b635bf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/31/316122de579d82e0738b1bfee17e945c differ diff --git a/PatchTestProject/Library/Artifacts/31/318246ddbd430d3b000e3573e9413519 b/PatchTestProject/Library/Artifacts/31/318246ddbd430d3b000e3573e9413519 new file mode 100644 index 0000000..a0841f5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/31/318246ddbd430d3b000e3573e9413519 differ diff --git a/PatchTestProject/Library/Artifacts/31/31980d8413ec23b26bf4e55f62b5be8c b/PatchTestProject/Library/Artifacts/31/31980d8413ec23b26bf4e55f62b5be8c new file mode 100644 index 0000000..5c811ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/31/31980d8413ec23b26bf4e55f62b5be8c differ diff --git a/PatchTestProject/Library/Artifacts/31/31d260f531f1ea238c13910f112e0cf7 b/PatchTestProject/Library/Artifacts/31/31d260f531f1ea238c13910f112e0cf7 new file mode 100644 index 0000000..64cd8e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/31/31d260f531f1ea238c13910f112e0cf7 differ diff --git a/PatchTestProject/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 b/PatchTestProject/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 new file mode 100644 index 0000000..6429dfd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 differ diff --git a/PatchTestProject/Library/Artifacts/32/3238fe9397202e98f48abe19c90474ba b/PatchTestProject/Library/Artifacts/32/3238fe9397202e98f48abe19c90474ba new file mode 100644 index 0000000..cb00125 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/3238fe9397202e98f48abe19c90474ba differ diff --git a/PatchTestProject/Library/Artifacts/32/326880e3036546b8520cb81c86a95287 b/PatchTestProject/Library/Artifacts/32/326880e3036546b8520cb81c86a95287 new file mode 100644 index 0000000..0bb486c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/326880e3036546b8520cb81c86a95287 differ diff --git a/PatchTestProject/Library/Artifacts/32/3269fe60c3fc663e9d58b9e36065e61d b/PatchTestProject/Library/Artifacts/32/3269fe60c3fc663e9d58b9e36065e61d new file mode 100644 index 0000000..5fea96b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/3269fe60c3fc663e9d58b9e36065e61d differ diff --git a/PatchTestProject/Library/Artifacts/32/32745a4f22d813d1f41572dff2b2bb42 b/PatchTestProject/Library/Artifacts/32/32745a4f22d813d1f41572dff2b2bb42 new file mode 100644 index 0000000..bd43cd6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/32745a4f22d813d1f41572dff2b2bb42 differ diff --git a/PatchTestProject/Library/Artifacts/32/32ba272d86d5d37b112477d2bf426088 b/PatchTestProject/Library/Artifacts/32/32ba272d86d5d37b112477d2bf426088 new file mode 100644 index 0000000..7264f0d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/32ba272d86d5d37b112477d2bf426088 differ diff --git a/PatchTestProject/Library/Artifacts/32/32c893a7e127346b5a7c72530619b4c0 b/PatchTestProject/Library/Artifacts/32/32c893a7e127346b5a7c72530619b4c0 new file mode 100644 index 0000000..192d8a2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/32c893a7e127346b5a7c72530619b4c0 differ diff --git a/PatchTestProject/Library/Artifacts/32/32ccb267002a7aad15e609a2d2a39ff8 b/PatchTestProject/Library/Artifacts/32/32ccb267002a7aad15e609a2d2a39ff8 new file mode 100644 index 0000000..d8fa7ab Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/32ccb267002a7aad15e609a2d2a39ff8 differ diff --git a/PatchTestProject/Library/Artifacts/32/32e6aca0349d9d7d477f7e9bf9c002b7 b/PatchTestProject/Library/Artifacts/32/32e6aca0349d9d7d477f7e9bf9c002b7 new file mode 100644 index 0000000..a2dd933 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/32/32e6aca0349d9d7d477f7e9bf9c002b7 differ diff --git a/PatchTestProject/Library/Artifacts/33/33a4e2dc33af0bb488e34709b9aac8da b/PatchTestProject/Library/Artifacts/33/33a4e2dc33af0bb488e34709b9aac8da new file mode 100644 index 0000000..3e36ffc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/33/33a4e2dc33af0bb488e34709b9aac8da differ diff --git a/PatchTestProject/Library/Artifacts/33/33a9f77080f53d3c537a2ba04da1bf80 b/PatchTestProject/Library/Artifacts/33/33a9f77080f53d3c537a2ba04da1bf80 new file mode 100644 index 0000000..453db81 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/33/33a9f77080f53d3c537a2ba04da1bf80 differ diff --git a/PatchTestProject/Library/Artifacts/33/33b019e7d3261bfd725f6772f0c12297 b/PatchTestProject/Library/Artifacts/33/33b019e7d3261bfd725f6772f0c12297 new file mode 100644 index 0000000..78b5401 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/33/33b019e7d3261bfd725f6772f0c12297 differ diff --git a/PatchTestProject/Library/Artifacts/34/341e589d033631028a2f03102c78a07d b/PatchTestProject/Library/Artifacts/34/341e589d033631028a2f03102c78a07d new file mode 100644 index 0000000..99f3d6f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/34/341e589d033631028a2f03102c78a07d differ diff --git a/PatchTestProject/Library/Artifacts/34/3424bac9b130d7dca10e0ff54359ea6b b/PatchTestProject/Library/Artifacts/34/3424bac9b130d7dca10e0ff54359ea6b new file mode 100644 index 0000000..070737b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/34/3424bac9b130d7dca10e0ff54359ea6b differ diff --git a/PatchTestProject/Library/Artifacts/34/34d5654388fe2db377a1ecb61684bd8f b/PatchTestProject/Library/Artifacts/34/34d5654388fe2db377a1ecb61684bd8f new file mode 100644 index 0000000..7012229 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/34/34d5654388fe2db377a1ecb61684bd8f differ diff --git a/PatchTestProject/Library/Artifacts/34/34dcb50347852fddecdf84405faa0a08 b/PatchTestProject/Library/Artifacts/34/34dcb50347852fddecdf84405faa0a08 new file mode 100644 index 0000000..5b580ef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/34/34dcb50347852fddecdf84405faa0a08 differ diff --git a/PatchTestProject/Library/Artifacts/35/35158c99207da4ef52273493982ddd3d b/PatchTestProject/Library/Artifacts/35/35158c99207da4ef52273493982ddd3d new file mode 100644 index 0000000..7fb33ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/35/35158c99207da4ef52273493982ddd3d differ diff --git a/PatchTestProject/Library/Artifacts/35/351aa781be85cceb5ec66573118a6b7e b/PatchTestProject/Library/Artifacts/35/351aa781be85cceb5ec66573118a6b7e new file mode 100644 index 0000000..71883e1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/35/351aa781be85cceb5ec66573118a6b7e differ diff --git a/PatchTestProject/Library/Artifacts/35/35c8296efe685ddaf3a4685b6abff9a3 b/PatchTestProject/Library/Artifacts/35/35c8296efe685ddaf3a4685b6abff9a3 new file mode 100644 index 0000000..1a7996c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/35/35c8296efe685ddaf3a4685b6abff9a3 differ diff --git a/PatchTestProject/Library/Artifacts/35/35d387e688b2ca3d075153bbdbc69cde b/PatchTestProject/Library/Artifacts/35/35d387e688b2ca3d075153bbdbc69cde new file mode 100644 index 0000000..976cd0a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/35/35d387e688b2ca3d075153bbdbc69cde differ diff --git a/PatchTestProject/Library/Artifacts/35/35e7df8d961de4dbfb25f73226394d27 b/PatchTestProject/Library/Artifacts/35/35e7df8d961de4dbfb25f73226394d27 new file mode 100644 index 0000000..ea93b63 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/35/35e7df8d961de4dbfb25f73226394d27 differ diff --git a/PatchTestProject/Library/Artifacts/36/364ebf51c7de28b6bd9a6a7eb40bc7d4 b/PatchTestProject/Library/Artifacts/36/364ebf51c7de28b6bd9a6a7eb40bc7d4 new file mode 100644 index 0000000..027a32b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/364ebf51c7de28b6bd9a6a7eb40bc7d4 differ diff --git a/PatchTestProject/Library/Artifacts/36/364fab22224834168e6e9fd5ab04b6c8 b/PatchTestProject/Library/Artifacts/36/364fab22224834168e6e9fd5ab04b6c8 new file mode 100644 index 0000000..e411e92 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/364fab22224834168e6e9fd5ab04b6c8 differ diff --git a/PatchTestProject/Library/Artifacts/36/36672138540c2f7b518a2d814511e59d b/PatchTestProject/Library/Artifacts/36/36672138540c2f7b518a2d814511e59d new file mode 100644 index 0000000..19bdd61 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36672138540c2f7b518a2d814511e59d differ diff --git a/PatchTestProject/Library/Artifacts/36/3683a93fdda2e773201b5f7ea805270e b/PatchTestProject/Library/Artifacts/36/3683a93fdda2e773201b5f7ea805270e new file mode 100644 index 0000000..437bf56 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/3683a93fdda2e773201b5f7ea805270e differ diff --git a/PatchTestProject/Library/Artifacts/36/3699c0b191973220f41ba2394651995f b/PatchTestProject/Library/Artifacts/36/3699c0b191973220f41ba2394651995f new file mode 100644 index 0000000..059739b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/3699c0b191973220f41ba2394651995f differ diff --git a/PatchTestProject/Library/Artifacts/36/36aba7f5100fabfd828c418218fb5032 b/PatchTestProject/Library/Artifacts/36/36aba7f5100fabfd828c418218fb5032 new file mode 100644 index 0000000..51f0c2e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36aba7f5100fabfd828c418218fb5032 differ diff --git a/PatchTestProject/Library/Artifacts/36/36b2fd5dbc4d2089d0406655ed67b88a b/PatchTestProject/Library/Artifacts/36/36b2fd5dbc4d2089d0406655ed67b88a new file mode 100644 index 0000000..c7798b6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36b2fd5dbc4d2089d0406655ed67b88a differ diff --git a/PatchTestProject/Library/Artifacts/36/36c14a1e5a6d93318e0cb9d2ae9f8671 b/PatchTestProject/Library/Artifacts/36/36c14a1e5a6d93318e0cb9d2ae9f8671 new file mode 100644 index 0000000..7d9b6f2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36c14a1e5a6d93318e0cb9d2ae9f8671 differ diff --git a/PatchTestProject/Library/Artifacts/36/36d8b2405f33fa61a47651ac26364f22 b/PatchTestProject/Library/Artifacts/36/36d8b2405f33fa61a47651ac26364f22 new file mode 100644 index 0000000..370d3f2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36d8b2405f33fa61a47651ac26364f22 differ diff --git a/PatchTestProject/Library/Artifacts/36/36d9d77f1af00f40ba4acac89cd816bc b/PatchTestProject/Library/Artifacts/36/36d9d77f1af00f40ba4acac89cd816bc new file mode 100644 index 0000000..fd05f7f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36d9d77f1af00f40ba4acac89cd816bc differ diff --git a/PatchTestProject/Library/Artifacts/36/36f3af93a14a8c6d76fdbecc5c168f63 b/PatchTestProject/Library/Artifacts/36/36f3af93a14a8c6d76fdbecc5c168f63 new file mode 100644 index 0000000..8a5a624 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36f3af93a14a8c6d76fdbecc5c168f63 differ diff --git a/PatchTestProject/Library/Artifacts/36/36fcc5ca3e3b1640c3dd8e50a2f4a19d b/PatchTestProject/Library/Artifacts/36/36fcc5ca3e3b1640c3dd8e50a2f4a19d new file mode 100644 index 0000000..61e73ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/36/36fcc5ca3e3b1640c3dd8e50a2f4a19d differ diff --git a/PatchTestProject/Library/Artifacts/37/370c745d7768c8f16c3571c40e7134c1 b/PatchTestProject/Library/Artifacts/37/370c745d7768c8f16c3571c40e7134c1 new file mode 100644 index 0000000..c55dc0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/37/370c745d7768c8f16c3571c40e7134c1 differ diff --git a/PatchTestProject/Library/Artifacts/37/3729416f792ca0555a62976eb29ed1d9 b/PatchTestProject/Library/Artifacts/37/3729416f792ca0555a62976eb29ed1d9 new file mode 100644 index 0000000..1db89b4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/37/3729416f792ca0555a62976eb29ed1d9 differ diff --git a/PatchTestProject/Library/Artifacts/37/3788b7eaa117d298b7530542fd69581f b/PatchTestProject/Library/Artifacts/37/3788b7eaa117d298b7530542fd69581f new file mode 100644 index 0000000..e360b68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/37/3788b7eaa117d298b7530542fd69581f differ diff --git a/PatchTestProject/Library/Artifacts/37/37bee9b8072e9e71f4af6ef5152ac205 b/PatchTestProject/Library/Artifacts/37/37bee9b8072e9e71f4af6ef5152ac205 new file mode 100644 index 0000000..c3028e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/37/37bee9b8072e9e71f4af6ef5152ac205 differ diff --git a/PatchTestProject/Library/Artifacts/38/38032a749d8fec494c620bbd589038f5 b/PatchTestProject/Library/Artifacts/38/38032a749d8fec494c620bbd589038f5 new file mode 100644 index 0000000..9c1fd3f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/38032a749d8fec494c620bbd589038f5 differ diff --git a/PatchTestProject/Library/Artifacts/38/383bc7754db14cc5404bab2ad55e8690 b/PatchTestProject/Library/Artifacts/38/383bc7754db14cc5404bab2ad55e8690 new file mode 100644 index 0000000..bc5928d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/383bc7754db14cc5404bab2ad55e8690 differ diff --git a/PatchTestProject/Library/Artifacts/38/385f46058c2b4d558b9feea7cc191120 b/PatchTestProject/Library/Artifacts/38/385f46058c2b4d558b9feea7cc191120 new file mode 100644 index 0000000..d8f1d3c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/385f46058c2b4d558b9feea7cc191120 differ diff --git a/PatchTestProject/Library/Artifacts/38/386d8f33200eba71af687d465456fa97 b/PatchTestProject/Library/Artifacts/38/386d8f33200eba71af687d465456fa97 new file mode 100644 index 0000000..ae2e18d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/386d8f33200eba71af687d465456fa97 differ diff --git a/PatchTestProject/Library/Artifacts/38/38b69568b8e9c5a4704a6340468a5944 b/PatchTestProject/Library/Artifacts/38/38b69568b8e9c5a4704a6340468a5944 new file mode 100644 index 0000000..ff672ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/38b69568b8e9c5a4704a6340468a5944 differ diff --git a/PatchTestProject/Library/Artifacts/38/38c11faef532b1a81c246f3165a0684a b/PatchTestProject/Library/Artifacts/38/38c11faef532b1a81c246f3165a0684a new file mode 100644 index 0000000..82bd340 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/38c11faef532b1a81c246f3165a0684a differ diff --git a/PatchTestProject/Library/Artifacts/38/38e4523ef9a7198161fff60ea800d194 b/PatchTestProject/Library/Artifacts/38/38e4523ef9a7198161fff60ea800d194 new file mode 100644 index 0000000..8dfbe9a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/38/38e4523ef9a7198161fff60ea800d194 differ diff --git a/PatchTestProject/Library/Artifacts/39/39025a39dd1bd831795cd6e073d02940 b/PatchTestProject/Library/Artifacts/39/39025a39dd1bd831795cd6e073d02940 new file mode 100644 index 0000000..835024f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39025a39dd1bd831795cd6e073d02940 differ diff --git a/PatchTestProject/Library/Artifacts/39/3923237f1c9b9b6df03ebbd7580ec3c8 b/PatchTestProject/Library/Artifacts/39/3923237f1c9b9b6df03ebbd7580ec3c8 new file mode 100644 index 0000000..d7ba714 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/3923237f1c9b9b6df03ebbd7580ec3c8 differ diff --git a/PatchTestProject/Library/Artifacts/39/39511ea075c1a8e18c309e1fe9fcc980 b/PatchTestProject/Library/Artifacts/39/39511ea075c1a8e18c309e1fe9fcc980 new file mode 100644 index 0000000..9c323eb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39511ea075c1a8e18c309e1fe9fcc980 differ diff --git a/PatchTestProject/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 b/PatchTestProject/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 new file mode 100644 index 0000000..12cebf3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 differ diff --git a/PatchTestProject/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 b/PatchTestProject/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 new file mode 100644 index 0000000..9408a0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 differ diff --git a/PatchTestProject/Library/Artifacts/39/39d774dd272f0267d068319006ebc3ad b/PatchTestProject/Library/Artifacts/39/39d774dd272f0267d068319006ebc3ad new file mode 100644 index 0000000..cde70eb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39d774dd272f0267d068319006ebc3ad differ diff --git a/PatchTestProject/Library/Artifacts/39/39e25091f7708fabdac96aea3d800658 b/PatchTestProject/Library/Artifacts/39/39e25091f7708fabdac96aea3d800658 new file mode 100644 index 0000000..84aae4c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39e25091f7708fabdac96aea3d800658 differ diff --git a/PatchTestProject/Library/Artifacts/39/39e707ad8509f86728e5953ad0f2617d b/PatchTestProject/Library/Artifacts/39/39e707ad8509f86728e5953ad0f2617d new file mode 100644 index 0000000..2a7d825 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/39/39e707ad8509f86728e5953ad0f2617d differ diff --git a/PatchTestProject/Library/Artifacts/3a/3a09c35d1b3cc11b08b82e1bbf3ca337 b/PatchTestProject/Library/Artifacts/3a/3a09c35d1b3cc11b08b82e1bbf3ca337 new file mode 100644 index 0000000..d78986b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3a/3a09c35d1b3cc11b08b82e1bbf3ca337 differ diff --git a/PatchTestProject/Library/Artifacts/3a/3a5063576a1e57e66814b57f92b9a924 b/PatchTestProject/Library/Artifacts/3a/3a5063576a1e57e66814b57f92b9a924 new file mode 100644 index 0000000..8b4ffa8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3a/3a5063576a1e57e66814b57f92b9a924 differ diff --git a/PatchTestProject/Library/Artifacts/3a/3a9cb9c41bd88d4a72a19d46fa10a05d b/PatchTestProject/Library/Artifacts/3a/3a9cb9c41bd88d4a72a19d46fa10a05d new file mode 100644 index 0000000..6a48814 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3a/3a9cb9c41bd88d4a72a19d46fa10a05d differ diff --git a/PatchTestProject/Library/Artifacts/3a/3aba7e89a66bfa5b1492432a03c0733f b/PatchTestProject/Library/Artifacts/3a/3aba7e89a66bfa5b1492432a03c0733f new file mode 100644 index 0000000..65d3fb3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3a/3aba7e89a66bfa5b1492432a03c0733f differ diff --git a/PatchTestProject/Library/Artifacts/3a/3ac7879af3532b5ddf2d758273266237 b/PatchTestProject/Library/Artifacts/3a/3ac7879af3532b5ddf2d758273266237 new file mode 100644 index 0000000..4adbbb7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3a/3ac7879af3532b5ddf2d758273266237 differ diff --git a/PatchTestProject/Library/Artifacts/3a/3ae9616f6950dccea056abd2940ad930 b/PatchTestProject/Library/Artifacts/3a/3ae9616f6950dccea056abd2940ad930 new file mode 100644 index 0000000..1576ff7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3a/3ae9616f6950dccea056abd2940ad930 differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b14dd85d84f70e8db91e21298d144f2 b/PatchTestProject/Library/Artifacts/3b/3b14dd85d84f70e8db91e21298d144f2 new file mode 100644 index 0000000..49f0b19 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b14dd85d84f70e8db91e21298d144f2 differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b308ef5d0b9f2d9a4ba53a00fb6850e b/PatchTestProject/Library/Artifacts/3b/3b308ef5d0b9f2d9a4ba53a00fb6850e new file mode 100644 index 0000000..c61e521 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b308ef5d0b9f2d9a4ba53a00fb6850e differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b5071404b49cb39705c2a3fe521cb39 b/PatchTestProject/Library/Artifacts/3b/3b5071404b49cb39705c2a3fe521cb39 new file mode 100644 index 0000000..16e9004 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b5071404b49cb39705c2a3fe521cb39 differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b5ef067cb1e1666d8cd5651c953813d b/PatchTestProject/Library/Artifacts/3b/3b5ef067cb1e1666d8cd5651c953813d new file mode 100644 index 0000000..6e0b698 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b5ef067cb1e1666d8cd5651c953813d differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 b/PatchTestProject/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 new file mode 100644 index 0000000..fb2def4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b896ac8e81e3bb5618457b68b9485c8 b/PatchTestProject/Library/Artifacts/3b/3b896ac8e81e3bb5618457b68b9485c8 new file mode 100644 index 0000000..67f2383 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b896ac8e81e3bb5618457b68b9485c8 differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b8f4039cf6fc8a6ab7aed285ff4be6c b/PatchTestProject/Library/Artifacts/3b/3b8f4039cf6fc8a6ab7aed285ff4be6c new file mode 100644 index 0000000..fe9bacb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b8f4039cf6fc8a6ab7aed285ff4be6c differ diff --git a/PatchTestProject/Library/Artifacts/3b/3b9268c4695cab0953331429c2481610 b/PatchTestProject/Library/Artifacts/3b/3b9268c4695cab0953331429c2481610 new file mode 100644 index 0000000..0fe3ffc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3b9268c4695cab0953331429c2481610 differ diff --git a/PatchTestProject/Library/Artifacts/3b/3bc745b797d6eb5c16b8694910729a6b b/PatchTestProject/Library/Artifacts/3b/3bc745b797d6eb5c16b8694910729a6b new file mode 100644 index 0000000..332ece1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3b/3bc745b797d6eb5c16b8694910729a6b differ diff --git a/PatchTestProject/Library/Artifacts/3c/3c0526a60e2eb355d7b4ac900875eebc b/PatchTestProject/Library/Artifacts/3c/3c0526a60e2eb355d7b4ac900875eebc new file mode 100644 index 0000000..b6a54ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3c/3c0526a60e2eb355d7b4ac900875eebc differ diff --git a/PatchTestProject/Library/Artifacts/3c/3c8ea535c5b272568107bc9f3879a544 b/PatchTestProject/Library/Artifacts/3c/3c8ea535c5b272568107bc9f3879a544 new file mode 100644 index 0000000..70a3898 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3c/3c8ea535c5b272568107bc9f3879a544 differ diff --git a/PatchTestProject/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 b/PatchTestProject/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 new file mode 100644 index 0000000..355f18e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 differ diff --git a/PatchTestProject/Library/Artifacts/3c/3cebf28d943a90a72976f48ec4cdecb9 b/PatchTestProject/Library/Artifacts/3c/3cebf28d943a90a72976f48ec4cdecb9 new file mode 100644 index 0000000..08ce254 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3c/3cebf28d943a90a72976f48ec4cdecb9 differ diff --git a/PatchTestProject/Library/Artifacts/3c/3cec6494d16aeb08595adf78cfd57165 b/PatchTestProject/Library/Artifacts/3c/3cec6494d16aeb08595adf78cfd57165 new file mode 100644 index 0000000..45dec70 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3c/3cec6494d16aeb08595adf78cfd57165 differ diff --git a/PatchTestProject/Library/Artifacts/3c/3cfc62b237cc1a5482453740ba707af5 b/PatchTestProject/Library/Artifacts/3c/3cfc62b237cc1a5482453740ba707af5 new file mode 100644 index 0000000..41bab2a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3c/3cfc62b237cc1a5482453740ba707af5 differ diff --git a/PatchTestProject/Library/Artifacts/3d/3d1e5cc2cb6726697404f7542e5d4b47 b/PatchTestProject/Library/Artifacts/3d/3d1e5cc2cb6726697404f7542e5d4b47 new file mode 100644 index 0000000..2e2aa16 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3d1e5cc2cb6726697404f7542e5d4b47 differ diff --git a/PatchTestProject/Library/Artifacts/3d/3d3801f0c63e0f31acc344524d267796 b/PatchTestProject/Library/Artifacts/3d/3d3801f0c63e0f31acc344524d267796 new file mode 100644 index 0000000..c3806c4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3d3801f0c63e0f31acc344524d267796 differ diff --git a/PatchTestProject/Library/Artifacts/3d/3d756acf844231e93bc53f63fc2c058f b/PatchTestProject/Library/Artifacts/3d/3d756acf844231e93bc53f63fc2c058f new file mode 100644 index 0000000..a44779e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3d756acf844231e93bc53f63fc2c058f differ diff --git a/PatchTestProject/Library/Artifacts/3d/3d9486186ec58918b3c49c3ddcc85bd0 b/PatchTestProject/Library/Artifacts/3d/3d9486186ec58918b3c49c3ddcc85bd0 new file mode 100644 index 0000000..7d7eb71 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3d9486186ec58918b3c49c3ddcc85bd0 differ diff --git a/PatchTestProject/Library/Artifacts/3d/3d9c9ed91d0c31860acd216ea2dd5dda b/PatchTestProject/Library/Artifacts/3d/3d9c9ed91d0c31860acd216ea2dd5dda new file mode 100644 index 0000000..75a6b93 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3d9c9ed91d0c31860acd216ea2dd5dda differ diff --git a/PatchTestProject/Library/Artifacts/3d/3da598fa08cfb9879b37424b8d3ca990 b/PatchTestProject/Library/Artifacts/3d/3da598fa08cfb9879b37424b8d3ca990 new file mode 100644 index 0000000..db0a883 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3da598fa08cfb9879b37424b8d3ca990 differ diff --git a/PatchTestProject/Library/Artifacts/3d/3db4c20befa21bf24b8e4d0090608b71 b/PatchTestProject/Library/Artifacts/3d/3db4c20befa21bf24b8e4d0090608b71 new file mode 100644 index 0000000..21b479f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3d/3db4c20befa21bf24b8e4d0090608b71 differ diff --git a/PatchTestProject/Library/Artifacts/3e/3e33d742e6c22f325926785e028455a5 b/PatchTestProject/Library/Artifacts/3e/3e33d742e6c22f325926785e028455a5 new file mode 100644 index 0000000..10e7e08 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3e/3e33d742e6c22f325926785e028455a5 differ diff --git a/PatchTestProject/Library/Artifacts/3e/3e3af0a48ec8cf475d65e2122b1540a6 b/PatchTestProject/Library/Artifacts/3e/3e3af0a48ec8cf475d65e2122b1540a6 new file mode 100644 index 0000000..70d731c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3e/3e3af0a48ec8cf475d65e2122b1540a6 differ diff --git a/PatchTestProject/Library/Artifacts/3e/3ebbcae759538c3ee2e74e7316117e08 b/PatchTestProject/Library/Artifacts/3e/3ebbcae759538c3ee2e74e7316117e08 new file mode 100644 index 0000000..caf0bc2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3e/3ebbcae759538c3ee2e74e7316117e08 differ diff --git a/PatchTestProject/Library/Artifacts/3e/3ef155d27add329f9c9c5e014f1ed862 b/PatchTestProject/Library/Artifacts/3e/3ef155d27add329f9c9c5e014f1ed862 new file mode 100644 index 0000000..b1c304a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3e/3ef155d27add329f9c9c5e014f1ed862 differ diff --git a/PatchTestProject/Library/Artifacts/3e/3ef6ceeb9f3c759bc31965518703fca6 b/PatchTestProject/Library/Artifacts/3e/3ef6ceeb9f3c759bc31965518703fca6 new file mode 100644 index 0000000..6514bac Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3e/3ef6ceeb9f3c759bc31965518703fca6 differ diff --git a/PatchTestProject/Library/Artifacts/3f/3f7cb8214be49f46410b0dae7dd99cb1 b/PatchTestProject/Library/Artifacts/3f/3f7cb8214be49f46410b0dae7dd99cb1 new file mode 100644 index 0000000..94529e6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3f/3f7cb8214be49f46410b0dae7dd99cb1 differ diff --git a/PatchTestProject/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 b/PatchTestProject/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 new file mode 100644 index 0000000..6747ee5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 differ diff --git a/PatchTestProject/Library/Artifacts/3f/3faec05a982911628554dee1defcef56 b/PatchTestProject/Library/Artifacts/3f/3faec05a982911628554dee1defcef56 new file mode 100644 index 0000000..580c9af Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3f/3faec05a982911628554dee1defcef56 differ diff --git a/PatchTestProject/Library/Artifacts/3f/3fc88aa9e2c6072619ab78c888accd39 b/PatchTestProject/Library/Artifacts/3f/3fc88aa9e2c6072619ab78c888accd39 new file mode 100644 index 0000000..ec56310 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/3f/3fc88aa9e2c6072619ab78c888accd39 differ diff --git a/PatchTestProject/Library/Artifacts/40/40033b8339e835c9e4d59a2ff325edfc b/PatchTestProject/Library/Artifacts/40/40033b8339e835c9e4d59a2ff325edfc new file mode 100644 index 0000000..74adb52 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/40/40033b8339e835c9e4d59a2ff325edfc differ diff --git a/PatchTestProject/Library/Artifacts/40/40288f6554696315b2587ec224c10ffa b/PatchTestProject/Library/Artifacts/40/40288f6554696315b2587ec224c10ffa new file mode 100644 index 0000000..e4fceaa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/40/40288f6554696315b2587ec224c10ffa differ diff --git a/PatchTestProject/Library/Artifacts/40/4037e49a2d0f0a6277a96931e3738e11 b/PatchTestProject/Library/Artifacts/40/4037e49a2d0f0a6277a96931e3738e11 new file mode 100644 index 0000000..10a89c2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/40/4037e49a2d0f0a6277a96931e3738e11 differ diff --git a/PatchTestProject/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf b/PatchTestProject/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf new file mode 100644 index 0000000..d79195d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf differ diff --git a/PatchTestProject/Library/Artifacts/40/40f30671d2669864c7bb68176f7c666d b/PatchTestProject/Library/Artifacts/40/40f30671d2669864c7bb68176f7c666d new file mode 100644 index 0000000..4bd02c6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/40/40f30671d2669864c7bb68176f7c666d differ diff --git a/PatchTestProject/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 b/PatchTestProject/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 new file mode 100644 index 0000000..4a41c33 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 differ diff --git a/PatchTestProject/Library/Artifacts/41/412c32c7098e7f21dd798adb16e3dc49 b/PatchTestProject/Library/Artifacts/41/412c32c7098e7f21dd798adb16e3dc49 new file mode 100644 index 0000000..82b2f0e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/41/412c32c7098e7f21dd798adb16e3dc49 differ diff --git a/PatchTestProject/Library/Artifacts/41/41af918fcb4ec5e44474e47532f96d8e b/PatchTestProject/Library/Artifacts/41/41af918fcb4ec5e44474e47532f96d8e new file mode 100644 index 0000000..37c1814 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/41/41af918fcb4ec5e44474e47532f96d8e differ diff --git a/PatchTestProject/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb b/PatchTestProject/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb new file mode 100644 index 0000000..ca295a2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb differ diff --git a/PatchTestProject/Library/Artifacts/41/41fa1fbc8af4c1d02d8f3495d6a138dd b/PatchTestProject/Library/Artifacts/41/41fa1fbc8af4c1d02d8f3495d6a138dd new file mode 100644 index 0000000..595fea5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/41/41fa1fbc8af4c1d02d8f3495d6a138dd differ diff --git a/PatchTestProject/Library/Artifacts/42/420ef5dbfe57816be31f04b7eb1a5cd0 b/PatchTestProject/Library/Artifacts/42/420ef5dbfe57816be31f04b7eb1a5cd0 new file mode 100644 index 0000000..6c78a87 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/420ef5dbfe57816be31f04b7eb1a5cd0 differ diff --git a/PatchTestProject/Library/Artifacts/42/420fbacdf348452cef144bd8be5e9a4e b/PatchTestProject/Library/Artifacts/42/420fbacdf348452cef144bd8be5e9a4e new file mode 100644 index 0000000..63ed182 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/420fbacdf348452cef144bd8be5e9a4e differ diff --git a/PatchTestProject/Library/Artifacts/42/4223337542f13bd7762a02f11f124171 b/PatchTestProject/Library/Artifacts/42/4223337542f13bd7762a02f11f124171 new file mode 100644 index 0000000..3ea71f3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/4223337542f13bd7762a02f11f124171 differ diff --git a/PatchTestProject/Library/Artifacts/42/425d31d9c8ff9bb9f2aa859e86693c3d b/PatchTestProject/Library/Artifacts/42/425d31d9c8ff9bb9f2aa859e86693c3d new file mode 100644 index 0000000..50da0f8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/425d31d9c8ff9bb9f2aa859e86693c3d differ diff --git a/PatchTestProject/Library/Artifacts/42/4295e915948e3d77d1aaecf755e90bac b/PatchTestProject/Library/Artifacts/42/4295e915948e3d77d1aaecf755e90bac new file mode 100644 index 0000000..3cf335f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/4295e915948e3d77d1aaecf755e90bac differ diff --git a/PatchTestProject/Library/Artifacts/42/42d4324aa9a587d581cc6f1a55147796 b/PatchTestProject/Library/Artifacts/42/42d4324aa9a587d581cc6f1a55147796 new file mode 100644 index 0000000..e6e73c5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/42d4324aa9a587d581cc6f1a55147796 differ diff --git a/PatchTestProject/Library/Artifacts/42/42e4b6a7caa2a56bc44619fba124e2d5 b/PatchTestProject/Library/Artifacts/42/42e4b6a7caa2a56bc44619fba124e2d5 new file mode 100644 index 0000000..902d50b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/42/42e4b6a7caa2a56bc44619fba124e2d5 differ diff --git a/PatchTestProject/Library/Artifacts/43/4316d8c49f9a3289b81baa57ac4137bf b/PatchTestProject/Library/Artifacts/43/4316d8c49f9a3289b81baa57ac4137bf new file mode 100644 index 0000000..c6763ec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/43/4316d8c49f9a3289b81baa57ac4137bf differ diff --git a/PatchTestProject/Library/Artifacts/43/434784a28be3365064f47b4617ce36a3 b/PatchTestProject/Library/Artifacts/43/434784a28be3365064f47b4617ce36a3 new file mode 100644 index 0000000..a54d864 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/43/434784a28be3365064f47b4617ce36a3 differ diff --git a/PatchTestProject/Library/Artifacts/43/4370b324a635650c2938298e8da209ff b/PatchTestProject/Library/Artifacts/43/4370b324a635650c2938298e8da209ff new file mode 100644 index 0000000..186a324 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/43/4370b324a635650c2938298e8da209ff differ diff --git a/PatchTestProject/Library/Artifacts/43/43842bc1265dcf6f0f0e2cf2aa9266c8 b/PatchTestProject/Library/Artifacts/43/43842bc1265dcf6f0f0e2cf2aa9266c8 new file mode 100644 index 0000000..03e2253 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/43/43842bc1265dcf6f0f0e2cf2aa9266c8 differ diff --git a/PatchTestProject/Library/Artifacts/43/43c459397d065e2420d5ae8f74235410 b/PatchTestProject/Library/Artifacts/43/43c459397d065e2420d5ae8f74235410 new file mode 100644 index 0000000..4a392df Binary files /dev/null and b/PatchTestProject/Library/Artifacts/43/43c459397d065e2420d5ae8f74235410 differ diff --git a/PatchTestProject/Library/Artifacts/43/43e49adf9e26cec8566ed790622d2af4 b/PatchTestProject/Library/Artifacts/43/43e49adf9e26cec8566ed790622d2af4 new file mode 100644 index 0000000..ba3e124 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/43/43e49adf9e26cec8566ed790622d2af4 differ diff --git a/PatchTestProject/Library/Artifacts/44/4497c685c13b2423715ac6261a1bf7d0 b/PatchTestProject/Library/Artifacts/44/4497c685c13b2423715ac6261a1bf7d0 new file mode 100644 index 0000000..89660ea Binary files /dev/null and b/PatchTestProject/Library/Artifacts/44/4497c685c13b2423715ac6261a1bf7d0 differ diff --git a/PatchTestProject/Library/Artifacts/44/44988a4e390739670208992fc6ec81c0 b/PatchTestProject/Library/Artifacts/44/44988a4e390739670208992fc6ec81c0 new file mode 100644 index 0000000..0242cfc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/44/44988a4e390739670208992fc6ec81c0 differ diff --git a/PatchTestProject/Library/Artifacts/45/451ba6a239cd904f9845fb8f02c4dc12 b/PatchTestProject/Library/Artifacts/45/451ba6a239cd904f9845fb8f02c4dc12 new file mode 100644 index 0000000..b910da6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/45/451ba6a239cd904f9845fb8f02c4dc12 differ diff --git a/PatchTestProject/Library/Artifacts/45/451ff88d0441d72891f1bd591f3b78b3 b/PatchTestProject/Library/Artifacts/45/451ff88d0441d72891f1bd591f3b78b3 new file mode 100644 index 0000000..fc5a5e7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/45/451ff88d0441d72891f1bd591f3b78b3 differ diff --git a/PatchTestProject/Library/Artifacts/45/452949ea1b3d9a8a97713f33f44293c4 b/PatchTestProject/Library/Artifacts/45/452949ea1b3d9a8a97713f33f44293c4 new file mode 100644 index 0000000..807513e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/45/452949ea1b3d9a8a97713f33f44293c4 differ diff --git a/PatchTestProject/Library/Artifacts/45/456a23d2e133704bd4f41673821b78ec b/PatchTestProject/Library/Artifacts/45/456a23d2e133704bd4f41673821b78ec new file mode 100644 index 0000000..05c9b41 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/45/456a23d2e133704bd4f41673821b78ec differ diff --git a/PatchTestProject/Library/Artifacts/45/4570f4ea62b664f38a56e94863dd14a3 b/PatchTestProject/Library/Artifacts/45/4570f4ea62b664f38a56e94863dd14a3 new file mode 100644 index 0000000..2256433 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/45/4570f4ea62b664f38a56e94863dd14a3 differ diff --git a/PatchTestProject/Library/Artifacts/45/45c25782b29c2a37e17f4da1e7cd30d2 b/PatchTestProject/Library/Artifacts/45/45c25782b29c2a37e17f4da1e7cd30d2 new file mode 100644 index 0000000..de2d73a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/45/45c25782b29c2a37e17f4da1e7cd30d2 differ diff --git a/PatchTestProject/Library/Artifacts/46/466e15a947c6e76a4c633e5eec480275 b/PatchTestProject/Library/Artifacts/46/466e15a947c6e76a4c633e5eec480275 new file mode 100644 index 0000000..919bfa0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/46/466e15a947c6e76a4c633e5eec480275 differ diff --git a/PatchTestProject/Library/Artifacts/46/46aac640dd0cd1d7d03ae3fa01a1bb9c b/PatchTestProject/Library/Artifacts/46/46aac640dd0cd1d7d03ae3fa01a1bb9c new file mode 100644 index 0000000..0c5e304 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/46/46aac640dd0cd1d7d03ae3fa01a1bb9c differ diff --git a/PatchTestProject/Library/Artifacts/46/46b2409d156420a5f578475d73eb2484 b/PatchTestProject/Library/Artifacts/46/46b2409d156420a5f578475d73eb2484 new file mode 100644 index 0000000..b4b4710 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/46/46b2409d156420a5f578475d73eb2484 differ diff --git a/PatchTestProject/Library/Artifacts/46/46b4cea68efb6811581cdf39e84fe30c b/PatchTestProject/Library/Artifacts/46/46b4cea68efb6811581cdf39e84fe30c new file mode 100644 index 0000000..ec3bd52 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/46/46b4cea68efb6811581cdf39e84fe30c differ diff --git a/PatchTestProject/Library/Artifacts/46/46b716a8632e12a58edbd6e9be0e8061 b/PatchTestProject/Library/Artifacts/46/46b716a8632e12a58edbd6e9be0e8061 new file mode 100644 index 0000000..bf5fd31 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/46/46b716a8632e12a58edbd6e9be0e8061 differ diff --git a/PatchTestProject/Library/Artifacts/46/46d2bd4975391851fdc46e0c1649706d b/PatchTestProject/Library/Artifacts/46/46d2bd4975391851fdc46e0c1649706d new file mode 100644 index 0000000..5a7303b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/46/46d2bd4975391851fdc46e0c1649706d differ diff --git a/PatchTestProject/Library/Artifacts/47/470b7ea34157bd9172782fd11ea80dde b/PatchTestProject/Library/Artifacts/47/470b7ea34157bd9172782fd11ea80dde new file mode 100644 index 0000000..12e764c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/47/470b7ea34157bd9172782fd11ea80dde differ diff --git a/PatchTestProject/Library/Artifacts/47/4735d8c3bf2c40fb5ba4137e1c39fd74 b/PatchTestProject/Library/Artifacts/47/4735d8c3bf2c40fb5ba4137e1c39fd74 new file mode 100644 index 0000000..c7a8680 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/47/4735d8c3bf2c40fb5ba4137e1c39fd74 differ diff --git a/PatchTestProject/Library/Artifacts/47/4775e4a018932639704c718b097c2432 b/PatchTestProject/Library/Artifacts/47/4775e4a018932639704c718b097c2432 new file mode 100644 index 0000000..a62efa4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/47/4775e4a018932639704c718b097c2432 differ diff --git a/PatchTestProject/Library/Artifacts/47/4794288709e320611687d479b584323e b/PatchTestProject/Library/Artifacts/47/4794288709e320611687d479b584323e new file mode 100644 index 0000000..eca2c97 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/47/4794288709e320611687d479b584323e differ diff --git a/PatchTestProject/Library/Artifacts/47/47a3caa0921cb9cb8a0e347321f43d1b b/PatchTestProject/Library/Artifacts/47/47a3caa0921cb9cb8a0e347321f43d1b new file mode 100644 index 0000000..c6559d5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/47/47a3caa0921cb9cb8a0e347321f43d1b differ diff --git a/PatchTestProject/Library/Artifacts/47/47b01b9fc122811f43039ef3b11421a4 b/PatchTestProject/Library/Artifacts/47/47b01b9fc122811f43039ef3b11421a4 new file mode 100644 index 0000000..b146df3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/47/47b01b9fc122811f43039ef3b11421a4 differ diff --git a/PatchTestProject/Library/Artifacts/48/482c22a2d0e599ca4f21e26da3e55198 b/PatchTestProject/Library/Artifacts/48/482c22a2d0e599ca4f21e26da3e55198 new file mode 100644 index 0000000..9648390 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/482c22a2d0e599ca4f21e26da3e55198 differ diff --git a/PatchTestProject/Library/Artifacts/48/482dff131a9ed090f2a54c30a658edee b/PatchTestProject/Library/Artifacts/48/482dff131a9ed090f2a54c30a658edee new file mode 100644 index 0000000..e07862b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/482dff131a9ed090f2a54c30a658edee differ diff --git a/PatchTestProject/Library/Artifacts/48/4855a9b02c8e1282074c5af7c5cbfe96 b/PatchTestProject/Library/Artifacts/48/4855a9b02c8e1282074c5af7c5cbfe96 new file mode 100644 index 0000000..6b0284f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/4855a9b02c8e1282074c5af7c5cbfe96 differ diff --git a/PatchTestProject/Library/Artifacts/48/4865f37171ec857fc01bf8fcbb97b71c b/PatchTestProject/Library/Artifacts/48/4865f37171ec857fc01bf8fcbb97b71c new file mode 100644 index 0000000..78495f5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/4865f37171ec857fc01bf8fcbb97b71c differ diff --git a/PatchTestProject/Library/Artifacts/48/48b9bb2dfd973d7691748af1b2c40a4c b/PatchTestProject/Library/Artifacts/48/48b9bb2dfd973d7691748af1b2c40a4c new file mode 100644 index 0000000..523769e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/48b9bb2dfd973d7691748af1b2c40a4c differ diff --git a/PatchTestProject/Library/Artifacts/48/48e956e4c8e6063c34052d55134dd99e b/PatchTestProject/Library/Artifacts/48/48e956e4c8e6063c34052d55134dd99e new file mode 100644 index 0000000..4f4b5d4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/48e956e4c8e6063c34052d55134dd99e differ diff --git a/PatchTestProject/Library/Artifacts/48/48f65b20676d60252409cac5a89f0683 b/PatchTestProject/Library/Artifacts/48/48f65b20676d60252409cac5a89f0683 new file mode 100644 index 0000000..cddaa0f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/48/48f65b20676d60252409cac5a89f0683 differ diff --git a/PatchTestProject/Library/Artifacts/49/491a39adb6941b93c47bc4e901fc95cf b/PatchTestProject/Library/Artifacts/49/491a39adb6941b93c47bc4e901fc95cf new file mode 100644 index 0000000..20dbddc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/491a39adb6941b93c47bc4e901fc95cf differ diff --git a/PatchTestProject/Library/Artifacts/49/491b0531ead60b539848a6f6acd8fc76 b/PatchTestProject/Library/Artifacts/49/491b0531ead60b539848a6f6acd8fc76 new file mode 100644 index 0000000..6c7926b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/491b0531ead60b539848a6f6acd8fc76 differ diff --git a/PatchTestProject/Library/Artifacts/49/495232a3a8f26e79efa54f696cb64158 b/PatchTestProject/Library/Artifacts/49/495232a3a8f26e79efa54f696cb64158 new file mode 100644 index 0000000..d751638 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/495232a3a8f26e79efa54f696cb64158 differ diff --git a/PatchTestProject/Library/Artifacts/49/4959fe3c8de53f75abeae1cab7c7adcb b/PatchTestProject/Library/Artifacts/49/4959fe3c8de53f75abeae1cab7c7adcb new file mode 100644 index 0000000..facafb6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/4959fe3c8de53f75abeae1cab7c7adcb differ diff --git a/PatchTestProject/Library/Artifacts/49/497031e89d9d980f982aa946bf2cb1ab b/PatchTestProject/Library/Artifacts/49/497031e89d9d980f982aa946bf2cb1ab new file mode 100644 index 0000000..b175003 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/497031e89d9d980f982aa946bf2cb1ab differ diff --git a/PatchTestProject/Library/Artifacts/49/497a010c711a76fbb26a3374cdd5afb8 b/PatchTestProject/Library/Artifacts/49/497a010c711a76fbb26a3374cdd5afb8 new file mode 100644 index 0000000..1a5d1a6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/497a010c711a76fbb26a3374cdd5afb8 differ diff --git a/PatchTestProject/Library/Artifacts/49/4996d647c07855c55098e63ede55dfff b/PatchTestProject/Library/Artifacts/49/4996d647c07855c55098e63ede55dfff new file mode 100644 index 0000000..c25156a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/4996d647c07855c55098e63ede55dfff differ diff --git a/PatchTestProject/Library/Artifacts/49/49dfdd46a89461a6cb46b92d299070e5 b/PatchTestProject/Library/Artifacts/49/49dfdd46a89461a6cb46b92d299070e5 new file mode 100644 index 0000000..f94ce25 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/49/49dfdd46a89461a6cb46b92d299070e5 differ diff --git a/PatchTestProject/Library/Artifacts/4a/4a027f1b2fd569db60646f3c5bd5c369 b/PatchTestProject/Library/Artifacts/4a/4a027f1b2fd569db60646f3c5bd5c369 new file mode 100644 index 0000000..64559f3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4a/4a027f1b2fd569db60646f3c5bd5c369 differ diff --git a/PatchTestProject/Library/Artifacts/4a/4a188b0c62d0ae9997c64bceb317255f b/PatchTestProject/Library/Artifacts/4a/4a188b0c62d0ae9997c64bceb317255f new file mode 100644 index 0000000..b45ffa6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4a/4a188b0c62d0ae9997c64bceb317255f differ diff --git a/PatchTestProject/Library/Artifacts/4a/4a54bdad987bfc437cab5c92bc5b5daa b/PatchTestProject/Library/Artifacts/4a/4a54bdad987bfc437cab5c92bc5b5daa new file mode 100644 index 0000000..31ad42f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4a/4a54bdad987bfc437cab5c92bc5b5daa differ diff --git a/PatchTestProject/Library/Artifacts/4a/4a7b673aed90ba1683ca7cad4bb18ad0 b/PatchTestProject/Library/Artifacts/4a/4a7b673aed90ba1683ca7cad4bb18ad0 new file mode 100644 index 0000000..1eb62c8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4a/4a7b673aed90ba1683ca7cad4bb18ad0 differ diff --git a/PatchTestProject/Library/Artifacts/4a/4adf216a6277a5450cd386539337bd80 b/PatchTestProject/Library/Artifacts/4a/4adf216a6277a5450cd386539337bd80 new file mode 100644 index 0000000..93d14dd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4a/4adf216a6277a5450cd386539337bd80 differ diff --git a/PatchTestProject/Library/Artifacts/4b/4b51ecd1589efbe15636f95bf02a24ad b/PatchTestProject/Library/Artifacts/4b/4b51ecd1589efbe15636f95bf02a24ad new file mode 100644 index 0000000..2012b71 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4b/4b51ecd1589efbe15636f95bf02a24ad differ diff --git a/PatchTestProject/Library/Artifacts/4b/4b5407b91a1ead5309ec3f5d4c7b3b6e b/PatchTestProject/Library/Artifacts/4b/4b5407b91a1ead5309ec3f5d4c7b3b6e new file mode 100644 index 0000000..62f105a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4b/4b5407b91a1ead5309ec3f5d4c7b3b6e differ diff --git a/PatchTestProject/Library/Artifacts/4b/4bdfbb4cadf1e653b94855980110ac1c b/PatchTestProject/Library/Artifacts/4b/4bdfbb4cadf1e653b94855980110ac1c new file mode 100644 index 0000000..25be181 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4b/4bdfbb4cadf1e653b94855980110ac1c differ diff --git a/PatchTestProject/Library/Artifacts/4b/4be69dda9ce03c9f5f8292c0cbde0509 b/PatchTestProject/Library/Artifacts/4b/4be69dda9ce03c9f5f8292c0cbde0509 new file mode 100644 index 0000000..704da27 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4b/4be69dda9ce03c9f5f8292c0cbde0509 differ diff --git a/PatchTestProject/Library/Artifacts/4c/4c0174e11ac92b315ecff41dbf18e458 b/PatchTestProject/Library/Artifacts/4c/4c0174e11ac92b315ecff41dbf18e458 new file mode 100644 index 0000000..f505149 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4c/4c0174e11ac92b315ecff41dbf18e458 differ diff --git a/PatchTestProject/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 b/PatchTestProject/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 new file mode 100644 index 0000000..a3b75a5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 differ diff --git a/PatchTestProject/Library/Artifacts/4c/4c3fd6b4750fa926b330220c66d37e35 b/PatchTestProject/Library/Artifacts/4c/4c3fd6b4750fa926b330220c66d37e35 new file mode 100644 index 0000000..d43b6f4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4c/4c3fd6b4750fa926b330220c66d37e35 differ diff --git a/PatchTestProject/Library/Artifacts/4c/4c83586655f7a519b70667fe129d2c16 b/PatchTestProject/Library/Artifacts/4c/4c83586655f7a519b70667fe129d2c16 new file mode 100644 index 0000000..dfe4f3a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4c/4c83586655f7a519b70667fe129d2c16 differ diff --git a/PatchTestProject/Library/Artifacts/4c/4cbb501e642aa08cb180ccb1011670b4 b/PatchTestProject/Library/Artifacts/4c/4cbb501e642aa08cb180ccb1011670b4 new file mode 100644 index 0000000..93ceb1e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4c/4cbb501e642aa08cb180ccb1011670b4 differ diff --git a/PatchTestProject/Library/Artifacts/4c/4cc6e2ccc2cb59be7c166f88bf4c8be7 b/PatchTestProject/Library/Artifacts/4c/4cc6e2ccc2cb59be7c166f88bf4c8be7 new file mode 100644 index 0000000..d65a150 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4c/4cc6e2ccc2cb59be7c166f88bf4c8be7 differ diff --git a/PatchTestProject/Library/Artifacts/4d/4d71a432556c7b740077148ebb99f037 b/PatchTestProject/Library/Artifacts/4d/4d71a432556c7b740077148ebb99f037 new file mode 100644 index 0000000..fc55178 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4d/4d71a432556c7b740077148ebb99f037 differ diff --git a/PatchTestProject/Library/Artifacts/4d/4d9544767af40458729212cbf6006f48 b/PatchTestProject/Library/Artifacts/4d/4d9544767af40458729212cbf6006f48 new file mode 100644 index 0000000..2def9fc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4d/4d9544767af40458729212cbf6006f48 differ diff --git a/PatchTestProject/Library/Artifacts/4d/4d96f93ca8a2d2978e4e9efea5b36fb1 b/PatchTestProject/Library/Artifacts/4d/4d96f93ca8a2d2978e4e9efea5b36fb1 new file mode 100644 index 0000000..fe0cd00 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4d/4d96f93ca8a2d2978e4e9efea5b36fb1 differ diff --git a/PatchTestProject/Library/Artifacts/4d/4dd9f0be2fbf69ea305f7b6c470f4d5b b/PatchTestProject/Library/Artifacts/4d/4dd9f0be2fbf69ea305f7b6c470f4d5b new file mode 100644 index 0000000..7bbc82b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4d/4dd9f0be2fbf69ea305f7b6c470f4d5b differ diff --git a/PatchTestProject/Library/Artifacts/4d/4def1d88dad1b8097bd6cd7e2ef8839e b/PatchTestProject/Library/Artifacts/4d/4def1d88dad1b8097bd6cd7e2ef8839e new file mode 100644 index 0000000..07ea22b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4d/4def1d88dad1b8097bd6cd7e2ef8839e differ diff --git a/PatchTestProject/Library/Artifacts/4e/4e01c7b453269a9ba629da44b3bb5ee9 b/PatchTestProject/Library/Artifacts/4e/4e01c7b453269a9ba629da44b3bb5ee9 new file mode 100644 index 0000000..9eae6fb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4e01c7b453269a9ba629da44b3bb5ee9 differ diff --git a/PatchTestProject/Library/Artifacts/4e/4e32aba89f27ba810ffae8579b311bc2 b/PatchTestProject/Library/Artifacts/4e/4e32aba89f27ba810ffae8579b311bc2 new file mode 100644 index 0000000..b904f2f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4e32aba89f27ba810ffae8579b311bc2 differ diff --git a/PatchTestProject/Library/Artifacts/4e/4e37f909d036d77d5fe5c2de6b06466c b/PatchTestProject/Library/Artifacts/4e/4e37f909d036d77d5fe5c2de6b06466c new file mode 100644 index 0000000..ffbc56b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4e37f909d036d77d5fe5c2de6b06466c differ diff --git a/PatchTestProject/Library/Artifacts/4e/4e3946cbea68b2834c1dc0c8a0cea828 b/PatchTestProject/Library/Artifacts/4e/4e3946cbea68b2834c1dc0c8a0cea828 new file mode 100644 index 0000000..58bbc4c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4e3946cbea68b2834c1dc0c8a0cea828 differ diff --git a/PatchTestProject/Library/Artifacts/4e/4e3b5889d4172f6485b0a7d0b6fb3800 b/PatchTestProject/Library/Artifacts/4e/4e3b5889d4172f6485b0a7d0b6fb3800 new file mode 100644 index 0000000..e9c28e2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4e3b5889d4172f6485b0a7d0b6fb3800 differ diff --git a/PatchTestProject/Library/Artifacts/4e/4e59eba451eb167339c20a5dd5c7c5e6 b/PatchTestProject/Library/Artifacts/4e/4e59eba451eb167339c20a5dd5c7c5e6 new file mode 100644 index 0000000..d209eeb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4e59eba451eb167339c20a5dd5c7c5e6 differ diff --git a/PatchTestProject/Library/Artifacts/4e/4ec4a91b311e8835e750d9dee32d85f8 b/PatchTestProject/Library/Artifacts/4e/4ec4a91b311e8835e750d9dee32d85f8 new file mode 100644 index 0000000..50bfd7f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4ec4a91b311e8835e750d9dee32d85f8 differ diff --git a/PatchTestProject/Library/Artifacts/4e/4ec7c9d1acf4aeb078a42864fbb9cbbc b/PatchTestProject/Library/Artifacts/4e/4ec7c9d1acf4aeb078a42864fbb9cbbc new file mode 100644 index 0000000..a8ceb8b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4e/4ec7c9d1acf4aeb078a42864fbb9cbbc differ diff --git a/PatchTestProject/Library/Artifacts/4f/4f3217e7fdbddaf3f619da8b4d6d6978 b/PatchTestProject/Library/Artifacts/4f/4f3217e7fdbddaf3f619da8b4d6d6978 new file mode 100644 index 0000000..687d3e7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4f/4f3217e7fdbddaf3f619da8b4d6d6978 differ diff --git a/PatchTestProject/Library/Artifacts/4f/4f42566594956fc873405367df2f7a57 b/PatchTestProject/Library/Artifacts/4f/4f42566594956fc873405367df2f7a57 new file mode 100644 index 0000000..1f2958b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4f/4f42566594956fc873405367df2f7a57 differ diff --git a/PatchTestProject/Library/Artifacts/4f/4f8d8cdeed5464b8b852d9cd23210839 b/PatchTestProject/Library/Artifacts/4f/4f8d8cdeed5464b8b852d9cd23210839 new file mode 100644 index 0000000..e18c26f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4f/4f8d8cdeed5464b8b852d9cd23210839 differ diff --git a/PatchTestProject/Library/Artifacts/4f/4fb45f18180c7391888eafd11e4a5352 b/PatchTestProject/Library/Artifacts/4f/4fb45f18180c7391888eafd11e4a5352 new file mode 100644 index 0000000..bd7586a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4f/4fb45f18180c7391888eafd11e4a5352 differ diff --git a/PatchTestProject/Library/Artifacts/4f/4fb7cfe1c29ecbddd7134faca8b03a54 b/PatchTestProject/Library/Artifacts/4f/4fb7cfe1c29ecbddd7134faca8b03a54 new file mode 100644 index 0000000..4bafa3e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4f/4fb7cfe1c29ecbddd7134faca8b03a54 differ diff --git a/PatchTestProject/Library/Artifacts/4f/4fc421b06153742d236a9ee959d66548 b/PatchTestProject/Library/Artifacts/4f/4fc421b06153742d236a9ee959d66548 new file mode 100644 index 0000000..09feef6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/4f/4fc421b06153742d236a9ee959d66548 differ diff --git a/PatchTestProject/Library/Artifacts/50/500a953a4246bca7380d0d8aa18dcf72 b/PatchTestProject/Library/Artifacts/50/500a953a4246bca7380d0d8aa18dcf72 new file mode 100644 index 0000000..42bce63 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/500a953a4246bca7380d0d8aa18dcf72 differ diff --git a/PatchTestProject/Library/Artifacts/50/504057eaed2034df09b45a177e054291 b/PatchTestProject/Library/Artifacts/50/504057eaed2034df09b45a177e054291 new file mode 100644 index 0000000..82b7c8c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/504057eaed2034df09b45a177e054291 differ diff --git a/PatchTestProject/Library/Artifacts/50/504427dc2928c68830ec2f2c7bbf75bd b/PatchTestProject/Library/Artifacts/50/504427dc2928c68830ec2f2c7bbf75bd new file mode 100644 index 0000000..a16ddfa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/504427dc2928c68830ec2f2c7bbf75bd differ diff --git a/PatchTestProject/Library/Artifacts/50/50596ba7545127bdcb8c91dfc76074c5 b/PatchTestProject/Library/Artifacts/50/50596ba7545127bdcb8c91dfc76074c5 new file mode 100644 index 0000000..f06e681 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50596ba7545127bdcb8c91dfc76074c5 differ diff --git a/PatchTestProject/Library/Artifacts/50/507e3f982207e4be577310793e42f02e b/PatchTestProject/Library/Artifacts/50/507e3f982207e4be577310793e42f02e new file mode 100644 index 0000000..b45a49a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/507e3f982207e4be577310793e42f02e differ diff --git a/PatchTestProject/Library/Artifacts/50/50a78e6b51008cf2cf534ac422c26e0c b/PatchTestProject/Library/Artifacts/50/50a78e6b51008cf2cf534ac422c26e0c new file mode 100644 index 0000000..fdd6431 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50a78e6b51008cf2cf534ac422c26e0c differ diff --git a/PatchTestProject/Library/Artifacts/50/50a9d8fbf50389567bc9942b88b62a27 b/PatchTestProject/Library/Artifacts/50/50a9d8fbf50389567bc9942b88b62a27 new file mode 100644 index 0000000..ba68595 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50a9d8fbf50389567bc9942b88b62a27 differ diff --git a/PatchTestProject/Library/Artifacts/50/50b449c665e3cc8b6c7291f7f76d27c6 b/PatchTestProject/Library/Artifacts/50/50b449c665e3cc8b6c7291f7f76d27c6 new file mode 100644 index 0000000..fe010b3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50b449c665e3cc8b6c7291f7f76d27c6 differ diff --git a/PatchTestProject/Library/Artifacts/50/50bbba6ad8f2748d682fbc2d510dfef4 b/PatchTestProject/Library/Artifacts/50/50bbba6ad8f2748d682fbc2d510dfef4 new file mode 100644 index 0000000..f14c55a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50bbba6ad8f2748d682fbc2d510dfef4 differ diff --git a/PatchTestProject/Library/Artifacts/50/50bc09913f6dcd20f9c26a786db5d286 b/PatchTestProject/Library/Artifacts/50/50bc09913f6dcd20f9c26a786db5d286 new file mode 100644 index 0000000..5942386 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50bc09913f6dcd20f9c26a786db5d286 differ diff --git a/PatchTestProject/Library/Artifacts/50/50c3795c9fda50f44a4c1c0ea02484f7 b/PatchTestProject/Library/Artifacts/50/50c3795c9fda50f44a4c1c0ea02484f7 new file mode 100644 index 0000000..5465eaa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50c3795c9fda50f44a4c1c0ea02484f7 differ diff --git a/PatchTestProject/Library/Artifacts/50/50c5a5204338ccaaad828854cf1b8aed b/PatchTestProject/Library/Artifacts/50/50c5a5204338ccaaad828854cf1b8aed new file mode 100644 index 0000000..88da11a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50c5a5204338ccaaad828854cf1b8aed differ diff --git a/PatchTestProject/Library/Artifacts/50/50e46f23e19820f18da4f22b28ac4ff9 b/PatchTestProject/Library/Artifacts/50/50e46f23e19820f18da4f22b28ac4ff9 new file mode 100644 index 0000000..8871a5d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50e46f23e19820f18da4f22b28ac4ff9 differ diff --git a/PatchTestProject/Library/Artifacts/50/50e988b74a72c0ac2ca3129aeffdfee0 b/PatchTestProject/Library/Artifacts/50/50e988b74a72c0ac2ca3129aeffdfee0 new file mode 100644 index 0000000..491830e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50e988b74a72c0ac2ca3129aeffdfee0 differ diff --git a/PatchTestProject/Library/Artifacts/50/50f019defb0b0f3f15ff87082eeb3fc7 b/PatchTestProject/Library/Artifacts/50/50f019defb0b0f3f15ff87082eeb3fc7 new file mode 100644 index 0000000..f06126c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/50/50f019defb0b0f3f15ff87082eeb3fc7 differ diff --git a/PatchTestProject/Library/Artifacts/51/5158501ebc90319cf3c05b152c4f77ca b/PatchTestProject/Library/Artifacts/51/5158501ebc90319cf3c05b152c4f77ca new file mode 100644 index 0000000..222e0e8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/51/5158501ebc90319cf3c05b152c4f77ca differ diff --git a/PatchTestProject/Library/Artifacts/51/516f6c256bca69d71728db64aa9ffac9 b/PatchTestProject/Library/Artifacts/51/516f6c256bca69d71728db64aa9ffac9 new file mode 100644 index 0000000..6e85212 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/51/516f6c256bca69d71728db64aa9ffac9 differ diff --git a/PatchTestProject/Library/Artifacts/51/51904f133c14bb8350f515cf77974c40 b/PatchTestProject/Library/Artifacts/51/51904f133c14bb8350f515cf77974c40 new file mode 100644 index 0000000..e600323 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/51/51904f133c14bb8350f515cf77974c40 differ diff --git a/PatchTestProject/Library/Artifacts/51/51bbff5169835314f4b8ca630882d83e b/PatchTestProject/Library/Artifacts/51/51bbff5169835314f4b8ca630882d83e new file mode 100644 index 0000000..5791d7c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/51/51bbff5169835314f4b8ca630882d83e differ diff --git a/PatchTestProject/Library/Artifacts/51/51cc9a392db9bd3a35d8a019614b25f3 b/PatchTestProject/Library/Artifacts/51/51cc9a392db9bd3a35d8a019614b25f3 new file mode 100644 index 0000000..205b6e8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/51/51cc9a392db9bd3a35d8a019614b25f3 differ diff --git a/PatchTestProject/Library/Artifacts/52/52213fbaf6cd67ab0199dd4b3f781a22 b/PatchTestProject/Library/Artifacts/52/52213fbaf6cd67ab0199dd4b3f781a22 new file mode 100644 index 0000000..99cac68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/52/52213fbaf6cd67ab0199dd4b3f781a22 differ diff --git a/PatchTestProject/Library/Artifacts/52/52354f2b422521913df9b642d1c0de39 b/PatchTestProject/Library/Artifacts/52/52354f2b422521913df9b642d1c0de39 new file mode 100644 index 0000000..46cfc27 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/52/52354f2b422521913df9b642d1c0de39 differ diff --git a/PatchTestProject/Library/Artifacts/52/523f04c7ec2103fa99a7ba33eea22272 b/PatchTestProject/Library/Artifacts/52/523f04c7ec2103fa99a7ba33eea22272 new file mode 100644 index 0000000..f1b3898 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/52/523f04c7ec2103fa99a7ba33eea22272 differ diff --git a/PatchTestProject/Library/Artifacts/52/52e76987656e58fc6919659cfcccbec0 b/PatchTestProject/Library/Artifacts/52/52e76987656e58fc6919659cfcccbec0 new file mode 100644 index 0000000..c3a19f6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/52/52e76987656e58fc6919659cfcccbec0 differ diff --git a/PatchTestProject/Library/Artifacts/52/52eda12a84b726929ceb11e081b986da b/PatchTestProject/Library/Artifacts/52/52eda12a84b726929ceb11e081b986da new file mode 100644 index 0000000..72b49bd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/52/52eda12a84b726929ceb11e081b986da differ diff --git a/PatchTestProject/Library/Artifacts/53/539205452a6b36248515013b9321af36 b/PatchTestProject/Library/Artifacts/53/539205452a6b36248515013b9321af36 new file mode 100644 index 0000000..b6b6989 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/53/539205452a6b36248515013b9321af36 differ diff --git a/PatchTestProject/Library/Artifacts/53/5392fcab4d64f9d90504465ba0634568 b/PatchTestProject/Library/Artifacts/53/5392fcab4d64f9d90504465ba0634568 new file mode 100644 index 0000000..4ff7c8f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/53/5392fcab4d64f9d90504465ba0634568 differ diff --git a/PatchTestProject/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b b/PatchTestProject/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b new file mode 100644 index 0000000..a184e92 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b differ diff --git a/PatchTestProject/Library/Artifacts/53/53ce5f458083c00dc74328ec375ebbf2 b/PatchTestProject/Library/Artifacts/53/53ce5f458083c00dc74328ec375ebbf2 new file mode 100644 index 0000000..1d1b457 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/53/53ce5f458083c00dc74328ec375ebbf2 differ diff --git a/PatchTestProject/Library/Artifacts/53/53eb767b9d79ac8ce6ef7c85d298eeb7 b/PatchTestProject/Library/Artifacts/53/53eb767b9d79ac8ce6ef7c85d298eeb7 new file mode 100644 index 0000000..1e4456c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/53/53eb767b9d79ac8ce6ef7c85d298eeb7 differ diff --git a/PatchTestProject/Library/Artifacts/54/54066929439fdf8122b9333bc03795ad b/PatchTestProject/Library/Artifacts/54/54066929439fdf8122b9333bc03795ad new file mode 100644 index 0000000..1992939 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/54/54066929439fdf8122b9333bc03795ad differ diff --git a/PatchTestProject/Library/Artifacts/54/545ede00319bdbd2a6b99b4c31adf372 b/PatchTestProject/Library/Artifacts/54/545ede00319bdbd2a6b99b4c31adf372 new file mode 100644 index 0000000..7c8e95d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/54/545ede00319bdbd2a6b99b4c31adf372 differ diff --git a/PatchTestProject/Library/Artifacts/54/546e79319b92f4b9acc098c7f21ce246 b/PatchTestProject/Library/Artifacts/54/546e79319b92f4b9acc098c7f21ce246 new file mode 100644 index 0000000..a258155 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/54/546e79319b92f4b9acc098c7f21ce246 differ diff --git a/PatchTestProject/Library/Artifacts/54/54bbc3ca135a1832e4081b99d7099fab b/PatchTestProject/Library/Artifacts/54/54bbc3ca135a1832e4081b99d7099fab new file mode 100644 index 0000000..3bc3a7e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/54/54bbc3ca135a1832e4081b99d7099fab differ diff --git a/PatchTestProject/Library/Artifacts/54/54f93ac6465f4d9d75db709070c4fdd7 b/PatchTestProject/Library/Artifacts/54/54f93ac6465f4d9d75db709070c4fdd7 new file mode 100644 index 0000000..6243a34 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/54/54f93ac6465f4d9d75db709070c4fdd7 differ diff --git a/PatchTestProject/Library/Artifacts/55/551806c1c0ee4a4f239d8ad7d4954cf2 b/PatchTestProject/Library/Artifacts/55/551806c1c0ee4a4f239d8ad7d4954cf2 new file mode 100644 index 0000000..df7e086 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/55/551806c1c0ee4a4f239d8ad7d4954cf2 differ diff --git a/PatchTestProject/Library/Artifacts/55/5548c2eb54573bf8756b69a3d3af2ad9 b/PatchTestProject/Library/Artifacts/55/5548c2eb54573bf8756b69a3d3af2ad9 new file mode 100644 index 0000000..1a689e2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/55/5548c2eb54573bf8756b69a3d3af2ad9 differ diff --git a/PatchTestProject/Library/Artifacts/56/56202f8b1209bf4abf8c058171692fe8 b/PatchTestProject/Library/Artifacts/56/56202f8b1209bf4abf8c058171692fe8 new file mode 100644 index 0000000..b60b446 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/56202f8b1209bf4abf8c058171692fe8 differ diff --git a/PatchTestProject/Library/Artifacts/56/5633b8f5f05ce9d74159990427f5c0dc b/PatchTestProject/Library/Artifacts/56/5633b8f5f05ce9d74159990427f5c0dc new file mode 100644 index 0000000..9f78a3b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/5633b8f5f05ce9d74159990427f5c0dc differ diff --git a/PatchTestProject/Library/Artifacts/56/564cf0f6a4851d4c651fb489ad0400de b/PatchTestProject/Library/Artifacts/56/564cf0f6a4851d4c651fb489ad0400de new file mode 100644 index 0000000..c9f4b6d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/564cf0f6a4851d4c651fb489ad0400de differ diff --git a/PatchTestProject/Library/Artifacts/56/5667464fa766629e2bc82872b1725850 b/PatchTestProject/Library/Artifacts/56/5667464fa766629e2bc82872b1725850 new file mode 100644 index 0000000..51f53a4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/5667464fa766629e2bc82872b1725850 differ diff --git a/PatchTestProject/Library/Artifacts/56/56a8efba7f1bce48a66139989ad514ab b/PatchTestProject/Library/Artifacts/56/56a8efba7f1bce48a66139989ad514ab new file mode 100644 index 0000000..431c465 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/56a8efba7f1bce48a66139989ad514ab differ diff --git a/PatchTestProject/Library/Artifacts/56/56b550856ce4f680a6e6a8d8bc8090da b/PatchTestProject/Library/Artifacts/56/56b550856ce4f680a6e6a8d8bc8090da new file mode 100644 index 0000000..38f390e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/56b550856ce4f680a6e6a8d8bc8090da differ diff --git a/PatchTestProject/Library/Artifacts/56/56c9ffc05fd0830575f3088b31c99f57 b/PatchTestProject/Library/Artifacts/56/56c9ffc05fd0830575f3088b31c99f57 new file mode 100644 index 0000000..70c51cc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/56c9ffc05fd0830575f3088b31c99f57 differ diff --git a/PatchTestProject/Library/Artifacts/56/56dc1d200dbc629c25827c417e4f7761 b/PatchTestProject/Library/Artifacts/56/56dc1d200dbc629c25827c417e4f7761 new file mode 100644 index 0000000..8593c85 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/56dc1d200dbc629c25827c417e4f7761 differ diff --git a/PatchTestProject/Library/Artifacts/56/56e0d621f4d9c37952591380d03a1e97 b/PatchTestProject/Library/Artifacts/56/56e0d621f4d9c37952591380d03a1e97 new file mode 100644 index 0000000..a654611 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/56/56e0d621f4d9c37952591380d03a1e97 differ diff --git a/PatchTestProject/Library/Artifacts/57/572d1c9b2e10d3bf5692912fd636e740 b/PatchTestProject/Library/Artifacts/57/572d1c9b2e10d3bf5692912fd636e740 new file mode 100644 index 0000000..4f11d54 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/57/572d1c9b2e10d3bf5692912fd636e740 differ diff --git a/PatchTestProject/Library/Artifacts/57/57395ff4d7d2cc9bf6836840c3e89141 b/PatchTestProject/Library/Artifacts/57/57395ff4d7d2cc9bf6836840c3e89141 new file mode 100644 index 0000000..f3348b1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/57/57395ff4d7d2cc9bf6836840c3e89141 differ diff --git a/PatchTestProject/Library/Artifacts/57/579a5e5386f48ede1167435275620488 b/PatchTestProject/Library/Artifacts/57/579a5e5386f48ede1167435275620488 new file mode 100644 index 0000000..9253fb3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/57/579a5e5386f48ede1167435275620488 differ diff --git a/PatchTestProject/Library/Artifacts/57/57be05b0fcdf2ffd41c5466bb67136b9 b/PatchTestProject/Library/Artifacts/57/57be05b0fcdf2ffd41c5466bb67136b9 new file mode 100644 index 0000000..ed3a0cb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/57/57be05b0fcdf2ffd41c5466bb67136b9 differ diff --git a/PatchTestProject/Library/Artifacts/57/57dbfe2a7d69d9d7e500bf34f29ba7aa b/PatchTestProject/Library/Artifacts/57/57dbfe2a7d69d9d7e500bf34f29ba7aa new file mode 100644 index 0000000..c1da596 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/57/57dbfe2a7d69d9d7e500bf34f29ba7aa differ diff --git a/PatchTestProject/Library/Artifacts/58/58156809167f263fd65cc5f69f71e4c2 b/PatchTestProject/Library/Artifacts/58/58156809167f263fd65cc5f69f71e4c2 new file mode 100644 index 0000000..3333177 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/58/58156809167f263fd65cc5f69f71e4c2 differ diff --git a/PatchTestProject/Library/Artifacts/58/582fe3891a93e86ef30447373e7fb99e b/PatchTestProject/Library/Artifacts/58/582fe3891a93e86ef30447373e7fb99e new file mode 100644 index 0000000..c05cd5c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/58/582fe3891a93e86ef30447373e7fb99e differ diff --git a/PatchTestProject/Library/Artifacts/58/58aa5272147941dad715112bc3d662be b/PatchTestProject/Library/Artifacts/58/58aa5272147941dad715112bc3d662be new file mode 100644 index 0000000..9eb1e43 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/58/58aa5272147941dad715112bc3d662be differ diff --git a/PatchTestProject/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df b/PatchTestProject/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df new file mode 100644 index 0000000..38d9440 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df differ diff --git a/PatchTestProject/Library/Artifacts/58/58d9cc94136740f6bc13e1fbc9e0b18d b/PatchTestProject/Library/Artifacts/58/58d9cc94136740f6bc13e1fbc9e0b18d new file mode 100644 index 0000000..489f972 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/58/58d9cc94136740f6bc13e1fbc9e0b18d differ diff --git a/PatchTestProject/Library/Artifacts/58/58e2889f67e60fb4b25bccc02305cecc b/PatchTestProject/Library/Artifacts/58/58e2889f67e60fb4b25bccc02305cecc new file mode 100644 index 0000000..70fed84 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/58/58e2889f67e60fb4b25bccc02305cecc differ diff --git a/PatchTestProject/Library/Artifacts/59/591b088b2d7e22963c9376b2f619663a b/PatchTestProject/Library/Artifacts/59/591b088b2d7e22963c9376b2f619663a new file mode 100644 index 0000000..5e6dbe8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/591b088b2d7e22963c9376b2f619663a differ diff --git a/PatchTestProject/Library/Artifacts/59/59297f9973aaa8030b47e4514043a17d b/PatchTestProject/Library/Artifacts/59/59297f9973aaa8030b47e4514043a17d new file mode 100644 index 0000000..8a73c16 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/59297f9973aaa8030b47e4514043a17d differ diff --git a/PatchTestProject/Library/Artifacts/59/593055add49111337e31f6107fb39400 b/PatchTestProject/Library/Artifacts/59/593055add49111337e31f6107fb39400 new file mode 100644 index 0000000..9c8c623 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/593055add49111337e31f6107fb39400 differ diff --git a/PatchTestProject/Library/Artifacts/59/593a14a4ca71f5b884bffc21addd25f8 b/PatchTestProject/Library/Artifacts/59/593a14a4ca71f5b884bffc21addd25f8 new file mode 100644 index 0000000..bbfa3e1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/593a14a4ca71f5b884bffc21addd25f8 differ diff --git a/PatchTestProject/Library/Artifacts/59/5947e35754fff1dc3bdf42c83b605ae1 b/PatchTestProject/Library/Artifacts/59/5947e35754fff1dc3bdf42c83b605ae1 new file mode 100644 index 0000000..659c15b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/5947e35754fff1dc3bdf42c83b605ae1 differ diff --git a/PatchTestProject/Library/Artifacts/59/594ff4ac643b6a9636604031c314fe69 b/PatchTestProject/Library/Artifacts/59/594ff4ac643b6a9636604031c314fe69 new file mode 100644 index 0000000..51d8708 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/594ff4ac643b6a9636604031c314fe69 differ diff --git a/PatchTestProject/Library/Artifacts/59/596db92d1fe6b8a1df4c616682d6c894 b/PatchTestProject/Library/Artifacts/59/596db92d1fe6b8a1df4c616682d6c894 new file mode 100644 index 0000000..f46b839 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/596db92d1fe6b8a1df4c616682d6c894 differ diff --git a/PatchTestProject/Library/Artifacts/59/5970c792b20194ca9273f5db483925d8 b/PatchTestProject/Library/Artifacts/59/5970c792b20194ca9273f5db483925d8 new file mode 100644 index 0000000..97d9b5c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/5970c792b20194ca9273f5db483925d8 differ diff --git a/PatchTestProject/Library/Artifacts/59/59c4f1c467a17323fff79b2602ea7217 b/PatchTestProject/Library/Artifacts/59/59c4f1c467a17323fff79b2602ea7217 new file mode 100644 index 0000000..6b4cf26 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/59/59c4f1c467a17323fff79b2602ea7217 differ diff --git a/PatchTestProject/Library/Artifacts/5a/5a124a00ac836872e22284fd07e4f323 b/PatchTestProject/Library/Artifacts/5a/5a124a00ac836872e22284fd07e4f323 new file mode 100644 index 0000000..8b0a19a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5a/5a124a00ac836872e22284fd07e4f323 differ diff --git a/PatchTestProject/Library/Artifacts/5a/5a4286e5372951a529b1dfb07ae10fb3 b/PatchTestProject/Library/Artifacts/5a/5a4286e5372951a529b1dfb07ae10fb3 new file mode 100644 index 0000000..e08c9fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5a/5a4286e5372951a529b1dfb07ae10fb3 differ diff --git a/PatchTestProject/Library/Artifacts/5a/5a53ff8009a52e78d5c5bf7947d99133 b/PatchTestProject/Library/Artifacts/5a/5a53ff8009a52e78d5c5bf7947d99133 new file mode 100644 index 0000000..52f7f51 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5a/5a53ff8009a52e78d5c5bf7947d99133 differ diff --git a/PatchTestProject/Library/Artifacts/5a/5ac3252171e820f429dbb2d40e654d46 b/PatchTestProject/Library/Artifacts/5a/5ac3252171e820f429dbb2d40e654d46 new file mode 100644 index 0000000..0cdd0bd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5a/5ac3252171e820f429dbb2d40e654d46 differ diff --git a/PatchTestProject/Library/Artifacts/5b/5b1ee438f89ced92aad1b99c065e7bfa b/PatchTestProject/Library/Artifacts/5b/5b1ee438f89ced92aad1b99c065e7bfa new file mode 100644 index 0000000..b1470cc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5b/5b1ee438f89ced92aad1b99c065e7bfa differ diff --git a/PatchTestProject/Library/Artifacts/5b/5b4706ca9194ada93490467afd0b728f b/PatchTestProject/Library/Artifacts/5b/5b4706ca9194ada93490467afd0b728f new file mode 100644 index 0000000..d7f3396 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5b/5b4706ca9194ada93490467afd0b728f differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c09cc41c3d5b93679c47072f14d4236 b/PatchTestProject/Library/Artifacts/5c/5c09cc41c3d5b93679c47072f14d4236 new file mode 100644 index 0000000..b6ab61d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c09cc41c3d5b93679c47072f14d4236 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c16247f43073549a2d17c0abfd92fbe b/PatchTestProject/Library/Artifacts/5c/5c16247f43073549a2d17c0abfd92fbe new file mode 100644 index 0000000..7d0a70f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c16247f43073549a2d17c0abfd92fbe differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c37ff538591c0a7932cb6043d8a1496 b/PatchTestProject/Library/Artifacts/5c/5c37ff538591c0a7932cb6043d8a1496 new file mode 100644 index 0000000..b81e8c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c37ff538591c0a7932cb6043d8a1496 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c3ccab7f7ae354497745ff02c32eee1 b/PatchTestProject/Library/Artifacts/5c/5c3ccab7f7ae354497745ff02c32eee1 new file mode 100644 index 0000000..0203638 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c3ccab7f7ae354497745ff02c32eee1 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c4ea173f368f8eec4165296b9e90f81 b/PatchTestProject/Library/Artifacts/5c/5c4ea173f368f8eec4165296b9e90f81 new file mode 100644 index 0000000..1f1d460 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c4ea173f368f8eec4165296b9e90f81 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c872f49d6db16f26214963546773026 b/PatchTestProject/Library/Artifacts/5c/5c872f49d6db16f26214963546773026 new file mode 100644 index 0000000..59b9ef3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c872f49d6db16f26214963546773026 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5c8e20d84b5bb13cb619619ffea4b801 b/PatchTestProject/Library/Artifacts/5c/5c8e20d84b5bb13cb619619ffea4b801 new file mode 100644 index 0000000..5c8bec8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5c8e20d84b5bb13cb619619ffea4b801 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5caa5dec5bd1742638314525c4b3995b b/PatchTestProject/Library/Artifacts/5c/5caa5dec5bd1742638314525c4b3995b new file mode 100644 index 0000000..8d97f92 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5caa5dec5bd1742638314525c4b3995b differ diff --git a/PatchTestProject/Library/Artifacts/5c/5cb91ba00147a518da36601cbe6af183 b/PatchTestProject/Library/Artifacts/5c/5cb91ba00147a518da36601cbe6af183 new file mode 100644 index 0000000..1c82608 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5cb91ba00147a518da36601cbe6af183 differ diff --git a/PatchTestProject/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d b/PatchTestProject/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d new file mode 100644 index 0000000..288c085 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d differ diff --git a/PatchTestProject/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 b/PatchTestProject/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 new file mode 100644 index 0000000..cae6d4c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 differ diff --git a/PatchTestProject/Library/Artifacts/5d/5d183ca44048935924a5ba05ae360722 b/PatchTestProject/Library/Artifacts/5d/5d183ca44048935924a5ba05ae360722 new file mode 100644 index 0000000..2739e67 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5d/5d183ca44048935924a5ba05ae360722 differ diff --git a/PatchTestProject/Library/Artifacts/5d/5d3274a36d6372969bffe1945d398249 b/PatchTestProject/Library/Artifacts/5d/5d3274a36d6372969bffe1945d398249 new file mode 100644 index 0000000..493c178 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5d/5d3274a36d6372969bffe1945d398249 differ diff --git a/PatchTestProject/Library/Artifacts/5d/5d3fc41073923265c54b867bc678ee9d b/PatchTestProject/Library/Artifacts/5d/5d3fc41073923265c54b867bc678ee9d new file mode 100644 index 0000000..fe94eb1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5d/5d3fc41073923265c54b867bc678ee9d differ diff --git a/PatchTestProject/Library/Artifacts/5d/5d88e5566e385ad1a16889209e0584d9 b/PatchTestProject/Library/Artifacts/5d/5d88e5566e385ad1a16889209e0584d9 new file mode 100644 index 0000000..b6383a7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5d/5d88e5566e385ad1a16889209e0584d9 differ diff --git a/PatchTestProject/Library/Artifacts/5e/5e5d52694284db2d9b0fdc496c64147c b/PatchTestProject/Library/Artifacts/5e/5e5d52694284db2d9b0fdc496c64147c new file mode 100644 index 0000000..28b0abf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5e/5e5d52694284db2d9b0fdc496c64147c differ diff --git a/PatchTestProject/Library/Artifacts/5e/5e9165767a4990837982cd68b9d189e2 b/PatchTestProject/Library/Artifacts/5e/5e9165767a4990837982cd68b9d189e2 new file mode 100644 index 0000000..74e9963 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5e/5e9165767a4990837982cd68b9d189e2 differ diff --git a/PatchTestProject/Library/Artifacts/5e/5eb12ad780509ea24c93fd9ce3be3b78 b/PatchTestProject/Library/Artifacts/5e/5eb12ad780509ea24c93fd9ce3be3b78 new file mode 100644 index 0000000..39206a6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5e/5eb12ad780509ea24c93fd9ce3be3b78 differ diff --git a/PatchTestProject/Library/Artifacts/5e/5ee885a33433cc50d6324924ce040b64 b/PatchTestProject/Library/Artifacts/5e/5ee885a33433cc50d6324924ce040b64 new file mode 100644 index 0000000..b70f33d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5e/5ee885a33433cc50d6324924ce040b64 differ diff --git a/PatchTestProject/Library/Artifacts/5e/5ef14967d6e865d07f7ee2045281968d b/PatchTestProject/Library/Artifacts/5e/5ef14967d6e865d07f7ee2045281968d new file mode 100644 index 0000000..1ad05b7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5e/5ef14967d6e865d07f7ee2045281968d differ diff --git a/PatchTestProject/Library/Artifacts/5f/5f8de8ebd06dc029a73f589929160d0e b/PatchTestProject/Library/Artifacts/5f/5f8de8ebd06dc029a73f589929160d0e new file mode 100644 index 0000000..5cd97e2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5f/5f8de8ebd06dc029a73f589929160d0e differ diff --git a/PatchTestProject/Library/Artifacts/5f/5fe04e4ddc690ad7c6fda609d1531913 b/PatchTestProject/Library/Artifacts/5f/5fe04e4ddc690ad7c6fda609d1531913 new file mode 100644 index 0000000..d3e6ebf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/5f/5fe04e4ddc690ad7c6fda609d1531913 differ diff --git a/PatchTestProject/Library/Artifacts/60/600fa282321a1533ca866c6640e6c207 b/PatchTestProject/Library/Artifacts/60/600fa282321a1533ca866c6640e6c207 new file mode 100644 index 0000000..c4df7c9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/600fa282321a1533ca866c6640e6c207 differ diff --git a/PatchTestProject/Library/Artifacts/60/6014eb0a83ab4b4c01e773d9a5bef548 b/PatchTestProject/Library/Artifacts/60/6014eb0a83ab4b4c01e773d9a5bef548 new file mode 100644 index 0000000..2d40da9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/6014eb0a83ab4b4c01e773d9a5bef548 differ diff --git a/PatchTestProject/Library/Artifacts/60/60157a16d533b5071d0caa5560ed1bfd b/PatchTestProject/Library/Artifacts/60/60157a16d533b5071d0caa5560ed1bfd new file mode 100644 index 0000000..993b24b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/60157a16d533b5071d0caa5560ed1bfd differ diff --git a/PatchTestProject/Library/Artifacts/60/6022fdf97d684dd0c9c687a44e55933f b/PatchTestProject/Library/Artifacts/60/6022fdf97d684dd0c9c687a44e55933f new file mode 100644 index 0000000..054fa26 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/6022fdf97d684dd0c9c687a44e55933f differ diff --git a/PatchTestProject/Library/Artifacts/60/60730f698a769da6dc70c4d37e86244f b/PatchTestProject/Library/Artifacts/60/60730f698a769da6dc70c4d37e86244f new file mode 100644 index 0000000..e983e00 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/60730f698a769da6dc70c4d37e86244f differ diff --git a/PatchTestProject/Library/Artifacts/60/607facbb22236a6f0a437d91a190b56f b/PatchTestProject/Library/Artifacts/60/607facbb22236a6f0a437d91a190b56f new file mode 100644 index 0000000..67d18b6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/607facbb22236a6f0a437d91a190b56f differ diff --git a/PatchTestProject/Library/Artifacts/60/60918208677b601d077ce92c639ca674 b/PatchTestProject/Library/Artifacts/60/60918208677b601d077ce92c639ca674 new file mode 100644 index 0000000..baf87d2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/60918208677b601d077ce92c639ca674 differ diff --git a/PatchTestProject/Library/Artifacts/60/6094a9bf0cea4421c5e051a8d1326263 b/PatchTestProject/Library/Artifacts/60/6094a9bf0cea4421c5e051a8d1326263 new file mode 100644 index 0000000..a3d8649 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/6094a9bf0cea4421c5e051a8d1326263 differ diff --git a/PatchTestProject/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da b/PatchTestProject/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da new file mode 100644 index 0000000..d78eb5e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da differ diff --git a/PatchTestProject/Library/Artifacts/60/60cf97f277349b3aac5d3bdc55149961 b/PatchTestProject/Library/Artifacts/60/60cf97f277349b3aac5d3bdc55149961 new file mode 100644 index 0000000..f7f46d0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/60/60cf97f277349b3aac5d3bdc55149961 differ diff --git a/PatchTestProject/Library/Artifacts/61/61709f7bfe6bd6276c25d16a9ca8b20d b/PatchTestProject/Library/Artifacts/61/61709f7bfe6bd6276c25d16a9ca8b20d new file mode 100644 index 0000000..b66d36f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/61/61709f7bfe6bd6276c25d16a9ca8b20d differ diff --git a/PatchTestProject/Library/Artifacts/61/619157f94eb3f928a6996b241fdd2fc5 b/PatchTestProject/Library/Artifacts/61/619157f94eb3f928a6996b241fdd2fc5 new file mode 100644 index 0000000..6134d21 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/61/619157f94eb3f928a6996b241fdd2fc5 differ diff --git a/PatchTestProject/Library/Artifacts/61/619278c1ca6eda737f608f66f41d6e94 b/PatchTestProject/Library/Artifacts/61/619278c1ca6eda737f608f66f41d6e94 new file mode 100644 index 0000000..a194dd3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/61/619278c1ca6eda737f608f66f41d6e94 differ diff --git a/PatchTestProject/Library/Artifacts/61/61e12bd2143bb0a3cb78f852b3f5851d b/PatchTestProject/Library/Artifacts/61/61e12bd2143bb0a3cb78f852b3f5851d new file mode 100644 index 0000000..42b9d5a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/61/61e12bd2143bb0a3cb78f852b3f5851d differ diff --git a/PatchTestProject/Library/Artifacts/62/623cc3ad592094dbcf326b8f7c6fe4a2 b/PatchTestProject/Library/Artifacts/62/623cc3ad592094dbcf326b8f7c6fe4a2 new file mode 100644 index 0000000..e3df98c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/623cc3ad592094dbcf326b8f7c6fe4a2 differ diff --git a/PatchTestProject/Library/Artifacts/62/625c4566c65c309f9ada492ce3fefdb8 b/PatchTestProject/Library/Artifacts/62/625c4566c65c309f9ada492ce3fefdb8 new file mode 100644 index 0000000..0b8c602 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/625c4566c65c309f9ada492ce3fefdb8 differ diff --git a/PatchTestProject/Library/Artifacts/62/6262934b4ee9a456d906aa9abee95698 b/PatchTestProject/Library/Artifacts/62/6262934b4ee9a456d906aa9abee95698 new file mode 100644 index 0000000..8ac1dac Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/6262934b4ee9a456d906aa9abee95698 differ diff --git a/PatchTestProject/Library/Artifacts/62/62b3115b4aca94a3d753e029ae2d4dc9 b/PatchTestProject/Library/Artifacts/62/62b3115b4aca94a3d753e029ae2d4dc9 new file mode 100644 index 0000000..6ce1d78 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/62b3115b4aca94a3d753e029ae2d4dc9 differ diff --git a/PatchTestProject/Library/Artifacts/62/62d7562e76bca4df8ede074346faec00 b/PatchTestProject/Library/Artifacts/62/62d7562e76bca4df8ede074346faec00 new file mode 100644 index 0000000..db9bb3d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/62d7562e76bca4df8ede074346faec00 differ diff --git a/PatchTestProject/Library/Artifacts/62/62d7fb9e3be2776a149a96054c6a81eb b/PatchTestProject/Library/Artifacts/62/62d7fb9e3be2776a149a96054c6a81eb new file mode 100644 index 0000000..cd6723a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/62d7fb9e3be2776a149a96054c6a81eb differ diff --git a/PatchTestProject/Library/Artifacts/62/62f5aa1cb272d741b68c68701c6f3382 b/PatchTestProject/Library/Artifacts/62/62f5aa1cb272d741b68c68701c6f3382 new file mode 100644 index 0000000..f4fc00a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/62/62f5aa1cb272d741b68c68701c6f3382 differ diff --git a/PatchTestProject/Library/Artifacts/63/6315b4e0a497e0b50d92ba90342b90d9 b/PatchTestProject/Library/Artifacts/63/6315b4e0a497e0b50d92ba90342b90d9 new file mode 100644 index 0000000..f3c226f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/6315b4e0a497e0b50d92ba90342b90d9 differ diff --git a/PatchTestProject/Library/Artifacts/63/632e63f827816dc6eecb0e8add650e11 b/PatchTestProject/Library/Artifacts/63/632e63f827816dc6eecb0e8add650e11 new file mode 100644 index 0000000..7e56329 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/632e63f827816dc6eecb0e8add650e11 differ diff --git a/PatchTestProject/Library/Artifacts/63/633ba206c2524d6f99018bec73084585 b/PatchTestProject/Library/Artifacts/63/633ba206c2524d6f99018bec73084585 new file mode 100644 index 0000000..bc1dce2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/633ba206c2524d6f99018bec73084585 differ diff --git a/PatchTestProject/Library/Artifacts/63/635ad8e656521e607b32e55a0d1b435f b/PatchTestProject/Library/Artifacts/63/635ad8e656521e607b32e55a0d1b435f new file mode 100644 index 0000000..ee5f630 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/635ad8e656521e607b32e55a0d1b435f differ diff --git a/PatchTestProject/Library/Artifacts/63/63821eb151323d4ab2835f0f4a68f47c b/PatchTestProject/Library/Artifacts/63/63821eb151323d4ab2835f0f4a68f47c new file mode 100644 index 0000000..69cfe9b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63821eb151323d4ab2835f0f4a68f47c differ diff --git a/PatchTestProject/Library/Artifacts/63/63892113faccaa6fd4aeb4f8a46050dd b/PatchTestProject/Library/Artifacts/63/63892113faccaa6fd4aeb4f8a46050dd new file mode 100644 index 0000000..3bc0d06 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63892113faccaa6fd4aeb4f8a46050dd differ diff --git a/PatchTestProject/Library/Artifacts/63/639fcaa8509b2114ef5993f4abd09ac3 b/PatchTestProject/Library/Artifacts/63/639fcaa8509b2114ef5993f4abd09ac3 new file mode 100644 index 0000000..20d9138 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/639fcaa8509b2114ef5993f4abd09ac3 differ diff --git a/PatchTestProject/Library/Artifacts/63/63b5315be4512c7ea29f98cd1c266de7 b/PatchTestProject/Library/Artifacts/63/63b5315be4512c7ea29f98cd1c266de7 new file mode 100644 index 0000000..e270925 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63b5315be4512c7ea29f98cd1c266de7 differ diff --git a/PatchTestProject/Library/Artifacts/63/63cf7756d23e05070a6423166ecc0f07 b/PatchTestProject/Library/Artifacts/63/63cf7756d23e05070a6423166ecc0f07 new file mode 100644 index 0000000..11bf718 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63cf7756d23e05070a6423166ecc0f07 differ diff --git a/PatchTestProject/Library/Artifacts/63/63f046bb337703c4046cd3066f481a22 b/PatchTestProject/Library/Artifacts/63/63f046bb337703c4046cd3066f481a22 new file mode 100644 index 0000000..a758b10 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63f046bb337703c4046cd3066f481a22 differ diff --git a/PatchTestProject/Library/Artifacts/63/63f4456a220ce805501bfd52da6661ad b/PatchTestProject/Library/Artifacts/63/63f4456a220ce805501bfd52da6661ad new file mode 100644 index 0000000..13cf08a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63f4456a220ce805501bfd52da6661ad differ diff --git a/PatchTestProject/Library/Artifacts/63/63f50f8942bf8a772b35672c6bdb7628 b/PatchTestProject/Library/Artifacts/63/63f50f8942bf8a772b35672c6bdb7628 new file mode 100644 index 0000000..eab8345 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/63/63f50f8942bf8a772b35672c6bdb7628 differ diff --git a/PatchTestProject/Library/Artifacts/64/64339d858a048ab3ede39f56f4ca7c0d b/PatchTestProject/Library/Artifacts/64/64339d858a048ab3ede39f56f4ca7c0d new file mode 100644 index 0000000..9d7982f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/64/64339d858a048ab3ede39f56f4ca7c0d differ diff --git a/PatchTestProject/Library/Artifacts/65/6531336c64f19c943af38d4d5fbac30c b/PatchTestProject/Library/Artifacts/65/6531336c64f19c943af38d4d5fbac30c new file mode 100644 index 0000000..94319cf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/6531336c64f19c943af38d4d5fbac30c differ diff --git a/PatchTestProject/Library/Artifacts/65/6546698753a919646461bdcfdc261625 b/PatchTestProject/Library/Artifacts/65/6546698753a919646461bdcfdc261625 new file mode 100644 index 0000000..6a5b6d8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/6546698753a919646461bdcfdc261625 differ diff --git a/PatchTestProject/Library/Artifacts/65/65662a8731052aab53c34379b6f4f082 b/PatchTestProject/Library/Artifacts/65/65662a8731052aab53c34379b6f4f082 new file mode 100644 index 0000000..363b593 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/65662a8731052aab53c34379b6f4f082 differ diff --git a/PatchTestProject/Library/Artifacts/65/65690a60ae695bd203f8e38621beb9cc b/PatchTestProject/Library/Artifacts/65/65690a60ae695bd203f8e38621beb9cc new file mode 100644 index 0000000..48ce457 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/65690a60ae695bd203f8e38621beb9cc differ diff --git a/PatchTestProject/Library/Artifacts/65/656bf15021dfb577e20428c4a867938b b/PatchTestProject/Library/Artifacts/65/656bf15021dfb577e20428c4a867938b new file mode 100644 index 0000000..3d835db Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/656bf15021dfb577e20428c4a867938b differ diff --git a/PatchTestProject/Library/Artifacts/65/657e1fb8faf84d453f4d6a339183476d b/PatchTestProject/Library/Artifacts/65/657e1fb8faf84d453f4d6a339183476d new file mode 100644 index 0000000..4a6f067 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/657e1fb8faf84d453f4d6a339183476d differ diff --git a/PatchTestProject/Library/Artifacts/65/65cafe897179c2f3d1fd517540083a39 b/PatchTestProject/Library/Artifacts/65/65cafe897179c2f3d1fd517540083a39 new file mode 100644 index 0000000..fa401fa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/65cafe897179c2f3d1fd517540083a39 differ diff --git a/PatchTestProject/Library/Artifacts/65/65eb479612be6bb4df3546d167b2fcba b/PatchTestProject/Library/Artifacts/65/65eb479612be6bb4df3546d167b2fcba new file mode 100644 index 0000000..f6873ef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/65eb479612be6bb4df3546d167b2fcba differ diff --git a/PatchTestProject/Library/Artifacts/65/65f202cdc289106690219366ed13afa2 b/PatchTestProject/Library/Artifacts/65/65f202cdc289106690219366ed13afa2 new file mode 100644 index 0000000..40f49a9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/65/65f202cdc289106690219366ed13afa2 differ diff --git a/PatchTestProject/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 b/PatchTestProject/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 new file mode 100644 index 0000000..67b013a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 differ diff --git a/PatchTestProject/Library/Artifacts/66/661964040108e2fcc7a509f8f574ca36 b/PatchTestProject/Library/Artifacts/66/661964040108e2fcc7a509f8f574ca36 new file mode 100644 index 0000000..db4c9ce Binary files /dev/null and b/PatchTestProject/Library/Artifacts/66/661964040108e2fcc7a509f8f574ca36 differ diff --git a/PatchTestProject/Library/Artifacts/66/66767e4b0c6efe43a9a8acdfde25cd7e b/PatchTestProject/Library/Artifacts/66/66767e4b0c6efe43a9a8acdfde25cd7e new file mode 100644 index 0000000..8af11fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/66/66767e4b0c6efe43a9a8acdfde25cd7e differ diff --git a/PatchTestProject/Library/Artifacts/66/669c20afb76734d7da0341874f823572 b/PatchTestProject/Library/Artifacts/66/669c20afb76734d7da0341874f823572 new file mode 100644 index 0000000..3477c50 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/66/669c20afb76734d7da0341874f823572 differ diff --git a/PatchTestProject/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 b/PatchTestProject/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 new file mode 100644 index 0000000..7d1d8e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 differ diff --git a/PatchTestProject/Library/Artifacts/67/6712eebb94d478178b5f599dc0697bf4 b/PatchTestProject/Library/Artifacts/67/6712eebb94d478178b5f599dc0697bf4 new file mode 100644 index 0000000..abbb306 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/67/6712eebb94d478178b5f599dc0697bf4 differ diff --git a/PatchTestProject/Library/Artifacts/67/677bebf77b67df9073861cace6cd9d63 b/PatchTestProject/Library/Artifacts/67/677bebf77b67df9073861cace6cd9d63 new file mode 100644 index 0000000..db11106 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/67/677bebf77b67df9073861cace6cd9d63 differ diff --git a/PatchTestProject/Library/Artifacts/68/68038a298b2dab71b4d1e7b6991a5920 b/PatchTestProject/Library/Artifacts/68/68038a298b2dab71b4d1e7b6991a5920 new file mode 100644 index 0000000..6987dd5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68038a298b2dab71b4d1e7b6991a5920 differ diff --git a/PatchTestProject/Library/Artifacts/68/68345ab2dafb8118aa0de768590d79b1 b/PatchTestProject/Library/Artifacts/68/68345ab2dafb8118aa0de768590d79b1 new file mode 100644 index 0000000..8debec4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68345ab2dafb8118aa0de768590d79b1 differ diff --git a/PatchTestProject/Library/Artifacts/68/686f76d7ce3454cc83eb729f4d427355 b/PatchTestProject/Library/Artifacts/68/686f76d7ce3454cc83eb729f4d427355 new file mode 100644 index 0000000..18cd948 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/686f76d7ce3454cc83eb729f4d427355 differ diff --git a/PatchTestProject/Library/Artifacts/68/68a16d9a46ce4e87f919a270d5bcf959 b/PatchTestProject/Library/Artifacts/68/68a16d9a46ce4e87f919a270d5bcf959 new file mode 100644 index 0000000..cdeeb49 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68a16d9a46ce4e87f919a270d5bcf959 differ diff --git a/PatchTestProject/Library/Artifacts/68/68a3f46f6621b39256e9062dff2a242e b/PatchTestProject/Library/Artifacts/68/68a3f46f6621b39256e9062dff2a242e new file mode 100644 index 0000000..381a1b6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68a3f46f6621b39256e9062dff2a242e differ diff --git a/PatchTestProject/Library/Artifacts/68/68b25482967ea24fe27a6afe1de05a3b b/PatchTestProject/Library/Artifacts/68/68b25482967ea24fe27a6afe1de05a3b new file mode 100644 index 0000000..d0abb3a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68b25482967ea24fe27a6afe1de05a3b differ diff --git a/PatchTestProject/Library/Artifacts/68/68e6d54225b52620e9cc9801df609170 b/PatchTestProject/Library/Artifacts/68/68e6d54225b52620e9cc9801df609170 new file mode 100644 index 0000000..8f32152 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68e6d54225b52620e9cc9801df609170 differ diff --git a/PatchTestProject/Library/Artifacts/68/68e8ab77215138c0ea63404d3e8799d4 b/PatchTestProject/Library/Artifacts/68/68e8ab77215138c0ea63404d3e8799d4 new file mode 100644 index 0000000..0ffba95 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/68/68e8ab77215138c0ea63404d3e8799d4 differ diff --git a/PatchTestProject/Library/Artifacts/69/69633e04983bdf898303d01896197591 b/PatchTestProject/Library/Artifacts/69/69633e04983bdf898303d01896197591 new file mode 100644 index 0000000..414e717 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/69/69633e04983bdf898303d01896197591 differ diff --git a/PatchTestProject/Library/Artifacts/69/698bfe4322d0156674a5006e204729a1 b/PatchTestProject/Library/Artifacts/69/698bfe4322d0156674a5006e204729a1 new file mode 100644 index 0000000..f4935af Binary files /dev/null and b/PatchTestProject/Library/Artifacts/69/698bfe4322d0156674a5006e204729a1 differ diff --git a/PatchTestProject/Library/Artifacts/69/69e9c6e18426d4d3a5980e926bdf0b4b b/PatchTestProject/Library/Artifacts/69/69e9c6e18426d4d3a5980e926bdf0b4b new file mode 100644 index 0000000..91523d6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/69/69e9c6e18426d4d3a5980e926bdf0b4b differ diff --git a/PatchTestProject/Library/Artifacts/69/69f80a127f788dffbb01dc21b95a4d1d b/PatchTestProject/Library/Artifacts/69/69f80a127f788dffbb01dc21b95a4d1d new file mode 100644 index 0000000..dd3c02c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/69/69f80a127f788dffbb01dc21b95a4d1d differ diff --git a/PatchTestProject/Library/Artifacts/6a/6a289e6d874b3e1ae063e464f17cd6cc b/PatchTestProject/Library/Artifacts/6a/6a289e6d874b3e1ae063e464f17cd6cc new file mode 100644 index 0000000..7ee3752 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6a289e6d874b3e1ae063e464f17cd6cc differ diff --git a/PatchTestProject/Library/Artifacts/6a/6a2b439d4053b714d5f52f76e52be3c1 b/PatchTestProject/Library/Artifacts/6a/6a2b439d4053b714d5f52f76e52be3c1 new file mode 100644 index 0000000..519af0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6a2b439d4053b714d5f52f76e52be3c1 differ diff --git a/PatchTestProject/Library/Artifacts/6a/6a4e3286759b4399b4b834b7520c477c b/PatchTestProject/Library/Artifacts/6a/6a4e3286759b4399b4b834b7520c477c new file mode 100644 index 0000000..febb4d1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6a4e3286759b4399b4b834b7520c477c differ diff --git a/PatchTestProject/Library/Artifacts/6a/6a9175f47c32e7a87eafacadfb742594 b/PatchTestProject/Library/Artifacts/6a/6a9175f47c32e7a87eafacadfb742594 new file mode 100644 index 0000000..a8f14e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6a9175f47c32e7a87eafacadfb742594 differ diff --git a/PatchTestProject/Library/Artifacts/6a/6a9f0b502eed101aa1eeebb7d316fe92 b/PatchTestProject/Library/Artifacts/6a/6a9f0b502eed101aa1eeebb7d316fe92 new file mode 100644 index 0000000..bb96ee0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6a9f0b502eed101aa1eeebb7d316fe92 differ diff --git a/PatchTestProject/Library/Artifacts/6a/6ac8913ecc155b113415da3002f53449 b/PatchTestProject/Library/Artifacts/6a/6ac8913ecc155b113415da3002f53449 new file mode 100644 index 0000000..1d7620c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6ac8913ecc155b113415da3002f53449 differ diff --git a/PatchTestProject/Library/Artifacts/6a/6ae37a3c23a0145df52cf6a1f8427042 b/PatchTestProject/Library/Artifacts/6a/6ae37a3c23a0145df52cf6a1f8427042 new file mode 100644 index 0000000..6040ce6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6ae37a3c23a0145df52cf6a1f8427042 differ diff --git a/PatchTestProject/Library/Artifacts/6a/6aee230b31deb0dfba05ecfa973a9ab4 b/PatchTestProject/Library/Artifacts/6a/6aee230b31deb0dfba05ecfa973a9ab4 new file mode 100644 index 0000000..36c5cdc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6a/6aee230b31deb0dfba05ecfa973a9ab4 differ diff --git a/PatchTestProject/Library/Artifacts/6b/6b0f7051376aa76ee06abbc1cf63fd89 b/PatchTestProject/Library/Artifacts/6b/6b0f7051376aa76ee06abbc1cf63fd89 new file mode 100644 index 0000000..52943ee Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6b/6b0f7051376aa76ee06abbc1cf63fd89 differ diff --git a/PatchTestProject/Library/Artifacts/6b/6b75a06f806e5565832c3bd91b1d7824 b/PatchTestProject/Library/Artifacts/6b/6b75a06f806e5565832c3bd91b1d7824 new file mode 100644 index 0000000..8881b23 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6b/6b75a06f806e5565832c3bd91b1d7824 differ diff --git a/PatchTestProject/Library/Artifacts/6b/6b9c80bc0c876fc34d96f985ef15acd3 b/PatchTestProject/Library/Artifacts/6b/6b9c80bc0c876fc34d96f985ef15acd3 new file mode 100644 index 0000000..40f3d42 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6b/6b9c80bc0c876fc34d96f985ef15acd3 differ diff --git a/PatchTestProject/Library/Artifacts/6b/6ba5dd151dc1aac32adcca663d389571 b/PatchTestProject/Library/Artifacts/6b/6ba5dd151dc1aac32adcca663d389571 new file mode 100644 index 0000000..742d744 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6b/6ba5dd151dc1aac32adcca663d389571 differ diff --git a/PatchTestProject/Library/Artifacts/6b/6bb36474d5aa5661f786eae4e7af5875 b/PatchTestProject/Library/Artifacts/6b/6bb36474d5aa5661f786eae4e7af5875 new file mode 100644 index 0000000..ad235fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6b/6bb36474d5aa5661f786eae4e7af5875 differ diff --git a/PatchTestProject/Library/Artifacts/6b/6bf3b8d4d0653ea5abc1398526f062f7 b/PatchTestProject/Library/Artifacts/6b/6bf3b8d4d0653ea5abc1398526f062f7 new file mode 100644 index 0000000..5081e5c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6b/6bf3b8d4d0653ea5abc1398526f062f7 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6c07d02c2785645cde46d16210d80a99 b/PatchTestProject/Library/Artifacts/6c/6c07d02c2785645cde46d16210d80a99 new file mode 100644 index 0000000..1566b99 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6c07d02c2785645cde46d16210d80a99 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 b/PatchTestProject/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 new file mode 100644 index 0000000..b810d61 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6c6d6e9c9f2ac214a21b9a178f1d4277 b/PatchTestProject/Library/Artifacts/6c/6c6d6e9c9f2ac214a21b9a178f1d4277 new file mode 100644 index 0000000..5a717ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6c6d6e9c9f2ac214a21b9a178f1d4277 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 b/PatchTestProject/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 new file mode 100644 index 0000000..8952007 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6c95cfd32343041f0c9d359d0726ff1e b/PatchTestProject/Library/Artifacts/6c/6c95cfd32343041f0c9d359d0726ff1e new file mode 100644 index 0000000..37e0a0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6c95cfd32343041f0c9d359d0726ff1e differ diff --git a/PatchTestProject/Library/Artifacts/6c/6cbe69c030e19f1c7a4f8c915da6a280 b/PatchTestProject/Library/Artifacts/6c/6cbe69c030e19f1c7a4f8c915da6a280 new file mode 100644 index 0000000..a29ccf0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6cbe69c030e19f1c7a4f8c915da6a280 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6cd64e167dd31c32697856050da773ca b/PatchTestProject/Library/Artifacts/6c/6cd64e167dd31c32697856050da773ca new file mode 100644 index 0000000..132e2c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6cd64e167dd31c32697856050da773ca differ diff --git a/PatchTestProject/Library/Artifacts/6c/6cdaeb90d442e04bbcdab36de154c507 b/PatchTestProject/Library/Artifacts/6c/6cdaeb90d442e04bbcdab36de154c507 new file mode 100644 index 0000000..b01a09b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6cdaeb90d442e04bbcdab36de154c507 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6ce4ead607f5c1f258ded67f1f2362e1 b/PatchTestProject/Library/Artifacts/6c/6ce4ead607f5c1f258ded67f1f2362e1 new file mode 100644 index 0000000..0faa55a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6ce4ead607f5c1f258ded67f1f2362e1 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6cef5afe21866f5d7457215984ee5511 b/PatchTestProject/Library/Artifacts/6c/6cef5afe21866f5d7457215984ee5511 new file mode 100644 index 0000000..77d6ef2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6cef5afe21866f5d7457215984ee5511 differ diff --git a/PatchTestProject/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e b/PatchTestProject/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e new file mode 100644 index 0000000..233a554 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e differ diff --git a/PatchTestProject/Library/Artifacts/6d/6d1aa3a007dc7d5d29eb16cb84b1a634 b/PatchTestProject/Library/Artifacts/6d/6d1aa3a007dc7d5d29eb16cb84b1a634 new file mode 100644 index 0000000..73343d8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6d/6d1aa3a007dc7d5d29eb16cb84b1a634 differ diff --git a/PatchTestProject/Library/Artifacts/6d/6d6b1204d8a659884c720f231d55dcab b/PatchTestProject/Library/Artifacts/6d/6d6b1204d8a659884c720f231d55dcab new file mode 100644 index 0000000..9c95afe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6d/6d6b1204d8a659884c720f231d55dcab differ diff --git a/PatchTestProject/Library/Artifacts/6d/6d6d359640ac11f5ce772f4a60de84d3 b/PatchTestProject/Library/Artifacts/6d/6d6d359640ac11f5ce772f4a60de84d3 new file mode 100644 index 0000000..3d4d505 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6d/6d6d359640ac11f5ce772f4a60de84d3 differ diff --git a/PatchTestProject/Library/Artifacts/6d/6d8d22a044534d2d8b164fbb6764896c b/PatchTestProject/Library/Artifacts/6d/6d8d22a044534d2d8b164fbb6764896c new file mode 100644 index 0000000..4f3235d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6d/6d8d22a044534d2d8b164fbb6764896c differ diff --git a/PatchTestProject/Library/Artifacts/6d/6da9d077ae87869b8ce34d99745f6b83 b/PatchTestProject/Library/Artifacts/6d/6da9d077ae87869b8ce34d99745f6b83 new file mode 100644 index 0000000..c12107c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6d/6da9d077ae87869b8ce34d99745f6b83 differ diff --git a/PatchTestProject/Library/Artifacts/6d/6ddab57124d461c35bc929c3a0d5a8c2 b/PatchTestProject/Library/Artifacts/6d/6ddab57124d461c35bc929c3a0d5a8c2 new file mode 100644 index 0000000..e09eda4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6d/6ddab57124d461c35bc929c3a0d5a8c2 differ diff --git a/PatchTestProject/Library/Artifacts/6e/6e56780d002bda80cc8729760cfbbebe b/PatchTestProject/Library/Artifacts/6e/6e56780d002bda80cc8729760cfbbebe new file mode 100644 index 0000000..6fb0358 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6e/6e56780d002bda80cc8729760cfbbebe differ diff --git a/PatchTestProject/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c b/PatchTestProject/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c new file mode 100644 index 0000000..41fe660 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c differ diff --git a/PatchTestProject/Library/Artifacts/6e/6ed35d77a8212ab7a5f758c68bcf805f b/PatchTestProject/Library/Artifacts/6e/6ed35d77a8212ab7a5f758c68bcf805f new file mode 100644 index 0000000..9aeedfe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6e/6ed35d77a8212ab7a5f758c68bcf805f differ diff --git a/PatchTestProject/Library/Artifacts/6e/6eefb8fc2d45a231aa46e2b2cdb4752c b/PatchTestProject/Library/Artifacts/6e/6eefb8fc2d45a231aa46e2b2cdb4752c new file mode 100644 index 0000000..2e857c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6e/6eefb8fc2d45a231aa46e2b2cdb4752c differ diff --git a/PatchTestProject/Library/Artifacts/6f/6f2430d965a96feb31dbb1b93f97e00f b/PatchTestProject/Library/Artifacts/6f/6f2430d965a96feb31dbb1b93f97e00f new file mode 100644 index 0000000..f595ed6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6f/6f2430d965a96feb31dbb1b93f97e00f differ diff --git a/PatchTestProject/Library/Artifacts/6f/6f41c85396e588cccc20bf5089009821 b/PatchTestProject/Library/Artifacts/6f/6f41c85396e588cccc20bf5089009821 new file mode 100644 index 0000000..6963c47 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6f/6f41c85396e588cccc20bf5089009821 differ diff --git a/PatchTestProject/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 b/PatchTestProject/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 new file mode 100644 index 0000000..b20da55 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 differ diff --git a/PatchTestProject/Library/Artifacts/6f/6fd118940f455ad0a8d36f36ff7b669f b/PatchTestProject/Library/Artifacts/6f/6fd118940f455ad0a8d36f36ff7b669f new file mode 100644 index 0000000..868ca80 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6f/6fd118940f455ad0a8d36f36ff7b669f differ diff --git a/PatchTestProject/Library/Artifacts/6f/6ffbbd748280499a332cb1bb96ef22d6 b/PatchTestProject/Library/Artifacts/6f/6ffbbd748280499a332cb1bb96ef22d6 new file mode 100644 index 0000000..5c00bc4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/6f/6ffbbd748280499a332cb1bb96ef22d6 differ diff --git a/PatchTestProject/Library/Artifacts/70/7014c5c17160d7a141fb8ac36d369cc6 b/PatchTestProject/Library/Artifacts/70/7014c5c17160d7a141fb8ac36d369cc6 new file mode 100644 index 0000000..c0142e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/70/7014c5c17160d7a141fb8ac36d369cc6 differ diff --git a/PatchTestProject/Library/Artifacts/70/7031b1f43616542125a3259d3999e879 b/PatchTestProject/Library/Artifacts/70/7031b1f43616542125a3259d3999e879 new file mode 100644 index 0000000..0b10091 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/70/7031b1f43616542125a3259d3999e879 differ diff --git a/PatchTestProject/Library/Artifacts/70/7037f42ef4db5ef0806f2b1ecd52503e b/PatchTestProject/Library/Artifacts/70/7037f42ef4db5ef0806f2b1ecd52503e new file mode 100644 index 0000000..6f78993 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/70/7037f42ef4db5ef0806f2b1ecd52503e differ diff --git a/PatchTestProject/Library/Artifacts/70/7055ff3caa027366d12984fbccf98148 b/PatchTestProject/Library/Artifacts/70/7055ff3caa027366d12984fbccf98148 new file mode 100644 index 0000000..49b96be Binary files /dev/null and b/PatchTestProject/Library/Artifacts/70/7055ff3caa027366d12984fbccf98148 differ diff --git a/PatchTestProject/Library/Artifacts/70/70c243cc19c015205eb64355177ad565 b/PatchTestProject/Library/Artifacts/70/70c243cc19c015205eb64355177ad565 new file mode 100644 index 0000000..c6d7562 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/70/70c243cc19c015205eb64355177ad565 differ diff --git a/PatchTestProject/Library/Artifacts/70/70cdf6ddd8a3d9b24a90b1351435ad9f b/PatchTestProject/Library/Artifacts/70/70cdf6ddd8a3d9b24a90b1351435ad9f new file mode 100644 index 0000000..ea62e28 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/70/70cdf6ddd8a3d9b24a90b1351435ad9f differ diff --git a/PatchTestProject/Library/Artifacts/71/7108c0608fcd35bdc7c365bf063d63bd b/PatchTestProject/Library/Artifacts/71/7108c0608fcd35bdc7c365bf063d63bd new file mode 100644 index 0000000..edc538f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/7108c0608fcd35bdc7c365bf063d63bd differ diff --git a/PatchTestProject/Library/Artifacts/71/710a66495a40c3180d7d1eec7ff8a73e b/PatchTestProject/Library/Artifacts/71/710a66495a40c3180d7d1eec7ff8a73e new file mode 100644 index 0000000..41be6a5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/710a66495a40c3180d7d1eec7ff8a73e differ diff --git a/PatchTestProject/Library/Artifacts/71/7128794dbb64aec783e834705adf0d91 b/PatchTestProject/Library/Artifacts/71/7128794dbb64aec783e834705adf0d91 new file mode 100644 index 0000000..979a0f7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/7128794dbb64aec783e834705adf0d91 differ diff --git a/PatchTestProject/Library/Artifacts/71/7161df9247c53c69d68c0f612fd361a8 b/PatchTestProject/Library/Artifacts/71/7161df9247c53c69d68c0f612fd361a8 new file mode 100644 index 0000000..c735dd5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/7161df9247c53c69d68c0f612fd361a8 differ diff --git a/PatchTestProject/Library/Artifacts/71/71824d2cb2cfd8e667cc956a0068ca3d b/PatchTestProject/Library/Artifacts/71/71824d2cb2cfd8e667cc956a0068ca3d new file mode 100644 index 0000000..c81795c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/71824d2cb2cfd8e667cc956a0068ca3d differ diff --git a/PatchTestProject/Library/Artifacts/71/718536fee4d7a6f9a5f4f25ea74406b7 b/PatchTestProject/Library/Artifacts/71/718536fee4d7a6f9a5f4f25ea74406b7 new file mode 100644 index 0000000..0044b63 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/718536fee4d7a6f9a5f4f25ea74406b7 differ diff --git a/PatchTestProject/Library/Artifacts/71/718fd204e46536b14d6251be5581cf2d b/PatchTestProject/Library/Artifacts/71/718fd204e46536b14d6251be5581cf2d new file mode 100644 index 0000000..4984535 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/718fd204e46536b14d6251be5581cf2d differ diff --git a/PatchTestProject/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 b/PatchTestProject/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 new file mode 100644 index 0000000..3383775 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 differ diff --git a/PatchTestProject/Library/Artifacts/71/71d144eeeba023b9d123bba1d46eb5bc b/PatchTestProject/Library/Artifacts/71/71d144eeeba023b9d123bba1d46eb5bc new file mode 100644 index 0000000..04c0a2b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/71/71d144eeeba023b9d123bba1d46eb5bc differ diff --git a/PatchTestProject/Library/Artifacts/72/720c7b5c722b86eb532336cf0c06a169 b/PatchTestProject/Library/Artifacts/72/720c7b5c722b86eb532336cf0c06a169 new file mode 100644 index 0000000..c474d68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/72/720c7b5c722b86eb532336cf0c06a169 differ diff --git a/PatchTestProject/Library/Artifacts/72/727d517e75452363783cdea521af09c8 b/PatchTestProject/Library/Artifacts/72/727d517e75452363783cdea521af09c8 new file mode 100644 index 0000000..dee52c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/72/727d517e75452363783cdea521af09c8 differ diff --git a/PatchTestProject/Library/Artifacts/72/72e33330e2b333b102f58e8eab6c3a17 b/PatchTestProject/Library/Artifacts/72/72e33330e2b333b102f58e8eab6c3a17 new file mode 100644 index 0000000..fcb0cc7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/72/72e33330e2b333b102f58e8eab6c3a17 differ diff --git a/PatchTestProject/Library/Artifacts/72/72edd6488ad1cf99110c87c371067ec5 b/PatchTestProject/Library/Artifacts/72/72edd6488ad1cf99110c87c371067ec5 new file mode 100644 index 0000000..83bae1c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/72/72edd6488ad1cf99110c87c371067ec5 differ diff --git a/PatchTestProject/Library/Artifacts/73/7343539f22c5b2fab7b10746cc4f2766 b/PatchTestProject/Library/Artifacts/73/7343539f22c5b2fab7b10746cc4f2766 new file mode 100644 index 0000000..8f79c1d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/73/7343539f22c5b2fab7b10746cc4f2766 differ diff --git a/PatchTestProject/Library/Artifacts/73/73a054c846a1ee9d49f8d60c20fc5824 b/PatchTestProject/Library/Artifacts/73/73a054c846a1ee9d49f8d60c20fc5824 new file mode 100644 index 0000000..82ca18d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/73/73a054c846a1ee9d49f8d60c20fc5824 differ diff --git a/PatchTestProject/Library/Artifacts/73/73d08097555aa1bb22330edfae43d499 b/PatchTestProject/Library/Artifacts/73/73d08097555aa1bb22330edfae43d499 new file mode 100644 index 0000000..791f463 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/73/73d08097555aa1bb22330edfae43d499 differ diff --git a/PatchTestProject/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 b/PatchTestProject/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 new file mode 100644 index 0000000..2c25d27 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 differ diff --git a/PatchTestProject/Library/Artifacts/74/74881a05c1f53542d513db84d022ebb6 b/PatchTestProject/Library/Artifacts/74/74881a05c1f53542d513db84d022ebb6 new file mode 100644 index 0000000..c09fdfe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/74/74881a05c1f53542d513db84d022ebb6 differ diff --git a/PatchTestProject/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 b/PatchTestProject/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 new file mode 100644 index 0000000..d583604 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 differ diff --git a/PatchTestProject/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 b/PatchTestProject/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 new file mode 100644 index 0000000..a171986 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 differ diff --git a/PatchTestProject/Library/Artifacts/74/74fdb021fd194eda0407166132dc6ea2 b/PatchTestProject/Library/Artifacts/74/74fdb021fd194eda0407166132dc6ea2 new file mode 100644 index 0000000..0e2991a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/74/74fdb021fd194eda0407166132dc6ea2 differ diff --git a/PatchTestProject/Library/Artifacts/75/75545c8753119548d9279c0a38724571 b/PatchTestProject/Library/Artifacts/75/75545c8753119548d9279c0a38724571 new file mode 100644 index 0000000..45277c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/75/75545c8753119548d9279c0a38724571 differ diff --git a/PatchTestProject/Library/Artifacts/75/75595e51eb389bc0f99087b6519ec53d b/PatchTestProject/Library/Artifacts/75/75595e51eb389bc0f99087b6519ec53d new file mode 100644 index 0000000..0220c39 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/75/75595e51eb389bc0f99087b6519ec53d differ diff --git a/PatchTestProject/Library/Artifacts/75/758050624edd233fb9c91a23a2014669 b/PatchTestProject/Library/Artifacts/75/758050624edd233fb9c91a23a2014669 new file mode 100644 index 0000000..1046741 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/75/758050624edd233fb9c91a23a2014669 differ diff --git a/PatchTestProject/Library/Artifacts/75/7587987fcccfc9947ba7673b75847394 b/PatchTestProject/Library/Artifacts/75/7587987fcccfc9947ba7673b75847394 new file mode 100644 index 0000000..53c7408 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/75/7587987fcccfc9947ba7673b75847394 differ diff --git a/PatchTestProject/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 b/PatchTestProject/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 new file mode 100644 index 0000000..24b3158 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 differ diff --git a/PatchTestProject/Library/Artifacts/75/75f4b31b259c176511f6d7543d12573c b/PatchTestProject/Library/Artifacts/75/75f4b31b259c176511f6d7543d12573c new file mode 100644 index 0000000..25cd7d9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/75/75f4b31b259c176511f6d7543d12573c differ diff --git a/PatchTestProject/Library/Artifacts/76/760fe5596e1de7228d5fa5ac7e11f106 b/PatchTestProject/Library/Artifacts/76/760fe5596e1de7228d5fa5ac7e11f106 new file mode 100644 index 0000000..a72f12a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/76/760fe5596e1de7228d5fa5ac7e11f106 differ diff --git a/PatchTestProject/Library/Artifacts/76/7625975ff41b58bf8dbed18409704aa6 b/PatchTestProject/Library/Artifacts/76/7625975ff41b58bf8dbed18409704aa6 new file mode 100644 index 0000000..598f2f6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/76/7625975ff41b58bf8dbed18409704aa6 differ diff --git a/PatchTestProject/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 b/PatchTestProject/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 new file mode 100644 index 0000000..3d31682 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 differ diff --git a/PatchTestProject/Library/Artifacts/76/7664b8467dd8ca74043884d65475a9a6 b/PatchTestProject/Library/Artifacts/76/7664b8467dd8ca74043884d65475a9a6 new file mode 100644 index 0000000..91ab109 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/76/7664b8467dd8ca74043884d65475a9a6 differ diff --git a/PatchTestProject/Library/Artifacts/76/76b761199019ec7373a297880d775de3 b/PatchTestProject/Library/Artifacts/76/76b761199019ec7373a297880d775de3 new file mode 100644 index 0000000..186a419 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/76/76b761199019ec7373a297880d775de3 differ diff --git a/PatchTestProject/Library/Artifacts/77/771798fd8cf92d2122969919925fe469 b/PatchTestProject/Library/Artifacts/77/771798fd8cf92d2122969919925fe469 new file mode 100644 index 0000000..14dddd0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/77/771798fd8cf92d2122969919925fe469 differ diff --git a/PatchTestProject/Library/Artifacts/77/778167d0363f2cefd497e35bee5567ef b/PatchTestProject/Library/Artifacts/77/778167d0363f2cefd497e35bee5567ef new file mode 100644 index 0000000..b4d6daf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/77/778167d0363f2cefd497e35bee5567ef differ diff --git a/PatchTestProject/Library/Artifacts/77/77cca2fe932101752542d2e98bfe3d27 b/PatchTestProject/Library/Artifacts/77/77cca2fe932101752542d2e98bfe3d27 new file mode 100644 index 0000000..1552132 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/77/77cca2fe932101752542d2e98bfe3d27 differ diff --git a/PatchTestProject/Library/Artifacts/77/77d4c486010475cf93d3f968b89133dd b/PatchTestProject/Library/Artifacts/77/77d4c486010475cf93d3f968b89133dd new file mode 100644 index 0000000..fcc355d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/77/77d4c486010475cf93d3f968b89133dd differ diff --git a/PatchTestProject/Library/Artifacts/77/77e6bd61efd82ad97f8dec9dccab8406 b/PatchTestProject/Library/Artifacts/77/77e6bd61efd82ad97f8dec9dccab8406 new file mode 100644 index 0000000..b712c45 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/77/77e6bd61efd82ad97f8dec9dccab8406 differ diff --git a/PatchTestProject/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 b/PatchTestProject/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 new file mode 100644 index 0000000..9c532f8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 differ diff --git a/PatchTestProject/Library/Artifacts/78/780d523c654a2ab2f70280db0095bce0 b/PatchTestProject/Library/Artifacts/78/780d523c654a2ab2f70280db0095bce0 new file mode 100644 index 0000000..a42a984 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/780d523c654a2ab2f70280db0095bce0 differ diff --git a/PatchTestProject/Library/Artifacts/78/7817b74f7986c832f74997bab814a2ba b/PatchTestProject/Library/Artifacts/78/7817b74f7986c832f74997bab814a2ba new file mode 100644 index 0000000..3f9f596 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/7817b74f7986c832f74997bab814a2ba differ diff --git a/PatchTestProject/Library/Artifacts/78/781ea18a5b43982c68d525bbf17290a0 b/PatchTestProject/Library/Artifacts/78/781ea18a5b43982c68d525bbf17290a0 new file mode 100644 index 0000000..c12d7b3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/781ea18a5b43982c68d525bbf17290a0 differ diff --git a/PatchTestProject/Library/Artifacts/78/786b488e2d2e67d26064cbc2696e7eb5 b/PatchTestProject/Library/Artifacts/78/786b488e2d2e67d26064cbc2696e7eb5 new file mode 100644 index 0000000..f2a98ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/786b488e2d2e67d26064cbc2696e7eb5 differ diff --git a/PatchTestProject/Library/Artifacts/78/7892ed537e54e5918c8944ddc194f506 b/PatchTestProject/Library/Artifacts/78/7892ed537e54e5918c8944ddc194f506 new file mode 100644 index 0000000..315b886 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/7892ed537e54e5918c8944ddc194f506 differ diff --git a/PatchTestProject/Library/Artifacts/78/78953d133cc78390aaac23e7a6fdef6b b/PatchTestProject/Library/Artifacts/78/78953d133cc78390aaac23e7a6fdef6b new file mode 100644 index 0000000..f25d9c6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/78953d133cc78390aaac23e7a6fdef6b differ diff --git a/PatchTestProject/Library/Artifacts/78/78a81eefc168fc2b5ffe57eeb2134475 b/PatchTestProject/Library/Artifacts/78/78a81eefc168fc2b5ffe57eeb2134475 new file mode 100644 index 0000000..5a373d0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/78/78a81eefc168fc2b5ffe57eeb2134475 differ diff --git a/PatchTestProject/Library/Artifacts/79/7917483258797bf9119467fb5c15f8ce b/PatchTestProject/Library/Artifacts/79/7917483258797bf9119467fb5c15f8ce new file mode 100644 index 0000000..0481976 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/7917483258797bf9119467fb5c15f8ce differ diff --git a/PatchTestProject/Library/Artifacts/79/7918035e90cb5909c05ff8048d67caf0 b/PatchTestProject/Library/Artifacts/79/7918035e90cb5909c05ff8048d67caf0 new file mode 100644 index 0000000..39e2051 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/7918035e90cb5909c05ff8048d67caf0 differ diff --git a/PatchTestProject/Library/Artifacts/79/7923490cb1391e5ce9b65d72cf22672c b/PatchTestProject/Library/Artifacts/79/7923490cb1391e5ce9b65d72cf22672c new file mode 100644 index 0000000..5ca92c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/7923490cb1391e5ce9b65d72cf22672c differ diff --git a/PatchTestProject/Library/Artifacts/79/79550c603e442c0cd093fef1a55e8b38 b/PatchTestProject/Library/Artifacts/79/79550c603e442c0cd093fef1a55e8b38 new file mode 100644 index 0000000..1ff1f81 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/79550c603e442c0cd093fef1a55e8b38 differ diff --git a/PatchTestProject/Library/Artifacts/79/7986c23257373f7b0f21791de42d75c4 b/PatchTestProject/Library/Artifacts/79/7986c23257373f7b0f21791de42d75c4 new file mode 100644 index 0000000..a634028 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/7986c23257373f7b0f21791de42d75c4 differ diff --git a/PatchTestProject/Library/Artifacts/79/79c42ca6353d3d3b0c2c654abe881ef6 b/PatchTestProject/Library/Artifacts/79/79c42ca6353d3d3b0c2c654abe881ef6 new file mode 100644 index 0000000..740dd4d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/79c42ca6353d3d3b0c2c654abe881ef6 differ diff --git a/PatchTestProject/Library/Artifacts/79/79cff51cf7e4041acdbfaedf4465abf2 b/PatchTestProject/Library/Artifacts/79/79cff51cf7e4041acdbfaedf4465abf2 new file mode 100644 index 0000000..d836f94 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/79cff51cf7e4041acdbfaedf4465abf2 differ diff --git a/PatchTestProject/Library/Artifacts/79/79e0e5b59567887e6a0a462c1fd2c17d b/PatchTestProject/Library/Artifacts/79/79e0e5b59567887e6a0a462c1fd2c17d new file mode 100644 index 0000000..6da46cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/79e0e5b59567887e6a0a462c1fd2c17d differ diff --git a/PatchTestProject/Library/Artifacts/79/79e96780fef6a84814a2e87511175953 b/PatchTestProject/Library/Artifacts/79/79e96780fef6a84814a2e87511175953 new file mode 100644 index 0000000..a71e422 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/79e96780fef6a84814a2e87511175953 differ diff --git a/PatchTestProject/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 b/PatchTestProject/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 new file mode 100644 index 0000000..7964e9b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 differ diff --git a/PatchTestProject/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 b/PatchTestProject/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 new file mode 100644 index 0000000..a9fbb89 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 differ diff --git a/PatchTestProject/Library/Artifacts/7a/7a7a4d1d07e87a8f69b994eab854dfc4 b/PatchTestProject/Library/Artifacts/7a/7a7a4d1d07e87a8f69b994eab854dfc4 new file mode 100644 index 0000000..55c7e28 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7a/7a7a4d1d07e87a8f69b994eab854dfc4 differ diff --git a/PatchTestProject/Library/Artifacts/7a/7ab910fe627f4a9825d0472a89ccac0b b/PatchTestProject/Library/Artifacts/7a/7ab910fe627f4a9825d0472a89ccac0b new file mode 100644 index 0000000..46178be Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7a/7ab910fe627f4a9825d0472a89ccac0b differ diff --git a/PatchTestProject/Library/Artifacts/7a/7aeb04ed3e9028fc30a737a730c35989 b/PatchTestProject/Library/Artifacts/7a/7aeb04ed3e9028fc30a737a730c35989 new file mode 100644 index 0000000..b855e65 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7a/7aeb04ed3e9028fc30a737a730c35989 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b18db629acd9345e6f7de106b2f7a45 b/PatchTestProject/Library/Artifacts/7b/7b18db629acd9345e6f7de106b2f7a45 new file mode 100644 index 0000000..8e22f9d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b18db629acd9345e6f7de106b2f7a45 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b1eddb8dad7d14f12a19ee7e1995632 b/PatchTestProject/Library/Artifacts/7b/7b1eddb8dad7d14f12a19ee7e1995632 new file mode 100644 index 0000000..ee2686d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b1eddb8dad7d14f12a19ee7e1995632 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b375cac6bb2b2caefa00f899bbb776a b/PatchTestProject/Library/Artifacts/7b/7b375cac6bb2b2caefa00f899bbb776a new file mode 100644 index 0000000..5c04854 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b375cac6bb2b2caefa00f899bbb776a differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b49dd398e28c32bd0da06d186a8a870 b/PatchTestProject/Library/Artifacts/7b/7b49dd398e28c32bd0da06d186a8a870 new file mode 100644 index 0000000..caf4c4d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b49dd398e28c32bd0da06d186a8a870 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b4a02b8c764cfc9ceaba66c727a5264 b/PatchTestProject/Library/Artifacts/7b/7b4a02b8c764cfc9ceaba66c727a5264 new file mode 100644 index 0000000..a5458bb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b4a02b8c764cfc9ceaba66c727a5264 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b6a934bea1dfa189c4757000ef83d57 b/PatchTestProject/Library/Artifacts/7b/7b6a934bea1dfa189c4757000ef83d57 new file mode 100644 index 0000000..9507d80 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b6a934bea1dfa189c4757000ef83d57 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7b7d426cb02b6199076b539f82a1fa6e b/PatchTestProject/Library/Artifacts/7b/7b7d426cb02b6199076b539f82a1fa6e new file mode 100644 index 0000000..c6e2b56 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7b7d426cb02b6199076b539f82a1fa6e differ diff --git a/PatchTestProject/Library/Artifacts/7b/7ba3612e232fa07d94ef258285c00882 b/PatchTestProject/Library/Artifacts/7b/7ba3612e232fa07d94ef258285c00882 new file mode 100644 index 0000000..f3ff799 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7ba3612e232fa07d94ef258285c00882 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 b/PatchTestProject/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 new file mode 100644 index 0000000..7ba63e2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7be87a42e20f049eecbd56a58518df55 b/PatchTestProject/Library/Artifacts/7b/7be87a42e20f049eecbd56a58518df55 new file mode 100644 index 0000000..58157c5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7be87a42e20f049eecbd56a58518df55 differ diff --git a/PatchTestProject/Library/Artifacts/7b/7bfb85dbc24805c7c3a95d1de6b484a7 b/PatchTestProject/Library/Artifacts/7b/7bfb85dbc24805c7c3a95d1de6b484a7 new file mode 100644 index 0000000..2c84c57 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7b/7bfb85dbc24805c7c3a95d1de6b484a7 differ diff --git a/PatchTestProject/Library/Artifacts/7c/7c19c8f962aee9e9021e5187aae4925d b/PatchTestProject/Library/Artifacts/7c/7c19c8f962aee9e9021e5187aae4925d new file mode 100644 index 0000000..54021e7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7c/7c19c8f962aee9e9021e5187aae4925d differ diff --git a/PatchTestProject/Library/Artifacts/7c/7c3897546969a734c81c3907dbe9a285 b/PatchTestProject/Library/Artifacts/7c/7c3897546969a734c81c3907dbe9a285 new file mode 100644 index 0000000..f37ef3e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7c/7c3897546969a734c81c3907dbe9a285 differ diff --git a/PatchTestProject/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 b/PatchTestProject/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 new file mode 100644 index 0000000..bf7b746 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 differ diff --git a/PatchTestProject/Library/Artifacts/7c/7ca027b4bb173e2c7e0237afc063a4c1 b/PatchTestProject/Library/Artifacts/7c/7ca027b4bb173e2c7e0237afc063a4c1 new file mode 100644 index 0000000..ba2966e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7c/7ca027b4bb173e2c7e0237afc063a4c1 differ diff --git a/PatchTestProject/Library/Artifacts/7c/7ceb2ee2971b261c945eb3e3e41b7a13 b/PatchTestProject/Library/Artifacts/7c/7ceb2ee2971b261c945eb3e3e41b7a13 new file mode 100644 index 0000000..e2e910a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7c/7ceb2ee2971b261c945eb3e3e41b7a13 differ diff --git a/PatchTestProject/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 b/PatchTestProject/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 new file mode 100644 index 0000000..e7ed25e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 differ diff --git a/PatchTestProject/Library/Artifacts/7d/7d2b5c70cbb6db2602353aa40f1b65d3 b/PatchTestProject/Library/Artifacts/7d/7d2b5c70cbb6db2602353aa40f1b65d3 new file mode 100644 index 0000000..7919c63 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7d2b5c70cbb6db2602353aa40f1b65d3 differ diff --git a/PatchTestProject/Library/Artifacts/7d/7d388d27d7008b3329c88ce4acfc93ad b/PatchTestProject/Library/Artifacts/7d/7d388d27d7008b3329c88ce4acfc93ad new file mode 100644 index 0000000..4dcb4f1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7d388d27d7008b3329c88ce4acfc93ad differ diff --git a/PatchTestProject/Library/Artifacts/7d/7d4ca971414e32fa3c2f40cf226b5e7c b/PatchTestProject/Library/Artifacts/7d/7d4ca971414e32fa3c2f40cf226b5e7c new file mode 100644 index 0000000..6b4da26 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7d4ca971414e32fa3c2f40cf226b5e7c differ diff --git a/PatchTestProject/Library/Artifacts/7d/7d61af2a4ada53e54538368092617fb6 b/PatchTestProject/Library/Artifacts/7d/7d61af2a4ada53e54538368092617fb6 new file mode 100644 index 0000000..a3d0e1f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7d61af2a4ada53e54538368092617fb6 differ diff --git a/PatchTestProject/Library/Artifacts/7d/7d8767c4d1846ed038ee861fe40f896e b/PatchTestProject/Library/Artifacts/7d/7d8767c4d1846ed038ee861fe40f896e new file mode 100644 index 0000000..2c64a96 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7d8767c4d1846ed038ee861fe40f896e differ diff --git a/PatchTestProject/Library/Artifacts/7d/7dbb5b75f10e0a80659ccb20126bb08f b/PatchTestProject/Library/Artifacts/7d/7dbb5b75f10e0a80659ccb20126bb08f new file mode 100644 index 0000000..aa58fb0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7dbb5b75f10e0a80659ccb20126bb08f differ diff --git a/PatchTestProject/Library/Artifacts/7d/7dcdcb16fe6e87fdc1058abc7ba9cc14 b/PatchTestProject/Library/Artifacts/7d/7dcdcb16fe6e87fdc1058abc7ba9cc14 new file mode 100644 index 0000000..4fe2fe4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7d/7dcdcb16fe6e87fdc1058abc7ba9cc14 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 b/PatchTestProject/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 new file mode 100644 index 0000000..7b06c5d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e1e200ba82e2c4987bbeb537bce7a33 b/PatchTestProject/Library/Artifacts/7e/7e1e200ba82e2c4987bbeb537bce7a33 new file mode 100644 index 0000000..d47b1e6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e1e200ba82e2c4987bbeb537bce7a33 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e267ba19d346809164e6a117e134711 b/PatchTestProject/Library/Artifacts/7e/7e267ba19d346809164e6a117e134711 new file mode 100644 index 0000000..d921d70 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e267ba19d346809164e6a117e134711 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e2bb9c5a5daa9e821e2d2b275c0541e b/PatchTestProject/Library/Artifacts/7e/7e2bb9c5a5daa9e821e2d2b275c0541e new file mode 100644 index 0000000..92aac66 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e2bb9c5a5daa9e821e2d2b275c0541e differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e51e211bf9318527b00fb9e192a0776 b/PatchTestProject/Library/Artifacts/7e/7e51e211bf9318527b00fb9e192a0776 new file mode 100644 index 0000000..697b993 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e51e211bf9318527b00fb9e192a0776 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e676a09cfbbfdcbc3cf5e60d147145a b/PatchTestProject/Library/Artifacts/7e/7e676a09cfbbfdcbc3cf5e60d147145a new file mode 100644 index 0000000..6558683 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e676a09cfbbfdcbc3cf5e60d147145a differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e76b194f196a2024207deee320ebf0d b/PatchTestProject/Library/Artifacts/7e/7e76b194f196a2024207deee320ebf0d new file mode 100644 index 0000000..7299c61 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e76b194f196a2024207deee320ebf0d differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e7ed211ff8b3056108ec4c724ddaf71 b/PatchTestProject/Library/Artifacts/7e/7e7ed211ff8b3056108ec4c724ddaf71 new file mode 100644 index 0000000..99938c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e7ed211ff8b3056108ec4c724ddaf71 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e87234ead64b55b6a4076e1f7dcea39 b/PatchTestProject/Library/Artifacts/7e/7e87234ead64b55b6a4076e1f7dcea39 new file mode 100644 index 0000000..7d51ccf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e87234ead64b55b6a4076e1f7dcea39 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7e8d5f116c039ae04304f0f75ed27c61 b/PatchTestProject/Library/Artifacts/7e/7e8d5f116c039ae04304f0f75ed27c61 new file mode 100644 index 0000000..e0af851 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7e8d5f116c039ae04304f0f75ed27c61 differ diff --git a/PatchTestProject/Library/Artifacts/7e/7ef926698c81241c33a67c640eaac9dd b/PatchTestProject/Library/Artifacts/7e/7ef926698c81241c33a67c640eaac9dd new file mode 100644 index 0000000..6d9bfa0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7e/7ef926698c81241c33a67c640eaac9dd differ diff --git a/PatchTestProject/Library/Artifacts/7f/7f0f6d803058eadc04cc2590ffe2ad96 b/PatchTestProject/Library/Artifacts/7f/7f0f6d803058eadc04cc2590ffe2ad96 new file mode 100644 index 0000000..9b588a9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7f0f6d803058eadc04cc2590ffe2ad96 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7f26aa7fe95961a53ba4b8938c7e85ca b/PatchTestProject/Library/Artifacts/7f/7f26aa7fe95961a53ba4b8938c7e85ca new file mode 100644 index 0000000..a8ed184 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7f26aa7fe95961a53ba4b8938c7e85ca differ diff --git a/PatchTestProject/Library/Artifacts/7f/7f48ebd5496b2cc0e2c6e42820904a36 b/PatchTestProject/Library/Artifacts/7f/7f48ebd5496b2cc0e2c6e42820904a36 new file mode 100644 index 0000000..884ffca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7f48ebd5496b2cc0e2c6e42820904a36 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7f4d140ec98b11d0e17ec4fd55312c11 b/PatchTestProject/Library/Artifacts/7f/7f4d140ec98b11d0e17ec4fd55312c11 new file mode 100644 index 0000000..8d542d6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7f4d140ec98b11d0e17ec4fd55312c11 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7f721736f816b18136030ad22cb359e6 b/PatchTestProject/Library/Artifacts/7f/7f721736f816b18136030ad22cb359e6 new file mode 100644 index 0000000..0f4ae68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7f721736f816b18136030ad22cb359e6 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7f8c8e8471126f3705e0de8e7db85a4d b/PatchTestProject/Library/Artifacts/7f/7f8c8e8471126f3705e0de8e7db85a4d new file mode 100644 index 0000000..6e856e6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7f8c8e8471126f3705e0de8e7db85a4d differ diff --git a/PatchTestProject/Library/Artifacts/7f/7fa7a84d10aaad44b4b5a9b42f6fce8e b/PatchTestProject/Library/Artifacts/7f/7fa7a84d10aaad44b4b5a9b42f6fce8e new file mode 100644 index 0000000..1bba90c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7fa7a84d10aaad44b4b5a9b42f6fce8e differ diff --git a/PatchTestProject/Library/Artifacts/7f/7fa7e79ebcdb49e6fae9f7f2a64b12c1 b/PatchTestProject/Library/Artifacts/7f/7fa7e79ebcdb49e6fae9f7f2a64b12c1 new file mode 100644 index 0000000..36f64e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7fa7e79ebcdb49e6fae9f7f2a64b12c1 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7fb1755de756b93772cf93ed7f659c3b b/PatchTestProject/Library/Artifacts/7f/7fb1755de756b93772cf93ed7f659c3b new file mode 100644 index 0000000..77c5643 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7fb1755de756b93772cf93ed7f659c3b differ diff --git a/PatchTestProject/Library/Artifacts/7f/7fc0f76753c0da0dfbae9ead3f994db6 b/PatchTestProject/Library/Artifacts/7f/7fc0f76753c0da0dfbae9ead3f994db6 new file mode 100644 index 0000000..771acf7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7fc0f76753c0da0dfbae9ead3f994db6 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7fcb07e6d69921fa746d6994f1590361 b/PatchTestProject/Library/Artifacts/7f/7fcb07e6d69921fa746d6994f1590361 new file mode 100644 index 0000000..b58b4b4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7fcb07e6d69921fa746d6994f1590361 differ diff --git a/PatchTestProject/Library/Artifacts/7f/7fde260846f2849e3f01837a508599d4 b/PatchTestProject/Library/Artifacts/7f/7fde260846f2849e3f01837a508599d4 new file mode 100644 index 0000000..905eaf6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/7f/7fde260846f2849e3f01837a508599d4 differ diff --git a/PatchTestProject/Library/Artifacts/80/80116e6c3ee07b53a604fa457e1b7f83 b/PatchTestProject/Library/Artifacts/80/80116e6c3ee07b53a604fa457e1b7f83 new file mode 100644 index 0000000..427fc9a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/80116e6c3ee07b53a604fa457e1b7f83 differ diff --git a/PatchTestProject/Library/Artifacts/80/8018597180439fea71d3023f4105888f b/PatchTestProject/Library/Artifacts/80/8018597180439fea71d3023f4105888f new file mode 100644 index 0000000..a4e01c7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/8018597180439fea71d3023f4105888f differ diff --git a/PatchTestProject/Library/Artifacts/80/803545f9c786f3db6cee1242a3b6c595 b/PatchTestProject/Library/Artifacts/80/803545f9c786f3db6cee1242a3b6c595 new file mode 100644 index 0000000..3883e1f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/803545f9c786f3db6cee1242a3b6c595 differ diff --git a/PatchTestProject/Library/Artifacts/80/80368bda4c7e419ab72398ce7cbd0314 b/PatchTestProject/Library/Artifacts/80/80368bda4c7e419ab72398ce7cbd0314 new file mode 100644 index 0000000..d4543d9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/80368bda4c7e419ab72398ce7cbd0314 differ diff --git a/PatchTestProject/Library/Artifacts/80/807216c1c18107b21e0527d5cf610332 b/PatchTestProject/Library/Artifacts/80/807216c1c18107b21e0527d5cf610332 new file mode 100644 index 0000000..f04cba4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/807216c1c18107b21e0527d5cf610332 differ diff --git a/PatchTestProject/Library/Artifacts/80/80d047a5e751e9b025ea746d82e1a8e5 b/PatchTestProject/Library/Artifacts/80/80d047a5e751e9b025ea746d82e1a8e5 new file mode 100644 index 0000000..ff54d33 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/80d047a5e751e9b025ea746d82e1a8e5 differ diff --git a/PatchTestProject/Library/Artifacts/80/80d720bee22070c87b933978b25fa79d b/PatchTestProject/Library/Artifacts/80/80d720bee22070c87b933978b25fa79d new file mode 100644 index 0000000..20f63e2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/80d720bee22070c87b933978b25fa79d differ diff --git a/PatchTestProject/Library/Artifacts/80/80f2151c251ee34daa7871ec72b4a111 b/PatchTestProject/Library/Artifacts/80/80f2151c251ee34daa7871ec72b4a111 new file mode 100644 index 0000000..caffe24 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/80f2151c251ee34daa7871ec72b4a111 differ diff --git a/PatchTestProject/Library/Artifacts/80/80fb7418797df0ad2d7020396c21f176 b/PatchTestProject/Library/Artifacts/80/80fb7418797df0ad2d7020396c21f176 new file mode 100644 index 0000000..3f890ec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/80/80fb7418797df0ad2d7020396c21f176 differ diff --git a/PatchTestProject/Library/Artifacts/81/8110d4292c20c88f99bde5ead51ca255 b/PatchTestProject/Library/Artifacts/81/8110d4292c20c88f99bde5ead51ca255 new file mode 100644 index 0000000..0d84a43 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/8110d4292c20c88f99bde5ead51ca255 differ diff --git a/PatchTestProject/Library/Artifacts/81/812a0b49fba29021167b092b3cfef9b3 b/PatchTestProject/Library/Artifacts/81/812a0b49fba29021167b092b3cfef9b3 new file mode 100644 index 0000000..1b78b49 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/812a0b49fba29021167b092b3cfef9b3 differ diff --git a/PatchTestProject/Library/Artifacts/81/812c5481fbbb19d7100ca5b2c7b24585 b/PatchTestProject/Library/Artifacts/81/812c5481fbbb19d7100ca5b2c7b24585 new file mode 100644 index 0000000..94305fc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/812c5481fbbb19d7100ca5b2c7b24585 differ diff --git a/PatchTestProject/Library/Artifacts/81/8140f0bdc161f8fec2e3dfec4b93193f b/PatchTestProject/Library/Artifacts/81/8140f0bdc161f8fec2e3dfec4b93193f new file mode 100644 index 0000000..66fb60e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/8140f0bdc161f8fec2e3dfec4b93193f differ diff --git a/PatchTestProject/Library/Artifacts/81/8148b401b8a04aa1bd2ac4af20e910ff b/PatchTestProject/Library/Artifacts/81/8148b401b8a04aa1bd2ac4af20e910ff new file mode 100644 index 0000000..e36401b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/8148b401b8a04aa1bd2ac4af20e910ff differ diff --git a/PatchTestProject/Library/Artifacts/81/8170bd8787035d2c0c6919cdfbe16063 b/PatchTestProject/Library/Artifacts/81/8170bd8787035d2c0c6919cdfbe16063 new file mode 100644 index 0000000..e5d0c86 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/8170bd8787035d2c0c6919cdfbe16063 differ diff --git a/PatchTestProject/Library/Artifacts/81/81d4b7f69b8c38e1aa7cd35ea985fa98 b/PatchTestProject/Library/Artifacts/81/81d4b7f69b8c38e1aa7cd35ea985fa98 new file mode 100644 index 0000000..e400a72 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/81/81d4b7f69b8c38e1aa7cd35ea985fa98 differ diff --git a/PatchTestProject/Library/Artifacts/82/8247262d90459e33b72a564120227566 b/PatchTestProject/Library/Artifacts/82/8247262d90459e33b72a564120227566 new file mode 100644 index 0000000..d32cc93 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/8247262d90459e33b72a564120227566 differ diff --git a/PatchTestProject/Library/Artifacts/82/825e72350347ee13549e56ff54f964a2 b/PatchTestProject/Library/Artifacts/82/825e72350347ee13549e56ff54f964a2 new file mode 100644 index 0000000..d2dcd24 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/825e72350347ee13549e56ff54f964a2 differ diff --git a/PatchTestProject/Library/Artifacts/82/826f933060fc58333bd19621634d9298 b/PatchTestProject/Library/Artifacts/82/826f933060fc58333bd19621634d9298 new file mode 100644 index 0000000..ce07ef9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/826f933060fc58333bd19621634d9298 differ diff --git a/PatchTestProject/Library/Artifacts/82/82756f6a3b590eda7761430d7f417fce b/PatchTestProject/Library/Artifacts/82/82756f6a3b590eda7761430d7f417fce new file mode 100644 index 0000000..95f2b0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82756f6a3b590eda7761430d7f417fce differ diff --git a/PatchTestProject/Library/Artifacts/82/828ab85630381bbadab5771cb14a8156 b/PatchTestProject/Library/Artifacts/82/828ab85630381bbadab5771cb14a8156 new file mode 100644 index 0000000..2f78881 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/828ab85630381bbadab5771cb14a8156 differ diff --git a/PatchTestProject/Library/Artifacts/82/82af17dc7568b4bd01ec622c47ba5937 b/PatchTestProject/Library/Artifacts/82/82af17dc7568b4bd01ec622c47ba5937 new file mode 100644 index 0000000..e1ce831 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82af17dc7568b4bd01ec622c47ba5937 differ diff --git a/PatchTestProject/Library/Artifacts/82/82d115e1280b18691581513ecbd5e9d3 b/PatchTestProject/Library/Artifacts/82/82d115e1280b18691581513ecbd5e9d3 new file mode 100644 index 0000000..870212d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82d115e1280b18691581513ecbd5e9d3 differ diff --git a/PatchTestProject/Library/Artifacts/82/82d1a263fbdd4f2f9ca475b709686078 b/PatchTestProject/Library/Artifacts/82/82d1a263fbdd4f2f9ca475b709686078 new file mode 100644 index 0000000..db728c3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82d1a263fbdd4f2f9ca475b709686078 differ diff --git a/PatchTestProject/Library/Artifacts/82/82d2a433d441bc9f48e410c2356dcc6a b/PatchTestProject/Library/Artifacts/82/82d2a433d441bc9f48e410c2356dcc6a new file mode 100644 index 0000000..14c97d2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82d2a433d441bc9f48e410c2356dcc6a differ diff --git a/PatchTestProject/Library/Artifacts/82/82e534d03b7d5fda722097736cf6d996 b/PatchTestProject/Library/Artifacts/82/82e534d03b7d5fda722097736cf6d996 new file mode 100644 index 0000000..24f916c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82e534d03b7d5fda722097736cf6d996 differ diff --git a/PatchTestProject/Library/Artifacts/82/82f79d96752576726e550220780b7fbd b/PatchTestProject/Library/Artifacts/82/82f79d96752576726e550220780b7fbd new file mode 100644 index 0000000..4aa28ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/82/82f79d96752576726e550220780b7fbd differ diff --git a/PatchTestProject/Library/Artifacts/83/8356d8abd1f5cf82883e64e07ac5054e b/PatchTestProject/Library/Artifacts/83/8356d8abd1f5cf82883e64e07ac5054e new file mode 100644 index 0000000..0f073ba Binary files /dev/null and b/PatchTestProject/Library/Artifacts/83/8356d8abd1f5cf82883e64e07ac5054e differ diff --git a/PatchTestProject/Library/Artifacts/83/835ab9210d9ca37a4acb9f4f610d95d4 b/PatchTestProject/Library/Artifacts/83/835ab9210d9ca37a4acb9f4f610d95d4 new file mode 100644 index 0000000..c201386 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/83/835ab9210d9ca37a4acb9f4f610d95d4 differ diff --git a/PatchTestProject/Library/Artifacts/83/8365750d0fbf85fccf9859164c230233 b/PatchTestProject/Library/Artifacts/83/8365750d0fbf85fccf9859164c230233 new file mode 100644 index 0000000..4c3fb44 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/83/8365750d0fbf85fccf9859164c230233 differ diff --git a/PatchTestProject/Library/Artifacts/83/83a43593ec482460c58dc2754ac908aa b/PatchTestProject/Library/Artifacts/83/83a43593ec482460c58dc2754ac908aa new file mode 100644 index 0000000..6c7e4f9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/83/83a43593ec482460c58dc2754ac908aa differ diff --git a/PatchTestProject/Library/Artifacts/83/83b241398d97dffbe3a7e80fd9969d85 b/PatchTestProject/Library/Artifacts/83/83b241398d97dffbe3a7e80fd9969d85 new file mode 100644 index 0000000..6bee3c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/83/83b241398d97dffbe3a7e80fd9969d85 differ diff --git a/PatchTestProject/Library/Artifacts/83/83ed81d5c607da02d232740a477f7b18 b/PatchTestProject/Library/Artifacts/83/83ed81d5c607da02d232740a477f7b18 new file mode 100644 index 0000000..1ab7576 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/83/83ed81d5c607da02d232740a477f7b18 differ diff --git a/PatchTestProject/Library/Artifacts/84/84296a40a6ae6ef6e4ea1b2bc20b3c31 b/PatchTestProject/Library/Artifacts/84/84296a40a6ae6ef6e4ea1b2bc20b3c31 new file mode 100644 index 0000000..e347a2b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/84/84296a40a6ae6ef6e4ea1b2bc20b3c31 differ diff --git a/PatchTestProject/Library/Artifacts/84/8438d3591c336e1f728dc5df74544ada b/PatchTestProject/Library/Artifacts/84/8438d3591c336e1f728dc5df74544ada new file mode 100644 index 0000000..8c5468c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/84/8438d3591c336e1f728dc5df74544ada differ diff --git a/PatchTestProject/Library/Artifacts/84/847d74c8e0071b3288809ab9df2d6d30 b/PatchTestProject/Library/Artifacts/84/847d74c8e0071b3288809ab9df2d6d30 new file mode 100644 index 0000000..82ead2d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/84/847d74c8e0071b3288809ab9df2d6d30 differ diff --git a/PatchTestProject/Library/Artifacts/84/8489a00a273a0c8f2c5d9b54fa5a3567 b/PatchTestProject/Library/Artifacts/84/8489a00a273a0c8f2c5d9b54fa5a3567 new file mode 100644 index 0000000..f3cbbd9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/84/8489a00a273a0c8f2c5d9b54fa5a3567 differ diff --git a/PatchTestProject/Library/Artifacts/84/84f75a786fc6320c713c7f90efe7daef b/PatchTestProject/Library/Artifacts/84/84f75a786fc6320c713c7f90efe7daef new file mode 100644 index 0000000..be45eb8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/84/84f75a786fc6320c713c7f90efe7daef differ diff --git a/PatchTestProject/Library/Artifacts/85/855fd13f833fa61e548e773484d31344 b/PatchTestProject/Library/Artifacts/85/855fd13f833fa61e548e773484d31344 new file mode 100644 index 0000000..54c2e6b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/85/855fd13f833fa61e548e773484d31344 differ diff --git a/PatchTestProject/Library/Artifacts/85/85926562dd894af6ef5a3304257531ba b/PatchTestProject/Library/Artifacts/85/85926562dd894af6ef5a3304257531ba new file mode 100644 index 0000000..a5eeb59 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/85/85926562dd894af6ef5a3304257531ba differ diff --git a/PatchTestProject/Library/Artifacts/85/859ef6869296e05e572c8035d5f0662b b/PatchTestProject/Library/Artifacts/85/859ef6869296e05e572c8035d5f0662b new file mode 100644 index 0000000..4b3fc3c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/85/859ef6869296e05e572c8035d5f0662b differ diff --git a/PatchTestProject/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 b/PatchTestProject/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 new file mode 100644 index 0000000..2b6b177 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 differ diff --git a/PatchTestProject/Library/Artifacts/86/8615ade6640dd6c0a42a0abea1dd0734 b/PatchTestProject/Library/Artifacts/86/8615ade6640dd6c0a42a0abea1dd0734 new file mode 100644 index 0000000..2c82cc9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/8615ade6640dd6c0a42a0abea1dd0734 differ diff --git a/PatchTestProject/Library/Artifacts/86/867b056c9dccee8a12c998226f74ba39 b/PatchTestProject/Library/Artifacts/86/867b056c9dccee8a12c998226f74ba39 new file mode 100644 index 0000000..6820812 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/867b056c9dccee8a12c998226f74ba39 differ diff --git a/PatchTestProject/Library/Artifacts/86/867bca7788c051da43d05f4b9910e6f2 b/PatchTestProject/Library/Artifacts/86/867bca7788c051da43d05f4b9910e6f2 new file mode 100644 index 0000000..cc1fd03 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/867bca7788c051da43d05f4b9910e6f2 differ diff --git a/PatchTestProject/Library/Artifacts/86/86a89d5590aed76772f253500f36b2e2 b/PatchTestProject/Library/Artifacts/86/86a89d5590aed76772f253500f36b2e2 new file mode 100644 index 0000000..2a4a90e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/86a89d5590aed76772f253500f36b2e2 differ diff --git a/PatchTestProject/Library/Artifacts/86/86cacc13765664333d269c5a6b79bd32 b/PatchTestProject/Library/Artifacts/86/86cacc13765664333d269c5a6b79bd32 new file mode 100644 index 0000000..42f8ae3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/86cacc13765664333d269c5a6b79bd32 differ diff --git a/PatchTestProject/Library/Artifacts/86/86ec6ad41af5471208bc8c7907c7ab96 b/PatchTestProject/Library/Artifacts/86/86ec6ad41af5471208bc8c7907c7ab96 new file mode 100644 index 0000000..2cc21b7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/86ec6ad41af5471208bc8c7907c7ab96 differ diff --git a/PatchTestProject/Library/Artifacts/86/86f9dcd2e4608ae46e803ca0df9fceb5 b/PatchTestProject/Library/Artifacts/86/86f9dcd2e4608ae46e803ca0df9fceb5 new file mode 100644 index 0000000..f533807 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/86f9dcd2e4608ae46e803ca0df9fceb5 differ diff --git a/PatchTestProject/Library/Artifacts/86/86fee4da6df4e7ae9ea4d2e9a62652e0 b/PatchTestProject/Library/Artifacts/86/86fee4da6df4e7ae9ea4d2e9a62652e0 new file mode 100644 index 0000000..eb20c2c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/86/86fee4da6df4e7ae9ea4d2e9a62652e0 differ diff --git a/PatchTestProject/Library/Artifacts/87/871990291c0c79667099f01aaed3cb6d b/PatchTestProject/Library/Artifacts/87/871990291c0c79667099f01aaed3cb6d new file mode 100644 index 0000000..b30433f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/87/871990291c0c79667099f01aaed3cb6d differ diff --git a/PatchTestProject/Library/Artifacts/87/874ff1a30c352e79d794de48f72660be b/PatchTestProject/Library/Artifacts/87/874ff1a30c352e79d794de48f72660be new file mode 100644 index 0000000..b71507b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/87/874ff1a30c352e79d794de48f72660be differ diff --git a/PatchTestProject/Library/Artifacts/87/879ec7fab8f09dde441c959f3326c841 b/PatchTestProject/Library/Artifacts/87/879ec7fab8f09dde441c959f3326c841 new file mode 100644 index 0000000..3dcc168 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/87/879ec7fab8f09dde441c959f3326c841 differ diff --git a/PatchTestProject/Library/Artifacts/87/87e4e8611dece0b81a40b329a36ed5af b/PatchTestProject/Library/Artifacts/87/87e4e8611dece0b81a40b329a36ed5af new file mode 100644 index 0000000..6d3f045 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/87/87e4e8611dece0b81a40b329a36ed5af differ diff --git a/PatchTestProject/Library/Artifacts/88/8804726d140007f50f7e7a677c3708cf b/PatchTestProject/Library/Artifacts/88/8804726d140007f50f7e7a677c3708cf new file mode 100644 index 0000000..4548e9e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/88/8804726d140007f50f7e7a677c3708cf differ diff --git a/PatchTestProject/Library/Artifacts/88/882e967886cfeca895965531a04bdf0a b/PatchTestProject/Library/Artifacts/88/882e967886cfeca895965531a04bdf0a new file mode 100644 index 0000000..dd65ef8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/88/882e967886cfeca895965531a04bdf0a differ diff --git a/PatchTestProject/Library/Artifacts/88/883dd0167cadfb949e2013dd4ee36e23 b/PatchTestProject/Library/Artifacts/88/883dd0167cadfb949e2013dd4ee36e23 new file mode 100644 index 0000000..f3a5fd2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/88/883dd0167cadfb949e2013dd4ee36e23 differ diff --git a/PatchTestProject/Library/Artifacts/88/88b09c85bff5c74a723888ca00f1b8bb b/PatchTestProject/Library/Artifacts/88/88b09c85bff5c74a723888ca00f1b8bb new file mode 100644 index 0000000..e4b4c82 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/88/88b09c85bff5c74a723888ca00f1b8bb differ diff --git a/PatchTestProject/Library/Artifacts/88/88d32e00f28c99e2ab019244aed7005a b/PatchTestProject/Library/Artifacts/88/88d32e00f28c99e2ab019244aed7005a new file mode 100644 index 0000000..27055f6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/88/88d32e00f28c99e2ab019244aed7005a differ diff --git a/PatchTestProject/Library/Artifacts/88/88f47c54f022cbe58bce19a8b6f8a336 b/PatchTestProject/Library/Artifacts/88/88f47c54f022cbe58bce19a8b6f8a336 new file mode 100644 index 0000000..f3ad1c3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/88/88f47c54f022cbe58bce19a8b6f8a336 differ diff --git a/PatchTestProject/Library/Artifacts/89/891d93548572634a02943ab8c2dfd350 b/PatchTestProject/Library/Artifacts/89/891d93548572634a02943ab8c2dfd350 new file mode 100644 index 0000000..ec3fa63 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/891d93548572634a02943ab8c2dfd350 differ diff --git a/PatchTestProject/Library/Artifacts/89/8946367ec3d9b304f912745f8fd89b80 b/PatchTestProject/Library/Artifacts/89/8946367ec3d9b304f912745f8fd89b80 new file mode 100644 index 0000000..9d2a8ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/8946367ec3d9b304f912745f8fd89b80 differ diff --git a/PatchTestProject/Library/Artifacts/89/894f8656c662dcbae491354cbf62ed5e b/PatchTestProject/Library/Artifacts/89/894f8656c662dcbae491354cbf62ed5e new file mode 100644 index 0000000..c76e2de Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/894f8656c662dcbae491354cbf62ed5e differ diff --git a/PatchTestProject/Library/Artifacts/89/89616c48fabacca83aa1cd733ab9e487 b/PatchTestProject/Library/Artifacts/89/89616c48fabacca83aa1cd733ab9e487 new file mode 100644 index 0000000..2368c3a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/89616c48fabacca83aa1cd733ab9e487 differ diff --git a/PatchTestProject/Library/Artifacts/89/896ffe03a6199b3ba69ad13b5f1f75e6 b/PatchTestProject/Library/Artifacts/89/896ffe03a6199b3ba69ad13b5f1f75e6 new file mode 100644 index 0000000..11c273e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/896ffe03a6199b3ba69ad13b5f1f75e6 differ diff --git a/PatchTestProject/Library/Artifacts/89/897f77b0329fecff8be4dd89311ba594 b/PatchTestProject/Library/Artifacts/89/897f77b0329fecff8be4dd89311ba594 new file mode 100644 index 0000000..965f0ee Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/897f77b0329fecff8be4dd89311ba594 differ diff --git a/PatchTestProject/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 b/PatchTestProject/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 new file mode 100644 index 0000000..683542a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8a321db839893488b5a06ea39f3eed49 b/PatchTestProject/Library/Artifacts/8a/8a321db839893488b5a06ea39f3eed49 new file mode 100644 index 0000000..63bb540 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8a321db839893488b5a06ea39f3eed49 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8a6025a0e1fb6e05f1c57c501743fcb0 b/PatchTestProject/Library/Artifacts/8a/8a6025a0e1fb6e05f1c57c501743fcb0 new file mode 100644 index 0000000..efe5c18 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8a6025a0e1fb6e05f1c57c501743fcb0 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8a6278018901691051fcf0c5d33d9cc7 b/PatchTestProject/Library/Artifacts/8a/8a6278018901691051fcf0c5d33d9cc7 new file mode 100644 index 0000000..869e0f4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8a6278018901691051fcf0c5d33d9cc7 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8a7d1d07c139cd2cf72fbda967777efc b/PatchTestProject/Library/Artifacts/8a/8a7d1d07c139cd2cf72fbda967777efc new file mode 100644 index 0000000..a2ebc0d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8a7d1d07c139cd2cf72fbda967777efc differ diff --git a/PatchTestProject/Library/Artifacts/8a/8a88af802c08dc9b8bb04486b375b4f8 b/PatchTestProject/Library/Artifacts/8a/8a88af802c08dc9b8bb04486b375b4f8 new file mode 100644 index 0000000..0c162e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8a88af802c08dc9b8bb04486b375b4f8 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 b/PatchTestProject/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 new file mode 100644 index 0000000..6cc8d16 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8aa70d4bf7aa9557bec06787b4644e63 b/PatchTestProject/Library/Artifacts/8a/8aa70d4bf7aa9557bec06787b4644e63 new file mode 100644 index 0000000..1904073 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8aa70d4bf7aa9557bec06787b4644e63 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8ac1a1148057924bbab464d1f40033dd b/PatchTestProject/Library/Artifacts/8a/8ac1a1148057924bbab464d1f40033dd new file mode 100644 index 0000000..9dfbd41 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8ac1a1148057924bbab464d1f40033dd differ diff --git a/PatchTestProject/Library/Artifacts/8a/8ac51c97e917c0c60478ac5a8cad544e b/PatchTestProject/Library/Artifacts/8a/8ac51c97e917c0c60478ac5a8cad544e new file mode 100644 index 0000000..f256899 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8ac51c97e917c0c60478ac5a8cad544e differ diff --git a/PatchTestProject/Library/Artifacts/8a/8ad2bd38457aab197d905aac653d74d0 b/PatchTestProject/Library/Artifacts/8a/8ad2bd38457aab197d905aac653d74d0 new file mode 100644 index 0000000..db85056 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8ad2bd38457aab197d905aac653d74d0 differ diff --git a/PatchTestProject/Library/Artifacts/8a/8ae37c890295715d69a0fdf911f6683b b/PatchTestProject/Library/Artifacts/8a/8ae37c890295715d69a0fdf911f6683b new file mode 100644 index 0000000..d356583 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8ae37c890295715d69a0fdf911f6683b differ diff --git a/PatchTestProject/Library/Artifacts/8a/8ae4e302147a392271ebfd8c8ce7db7b b/PatchTestProject/Library/Artifacts/8a/8ae4e302147a392271ebfd8c8ce7db7b new file mode 100644 index 0000000..9cea4bf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8ae4e302147a392271ebfd8c8ce7db7b differ diff --git a/PatchTestProject/Library/Artifacts/8a/8af41a4a0d7acca96c0a9db5c66d2cbf b/PatchTestProject/Library/Artifacts/8a/8af41a4a0d7acca96c0a9db5c66d2cbf new file mode 100644 index 0000000..e08c359 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8a/8af41a4a0d7acca96c0a9db5c66d2cbf differ diff --git a/PatchTestProject/Library/Artifacts/8b/8b11bdfb589de5d5b49b0b4988643fdb b/PatchTestProject/Library/Artifacts/8b/8b11bdfb589de5d5b49b0b4988643fdb new file mode 100644 index 0000000..36cf7fb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8b/8b11bdfb589de5d5b49b0b4988643fdb differ diff --git a/PatchTestProject/Library/Artifacts/8b/8b7452c1d4fbd91be703f84604ca632f b/PatchTestProject/Library/Artifacts/8b/8b7452c1d4fbd91be703f84604ca632f new file mode 100644 index 0000000..ab1196d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8b/8b7452c1d4fbd91be703f84604ca632f differ diff --git a/PatchTestProject/Library/Artifacts/8b/8bcdb6801d4afb24628451159ccf4e2d b/PatchTestProject/Library/Artifacts/8b/8bcdb6801d4afb24628451159ccf4e2d new file mode 100644 index 0000000..b4eb6bf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8b/8bcdb6801d4afb24628451159ccf4e2d differ diff --git a/PatchTestProject/Library/Artifacts/8b/8bf5c55e97bea747f9d559f1c5197f3f b/PatchTestProject/Library/Artifacts/8b/8bf5c55e97bea747f9d559f1c5197f3f new file mode 100644 index 0000000..a29ee1a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8b/8bf5c55e97bea747f9d559f1c5197f3f differ diff --git a/PatchTestProject/Library/Artifacts/8c/8c0b2a77b4bf1a92335150dfa6a89b2a b/PatchTestProject/Library/Artifacts/8c/8c0b2a77b4bf1a92335150dfa6a89b2a new file mode 100644 index 0000000..09fc293 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8c0b2a77b4bf1a92335150dfa6a89b2a differ diff --git a/PatchTestProject/Library/Artifacts/8c/8c24a767dcf34b74db1612f5ba83ca12 b/PatchTestProject/Library/Artifacts/8c/8c24a767dcf34b74db1612f5ba83ca12 new file mode 100644 index 0000000..e7d1cff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8c24a767dcf34b74db1612f5ba83ca12 differ diff --git a/PatchTestProject/Library/Artifacts/8c/8c31a582ab97f88a477e1cc218369c69 b/PatchTestProject/Library/Artifacts/8c/8c31a582ab97f88a477e1cc218369c69 new file mode 100644 index 0000000..601bb00 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8c31a582ab97f88a477e1cc218369c69 differ diff --git a/PatchTestProject/Library/Artifacts/8c/8c9645d6a6b7632e8a448085d10eae1a b/PatchTestProject/Library/Artifacts/8c/8c9645d6a6b7632e8a448085d10eae1a new file mode 100644 index 0000000..5dc2f41 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8c9645d6a6b7632e8a448085d10eae1a differ diff --git a/PatchTestProject/Library/Artifacts/8c/8cb64f64907bbd5ea0a1448927f97f06 b/PatchTestProject/Library/Artifacts/8c/8cb64f64907bbd5ea0a1448927f97f06 new file mode 100644 index 0000000..4aebc5f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8cb64f64907bbd5ea0a1448927f97f06 differ diff --git a/PatchTestProject/Library/Artifacts/8c/8cc639e24149b6a6082ef8e85fc1b262 b/PatchTestProject/Library/Artifacts/8c/8cc639e24149b6a6082ef8e85fc1b262 new file mode 100644 index 0000000..8407a6e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8cc639e24149b6a6082ef8e85fc1b262 differ diff --git a/PatchTestProject/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e b/PatchTestProject/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e new file mode 100644 index 0000000..9f9f91c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e differ diff --git a/PatchTestProject/Library/Artifacts/8d/8d70f25fb0c97216b331510bdfddffe4 b/PatchTestProject/Library/Artifacts/8d/8d70f25fb0c97216b331510bdfddffe4 new file mode 100644 index 0000000..b09ef0e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8d/8d70f25fb0c97216b331510bdfddffe4 differ diff --git a/PatchTestProject/Library/Artifacts/8d/8d808a9f90dcf2a0ae5e9d23ffeb698b b/PatchTestProject/Library/Artifacts/8d/8d808a9f90dcf2a0ae5e9d23ffeb698b new file mode 100644 index 0000000..e589368 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8d/8d808a9f90dcf2a0ae5e9d23ffeb698b differ diff --git a/PatchTestProject/Library/Artifacts/8d/8da14d8e73fc35f24bc0b92ccef7a158 b/PatchTestProject/Library/Artifacts/8d/8da14d8e73fc35f24bc0b92ccef7a158 new file mode 100644 index 0000000..6c9f706 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8d/8da14d8e73fc35f24bc0b92ccef7a158 differ diff --git a/PatchTestProject/Library/Artifacts/8d/8dcfc9b95b987ba5659fe7dd92e97720 b/PatchTestProject/Library/Artifacts/8d/8dcfc9b95b987ba5659fe7dd92e97720 new file mode 100644 index 0000000..2774b6d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8d/8dcfc9b95b987ba5659fe7dd92e97720 differ diff --git a/PatchTestProject/Library/Artifacts/8d/8def7880596a3c62c5ac8c56fce4327f b/PatchTestProject/Library/Artifacts/8d/8def7880596a3c62c5ac8c56fce4327f new file mode 100644 index 0000000..9bc1636 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8d/8def7880596a3c62c5ac8c56fce4327f differ diff --git a/PatchTestProject/Library/Artifacts/8e/8e07b65a9afa262f5066eb5fcfffefa4 b/PatchTestProject/Library/Artifacts/8e/8e07b65a9afa262f5066eb5fcfffefa4 new file mode 100644 index 0000000..125ad09 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8e07b65a9afa262f5066eb5fcfffefa4 differ diff --git a/PatchTestProject/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c b/PatchTestProject/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c new file mode 100644 index 0000000..8b3a729 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c differ diff --git a/PatchTestProject/Library/Artifacts/8e/8e40ab2b32ae45212902618eac6c0899 b/PatchTestProject/Library/Artifacts/8e/8e40ab2b32ae45212902618eac6c0899 new file mode 100644 index 0000000..b399983 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8e40ab2b32ae45212902618eac6c0899 differ diff --git a/PatchTestProject/Library/Artifacts/8e/8e9c0c57bcfbf4b1f7c2846f0da09d4b b/PatchTestProject/Library/Artifacts/8e/8e9c0c57bcfbf4b1f7c2846f0da09d4b new file mode 100644 index 0000000..7eef38e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8e9c0c57bcfbf4b1f7c2846f0da09d4b differ diff --git a/PatchTestProject/Library/Artifacts/8e/8eaa84a028b9e4f036881bef3c2949f1 b/PatchTestProject/Library/Artifacts/8e/8eaa84a028b9e4f036881bef3c2949f1 new file mode 100644 index 0000000..f254e52 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8eaa84a028b9e4f036881bef3c2949f1 differ diff --git a/PatchTestProject/Library/Artifacts/8e/8ecfbea0519a564fb107ec7bde310091 b/PatchTestProject/Library/Artifacts/8e/8ecfbea0519a564fb107ec7bde310091 new file mode 100644 index 0000000..b3c2b3d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8ecfbea0519a564fb107ec7bde310091 differ diff --git a/PatchTestProject/Library/Artifacts/8e/8ed81c7b111bfc1384687b799bdb0110 b/PatchTestProject/Library/Artifacts/8e/8ed81c7b111bfc1384687b799bdb0110 new file mode 100644 index 0000000..b07f561 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8ed81c7b111bfc1384687b799bdb0110 differ diff --git a/PatchTestProject/Library/Artifacts/8e/8ef98b251e1316adb7341669d1ac5604 b/PatchTestProject/Library/Artifacts/8e/8ef98b251e1316adb7341669d1ac5604 new file mode 100644 index 0000000..9436ea8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8e/8ef98b251e1316adb7341669d1ac5604 differ diff --git a/PatchTestProject/Library/Artifacts/8f/8f16cce0ec25d7fb3946beffbb01ad5a b/PatchTestProject/Library/Artifacts/8f/8f16cce0ec25d7fb3946beffbb01ad5a new file mode 100644 index 0000000..a4cd9fe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8f/8f16cce0ec25d7fb3946beffbb01ad5a differ diff --git a/PatchTestProject/Library/Artifacts/8f/8f85addf2944954042cb398b8b9a9059 b/PatchTestProject/Library/Artifacts/8f/8f85addf2944954042cb398b8b9a9059 new file mode 100644 index 0000000..68b4f99 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8f/8f85addf2944954042cb398b8b9a9059 differ diff --git a/PatchTestProject/Library/Artifacts/8f/8f99c4d5d99e5e22009483267d303e84 b/PatchTestProject/Library/Artifacts/8f/8f99c4d5d99e5e22009483267d303e84 new file mode 100644 index 0000000..2f9f3ad Binary files /dev/null and b/PatchTestProject/Library/Artifacts/8f/8f99c4d5d99e5e22009483267d303e84 differ diff --git a/PatchTestProject/Library/Artifacts/90/90586af7dae166189de3c7fee1e4aad9 b/PatchTestProject/Library/Artifacts/90/90586af7dae166189de3c7fee1e4aad9 new file mode 100644 index 0000000..b2944b6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/90/90586af7dae166189de3c7fee1e4aad9 differ diff --git a/PatchTestProject/Library/Artifacts/90/906abb8b00975b71f1aed3c48020c09a b/PatchTestProject/Library/Artifacts/90/906abb8b00975b71f1aed3c48020c09a new file mode 100644 index 0000000..2d04f27 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/90/906abb8b00975b71f1aed3c48020c09a differ diff --git a/PatchTestProject/Library/Artifacts/90/9097844f1c71294562db5d8e78eda975 b/PatchTestProject/Library/Artifacts/90/9097844f1c71294562db5d8e78eda975 new file mode 100644 index 0000000..aac8726 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/90/9097844f1c71294562db5d8e78eda975 differ diff --git a/PatchTestProject/Library/Artifacts/90/90dda31c6005b2bc289e1dd07e4ddc05 b/PatchTestProject/Library/Artifacts/90/90dda31c6005b2bc289e1dd07e4ddc05 new file mode 100644 index 0000000..4a328e7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/90/90dda31c6005b2bc289e1dd07e4ddc05 differ diff --git a/PatchTestProject/Library/Artifacts/91/9119c5680820f5352e1d9a3c2eb4002a b/PatchTestProject/Library/Artifacts/91/9119c5680820f5352e1d9a3c2eb4002a new file mode 100644 index 0000000..6651acb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/91/9119c5680820f5352e1d9a3c2eb4002a differ diff --git a/PatchTestProject/Library/Artifacts/91/912997f99307cf73ff5edcc814896560 b/PatchTestProject/Library/Artifacts/91/912997f99307cf73ff5edcc814896560 new file mode 100644 index 0000000..526238a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/91/912997f99307cf73ff5edcc814896560 differ diff --git a/PatchTestProject/Library/Artifacts/91/91b28649238eaf273c8c9d0245221ae9 b/PatchTestProject/Library/Artifacts/91/91b28649238eaf273c8c9d0245221ae9 new file mode 100644 index 0000000..e8c2839 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/91/91b28649238eaf273c8c9d0245221ae9 differ diff --git a/PatchTestProject/Library/Artifacts/91/91e19f57f7784b80d2b45cc87d9805d8 b/PatchTestProject/Library/Artifacts/91/91e19f57f7784b80d2b45cc87d9805d8 new file mode 100644 index 0000000..98d7156 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/91/91e19f57f7784b80d2b45cc87d9805d8 differ diff --git a/PatchTestProject/Library/Artifacts/92/920b4f031993c8c33be0ed93c295bd87 b/PatchTestProject/Library/Artifacts/92/920b4f031993c8c33be0ed93c295bd87 new file mode 100644 index 0000000..6086c20 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/92/920b4f031993c8c33be0ed93c295bd87 differ diff --git a/PatchTestProject/Library/Artifacts/92/924ac8a4e10a56b8acfabfc7a641e7fd b/PatchTestProject/Library/Artifacts/92/924ac8a4e10a56b8acfabfc7a641e7fd new file mode 100644 index 0000000..30a2762 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/92/924ac8a4e10a56b8acfabfc7a641e7fd differ diff --git a/PatchTestProject/Library/Artifacts/92/92749dfe6c0013a29b9dfd467fa576d6 b/PatchTestProject/Library/Artifacts/92/92749dfe6c0013a29b9dfd467fa576d6 new file mode 100644 index 0000000..c62f4c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/92/92749dfe6c0013a29b9dfd467fa576d6 differ diff --git a/PatchTestProject/Library/Artifacts/92/928669e8f1d8038c9e2975aaf6f93ed0 b/PatchTestProject/Library/Artifacts/92/928669e8f1d8038c9e2975aaf6f93ed0 new file mode 100644 index 0000000..e3525c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/92/928669e8f1d8038c9e2975aaf6f93ed0 differ diff --git a/PatchTestProject/Library/Artifacts/92/92ff871833df8535f5eb02dd9658c64a b/PatchTestProject/Library/Artifacts/92/92ff871833df8535f5eb02dd9658c64a new file mode 100644 index 0000000..dcaf55f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/92/92ff871833df8535f5eb02dd9658c64a differ diff --git a/PatchTestProject/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 b/PatchTestProject/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 new file mode 100644 index 0000000..6132453 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 differ diff --git a/PatchTestProject/Library/Artifacts/93/9330f2177bbbbe2a8aa117f4478d563b b/PatchTestProject/Library/Artifacts/93/9330f2177bbbbe2a8aa117f4478d563b new file mode 100644 index 0000000..bd76ca4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/93/9330f2177bbbbe2a8aa117f4478d563b differ diff --git a/PatchTestProject/Library/Artifacts/93/9357e0a837a3755a8386e1cdf6e0d9aa b/PatchTestProject/Library/Artifacts/93/9357e0a837a3755a8386e1cdf6e0d9aa new file mode 100644 index 0000000..caf5da4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/93/9357e0a837a3755a8386e1cdf6e0d9aa differ diff --git a/PatchTestProject/Library/Artifacts/93/938c34cab11e00b36fb29cc95be00bd7 b/PatchTestProject/Library/Artifacts/93/938c34cab11e00b36fb29cc95be00bd7 new file mode 100644 index 0000000..59c1704 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/93/938c34cab11e00b36fb29cc95be00bd7 differ diff --git a/PatchTestProject/Library/Artifacts/93/93fc3012d797b749abde15f373285520 b/PatchTestProject/Library/Artifacts/93/93fc3012d797b749abde15f373285520 new file mode 100644 index 0000000..6b71348 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/93/93fc3012d797b749abde15f373285520 differ diff --git a/PatchTestProject/Library/Artifacts/94/9485bc1a0c6964e7a6a77e157586fdb4 b/PatchTestProject/Library/Artifacts/94/9485bc1a0c6964e7a6a77e157586fdb4 new file mode 100644 index 0000000..1a3d8ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/94/9485bc1a0c6964e7a6a77e157586fdb4 differ diff --git a/PatchTestProject/Library/Artifacts/94/94ac28d609a4196eae72b2f600ac9366 b/PatchTestProject/Library/Artifacts/94/94ac28d609a4196eae72b2f600ac9366 new file mode 100644 index 0000000..a664d4f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/94/94ac28d609a4196eae72b2f600ac9366 differ diff --git a/PatchTestProject/Library/Artifacts/94/94ca390e362c1eb377a0c49e1a5abb95 b/PatchTestProject/Library/Artifacts/94/94ca390e362c1eb377a0c49e1a5abb95 new file mode 100644 index 0000000..230b8c7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/94/94ca390e362c1eb377a0c49e1a5abb95 differ diff --git a/PatchTestProject/Library/Artifacts/94/94d59a94d1ce1823af7fe1d30bde1570 b/PatchTestProject/Library/Artifacts/94/94d59a94d1ce1823af7fe1d30bde1570 new file mode 100644 index 0000000..7172d1d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/94/94d59a94d1ce1823af7fe1d30bde1570 differ diff --git a/PatchTestProject/Library/Artifacts/94/94d7b42979eec840fcb98c563d182417 b/PatchTestProject/Library/Artifacts/94/94d7b42979eec840fcb98c563d182417 new file mode 100644 index 0000000..f794faa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/94/94d7b42979eec840fcb98c563d182417 differ diff --git a/PatchTestProject/Library/Artifacts/95/951b5e91b59b109886a2cbcdb80807e0 b/PatchTestProject/Library/Artifacts/95/951b5e91b59b109886a2cbcdb80807e0 new file mode 100644 index 0000000..5e80919 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/951b5e91b59b109886a2cbcdb80807e0 differ diff --git a/PatchTestProject/Library/Artifacts/95/951d4633e074f56dee75b119c9ccb4de b/PatchTestProject/Library/Artifacts/95/951d4633e074f56dee75b119c9ccb4de new file mode 100644 index 0000000..3f5de5d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/951d4633e074f56dee75b119c9ccb4de differ diff --git a/PatchTestProject/Library/Artifacts/95/9543414fd6269ae134996e13135fc60a b/PatchTestProject/Library/Artifacts/95/9543414fd6269ae134996e13135fc60a new file mode 100644 index 0000000..df319f5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/9543414fd6269ae134996e13135fc60a differ diff --git a/PatchTestProject/Library/Artifacts/95/958294ae5df5bf7d2baf00d75a816f2a b/PatchTestProject/Library/Artifacts/95/958294ae5df5bf7d2baf00d75a816f2a new file mode 100644 index 0000000..85f26a4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/958294ae5df5bf7d2baf00d75a816f2a differ diff --git a/PatchTestProject/Library/Artifacts/95/95a2deff040dcc65e7ce91991353a81f b/PatchTestProject/Library/Artifacts/95/95a2deff040dcc65e7ce91991353a81f new file mode 100644 index 0000000..c16eeaf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/95a2deff040dcc65e7ce91991353a81f differ diff --git a/PatchTestProject/Library/Artifacts/95/95baf5df7d0a8fc03ead19b2bacab7dd b/PatchTestProject/Library/Artifacts/95/95baf5df7d0a8fc03ead19b2bacab7dd new file mode 100644 index 0000000..04e7c77 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/95baf5df7d0a8fc03ead19b2bacab7dd differ diff --git a/PatchTestProject/Library/Artifacts/95/95c376010c7f24ff156a4ba80a5de242 b/PatchTestProject/Library/Artifacts/95/95c376010c7f24ff156a4ba80a5de242 new file mode 100644 index 0000000..dfb51c4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/95/95c376010c7f24ff156a4ba80a5de242 differ diff --git a/PatchTestProject/Library/Artifacts/96/96130fc3291ac1e8ab74bc836d86a215 b/PatchTestProject/Library/Artifacts/96/96130fc3291ac1e8ab74bc836d86a215 new file mode 100644 index 0000000..68849fa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/96/96130fc3291ac1e8ab74bc836d86a215 differ diff --git a/PatchTestProject/Library/Artifacts/96/966fd314216851981556f40d737a96ca b/PatchTestProject/Library/Artifacts/96/966fd314216851981556f40d737a96ca new file mode 100644 index 0000000..7e6dce4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/96/966fd314216851981556f40d737a96ca differ diff --git a/PatchTestProject/Library/Artifacts/96/9678645d5d0cc9866a27cd10b99ab386 b/PatchTestProject/Library/Artifacts/96/9678645d5d0cc9866a27cd10b99ab386 new file mode 100644 index 0000000..872a659 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/96/9678645d5d0cc9866a27cd10b99ab386 differ diff --git a/PatchTestProject/Library/Artifacts/96/96e5d2e7a4769913d5a40d6f7d5fb23a b/PatchTestProject/Library/Artifacts/96/96e5d2e7a4769913d5a40d6f7d5fb23a new file mode 100644 index 0000000..2bea079 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/96/96e5d2e7a4769913d5a40d6f7d5fb23a differ diff --git a/PatchTestProject/Library/Artifacts/96/96ef407306c06072f7b8188a42784d4c b/PatchTestProject/Library/Artifacts/96/96ef407306c06072f7b8188a42784d4c new file mode 100644 index 0000000..6665139 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/96/96ef407306c06072f7b8188a42784d4c differ diff --git a/PatchTestProject/Library/Artifacts/97/976f4c55683029e4f07876ce30a1753f b/PatchTestProject/Library/Artifacts/97/976f4c55683029e4f07876ce30a1753f new file mode 100644 index 0000000..75aab2b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/976f4c55683029e4f07876ce30a1753f differ diff --git a/PatchTestProject/Library/Artifacts/97/9774e4e6c60af783c547b72815948237 b/PatchTestProject/Library/Artifacts/97/9774e4e6c60af783c547b72815948237 new file mode 100644 index 0000000..5dcbc87 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/9774e4e6c60af783c547b72815948237 differ diff --git a/PatchTestProject/Library/Artifacts/97/977a47c7506e72b4b96e028dba930fe6 b/PatchTestProject/Library/Artifacts/97/977a47c7506e72b4b96e028dba930fe6 new file mode 100644 index 0000000..05afb2d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/977a47c7506e72b4b96e028dba930fe6 differ diff --git a/PatchTestProject/Library/Artifacts/97/977f9de276ee975ba877287f477b38b0 b/PatchTestProject/Library/Artifacts/97/977f9de276ee975ba877287f477b38b0 new file mode 100644 index 0000000..2eda5a6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/977f9de276ee975ba877287f477b38b0 differ diff --git a/PatchTestProject/Library/Artifacts/97/979ab6ca005cf97eff2067853d29f771 b/PatchTestProject/Library/Artifacts/97/979ab6ca005cf97eff2067853d29f771 new file mode 100644 index 0000000..2f0a247 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/979ab6ca005cf97eff2067853d29f771 differ diff --git a/PatchTestProject/Library/Artifacts/97/97a075f977e79cbfdfde7fd2599e74da b/PatchTestProject/Library/Artifacts/97/97a075f977e79cbfdfde7fd2599e74da new file mode 100644 index 0000000..0a1382c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/97a075f977e79cbfdfde7fd2599e74da differ diff --git a/PatchTestProject/Library/Artifacts/97/97a5768aff5f981d9e7d4cc300c356cc b/PatchTestProject/Library/Artifacts/97/97a5768aff5f981d9e7d4cc300c356cc new file mode 100644 index 0000000..b754528 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/97/97a5768aff5f981d9e7d4cc300c356cc differ diff --git a/PatchTestProject/Library/Artifacts/98/9860b3c390ad26d57b1ee0c0f3e9394f b/PatchTestProject/Library/Artifacts/98/9860b3c390ad26d57b1ee0c0f3e9394f new file mode 100644 index 0000000..838f3ed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/98/9860b3c390ad26d57b1ee0c0f3e9394f differ diff --git a/PatchTestProject/Library/Artifacts/98/9872ea7fd2488cd98317650745c18d1c b/PatchTestProject/Library/Artifacts/98/9872ea7fd2488cd98317650745c18d1c new file mode 100644 index 0000000..ab5530c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/98/9872ea7fd2488cd98317650745c18d1c differ diff --git a/PatchTestProject/Library/Artifacts/98/98a12dadc623e445ad2a1d392d212362 b/PatchTestProject/Library/Artifacts/98/98a12dadc623e445ad2a1d392d212362 new file mode 100644 index 0000000..652e386 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/98/98a12dadc623e445ad2a1d392d212362 differ diff --git a/PatchTestProject/Library/Artifacts/98/98ea1ab4dbbd189b690af4f979ea0383 b/PatchTestProject/Library/Artifacts/98/98ea1ab4dbbd189b690af4f979ea0383 new file mode 100644 index 0000000..dbb6757 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/98/98ea1ab4dbbd189b690af4f979ea0383 differ diff --git a/PatchTestProject/Library/Artifacts/98/98f098da1f2ce1de63a04797fb3a7be4 b/PatchTestProject/Library/Artifacts/98/98f098da1f2ce1de63a04797fb3a7be4 new file mode 100644 index 0000000..e9ba372 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/98/98f098da1f2ce1de63a04797fb3a7be4 differ diff --git a/PatchTestProject/Library/Artifacts/99/993b4c40e74ba10e3c2d12fc786a9c4a b/PatchTestProject/Library/Artifacts/99/993b4c40e74ba10e3c2d12fc786a9c4a new file mode 100644 index 0000000..a8973a2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/993b4c40e74ba10e3c2d12fc786a9c4a differ diff --git a/PatchTestProject/Library/Artifacts/99/994fe8c3128b779a40c21a2e37f2928e b/PatchTestProject/Library/Artifacts/99/994fe8c3128b779a40c21a2e37f2928e new file mode 100644 index 0000000..912620d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/994fe8c3128b779a40c21a2e37f2928e differ diff --git a/PatchTestProject/Library/Artifacts/99/9951e1d6be5a19ce7718cdd2a6c546c9 b/PatchTestProject/Library/Artifacts/99/9951e1d6be5a19ce7718cdd2a6c546c9 new file mode 100644 index 0000000..0cb3047 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/9951e1d6be5a19ce7718cdd2a6c546c9 differ diff --git a/PatchTestProject/Library/Artifacts/99/996bfbe54a14e23f5fcd87274448f7c8 b/PatchTestProject/Library/Artifacts/99/996bfbe54a14e23f5fcd87274448f7c8 new file mode 100644 index 0000000..23bc307 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/996bfbe54a14e23f5fcd87274448f7c8 differ diff --git a/PatchTestProject/Library/Artifacts/99/99892f0a0aeae2138546880db191e049 b/PatchTestProject/Library/Artifacts/99/99892f0a0aeae2138546880db191e049 new file mode 100644 index 0000000..b2775dd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/99892f0a0aeae2138546880db191e049 differ diff --git a/PatchTestProject/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 b/PatchTestProject/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 new file mode 100644 index 0000000..50551e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 differ diff --git a/PatchTestProject/Library/Artifacts/99/99f196d5ed3749924032d00167a920eb b/PatchTestProject/Library/Artifacts/99/99f196d5ed3749924032d00167a920eb new file mode 100644 index 0000000..3486408 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/99/99f196d5ed3749924032d00167a920eb differ diff --git a/PatchTestProject/Library/Artifacts/9a/9a257bfad4cd14f3579ff896958705f4 b/PatchTestProject/Library/Artifacts/9a/9a257bfad4cd14f3579ff896958705f4 new file mode 100644 index 0000000..d02d2c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9a257bfad4cd14f3579ff896958705f4 differ diff --git a/PatchTestProject/Library/Artifacts/9a/9a3df0501ec0b75dfadf71cabb747e40 b/PatchTestProject/Library/Artifacts/9a/9a3df0501ec0b75dfadf71cabb747e40 new file mode 100644 index 0000000..5e203ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9a3df0501ec0b75dfadf71cabb747e40 differ diff --git a/PatchTestProject/Library/Artifacts/9a/9a57049f1ee8f8af7944430b87677162 b/PatchTestProject/Library/Artifacts/9a/9a57049f1ee8f8af7944430b87677162 new file mode 100644 index 0000000..eeec384 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9a57049f1ee8f8af7944430b87677162 differ diff --git a/PatchTestProject/Library/Artifacts/9a/9a63ce9f1954a052979eeaa585d49cb0 b/PatchTestProject/Library/Artifacts/9a/9a63ce9f1954a052979eeaa585d49cb0 new file mode 100644 index 0000000..813280b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9a63ce9f1954a052979eeaa585d49cb0 differ diff --git a/PatchTestProject/Library/Artifacts/9a/9a88447de12d0777936e099c9f16386a b/PatchTestProject/Library/Artifacts/9a/9a88447de12d0777936e099c9f16386a new file mode 100644 index 0000000..2a84c5d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9a88447de12d0777936e099c9f16386a differ diff --git a/PatchTestProject/Library/Artifacts/9a/9a97953215d7feee795afbb1b6d05e97 b/PatchTestProject/Library/Artifacts/9a/9a97953215d7feee795afbb1b6d05e97 new file mode 100644 index 0000000..1cd8ee4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9a97953215d7feee795afbb1b6d05e97 differ diff --git a/PatchTestProject/Library/Artifacts/9a/9aae37ea4593f5d0c101f3e0123fd08e b/PatchTestProject/Library/Artifacts/9a/9aae37ea4593f5d0c101f3e0123fd08e new file mode 100644 index 0000000..315b6b3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9aae37ea4593f5d0c101f3e0123fd08e differ diff --git a/PatchTestProject/Library/Artifacts/9a/9ab364c9d798cfb0efef1f2e429d7ebc b/PatchTestProject/Library/Artifacts/9a/9ab364c9d798cfb0efef1f2e429d7ebc new file mode 100644 index 0000000..340d1ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9ab364c9d798cfb0efef1f2e429d7ebc differ diff --git a/PatchTestProject/Library/Artifacts/9a/9acd0bcb3c04dafc23c70aad948c0a11 b/PatchTestProject/Library/Artifacts/9a/9acd0bcb3c04dafc23c70aad948c0a11 new file mode 100644 index 0000000..65cd7d1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9acd0bcb3c04dafc23c70aad948c0a11 differ diff --git a/PatchTestProject/Library/Artifacts/9a/9ad859f5860a06df4db781e744609c40 b/PatchTestProject/Library/Artifacts/9a/9ad859f5860a06df4db781e744609c40 new file mode 100644 index 0000000..638277b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9a/9ad859f5860a06df4db781e744609c40 differ diff --git a/PatchTestProject/Library/Artifacts/9b/9b0c1edc89867f0d02866ef4a0c3e5a6 b/PatchTestProject/Library/Artifacts/9b/9b0c1edc89867f0d02866ef4a0c3e5a6 new file mode 100644 index 0000000..c6533cc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9b/9b0c1edc89867f0d02866ef4a0c3e5a6 differ diff --git a/PatchTestProject/Library/Artifacts/9b/9b2a95aabdad73ae5475b38d34d40ef9 b/PatchTestProject/Library/Artifacts/9b/9b2a95aabdad73ae5475b38d34d40ef9 new file mode 100644 index 0000000..595b391 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9b/9b2a95aabdad73ae5475b38d34d40ef9 differ diff --git a/PatchTestProject/Library/Artifacts/9b/9b50b42643aed43d465c8656ba3421fe b/PatchTestProject/Library/Artifacts/9b/9b50b42643aed43d465c8656ba3421fe new file mode 100644 index 0000000..f34051e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9b/9b50b42643aed43d465c8656ba3421fe differ diff --git a/PatchTestProject/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f b/PatchTestProject/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f new file mode 100644 index 0000000..9353a9d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f differ diff --git a/PatchTestProject/Library/Artifacts/9b/9be4fa229cd33f74efae677b3810e20f b/PatchTestProject/Library/Artifacts/9b/9be4fa229cd33f74efae677b3810e20f new file mode 100644 index 0000000..9863080 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9b/9be4fa229cd33f74efae677b3810e20f differ diff --git a/PatchTestProject/Library/Artifacts/9c/9c486dad0b5ca25639245c57da26dc10 b/PatchTestProject/Library/Artifacts/9c/9c486dad0b5ca25639245c57da26dc10 new file mode 100644 index 0000000..e223fdf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9c/9c486dad0b5ca25639245c57da26dc10 differ diff --git a/PatchTestProject/Library/Artifacts/9c/9c555c6e82f4a93d1077bdcc8a7289b1 b/PatchTestProject/Library/Artifacts/9c/9c555c6e82f4a93d1077bdcc8a7289b1 new file mode 100644 index 0000000..80329d2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9c/9c555c6e82f4a93d1077bdcc8a7289b1 differ diff --git a/PatchTestProject/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 b/PatchTestProject/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 new file mode 100644 index 0000000..07874f8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 differ diff --git a/PatchTestProject/Library/Artifacts/9c/9cb16f9acf4c792bec3469996e07e84a b/PatchTestProject/Library/Artifacts/9c/9cb16f9acf4c792bec3469996e07e84a new file mode 100644 index 0000000..ea81d73 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9c/9cb16f9acf4c792bec3469996e07e84a differ diff --git a/PatchTestProject/Library/Artifacts/9c/9cbb3bdfb792b3c5823bf2ae9e293f47 b/PatchTestProject/Library/Artifacts/9c/9cbb3bdfb792b3c5823bf2ae9e293f47 new file mode 100644 index 0000000..fffbd0d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9c/9cbb3bdfb792b3c5823bf2ae9e293f47 differ diff --git a/PatchTestProject/Library/Artifacts/9c/9cbea3f85d092f9ee0c60dd6828938cc b/PatchTestProject/Library/Artifacts/9c/9cbea3f85d092f9ee0c60dd6828938cc new file mode 100644 index 0000000..9638346 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9c/9cbea3f85d092f9ee0c60dd6828938cc differ diff --git a/PatchTestProject/Library/Artifacts/9d/9d98d1b89ecb3a51de3f33098fecdb12 b/PatchTestProject/Library/Artifacts/9d/9d98d1b89ecb3a51de3f33098fecdb12 new file mode 100644 index 0000000..49dc645 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9d98d1b89ecb3a51de3f33098fecdb12 differ diff --git a/PatchTestProject/Library/Artifacts/9d/9dab01e919a26bdb7af49e328dae573f b/PatchTestProject/Library/Artifacts/9d/9dab01e919a26bdb7af49e328dae573f new file mode 100644 index 0000000..fd1ee8a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9dab01e919a26bdb7af49e328dae573f differ diff --git a/PatchTestProject/Library/Artifacts/9d/9dcbb861d3b2e8a0434b7b60882d3f51 b/PatchTestProject/Library/Artifacts/9d/9dcbb861d3b2e8a0434b7b60882d3f51 new file mode 100644 index 0000000..e766490 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9dcbb861d3b2e8a0434b7b60882d3f51 differ diff --git a/PatchTestProject/Library/Artifacts/9d/9dd8139c42e1e35b1dbadb43be56f64a b/PatchTestProject/Library/Artifacts/9d/9dd8139c42e1e35b1dbadb43be56f64a new file mode 100644 index 0000000..8bc3dca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9dd8139c42e1e35b1dbadb43be56f64a differ diff --git a/PatchTestProject/Library/Artifacts/9d/9dde22722aea625605a4c04c7f2e7c7b b/PatchTestProject/Library/Artifacts/9d/9dde22722aea625605a4c04c7f2e7c7b new file mode 100644 index 0000000..48eb85a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9dde22722aea625605a4c04c7f2e7c7b differ diff --git a/PatchTestProject/Library/Artifacts/9d/9de711537342d71fba800709f60014b8 b/PatchTestProject/Library/Artifacts/9d/9de711537342d71fba800709f60014b8 new file mode 100644 index 0000000..5f23a93 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9de711537342d71fba800709f60014b8 differ diff --git a/PatchTestProject/Library/Artifacts/9d/9dfc3901367d6278acdbb25d9c838e16 b/PatchTestProject/Library/Artifacts/9d/9dfc3901367d6278acdbb25d9c838e16 new file mode 100644 index 0000000..937c823 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9d/9dfc3901367d6278acdbb25d9c838e16 differ diff --git a/PatchTestProject/Library/Artifacts/9f/9f1135d53947615ec5f7c004e7ef48d4 b/PatchTestProject/Library/Artifacts/9f/9f1135d53947615ec5f7c004e7ef48d4 new file mode 100644 index 0000000..e0dd534 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9f1135d53947615ec5f7c004e7ef48d4 differ diff --git a/PatchTestProject/Library/Artifacts/9f/9f268be27f4e86271ca0e4b0856d0a1a b/PatchTestProject/Library/Artifacts/9f/9f268be27f4e86271ca0e4b0856d0a1a new file mode 100644 index 0000000..d8c5a3a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9f268be27f4e86271ca0e4b0856d0a1a differ diff --git a/PatchTestProject/Library/Artifacts/9f/9f42f08db184b60898299f8357ae4e56 b/PatchTestProject/Library/Artifacts/9f/9f42f08db184b60898299f8357ae4e56 new file mode 100644 index 0000000..c10fd9e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9f42f08db184b60898299f8357ae4e56 differ diff --git a/PatchTestProject/Library/Artifacts/9f/9f65b546efaf6fd6f2360c4c547612c8 b/PatchTestProject/Library/Artifacts/9f/9f65b546efaf6fd6f2360c4c547612c8 new file mode 100644 index 0000000..93c6683 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9f65b546efaf6fd6f2360c4c547612c8 differ diff --git a/PatchTestProject/Library/Artifacts/9f/9f9f57ed641d198ce36c5d2bf2627446 b/PatchTestProject/Library/Artifacts/9f/9f9f57ed641d198ce36c5d2bf2627446 new file mode 100644 index 0000000..fa33881 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9f9f57ed641d198ce36c5d2bf2627446 differ diff --git a/PatchTestProject/Library/Artifacts/9f/9fee3110e33997b134e0512a9112519d b/PatchTestProject/Library/Artifacts/9f/9fee3110e33997b134e0512a9112519d new file mode 100644 index 0000000..0bc6c0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9fee3110e33997b134e0512a9112519d differ diff --git a/PatchTestProject/Library/Artifacts/9f/9ff759ce1b84529bfe3ccce3aab0e686 b/PatchTestProject/Library/Artifacts/9f/9ff759ce1b84529bfe3ccce3aab0e686 new file mode 100644 index 0000000..58aed48 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/9f/9ff759ce1b84529bfe3ccce3aab0e686 differ diff --git a/PatchTestProject/Library/Artifacts/a0/a03494c4b9fc684f5b5553308ee7ecfb b/PatchTestProject/Library/Artifacts/a0/a03494c4b9fc684f5b5553308ee7ecfb new file mode 100644 index 0000000..34f2f41 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a03494c4b9fc684f5b5553308ee7ecfb differ diff --git a/PatchTestProject/Library/Artifacts/a0/a048b10b5552eb04352f2072a4dcbedd b/PatchTestProject/Library/Artifacts/a0/a048b10b5552eb04352f2072a4dcbedd new file mode 100644 index 0000000..f59b606 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a048b10b5552eb04352f2072a4dcbedd differ diff --git a/PatchTestProject/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa b/PatchTestProject/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa new file mode 100644 index 0000000..d42e38f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa differ diff --git a/PatchTestProject/Library/Artifacts/a0/a07c2e95716ddbf5511a0630b90021b7 b/PatchTestProject/Library/Artifacts/a0/a07c2e95716ddbf5511a0630b90021b7 new file mode 100644 index 0000000..7f19ac5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a07c2e95716ddbf5511a0630b90021b7 differ diff --git a/PatchTestProject/Library/Artifacts/a0/a09f497c3ee0d1ced7357e0ae4b78f46 b/PatchTestProject/Library/Artifacts/a0/a09f497c3ee0d1ced7357e0ae4b78f46 new file mode 100644 index 0000000..dc4812b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a09f497c3ee0d1ced7357e0ae4b78f46 differ diff --git a/PatchTestProject/Library/Artifacts/a0/a0b78db8f1aa578103becbb6b409edb7 b/PatchTestProject/Library/Artifacts/a0/a0b78db8f1aa578103becbb6b409edb7 new file mode 100644 index 0000000..986646c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a0b78db8f1aa578103becbb6b409edb7 differ diff --git a/PatchTestProject/Library/Artifacts/a0/a0c6ea38b88b046bf1de2c8f17d2bc2e b/PatchTestProject/Library/Artifacts/a0/a0c6ea38b88b046bf1de2c8f17d2bc2e new file mode 100644 index 0000000..a9c9b12 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a0c6ea38b88b046bf1de2c8f17d2bc2e differ diff --git a/PatchTestProject/Library/Artifacts/a0/a0d62bae4952c87d30d1e0f36b4d528c b/PatchTestProject/Library/Artifacts/a0/a0d62bae4952c87d30d1e0f36b4d528c new file mode 100644 index 0000000..c4257a8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a0d62bae4952c87d30d1e0f36b4d528c differ diff --git a/PatchTestProject/Library/Artifacts/a0/a0fb62f28ea706c54604fd93b2fc0f26 b/PatchTestProject/Library/Artifacts/a0/a0fb62f28ea706c54604fd93b2fc0f26 new file mode 100644 index 0000000..589977d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a0/a0fb62f28ea706c54604fd93b2fc0f26 differ diff --git a/PatchTestProject/Library/Artifacts/a1/a12de76a13f64aeb4b342fdbde11933e b/PatchTestProject/Library/Artifacts/a1/a12de76a13f64aeb4b342fdbde11933e new file mode 100644 index 0000000..dc759df Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a12de76a13f64aeb4b342fdbde11933e differ diff --git a/PatchTestProject/Library/Artifacts/a1/a1335166603c70a4a7249df3b42c9088 b/PatchTestProject/Library/Artifacts/a1/a1335166603c70a4a7249df3b42c9088 new file mode 100644 index 0000000..72bfaed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a1335166603c70a4a7249df3b42c9088 differ diff --git a/PatchTestProject/Library/Artifacts/a1/a13b42b5104360bffe935e18e92a0dcd b/PatchTestProject/Library/Artifacts/a1/a13b42b5104360bffe935e18e92a0dcd new file mode 100644 index 0000000..13a9630 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a13b42b5104360bffe935e18e92a0dcd differ diff --git a/PatchTestProject/Library/Artifacts/a1/a16715ed0394de2b1fcf5c5050164c4c b/PatchTestProject/Library/Artifacts/a1/a16715ed0394de2b1fcf5c5050164c4c new file mode 100644 index 0000000..06cff46 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a16715ed0394de2b1fcf5c5050164c4c differ diff --git a/PatchTestProject/Library/Artifacts/a1/a172d6623839946d3395536d85f0c2ee b/PatchTestProject/Library/Artifacts/a1/a172d6623839946d3395536d85f0c2ee new file mode 100644 index 0000000..d1a0747 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a172d6623839946d3395536d85f0c2ee differ diff --git a/PatchTestProject/Library/Artifacts/a1/a172e3451561efebbf92c44abeb460de b/PatchTestProject/Library/Artifacts/a1/a172e3451561efebbf92c44abeb460de new file mode 100644 index 0000000..8ca74f6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a172e3451561efebbf92c44abeb460de differ diff --git a/PatchTestProject/Library/Artifacts/a1/a1a124ff5ef24d987f3e0223fd6106f0 b/PatchTestProject/Library/Artifacts/a1/a1a124ff5ef24d987f3e0223fd6106f0 new file mode 100644 index 0000000..f390e48 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a1a124ff5ef24d987f3e0223fd6106f0 differ diff --git a/PatchTestProject/Library/Artifacts/a1/a1ba3d827e524d04b03de82567360cf8 b/PatchTestProject/Library/Artifacts/a1/a1ba3d827e524d04b03de82567360cf8 new file mode 100644 index 0000000..5248be2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a1ba3d827e524d04b03de82567360cf8 differ diff --git a/PatchTestProject/Library/Artifacts/a1/a1c7b0865f78e2f93c0f9e5986068862 b/PatchTestProject/Library/Artifacts/a1/a1c7b0865f78e2f93c0f9e5986068862 new file mode 100644 index 0000000..7d4a33e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a1c7b0865f78e2f93c0f9e5986068862 differ diff --git a/PatchTestProject/Library/Artifacts/a1/a1fab646fb86f939d0acda87c6cb0b65 b/PatchTestProject/Library/Artifacts/a1/a1fab646fb86f939d0acda87c6cb0b65 new file mode 100644 index 0000000..fcb0c56 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a1/a1fab646fb86f939d0acda87c6cb0b65 differ diff --git a/PatchTestProject/Library/Artifacts/a2/a2010cb6e014de093af08a485b1e429d b/PatchTestProject/Library/Artifacts/a2/a2010cb6e014de093af08a485b1e429d new file mode 100644 index 0000000..342bbbc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a2010cb6e014de093af08a485b1e429d differ diff --git a/PatchTestProject/Library/Artifacts/a2/a226b08ece124e26a13764d81f6aeae3 b/PatchTestProject/Library/Artifacts/a2/a226b08ece124e26a13764d81f6aeae3 new file mode 100644 index 0000000..eb0539d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a226b08ece124e26a13764d81f6aeae3 differ diff --git a/PatchTestProject/Library/Artifacts/a2/a23422ecfbdbaa5291ad5680e96a3901 b/PatchTestProject/Library/Artifacts/a2/a23422ecfbdbaa5291ad5680e96a3901 new file mode 100644 index 0000000..898e3a3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a23422ecfbdbaa5291ad5680e96a3901 differ diff --git a/PatchTestProject/Library/Artifacts/a2/a28e82ce627f12e55f2970f697f49e86 b/PatchTestProject/Library/Artifacts/a2/a28e82ce627f12e55f2970f697f49e86 new file mode 100644 index 0000000..ee0da02 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a28e82ce627f12e55f2970f697f49e86 differ diff --git a/PatchTestProject/Library/Artifacts/a2/a2e11b562c98b195b3be947c9f737bc3 b/PatchTestProject/Library/Artifacts/a2/a2e11b562c98b195b3be947c9f737bc3 new file mode 100644 index 0000000..e35c275 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a2e11b562c98b195b3be947c9f737bc3 differ diff --git a/PatchTestProject/Library/Artifacts/a2/a2e7c8c1a5c6c787fb86180539f066ec b/PatchTestProject/Library/Artifacts/a2/a2e7c8c1a5c6c787fb86180539f066ec new file mode 100644 index 0000000..cef34f4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a2e7c8c1a5c6c787fb86180539f066ec differ diff --git a/PatchTestProject/Library/Artifacts/a2/a2feea39d423c6c579edc79533c9305e b/PatchTestProject/Library/Artifacts/a2/a2feea39d423c6c579edc79533c9305e new file mode 100644 index 0000000..d862d0f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a2/a2feea39d423c6c579edc79533c9305e differ diff --git a/PatchTestProject/Library/Artifacts/a3/a30d63f730e90c677e74ddf1e4002aab b/PatchTestProject/Library/Artifacts/a3/a30d63f730e90c677e74ddf1e4002aab new file mode 100644 index 0000000..6adec17 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a30d63f730e90c677e74ddf1e4002aab differ diff --git a/PatchTestProject/Library/Artifacts/a3/a345a99589ca1098b790189ec1cd742d b/PatchTestProject/Library/Artifacts/a3/a345a99589ca1098b790189ec1cd742d new file mode 100644 index 0000000..09aac0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a345a99589ca1098b790189ec1cd742d differ diff --git a/PatchTestProject/Library/Artifacts/a3/a37ae1eac371232ae9cfb90808071499 b/PatchTestProject/Library/Artifacts/a3/a37ae1eac371232ae9cfb90808071499 new file mode 100644 index 0000000..5d89035 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a37ae1eac371232ae9cfb90808071499 differ diff --git a/PatchTestProject/Library/Artifacts/a3/a3874061fced8446758d72c1228cc119 b/PatchTestProject/Library/Artifacts/a3/a3874061fced8446758d72c1228cc119 new file mode 100644 index 0000000..3229108 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a3874061fced8446758d72c1228cc119 differ diff --git a/PatchTestProject/Library/Artifacts/a3/a3e43b7e10404a831d1e4ad48ab854fe b/PatchTestProject/Library/Artifacts/a3/a3e43b7e10404a831d1e4ad48ab854fe new file mode 100644 index 0000000..9f2fd1d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a3e43b7e10404a831d1e4ad48ab854fe differ diff --git a/PatchTestProject/Library/Artifacts/a3/a3efb0c75e85df5a39d70e15266ca5d4 b/PatchTestProject/Library/Artifacts/a3/a3efb0c75e85df5a39d70e15266ca5d4 new file mode 100644 index 0000000..c1b476e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a3efb0c75e85df5a39d70e15266ca5d4 differ diff --git a/PatchTestProject/Library/Artifacts/a3/a3efb6a67a68a77f8e3c786da1089827 b/PatchTestProject/Library/Artifacts/a3/a3efb6a67a68a77f8e3c786da1089827 new file mode 100644 index 0000000..4c7fa7d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a3/a3efb6a67a68a77f8e3c786da1089827 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a406e3e5064832a938f8664cdb8d34d7 b/PatchTestProject/Library/Artifacts/a4/a406e3e5064832a938f8664cdb8d34d7 new file mode 100644 index 0000000..508d92b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a406e3e5064832a938f8664cdb8d34d7 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a43947e53f16d3ae62b417a61a3b3746 b/PatchTestProject/Library/Artifacts/a4/a43947e53f16d3ae62b417a61a3b3746 new file mode 100644 index 0000000..62b195a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a43947e53f16d3ae62b417a61a3b3746 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a494d008eed4ecdb4b4f85620cdf0ff6 b/PatchTestProject/Library/Artifacts/a4/a494d008eed4ecdb4b4f85620cdf0ff6 new file mode 100644 index 0000000..4cecaf8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a494d008eed4ecdb4b4f85620cdf0ff6 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a4a14bc06089153f8ba7fa97133fc624 b/PatchTestProject/Library/Artifacts/a4/a4a14bc06089153f8ba7fa97133fc624 new file mode 100644 index 0000000..cde9281 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a4a14bc06089153f8ba7fa97133fc624 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a4b232ca9d5dcc0c97f9412c34316477 b/PatchTestProject/Library/Artifacts/a4/a4b232ca9d5dcc0c97f9412c34316477 new file mode 100644 index 0000000..9941dc9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a4b232ca9d5dcc0c97f9412c34316477 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a4bb7047c766035c66e56a0678b73c05 b/PatchTestProject/Library/Artifacts/a4/a4bb7047c766035c66e56a0678b73c05 new file mode 100644 index 0000000..e58bd78 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a4bb7047c766035c66e56a0678b73c05 differ diff --git a/PatchTestProject/Library/Artifacts/a4/a4db3ae73d263dccae14c525bd1fc6c3 b/PatchTestProject/Library/Artifacts/a4/a4db3ae73d263dccae14c525bd1fc6c3 new file mode 100644 index 0000000..e585f68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a4/a4db3ae73d263dccae14c525bd1fc6c3 differ diff --git a/PatchTestProject/Library/Artifacts/a5/a58e789bb9412b06d066699f989a2cc2 b/PatchTestProject/Library/Artifacts/a5/a58e789bb9412b06d066699f989a2cc2 new file mode 100644 index 0000000..63a74f8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a5/a58e789bb9412b06d066699f989a2cc2 differ diff --git a/PatchTestProject/Library/Artifacts/a6/a6999de151508b7cfd7d1dc7a0d8d133 b/PatchTestProject/Library/Artifacts/a6/a6999de151508b7cfd7d1dc7a0d8d133 new file mode 100644 index 0000000..f1f683b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a6/a6999de151508b7cfd7d1dc7a0d8d133 differ diff --git a/PatchTestProject/Library/Artifacts/a6/a6ffe60c59bf5bff9d6f1d5e17af0f13 b/PatchTestProject/Library/Artifacts/a6/a6ffe60c59bf5bff9d6f1d5e17af0f13 new file mode 100644 index 0000000..dd715b6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a6/a6ffe60c59bf5bff9d6f1d5e17af0f13 differ diff --git a/PatchTestProject/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b b/PatchTestProject/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b new file mode 100644 index 0000000..198cc8c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b differ diff --git a/PatchTestProject/Library/Artifacts/a7/a711a95c86cbad603a7826a75dce0486 b/PatchTestProject/Library/Artifacts/a7/a711a95c86cbad603a7826a75dce0486 new file mode 100644 index 0000000..7a48ea9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a7/a711a95c86cbad603a7826a75dce0486 differ diff --git a/PatchTestProject/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 b/PatchTestProject/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 new file mode 100644 index 0000000..93e3e48 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 differ diff --git a/PatchTestProject/Library/Artifacts/a7/a742dbda4a1f16ce8bb40db3cc279f58 b/PatchTestProject/Library/Artifacts/a7/a742dbda4a1f16ce8bb40db3cc279f58 new file mode 100644 index 0000000..91c75f9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a7/a742dbda4a1f16ce8bb40db3cc279f58 differ diff --git a/PatchTestProject/Library/Artifacts/a7/a7908624f0ec2cdb026961b4a7acf0a4 b/PatchTestProject/Library/Artifacts/a7/a7908624f0ec2cdb026961b4a7acf0a4 new file mode 100644 index 0000000..c3bae16 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a7/a7908624f0ec2cdb026961b4a7acf0a4 differ diff --git a/PatchTestProject/Library/Artifacts/a7/a7ad2d8369c622200cef49014e0d809f b/PatchTestProject/Library/Artifacts/a7/a7ad2d8369c622200cef49014e0d809f new file mode 100644 index 0000000..7870059 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a7/a7ad2d8369c622200cef49014e0d809f differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8154fbc8c1ba26fd39e00b309f67dd1 b/PatchTestProject/Library/Artifacts/a8/a8154fbc8c1ba26fd39e00b309f67dd1 new file mode 100644 index 0000000..672ea6b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8154fbc8c1ba26fd39e00b309f67dd1 differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8249590bf22cce1d22448ce6fff9a1b b/PatchTestProject/Library/Artifacts/a8/a8249590bf22cce1d22448ce6fff9a1b new file mode 100644 index 0000000..a44379d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8249590bf22cce1d22448ce6fff9a1b differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8444f8a19842a0293930c7fa0e1dfe1 b/PatchTestProject/Library/Artifacts/a8/a8444f8a19842a0293930c7fa0e1dfe1 new file mode 100644 index 0000000..4971fff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8444f8a19842a0293930c7fa0e1dfe1 differ diff --git a/PatchTestProject/Library/Artifacts/a8/a869e5f5394e95c794a8723da29cbda7 b/PatchTestProject/Library/Artifacts/a8/a869e5f5394e95c794a8723da29cbda7 new file mode 100644 index 0000000..9efa8b1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a869e5f5394e95c794a8723da29cbda7 differ diff --git a/PatchTestProject/Library/Artifacts/a8/a873991dc25334abe9ed642b95a55b63 b/PatchTestProject/Library/Artifacts/a8/a873991dc25334abe9ed642b95a55b63 new file mode 100644 index 0000000..2134579 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a873991dc25334abe9ed642b95a55b63 differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8af77648488859eb0af12214451ad36 b/PatchTestProject/Library/Artifacts/a8/a8af77648488859eb0af12214451ad36 new file mode 100644 index 0000000..9c3f8ac Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8af77648488859eb0af12214451ad36 differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8c15ff58a3b049867144c3ad86c405f b/PatchTestProject/Library/Artifacts/a8/a8c15ff58a3b049867144c3ad86c405f new file mode 100644 index 0000000..6ec77e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8c15ff58a3b049867144c3ad86c405f differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8c915abe9a4db9fb541fb22b2e589f8 b/PatchTestProject/Library/Artifacts/a8/a8c915abe9a4db9fb541fb22b2e589f8 new file mode 100644 index 0000000..ad17306 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8c915abe9a4db9fb541fb22b2e589f8 differ diff --git a/PatchTestProject/Library/Artifacts/a8/a8de8f3ca0b23703ae1503fbf45c23f2 b/PatchTestProject/Library/Artifacts/a8/a8de8f3ca0b23703ae1503fbf45c23f2 new file mode 100644 index 0000000..c1621fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a8/a8de8f3ca0b23703ae1503fbf45c23f2 differ diff --git a/PatchTestProject/Library/Artifacts/a9/a90c1007713c15d863c7b4ce699924e5 b/PatchTestProject/Library/Artifacts/a9/a90c1007713c15d863c7b4ce699924e5 new file mode 100644 index 0000000..64b119e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a90c1007713c15d863c7b4ce699924e5 differ diff --git a/PatchTestProject/Library/Artifacts/a9/a9308b972ba044d9b60aaf856a56fc10 b/PatchTestProject/Library/Artifacts/a9/a9308b972ba044d9b60aaf856a56fc10 new file mode 100644 index 0000000..c67a449 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a9308b972ba044d9b60aaf856a56fc10 differ diff --git a/PatchTestProject/Library/Artifacts/a9/a93ac1560d84581bb84a299bc5975c56 b/PatchTestProject/Library/Artifacts/a9/a93ac1560d84581bb84a299bc5975c56 new file mode 100644 index 0000000..6b7dfc2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a93ac1560d84581bb84a299bc5975c56 differ diff --git a/PatchTestProject/Library/Artifacts/a9/a96137c24da6a203abcbcb99f0742f2e b/PatchTestProject/Library/Artifacts/a9/a96137c24da6a203abcbcb99f0742f2e new file mode 100644 index 0000000..08918a3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a96137c24da6a203abcbcb99f0742f2e differ diff --git a/PatchTestProject/Library/Artifacts/a9/a9721d4879e3ba9785a732e7fb2751be b/PatchTestProject/Library/Artifacts/a9/a9721d4879e3ba9785a732e7fb2751be new file mode 100644 index 0000000..d05790a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a9721d4879e3ba9785a732e7fb2751be differ diff --git a/PatchTestProject/Library/Artifacts/a9/a9976d9076e05ee98737239b8b328bce b/PatchTestProject/Library/Artifacts/a9/a9976d9076e05ee98737239b8b328bce new file mode 100644 index 0000000..627caaa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a9976d9076e05ee98737239b8b328bce differ diff --git a/PatchTestProject/Library/Artifacts/a9/a9d12a3ff9eeb733a1e902a72a1b3d5c b/PatchTestProject/Library/Artifacts/a9/a9d12a3ff9eeb733a1e902a72a1b3d5c new file mode 100644 index 0000000..bd438fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/a9/a9d12a3ff9eeb733a1e902a72a1b3d5c differ diff --git a/PatchTestProject/Library/Artifacts/aa/aa5036be06c09dd60e2c1e8033d80121 b/PatchTestProject/Library/Artifacts/aa/aa5036be06c09dd60e2c1e8033d80121 new file mode 100644 index 0000000..e7abf3d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/aa/aa5036be06c09dd60e2c1e8033d80121 differ diff --git a/PatchTestProject/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 b/PatchTestProject/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 new file mode 100644 index 0000000..f8e19c8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 differ diff --git a/PatchTestProject/Library/Artifacts/aa/aa72f69bd56da905a9cfbdfc74b19aa9 b/PatchTestProject/Library/Artifacts/aa/aa72f69bd56da905a9cfbdfc74b19aa9 new file mode 100644 index 0000000..e8ea041 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/aa/aa72f69bd56da905a9cfbdfc74b19aa9 differ diff --git a/PatchTestProject/Library/Artifacts/aa/aaf563e02760388e0eed524d8eef04c1 b/PatchTestProject/Library/Artifacts/aa/aaf563e02760388e0eed524d8eef04c1 new file mode 100644 index 0000000..30df31f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/aa/aaf563e02760388e0eed524d8eef04c1 differ diff --git a/PatchTestProject/Library/Artifacts/aa/aaf598669d9badec90ccbbe6679cbb3e b/PatchTestProject/Library/Artifacts/aa/aaf598669d9badec90ccbbe6679cbb3e new file mode 100644 index 0000000..6afb94c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/aa/aaf598669d9badec90ccbbe6679cbb3e differ diff --git a/PatchTestProject/Library/Artifacts/ab/ab07ce0dcc3dba3a4d2d6af75715d622 b/PatchTestProject/Library/Artifacts/ab/ab07ce0dcc3dba3a4d2d6af75715d622 new file mode 100644 index 0000000..3e9fea4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/ab07ce0dcc3dba3a4d2d6af75715d622 differ diff --git a/PatchTestProject/Library/Artifacts/ab/ab0ff57f5844f0167878a205d3d60e40 b/PatchTestProject/Library/Artifacts/ab/ab0ff57f5844f0167878a205d3d60e40 new file mode 100644 index 0000000..1986f55 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/ab0ff57f5844f0167878a205d3d60e40 differ diff --git a/PatchTestProject/Library/Artifacts/ab/ab3fcdc362082348b837d825af430d51 b/PatchTestProject/Library/Artifacts/ab/ab3fcdc362082348b837d825af430d51 new file mode 100644 index 0000000..8b41be3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/ab3fcdc362082348b837d825af430d51 differ diff --git a/PatchTestProject/Library/Artifacts/ab/ab45239b89d1aeb0b81771549f94c19f b/PatchTestProject/Library/Artifacts/ab/ab45239b89d1aeb0b81771549f94c19f new file mode 100644 index 0000000..7b466ad Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/ab45239b89d1aeb0b81771549f94c19f differ diff --git a/PatchTestProject/Library/Artifacts/ab/ab4748c1d427e4ea78782eebb9546ca9 b/PatchTestProject/Library/Artifacts/ab/ab4748c1d427e4ea78782eebb9546ca9 new file mode 100644 index 0000000..8fc9a0e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/ab4748c1d427e4ea78782eebb9546ca9 differ diff --git a/PatchTestProject/Library/Artifacts/ab/ab9e700a4e25915bfcc8678c1f7d68d0 b/PatchTestProject/Library/Artifacts/ab/ab9e700a4e25915bfcc8678c1f7d68d0 new file mode 100644 index 0000000..33a701f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/ab9e700a4e25915bfcc8678c1f7d68d0 differ diff --git a/PatchTestProject/Library/Artifacts/ab/abb7d571d880de65b158d2d10dd02458 b/PatchTestProject/Library/Artifacts/ab/abb7d571d880de65b158d2d10dd02458 new file mode 100644 index 0000000..dfa02da Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/abb7d571d880de65b158d2d10dd02458 differ diff --git a/PatchTestProject/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b b/PatchTestProject/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b new file mode 100644 index 0000000..5ad8c1f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b differ diff --git a/PatchTestProject/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c b/PatchTestProject/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c new file mode 100644 index 0000000..8d1da09 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c differ diff --git a/PatchTestProject/Library/Artifacts/ac/ac78ad6b5155b96d925ff48c29846de1 b/PatchTestProject/Library/Artifacts/ac/ac78ad6b5155b96d925ff48c29846de1 new file mode 100644 index 0000000..7ff9a67 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ac/ac78ad6b5155b96d925ff48c29846de1 differ diff --git a/PatchTestProject/Library/Artifacts/ac/ac8c46051dc196d69e98591142f9e96d b/PatchTestProject/Library/Artifacts/ac/ac8c46051dc196d69e98591142f9e96d new file mode 100644 index 0000000..b863cb5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ac/ac8c46051dc196d69e98591142f9e96d differ diff --git a/PatchTestProject/Library/Artifacts/ac/acd42aef4c90360262bb27c05a037104 b/PatchTestProject/Library/Artifacts/ac/acd42aef4c90360262bb27c05a037104 new file mode 100644 index 0000000..dd60096 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ac/acd42aef4c90360262bb27c05a037104 differ diff --git a/PatchTestProject/Library/Artifacts/ac/acd7b576ef15b6ee1890eb8df997d42e b/PatchTestProject/Library/Artifacts/ac/acd7b576ef15b6ee1890eb8df997d42e new file mode 100644 index 0000000..f2b5800 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ac/acd7b576ef15b6ee1890eb8df997d42e differ diff --git a/PatchTestProject/Library/Artifacts/ac/acfb272d8810080661fed701721e79ae b/PatchTestProject/Library/Artifacts/ac/acfb272d8810080661fed701721e79ae new file mode 100644 index 0000000..27f41ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ac/acfb272d8810080661fed701721e79ae differ diff --git a/PatchTestProject/Library/Artifacts/ad/ad365b59c1aa5161bc1845953758fac1 b/PatchTestProject/Library/Artifacts/ad/ad365b59c1aa5161bc1845953758fac1 new file mode 100644 index 0000000..e8d91b7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ad/ad365b59c1aa5161bc1845953758fac1 differ diff --git a/PatchTestProject/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee b/PatchTestProject/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee new file mode 100644 index 0000000..30d7a97 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee differ diff --git a/PatchTestProject/Library/Artifacts/ad/ad69892df68e265da534881d872b1819 b/PatchTestProject/Library/Artifacts/ad/ad69892df68e265da534881d872b1819 new file mode 100644 index 0000000..07c8ef6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ad/ad69892df68e265da534881d872b1819 differ diff --git a/PatchTestProject/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b b/PatchTestProject/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b new file mode 100644 index 0000000..6db2149 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b differ diff --git a/PatchTestProject/Library/Artifacts/ae/ae16f4fb6483a46d1bee5ff1176ac799 b/PatchTestProject/Library/Artifacts/ae/ae16f4fb6483a46d1bee5ff1176ac799 new file mode 100644 index 0000000..fbd597a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ae/ae16f4fb6483a46d1bee5ff1176ac799 differ diff --git a/PatchTestProject/Library/Artifacts/ae/ae33e47ca2c8247394a6fbf66585009f b/PatchTestProject/Library/Artifacts/ae/ae33e47ca2c8247394a6fbf66585009f new file mode 100644 index 0000000..46e2da4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ae/ae33e47ca2c8247394a6fbf66585009f differ diff --git a/PatchTestProject/Library/Artifacts/ae/ae3ea387b0b9b2b2b68441d87018b76d b/PatchTestProject/Library/Artifacts/ae/ae3ea387b0b9b2b2b68441d87018b76d new file mode 100644 index 0000000..39e0341 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ae/ae3ea387b0b9b2b2b68441d87018b76d differ diff --git a/PatchTestProject/Library/Artifacts/ae/aec2b710f311f8b6b62ce603c37f0369 b/PatchTestProject/Library/Artifacts/ae/aec2b710f311f8b6b62ce603c37f0369 new file mode 100644 index 0000000..88f881f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ae/aec2b710f311f8b6b62ce603c37f0369 differ diff --git a/PatchTestProject/Library/Artifacts/ae/aed7d219661a2e3c52326173f4715385 b/PatchTestProject/Library/Artifacts/ae/aed7d219661a2e3c52326173f4715385 new file mode 100644 index 0000000..bb277df Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ae/aed7d219661a2e3c52326173f4715385 differ diff --git a/PatchTestProject/Library/Artifacts/af/af1feaabc6123681b9be19d2d7f2dfa7 b/PatchTestProject/Library/Artifacts/af/af1feaabc6123681b9be19d2d7f2dfa7 new file mode 100644 index 0000000..41dfcdc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/af1feaabc6123681b9be19d2d7f2dfa7 differ diff --git a/PatchTestProject/Library/Artifacts/af/af3cb61dca75169839146320115f97fd b/PatchTestProject/Library/Artifacts/af/af3cb61dca75169839146320115f97fd new file mode 100644 index 0000000..dbdf37b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/af3cb61dca75169839146320115f97fd differ diff --git a/PatchTestProject/Library/Artifacts/af/af480d22cbdd439488f6ade8813cea66 b/PatchTestProject/Library/Artifacts/af/af480d22cbdd439488f6ade8813cea66 new file mode 100644 index 0000000..cdbd5ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/af480d22cbdd439488f6ade8813cea66 differ diff --git a/PatchTestProject/Library/Artifacts/af/af5a6fb2e3fbbd5d7c36d7ab67770702 b/PatchTestProject/Library/Artifacts/af/af5a6fb2e3fbbd5d7c36d7ab67770702 new file mode 100644 index 0000000..4c96d61 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/af5a6fb2e3fbbd5d7c36d7ab67770702 differ diff --git a/PatchTestProject/Library/Artifacts/af/afa56ef9d0fd8cc24e06614202cca8d9 b/PatchTestProject/Library/Artifacts/af/afa56ef9d0fd8cc24e06614202cca8d9 new file mode 100644 index 0000000..46ab00c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/afa56ef9d0fd8cc24e06614202cca8d9 differ diff --git a/PatchTestProject/Library/Artifacts/af/afdc2ad32f2c932dbd59be15f280307f b/PatchTestProject/Library/Artifacts/af/afdc2ad32f2c932dbd59be15f280307f new file mode 100644 index 0000000..fd9049d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/afdc2ad32f2c932dbd59be15f280307f differ diff --git a/PatchTestProject/Library/Artifacts/af/afe02bf988b8a6c0af9ea52bf234c7e6 b/PatchTestProject/Library/Artifacts/af/afe02bf988b8a6c0af9ea52bf234c7e6 new file mode 100644 index 0000000..b6b9369 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/af/afe02bf988b8a6c0af9ea52bf234c7e6 differ diff --git a/PatchTestProject/Library/Artifacts/b0/b01f59c2e91c681a7ae8d8b7504b14e4 b/PatchTestProject/Library/Artifacts/b0/b01f59c2e91c681a7ae8d8b7504b14e4 new file mode 100644 index 0000000..deebf27 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b01f59c2e91c681a7ae8d8b7504b14e4 differ diff --git a/PatchTestProject/Library/Artifacts/b0/b02c556e59aa5740c1439901e47ec8f4 b/PatchTestProject/Library/Artifacts/b0/b02c556e59aa5740c1439901e47ec8f4 new file mode 100644 index 0000000..2f2d4be Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b02c556e59aa5740c1439901e47ec8f4 differ diff --git a/PatchTestProject/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be b/PatchTestProject/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be new file mode 100644 index 0000000..10950b9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be differ diff --git a/PatchTestProject/Library/Artifacts/b0/b06fc391c7818219156462efabef9da2 b/PatchTestProject/Library/Artifacts/b0/b06fc391c7818219156462efabef9da2 new file mode 100644 index 0000000..0acd33e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b06fc391c7818219156462efabef9da2 differ diff --git a/PatchTestProject/Library/Artifacts/b0/b07bd976d5401c44ecbbc44c430e0973 b/PatchTestProject/Library/Artifacts/b0/b07bd976d5401c44ecbbc44c430e0973 new file mode 100644 index 0000000..1c02405 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b07bd976d5401c44ecbbc44c430e0973 differ diff --git a/PatchTestProject/Library/Artifacts/b0/b07e9bbae1b038fec4af363e23890538 b/PatchTestProject/Library/Artifacts/b0/b07e9bbae1b038fec4af363e23890538 new file mode 100644 index 0000000..2430019 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b07e9bbae1b038fec4af363e23890538 differ diff --git a/PatchTestProject/Library/Artifacts/b0/b0fb81bb0d2c052fa1d49d9e3890cc95 b/PatchTestProject/Library/Artifacts/b0/b0fb81bb0d2c052fa1d49d9e3890cc95 new file mode 100644 index 0000000..9a2fe9f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b0/b0fb81bb0d2c052fa1d49d9e3890cc95 differ diff --git a/PatchTestProject/Library/Artifacts/b1/b110206621d932ad2c12e9bb86fe8294 b/PatchTestProject/Library/Artifacts/b1/b110206621d932ad2c12e9bb86fe8294 new file mode 100644 index 0000000..4be5e83 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b1/b110206621d932ad2c12e9bb86fe8294 differ diff --git a/PatchTestProject/Library/Artifacts/b1/b13c3cbd2bbdcda47f3a0741abde914f b/PatchTestProject/Library/Artifacts/b1/b13c3cbd2bbdcda47f3a0741abde914f new file mode 100644 index 0000000..a5940a9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b1/b13c3cbd2bbdcda47f3a0741abde914f differ diff --git a/PatchTestProject/Library/Artifacts/b1/b144e500c81a055126777b25c911c4ab b/PatchTestProject/Library/Artifacts/b1/b144e500c81a055126777b25c911c4ab new file mode 100644 index 0000000..8242480 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b1/b144e500c81a055126777b25c911c4ab differ diff --git a/PatchTestProject/Library/Artifacts/b1/b17a1532723546dae0a03fcd162e2eaa b/PatchTestProject/Library/Artifacts/b1/b17a1532723546dae0a03fcd162e2eaa new file mode 100644 index 0000000..2d08bf5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b1/b17a1532723546dae0a03fcd162e2eaa differ diff --git a/PatchTestProject/Library/Artifacts/b2/b237273de0b141d7210167d474a197a4 b/PatchTestProject/Library/Artifacts/b2/b237273de0b141d7210167d474a197a4 new file mode 100644 index 0000000..7bb5c0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b2/b237273de0b141d7210167d474a197a4 differ diff --git a/PatchTestProject/Library/Artifacts/b3/b31bb56329ce27d5ab309fc43251052a b/PatchTestProject/Library/Artifacts/b3/b31bb56329ce27d5ab309fc43251052a new file mode 100644 index 0000000..10f51b3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b3/b31bb56329ce27d5ab309fc43251052a differ diff --git a/PatchTestProject/Library/Artifacts/b3/b3a5b8aaeceae4b3d891ce550d0e42a9 b/PatchTestProject/Library/Artifacts/b3/b3a5b8aaeceae4b3d891ce550d0e42a9 new file mode 100644 index 0000000..6a9c20b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b3/b3a5b8aaeceae4b3d891ce550d0e42a9 differ diff --git a/PatchTestProject/Library/Artifacts/b3/b3aca2017b7cca2f710cc7aef70c9261 b/PatchTestProject/Library/Artifacts/b3/b3aca2017b7cca2f710cc7aef70c9261 new file mode 100644 index 0000000..f3f9c8c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b3/b3aca2017b7cca2f710cc7aef70c9261 differ diff --git a/PatchTestProject/Library/Artifacts/b3/b3af3a2af769d03dcbb40ba3f9de9c44 b/PatchTestProject/Library/Artifacts/b3/b3af3a2af769d03dcbb40ba3f9de9c44 new file mode 100644 index 0000000..c150c68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b3/b3af3a2af769d03dcbb40ba3f9de9c44 differ diff --git a/PatchTestProject/Library/Artifacts/b3/b3bd73d1231850a6e18fd74ba883b990 b/PatchTestProject/Library/Artifacts/b3/b3bd73d1231850a6e18fd74ba883b990 new file mode 100644 index 0000000..3c8b349 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b3/b3bd73d1231850a6e18fd74ba883b990 differ diff --git a/PatchTestProject/Library/Artifacts/b3/b3de67ea02c2742735c4e61f39455adf b/PatchTestProject/Library/Artifacts/b3/b3de67ea02c2742735c4e61f39455adf new file mode 100644 index 0000000..1f27f37 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b3/b3de67ea02c2742735c4e61f39455adf differ diff --git a/PatchTestProject/Library/Artifacts/b4/b4324b34f83c80aaa1ba0521169c5c04 b/PatchTestProject/Library/Artifacts/b4/b4324b34f83c80aaa1ba0521169c5c04 new file mode 100644 index 0000000..22c8d91 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b4324b34f83c80aaa1ba0521169c5c04 differ diff --git a/PatchTestProject/Library/Artifacts/b4/b4575e80b56951fe06a2c1d969c79d2e b/PatchTestProject/Library/Artifacts/b4/b4575e80b56951fe06a2c1d969c79d2e new file mode 100644 index 0000000..8f1f379 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b4575e80b56951fe06a2c1d969c79d2e differ diff --git a/PatchTestProject/Library/Artifacts/b4/b4591342147901d37fbc6fe2226d03c4 b/PatchTestProject/Library/Artifacts/b4/b4591342147901d37fbc6fe2226d03c4 new file mode 100644 index 0000000..0ae9db7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b4591342147901d37fbc6fe2226d03c4 differ diff --git a/PatchTestProject/Library/Artifacts/b4/b45fd187aaa2c5c87b3eb2e53c146885 b/PatchTestProject/Library/Artifacts/b4/b45fd187aaa2c5c87b3eb2e53c146885 new file mode 100644 index 0000000..b7c36e5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b45fd187aaa2c5c87b3eb2e53c146885 differ diff --git a/PatchTestProject/Library/Artifacts/b4/b48e7b0c4ebb2edb5505b867e399fd9b b/PatchTestProject/Library/Artifacts/b4/b48e7b0c4ebb2edb5505b867e399fd9b new file mode 100644 index 0000000..00bea34 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b48e7b0c4ebb2edb5505b867e399fd9b differ diff --git a/PatchTestProject/Library/Artifacts/b4/b4b5cdc0f3d28010ad85a62464bbd8e0 b/PatchTestProject/Library/Artifacts/b4/b4b5cdc0f3d28010ad85a62464bbd8e0 new file mode 100644 index 0000000..5df0122 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b4b5cdc0f3d28010ad85a62464bbd8e0 differ diff --git a/PatchTestProject/Library/Artifacts/b4/b4d2fb79c680d393c02797f55229dc46 b/PatchTestProject/Library/Artifacts/b4/b4d2fb79c680d393c02797f55229dc46 new file mode 100644 index 0000000..be93505 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b4/b4d2fb79c680d393c02797f55229dc46 differ diff --git a/PatchTestProject/Library/Artifacts/b5/b512b8e44cc62514e127edd00e7761f5 b/PatchTestProject/Library/Artifacts/b5/b512b8e44cc62514e127edd00e7761f5 new file mode 100644 index 0000000..3fd6668 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b512b8e44cc62514e127edd00e7761f5 differ diff --git a/PatchTestProject/Library/Artifacts/b5/b517e81de683101af06a6289db1e6026 b/PatchTestProject/Library/Artifacts/b5/b517e81de683101af06a6289db1e6026 new file mode 100644 index 0000000..f8a2f58 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b517e81de683101af06a6289db1e6026 differ diff --git a/PatchTestProject/Library/Artifacts/b5/b52bfb0cfc931fd7e70b9579ebd8d01a b/PatchTestProject/Library/Artifacts/b5/b52bfb0cfc931fd7e70b9579ebd8d01a new file mode 100644 index 0000000..a11e5c3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b52bfb0cfc931fd7e70b9579ebd8d01a differ diff --git a/PatchTestProject/Library/Artifacts/b5/b54018ef8cca5209093f282cc9ff4db5 b/PatchTestProject/Library/Artifacts/b5/b54018ef8cca5209093f282cc9ff4db5 new file mode 100644 index 0000000..c7a9794 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b54018ef8cca5209093f282cc9ff4db5 differ diff --git a/PatchTestProject/Library/Artifacts/b5/b584f8d856074c0e4f2536b95d3e40bd b/PatchTestProject/Library/Artifacts/b5/b584f8d856074c0e4f2536b95d3e40bd new file mode 100644 index 0000000..d08af3b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b584f8d856074c0e4f2536b95d3e40bd differ diff --git a/PatchTestProject/Library/Artifacts/b5/b5c496a08c5f83b24b83d6be5e0d67e4 b/PatchTestProject/Library/Artifacts/b5/b5c496a08c5f83b24b83d6be5e0d67e4 new file mode 100644 index 0000000..92defcf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b5c496a08c5f83b24b83d6be5e0d67e4 differ diff --git a/PatchTestProject/Library/Artifacts/b5/b5e09e4fcd2e0035c8106fde7640a67e b/PatchTestProject/Library/Artifacts/b5/b5e09e4fcd2e0035c8106fde7640a67e new file mode 100644 index 0000000..0ea6c75 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b5/b5e09e4fcd2e0035c8106fde7640a67e differ diff --git a/PatchTestProject/Library/Artifacts/b6/b6a246d9b7e019238f6b58ae7a4ffb7e b/PatchTestProject/Library/Artifacts/b6/b6a246d9b7e019238f6b58ae7a4ffb7e new file mode 100644 index 0000000..8d4bc31 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b6/b6a246d9b7e019238f6b58ae7a4ffb7e differ diff --git a/PatchTestProject/Library/Artifacts/b6/b6c6a5d81bf6c4be972ca51a887944a6 b/PatchTestProject/Library/Artifacts/b6/b6c6a5d81bf6c4be972ca51a887944a6 new file mode 100644 index 0000000..9591cc6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b6/b6c6a5d81bf6c4be972ca51a887944a6 differ diff --git a/PatchTestProject/Library/Artifacts/b7/b73a8dd0c34849d1e6d943910ccc4b5b b/PatchTestProject/Library/Artifacts/b7/b73a8dd0c34849d1e6d943910ccc4b5b new file mode 100644 index 0000000..c4ad56e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b73a8dd0c34849d1e6d943910ccc4b5b differ diff --git a/PatchTestProject/Library/Artifacts/b7/b746951d7a357e42d71cb0de4cb79c94 b/PatchTestProject/Library/Artifacts/b7/b746951d7a357e42d71cb0de4cb79c94 new file mode 100644 index 0000000..ec3da44 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b746951d7a357e42d71cb0de4cb79c94 differ diff --git a/PatchTestProject/Library/Artifacts/b7/b7a6ecfe89f0d558a7cea4ffcd8aa93e b/PatchTestProject/Library/Artifacts/b7/b7a6ecfe89f0d558a7cea4ffcd8aa93e new file mode 100644 index 0000000..fec023e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b7a6ecfe89f0d558a7cea4ffcd8aa93e differ diff --git a/PatchTestProject/Library/Artifacts/b7/b7ae75aed4e0e28ed99ca79e11248630 b/PatchTestProject/Library/Artifacts/b7/b7ae75aed4e0e28ed99ca79e11248630 new file mode 100644 index 0000000..b0d5681 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b7ae75aed4e0e28ed99ca79e11248630 differ diff --git a/PatchTestProject/Library/Artifacts/b7/b7be73ab80deeaa6190bb0c5269a39fb b/PatchTestProject/Library/Artifacts/b7/b7be73ab80deeaa6190bb0c5269a39fb new file mode 100644 index 0000000..43174c3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b7be73ab80deeaa6190bb0c5269a39fb differ diff --git a/PatchTestProject/Library/Artifacts/b7/b7c1235e76d578a7de744099117731fb b/PatchTestProject/Library/Artifacts/b7/b7c1235e76d578a7de744099117731fb new file mode 100644 index 0000000..1150edc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b7c1235e76d578a7de744099117731fb differ diff --git a/PatchTestProject/Library/Artifacts/b7/b7e42d99a386ea4e0e22dd7244a19f40 b/PatchTestProject/Library/Artifacts/b7/b7e42d99a386ea4e0e22dd7244a19f40 new file mode 100644 index 0000000..23af7a5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b7/b7e42d99a386ea4e0e22dd7244a19f40 differ diff --git a/PatchTestProject/Library/Artifacts/b8/b8054bd01ee231af6000307aa94b380f b/PatchTestProject/Library/Artifacts/b8/b8054bd01ee231af6000307aa94b380f new file mode 100644 index 0000000..77f1a95 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b8/b8054bd01ee231af6000307aa94b380f differ diff --git a/PatchTestProject/Library/Artifacts/b8/b80942faf73afdbcdc06ff3aa6623231 b/PatchTestProject/Library/Artifacts/b8/b80942faf73afdbcdc06ff3aa6623231 new file mode 100644 index 0000000..185f3e7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b8/b80942faf73afdbcdc06ff3aa6623231 differ diff --git a/PatchTestProject/Library/Artifacts/b8/b81e7ce37aa1a85db697f3bd7931710d b/PatchTestProject/Library/Artifacts/b8/b81e7ce37aa1a85db697f3bd7931710d new file mode 100644 index 0000000..11dc03f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b8/b81e7ce37aa1a85db697f3bd7931710d differ diff --git a/PatchTestProject/Library/Artifacts/b8/b8f50246c1d8c43cb94f25ff334554c6 b/PatchTestProject/Library/Artifacts/b8/b8f50246c1d8c43cb94f25ff334554c6 new file mode 100644 index 0000000..58908e3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b8/b8f50246c1d8c43cb94f25ff334554c6 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b9135591d31407a19026c1887aefb33a b/PatchTestProject/Library/Artifacts/b9/b9135591d31407a19026c1887aefb33a new file mode 100644 index 0000000..097cb98 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b9135591d31407a19026c1887aefb33a differ diff --git a/PatchTestProject/Library/Artifacts/b9/b94c6863b62c5bb38833e9ce559f1f3a b/PatchTestProject/Library/Artifacts/b9/b94c6863b62c5bb38833e9ce559f1f3a new file mode 100644 index 0000000..0484849 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b94c6863b62c5bb38833e9ce559f1f3a differ diff --git a/PatchTestProject/Library/Artifacts/b9/b9654cdf74d9b0899a59d03651791574 b/PatchTestProject/Library/Artifacts/b9/b9654cdf74d9b0899a59d03651791574 new file mode 100644 index 0000000..ba694e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b9654cdf74d9b0899a59d03651791574 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b983755b9b09cc0208d9a1b244fed7d9 b/PatchTestProject/Library/Artifacts/b9/b983755b9b09cc0208d9a1b244fed7d9 new file mode 100644 index 0000000..7e45455 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b983755b9b09cc0208d9a1b244fed7d9 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b99e382441947d57798526e62f377545 b/PatchTestProject/Library/Artifacts/b9/b99e382441947d57798526e62f377545 new file mode 100644 index 0000000..bb15439 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b99e382441947d57798526e62f377545 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b9a2c6d045954aada617a700f01c0f83 b/PatchTestProject/Library/Artifacts/b9/b9a2c6d045954aada617a700f01c0f83 new file mode 100644 index 0000000..624a5c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b9a2c6d045954aada617a700f01c0f83 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b9a5598e02a75cec2c9c51fbaf16c698 b/PatchTestProject/Library/Artifacts/b9/b9a5598e02a75cec2c9c51fbaf16c698 new file mode 100644 index 0000000..5d7a4fc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b9a5598e02a75cec2c9c51fbaf16c698 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b9ac40dcbfe091082c67fd84ca8cf9d7 b/PatchTestProject/Library/Artifacts/b9/b9ac40dcbfe091082c67fd84ca8cf9d7 new file mode 100644 index 0000000..650bcae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b9ac40dcbfe091082c67fd84ca8cf9d7 differ diff --git a/PatchTestProject/Library/Artifacts/b9/b9bc6f459fea603775baa5579edae153 b/PatchTestProject/Library/Artifacts/b9/b9bc6f459fea603775baa5579edae153 new file mode 100644 index 0000000..2ed6905 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/b9/b9bc6f459fea603775baa5579edae153 differ diff --git a/PatchTestProject/Library/Artifacts/ba/ba12ee43052ca85a96e5b1386ca9fa89 b/PatchTestProject/Library/Artifacts/ba/ba12ee43052ca85a96e5b1386ca9fa89 new file mode 100644 index 0000000..57d5b41 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ba/ba12ee43052ca85a96e5b1386ca9fa89 differ diff --git a/PatchTestProject/Library/Artifacts/ba/ba3d0f39ebb165d52a210ab73534f0b9 b/PatchTestProject/Library/Artifacts/ba/ba3d0f39ebb165d52a210ab73534f0b9 new file mode 100644 index 0000000..f883b97 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ba/ba3d0f39ebb165d52a210ab73534f0b9 differ diff --git a/PatchTestProject/Library/Artifacts/ba/ba8d981605cbf5667da0fb758c0be23a b/PatchTestProject/Library/Artifacts/ba/ba8d981605cbf5667da0fb758c0be23a new file mode 100644 index 0000000..a1ff7ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ba/ba8d981605cbf5667da0fb758c0be23a differ diff --git a/PatchTestProject/Library/Artifacts/ba/bab037ca767dda632f5df3ce4cdd6295 b/PatchTestProject/Library/Artifacts/ba/bab037ca767dda632f5df3ce4cdd6295 new file mode 100644 index 0000000..61e8a5f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ba/bab037ca767dda632f5df3ce4cdd6295 differ diff --git a/PatchTestProject/Library/Artifacts/ba/babd940728b242329a8b5748ccb0b9d9 b/PatchTestProject/Library/Artifacts/ba/babd940728b242329a8b5748ccb0b9d9 new file mode 100644 index 0000000..10573ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ba/babd940728b242329a8b5748ccb0b9d9 differ diff --git a/PatchTestProject/Library/Artifacts/ba/badcf177c65abbbeb1c5ea816ee4f431 b/PatchTestProject/Library/Artifacts/ba/badcf177c65abbbeb1c5ea816ee4f431 new file mode 100644 index 0000000..f5f2a75 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ba/badcf177c65abbbeb1c5ea816ee4f431 differ diff --git a/PatchTestProject/Library/Artifacts/bb/bb0d8d6801d4796d099513c4f0003a1a b/PatchTestProject/Library/Artifacts/bb/bb0d8d6801d4796d099513c4f0003a1a new file mode 100644 index 0000000..71ce472 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bb/bb0d8d6801d4796d099513c4f0003a1a differ diff --git a/PatchTestProject/Library/Artifacts/bb/bb315c5ec0250ff41bf5256f848f31e9 b/PatchTestProject/Library/Artifacts/bb/bb315c5ec0250ff41bf5256f848f31e9 new file mode 100644 index 0000000..e4b75f7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bb/bb315c5ec0250ff41bf5256f848f31e9 differ diff --git a/PatchTestProject/Library/Artifacts/bb/bb44d4928c278b30c810ca3d9ddb37ae b/PatchTestProject/Library/Artifacts/bb/bb44d4928c278b30c810ca3d9ddb37ae new file mode 100644 index 0000000..0f7be1e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bb/bb44d4928c278b30c810ca3d9ddb37ae differ diff --git a/PatchTestProject/Library/Artifacts/bb/bb46ef0b709668755af8b0139f6fadd9 b/PatchTestProject/Library/Artifacts/bb/bb46ef0b709668755af8b0139f6fadd9 new file mode 100644 index 0000000..eab3a5f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bb/bb46ef0b709668755af8b0139f6fadd9 differ diff --git a/PatchTestProject/Library/Artifacts/bb/bb62515334ebdc669577175a9c86ca3a b/PatchTestProject/Library/Artifacts/bb/bb62515334ebdc669577175a9c86ca3a new file mode 100644 index 0000000..18775f7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bb/bb62515334ebdc669577175a9c86ca3a differ diff --git a/PatchTestProject/Library/Artifacts/bc/bc1128eaf67601998a5b5cba144cd48b b/PatchTestProject/Library/Artifacts/bc/bc1128eaf67601998a5b5cba144cd48b new file mode 100644 index 0000000..245f02c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bc1128eaf67601998a5b5cba144cd48b differ diff --git a/PatchTestProject/Library/Artifacts/bc/bc23fc018e5ab1bfb498600b3ca04ece b/PatchTestProject/Library/Artifacts/bc/bc23fc018e5ab1bfb498600b3ca04ece new file mode 100644 index 0000000..ab402d4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bc23fc018e5ab1bfb498600b3ca04ece differ diff --git a/PatchTestProject/Library/Artifacts/bc/bc428f5dd5a07651c607dbc603d7ca8d b/PatchTestProject/Library/Artifacts/bc/bc428f5dd5a07651c607dbc603d7ca8d new file mode 100644 index 0000000..502a228 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bc428f5dd5a07651c607dbc603d7ca8d differ diff --git a/PatchTestProject/Library/Artifacts/bc/bc7ad53a65bbaf29eec047cccfb0bbaf b/PatchTestProject/Library/Artifacts/bc/bc7ad53a65bbaf29eec047cccfb0bbaf new file mode 100644 index 0000000..d9f19e3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bc7ad53a65bbaf29eec047cccfb0bbaf differ diff --git a/PatchTestProject/Library/Artifacts/bc/bcb1efc9bb1e410b7aefd83eb2ff67e7 b/PatchTestProject/Library/Artifacts/bc/bcb1efc9bb1e410b7aefd83eb2ff67e7 new file mode 100644 index 0000000..89fa6cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bcb1efc9bb1e410b7aefd83eb2ff67e7 differ diff --git a/PatchTestProject/Library/Artifacts/bc/bcd222cec4b954fac12d6b88c1dc5513 b/PatchTestProject/Library/Artifacts/bc/bcd222cec4b954fac12d6b88c1dc5513 new file mode 100644 index 0000000..a53074f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bcd222cec4b954fac12d6b88c1dc5513 differ diff --git a/PatchTestProject/Library/Artifacts/bc/bcd57b208838f9a2d895e8b750884e3d b/PatchTestProject/Library/Artifacts/bc/bcd57b208838f9a2d895e8b750884e3d new file mode 100644 index 0000000..c5b813f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bc/bcd57b208838f9a2d895e8b750884e3d differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd138e67b0c8b3c0ea38ab8995dda73d b/PatchTestProject/Library/Artifacts/bd/bd138e67b0c8b3c0ea38ab8995dda73d new file mode 100644 index 0000000..bac703e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd138e67b0c8b3c0ea38ab8995dda73d differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d b/PatchTestProject/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d new file mode 100644 index 0000000..9be96ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd45a2aa6d6328619f700b4ba8c429d2 b/PatchTestProject/Library/Artifacts/bd/bd45a2aa6d6328619f700b4ba8c429d2 new file mode 100644 index 0000000..25b4f73 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd45a2aa6d6328619f700b4ba8c429d2 differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd4823a883980b19b21cd46689df8608 b/PatchTestProject/Library/Artifacts/bd/bd4823a883980b19b21cd46689df8608 new file mode 100644 index 0000000..d28c9e5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd4823a883980b19b21cd46689df8608 differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd48e2600b9f6d62fb1b234a93cd80b8 b/PatchTestProject/Library/Artifacts/bd/bd48e2600b9f6d62fb1b234a93cd80b8 new file mode 100644 index 0000000..a3dc727 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd48e2600b9f6d62fb1b234a93cd80b8 differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd6d152ad0ec3861bc4b09391eb187c9 b/PatchTestProject/Library/Artifacts/bd/bd6d152ad0ec3861bc4b09391eb187c9 new file mode 100644 index 0000000..3ed0d1f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd6d152ad0ec3861bc4b09391eb187c9 differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd710fe355b54e685ba24f9a18e64be5 b/PatchTestProject/Library/Artifacts/bd/bd710fe355b54e685ba24f9a18e64be5 new file mode 100644 index 0000000..9462606 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd710fe355b54e685ba24f9a18e64be5 differ diff --git a/PatchTestProject/Library/Artifacts/bd/bd9cf583daffe797aa282c7c89996edb b/PatchTestProject/Library/Artifacts/bd/bd9cf583daffe797aa282c7c89996edb new file mode 100644 index 0000000..52cf3f5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bd9cf583daffe797aa282c7c89996edb differ diff --git a/PatchTestProject/Library/Artifacts/bd/bda003da0871999e40ce4f7cbb26aa23 b/PatchTestProject/Library/Artifacts/bd/bda003da0871999e40ce4f7cbb26aa23 new file mode 100644 index 0000000..f4a7ddc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bda003da0871999e40ce4f7cbb26aa23 differ diff --git a/PatchTestProject/Library/Artifacts/bd/bdda686181c0e982bad862e5b0c68b1b b/PatchTestProject/Library/Artifacts/bd/bdda686181c0e982bad862e5b0c68b1b new file mode 100644 index 0000000..04ffe2c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bd/bdda686181c0e982bad862e5b0c68b1b differ diff --git a/PatchTestProject/Library/Artifacts/be/be3bb59c67f96d5af7d1a38c7b5eddb1 b/PatchTestProject/Library/Artifacts/be/be3bb59c67f96d5af7d1a38c7b5eddb1 new file mode 100644 index 0000000..5b7332d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/be/be3bb59c67f96d5af7d1a38c7b5eddb1 differ diff --git a/PatchTestProject/Library/Artifacts/be/be50a4ca91102e7d94011ba7c5a3a996 b/PatchTestProject/Library/Artifacts/be/be50a4ca91102e7d94011ba7c5a3a996 new file mode 100644 index 0000000..9c65b81 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/be/be50a4ca91102e7d94011ba7c5a3a996 differ diff --git a/PatchTestProject/Library/Artifacts/be/be7fdd1b56af1ba3be60216d37296fa0 b/PatchTestProject/Library/Artifacts/be/be7fdd1b56af1ba3be60216d37296fa0 new file mode 100644 index 0000000..28401b4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/be/be7fdd1b56af1ba3be60216d37296fa0 differ diff --git a/PatchTestProject/Library/Artifacts/be/bebad9bdd96d5b33b39e42e0370b948f b/PatchTestProject/Library/Artifacts/be/bebad9bdd96d5b33b39e42e0370b948f new file mode 100644 index 0000000..76eb6c9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/be/bebad9bdd96d5b33b39e42e0370b948f differ diff --git a/PatchTestProject/Library/Artifacts/be/bed77284ef00ecdd05894f84880799d4 b/PatchTestProject/Library/Artifacts/be/bed77284ef00ecdd05894f84880799d4 new file mode 100644 index 0000000..79e5017 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/be/bed77284ef00ecdd05894f84880799d4 differ diff --git a/PatchTestProject/Library/Artifacts/be/beea932d90ce393e27ca4d41988510d9 b/PatchTestProject/Library/Artifacts/be/beea932d90ce393e27ca4d41988510d9 new file mode 100644 index 0000000..8080148 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/be/beea932d90ce393e27ca4d41988510d9 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf216f81f0b326a7adb240e70bc32ef1 b/PatchTestProject/Library/Artifacts/bf/bf216f81f0b326a7adb240e70bc32ef1 new file mode 100644 index 0000000..11d069a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf216f81f0b326a7adb240e70bc32ef1 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf312bd9186488198e07e35a44e734a5 b/PatchTestProject/Library/Artifacts/bf/bf312bd9186488198e07e35a44e734a5 new file mode 100644 index 0000000..c9445d1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf312bd9186488198e07e35a44e734a5 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf4304b90278f450c767c0057fd697fe b/PatchTestProject/Library/Artifacts/bf/bf4304b90278f450c767c0057fd697fe new file mode 100644 index 0000000..031f7df Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf4304b90278f450c767c0057fd697fe differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf668b5d01e791279d211dab364a74f7 b/PatchTestProject/Library/Artifacts/bf/bf668b5d01e791279d211dab364a74f7 new file mode 100644 index 0000000..fb61d1f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf668b5d01e791279d211dab364a74f7 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf784fd89e1845710e0f3128fdc34114 b/PatchTestProject/Library/Artifacts/bf/bf784fd89e1845710e0f3128fdc34114 new file mode 100644 index 0000000..1558917 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf784fd89e1845710e0f3128fdc34114 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf7fce0147a7d84431095a868cef47e9 b/PatchTestProject/Library/Artifacts/bf/bf7fce0147a7d84431095a868cef47e9 new file mode 100644 index 0000000..3c83f2a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf7fce0147a7d84431095a868cef47e9 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf8cd2f3abc4f5333d2d248c0a8890bb b/PatchTestProject/Library/Artifacts/bf/bf8cd2f3abc4f5333d2d248c0a8890bb new file mode 100644 index 0000000..c207d85 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf8cd2f3abc4f5333d2d248c0a8890bb differ diff --git a/PatchTestProject/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 b/PatchTestProject/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 new file mode 100644 index 0000000..a14a5f6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bfa221aa10c5078d2d63129daa0bbd71 b/PatchTestProject/Library/Artifacts/bf/bfa221aa10c5078d2d63129daa0bbd71 new file mode 100644 index 0000000..9621811 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bfa221aa10c5078d2d63129daa0bbd71 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bfb6249758b99839b6753b051d1a9eae b/PatchTestProject/Library/Artifacts/bf/bfb6249758b99839b6753b051d1a9eae new file mode 100644 index 0000000..9d6ec29 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bfb6249758b99839b6753b051d1a9eae differ diff --git a/PatchTestProject/Library/Artifacts/bf/bfd3d44307634d89f0a8e7c4715b1122 b/PatchTestProject/Library/Artifacts/bf/bfd3d44307634d89f0a8e7c4715b1122 new file mode 100644 index 0000000..c1bcffb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bfd3d44307634d89f0a8e7c4715b1122 differ diff --git a/PatchTestProject/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 b/PatchTestProject/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 new file mode 100644 index 0000000..e7a06e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 differ diff --git a/PatchTestProject/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 b/PatchTestProject/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 new file mode 100644 index 0000000..6cea4ef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 differ diff --git a/PatchTestProject/Library/Artifacts/c0/c068092e2794a99160887e3309f47739 b/PatchTestProject/Library/Artifacts/c0/c068092e2794a99160887e3309f47739 new file mode 100644 index 0000000..f201354 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c0/c068092e2794a99160887e3309f47739 differ diff --git a/PatchTestProject/Library/Artifacts/c0/c0a672a3b5fe682f41ebd1d52928c8f0 b/PatchTestProject/Library/Artifacts/c0/c0a672a3b5fe682f41ebd1d52928c8f0 new file mode 100644 index 0000000..ce45680 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c0/c0a672a3b5fe682f41ebd1d52928c8f0 differ diff --git a/PatchTestProject/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c b/PatchTestProject/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c new file mode 100644 index 0000000..4888b58 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c differ diff --git a/PatchTestProject/Library/Artifacts/c0/c0c2e1579b4def1f95804e8a75b00a78 b/PatchTestProject/Library/Artifacts/c0/c0c2e1579b4def1f95804e8a75b00a78 new file mode 100644 index 0000000..080e9d7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c0/c0c2e1579b4def1f95804e8a75b00a78 differ diff --git a/PatchTestProject/Library/Artifacts/c0/c0fda78c00edffb25f5d7060b70d6d39 b/PatchTestProject/Library/Artifacts/c0/c0fda78c00edffb25f5d7060b70d6d39 new file mode 100644 index 0000000..ce708cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c0/c0fda78c00edffb25f5d7060b70d6d39 differ diff --git a/PatchTestProject/Library/Artifacts/c1/c109fb6728f957b01bc897fd07d47dee b/PatchTestProject/Library/Artifacts/c1/c109fb6728f957b01bc897fd07d47dee new file mode 100644 index 0000000..c5cd3d3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c109fb6728f957b01bc897fd07d47dee differ diff --git a/PatchTestProject/Library/Artifacts/c1/c14fe33fead87fa786e7b024f20d4ddb b/PatchTestProject/Library/Artifacts/c1/c14fe33fead87fa786e7b024f20d4ddb new file mode 100644 index 0000000..db04d8b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c14fe33fead87fa786e7b024f20d4ddb differ diff --git a/PatchTestProject/Library/Artifacts/c1/c170217c5450982bd876d57c1c114f62 b/PatchTestProject/Library/Artifacts/c1/c170217c5450982bd876d57c1c114f62 new file mode 100644 index 0000000..4620751 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c170217c5450982bd876d57c1c114f62 differ diff --git a/PatchTestProject/Library/Artifacts/c1/c180f1f9def0b898ae030f9d33a0d6ff b/PatchTestProject/Library/Artifacts/c1/c180f1f9def0b898ae030f9d33a0d6ff new file mode 100644 index 0000000..7dcfc3b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c180f1f9def0b898ae030f9d33a0d6ff differ diff --git a/PatchTestProject/Library/Artifacts/c1/c183eec686e7af05070a4ba32a8ccbb3 b/PatchTestProject/Library/Artifacts/c1/c183eec686e7af05070a4ba32a8ccbb3 new file mode 100644 index 0000000..ee81be8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c183eec686e7af05070a4ba32a8ccbb3 differ diff --git a/PatchTestProject/Library/Artifacts/c1/c18a31e13c3ae9632861a41154b8c0e5 b/PatchTestProject/Library/Artifacts/c1/c18a31e13c3ae9632861a41154b8c0e5 new file mode 100644 index 0000000..ed7c1a2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c18a31e13c3ae9632861a41154b8c0e5 differ diff --git a/PatchTestProject/Library/Artifacts/c1/c18ea9d6f1acd9fef33802b7fef56288 b/PatchTestProject/Library/Artifacts/c1/c18ea9d6f1acd9fef33802b7fef56288 new file mode 100644 index 0000000..1ea5b45 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c18ea9d6f1acd9fef33802b7fef56288 differ diff --git a/PatchTestProject/Library/Artifacts/c1/c19854594195a230642c891980c4c4fc b/PatchTestProject/Library/Artifacts/c1/c19854594195a230642c891980c4c4fc new file mode 100644 index 0000000..f2495ec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c19854594195a230642c891980c4c4fc differ diff --git a/PatchTestProject/Library/Artifacts/c1/c1f1750a480e591b10c26bbda7a24a7f b/PatchTestProject/Library/Artifacts/c1/c1f1750a480e591b10c26bbda7a24a7f new file mode 100644 index 0000000..f8c420b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c1f1750a480e591b10c26bbda7a24a7f differ diff --git a/PatchTestProject/Library/Artifacts/c1/c1fd04cf667edf4505f286c34522d186 b/PatchTestProject/Library/Artifacts/c1/c1fd04cf667edf4505f286c34522d186 new file mode 100644 index 0000000..5e8f5ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c1/c1fd04cf667edf4505f286c34522d186 differ diff --git a/PatchTestProject/Library/Artifacts/c2/c211e23c4b1df3fd9815f42a3baab76e b/PatchTestProject/Library/Artifacts/c2/c211e23c4b1df3fd9815f42a3baab76e new file mode 100644 index 0000000..1c9d436 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c2/c211e23c4b1df3fd9815f42a3baab76e differ diff --git a/PatchTestProject/Library/Artifacts/c2/c238f7cebb8414a0ccfedea5ba036739 b/PatchTestProject/Library/Artifacts/c2/c238f7cebb8414a0ccfedea5ba036739 new file mode 100644 index 0000000..91da8bf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c2/c238f7cebb8414a0ccfedea5ba036739 differ diff --git a/PatchTestProject/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 b/PatchTestProject/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 new file mode 100644 index 0000000..5d66413 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 differ diff --git a/PatchTestProject/Library/Artifacts/c2/c270e0c7ee4754256a1f5a6d8ec0b51c b/PatchTestProject/Library/Artifacts/c2/c270e0c7ee4754256a1f5a6d8ec0b51c new file mode 100644 index 0000000..1390d7f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c2/c270e0c7ee4754256a1f5a6d8ec0b51c differ diff --git a/PatchTestProject/Library/Artifacts/c2/c2b25dcd18a82545a4cf00840fb7e26d b/PatchTestProject/Library/Artifacts/c2/c2b25dcd18a82545a4cf00840fb7e26d new file mode 100644 index 0000000..beb6177 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c2/c2b25dcd18a82545a4cf00840fb7e26d differ diff --git a/PatchTestProject/Library/Artifacts/c2/c2cd88b167a5d2445f3ee460f9438af6 b/PatchTestProject/Library/Artifacts/c2/c2cd88b167a5d2445f3ee460f9438af6 new file mode 100644 index 0000000..da21385 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c2/c2cd88b167a5d2445f3ee460f9438af6 differ diff --git a/PatchTestProject/Library/Artifacts/c3/c34b0b8f26a0230ae65c84c757900654 b/PatchTestProject/Library/Artifacts/c3/c34b0b8f26a0230ae65c84c757900654 new file mode 100644 index 0000000..9210bf4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c3/c34b0b8f26a0230ae65c84c757900654 differ diff --git a/PatchTestProject/Library/Artifacts/c3/c3938fcacecaf6e5ca1dadf1fab64bef b/PatchTestProject/Library/Artifacts/c3/c3938fcacecaf6e5ca1dadf1fab64bef new file mode 100644 index 0000000..1fce23e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c3/c3938fcacecaf6e5ca1dadf1fab64bef differ diff --git a/PatchTestProject/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 b/PatchTestProject/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 new file mode 100644 index 0000000..66e0922 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 differ diff --git a/PatchTestProject/Library/Artifacts/c3/c3d90cb2eb44f7a287850ad4da8e8940 b/PatchTestProject/Library/Artifacts/c3/c3d90cb2eb44f7a287850ad4da8e8940 new file mode 100644 index 0000000..7b85de5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c3/c3d90cb2eb44f7a287850ad4da8e8940 differ diff --git a/PatchTestProject/Library/Artifacts/c4/c41aac6147fe101139349b9cc993cd64 b/PatchTestProject/Library/Artifacts/c4/c41aac6147fe101139349b9cc993cd64 new file mode 100644 index 0000000..8c3f6cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c4/c41aac6147fe101139349b9cc993cd64 differ diff --git a/PatchTestProject/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f b/PatchTestProject/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f new file mode 100644 index 0000000..5da5782 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f differ diff --git a/PatchTestProject/Library/Artifacts/c4/c46ed3fdb98dddcb1628032d91e5a505 b/PatchTestProject/Library/Artifacts/c4/c46ed3fdb98dddcb1628032d91e5a505 new file mode 100644 index 0000000..38ea19a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c4/c46ed3fdb98dddcb1628032d91e5a505 differ diff --git a/PatchTestProject/Library/Artifacts/c4/c492a525c431a41701669f6f175ceb04 b/PatchTestProject/Library/Artifacts/c4/c492a525c431a41701669f6f175ceb04 new file mode 100644 index 0000000..04c4465 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c4/c492a525c431a41701669f6f175ceb04 differ diff --git a/PatchTestProject/Library/Artifacts/c4/c49749f18c726f5a10669cdccfd9b25b b/PatchTestProject/Library/Artifacts/c4/c49749f18c726f5a10669cdccfd9b25b new file mode 100644 index 0000000..9d3959d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c4/c49749f18c726f5a10669cdccfd9b25b differ diff --git a/PatchTestProject/Library/Artifacts/c4/c4d448994e0ea6a690e472df4aaae511 b/PatchTestProject/Library/Artifacts/c4/c4d448994e0ea6a690e472df4aaae511 new file mode 100644 index 0000000..233145c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c4/c4d448994e0ea6a690e472df4aaae511 differ diff --git a/PatchTestProject/Library/Artifacts/c5/c513f94929d2773b32c5d7546129e9f1 b/PatchTestProject/Library/Artifacts/c5/c513f94929d2773b32c5d7546129e9f1 new file mode 100644 index 0000000..715a879 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c5/c513f94929d2773b32c5d7546129e9f1 differ diff --git a/PatchTestProject/Library/Artifacts/c5/c51c52943e29b1dc9ca1591c31248ffe b/PatchTestProject/Library/Artifacts/c5/c51c52943e29b1dc9ca1591c31248ffe new file mode 100644 index 0000000..af6b605 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c5/c51c52943e29b1dc9ca1591c31248ffe differ diff --git a/PatchTestProject/Library/Artifacts/c5/c565d40685515274475dee35c7a6479a b/PatchTestProject/Library/Artifacts/c5/c565d40685515274475dee35c7a6479a new file mode 100644 index 0000000..3a40b86 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c5/c565d40685515274475dee35c7a6479a differ diff --git a/PatchTestProject/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 b/PatchTestProject/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 new file mode 100644 index 0000000..2751c5c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 differ diff --git a/PatchTestProject/Library/Artifacts/c6/c639806319161898eccccca11f509442 b/PatchTestProject/Library/Artifacts/c6/c639806319161898eccccca11f509442 new file mode 100644 index 0000000..f52b1c4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c639806319161898eccccca11f509442 differ diff --git a/PatchTestProject/Library/Artifacts/c6/c63baf739e27c73c167d779d20925d9b b/PatchTestProject/Library/Artifacts/c6/c63baf739e27c73c167d779d20925d9b new file mode 100644 index 0000000..3dc5379 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c63baf739e27c73c167d779d20925d9b differ diff --git a/PatchTestProject/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 b/PatchTestProject/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 new file mode 100644 index 0000000..542f921 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 differ diff --git a/PatchTestProject/Library/Artifacts/c6/c65ae27b7d1b8afbbe590e81c4ab480b b/PatchTestProject/Library/Artifacts/c6/c65ae27b7d1b8afbbe590e81c4ab480b new file mode 100644 index 0000000..bb7a480 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c65ae27b7d1b8afbbe590e81c4ab480b differ diff --git a/PatchTestProject/Library/Artifacts/c6/c65c0e161aeeec8d728275991ad1c8e1 b/PatchTestProject/Library/Artifacts/c6/c65c0e161aeeec8d728275991ad1c8e1 new file mode 100644 index 0000000..5e8ce1a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c65c0e161aeeec8d728275991ad1c8e1 differ diff --git a/PatchTestProject/Library/Artifacts/c6/c660f0d9020e67bf64fe23e1b1001322 b/PatchTestProject/Library/Artifacts/c6/c660f0d9020e67bf64fe23e1b1001322 new file mode 100644 index 0000000..6009869 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c660f0d9020e67bf64fe23e1b1001322 differ diff --git a/PatchTestProject/Library/Artifacts/c6/c661d49579272d57d5f617213aeb724d b/PatchTestProject/Library/Artifacts/c6/c661d49579272d57d5f617213aeb724d new file mode 100644 index 0000000..f20eb86 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c661d49579272d57d5f617213aeb724d differ diff --git a/PatchTestProject/Library/Artifacts/c6/c6a47a3e6d49c1b4377df34e51d01a06 b/PatchTestProject/Library/Artifacts/c6/c6a47a3e6d49c1b4377df34e51d01a06 new file mode 100644 index 0000000..88b75b6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c6a47a3e6d49c1b4377df34e51d01a06 differ diff --git a/PatchTestProject/Library/Artifacts/c6/c6aaeff2b7aeb14b7091f1b9cfe4b56b b/PatchTestProject/Library/Artifacts/c6/c6aaeff2b7aeb14b7091f1b9cfe4b56b new file mode 100644 index 0000000..220e7a0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c6aaeff2b7aeb14b7091f1b9cfe4b56b differ diff --git a/PatchTestProject/Library/Artifacts/c6/c6c8f66623febb9b37c475563d271aee b/PatchTestProject/Library/Artifacts/c6/c6c8f66623febb9b37c475563d271aee new file mode 100644 index 0000000..1106b9e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c6/c6c8f66623febb9b37c475563d271aee differ diff --git a/PatchTestProject/Library/Artifacts/c7/c7185f3610084daa988af26c3aa801e6 b/PatchTestProject/Library/Artifacts/c7/c7185f3610084daa988af26c3aa801e6 new file mode 100644 index 0000000..2e2bcef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c7/c7185f3610084daa988af26c3aa801e6 differ diff --git a/PatchTestProject/Library/Artifacts/c7/c71b463d60e5f9728cdbd48100250306 b/PatchTestProject/Library/Artifacts/c7/c71b463d60e5f9728cdbd48100250306 new file mode 100644 index 0000000..040f828 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c7/c71b463d60e5f9728cdbd48100250306 differ diff --git a/PatchTestProject/Library/Artifacts/c7/c745f97296af342f0d6b720e2c5a4822 b/PatchTestProject/Library/Artifacts/c7/c745f97296af342f0d6b720e2c5a4822 new file mode 100644 index 0000000..6cccad6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c7/c745f97296af342f0d6b720e2c5a4822 differ diff --git a/PatchTestProject/Library/Artifacts/c7/c7e784ecfaaa10db8d029e4c8f87e70d b/PatchTestProject/Library/Artifacts/c7/c7e784ecfaaa10db8d029e4c8f87e70d new file mode 100644 index 0000000..5992cd9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c7/c7e784ecfaaa10db8d029e4c8f87e70d differ diff --git a/PatchTestProject/Library/Artifacts/c7/c7ef9785047b31dc130f0e116262be69 b/PatchTestProject/Library/Artifacts/c7/c7ef9785047b31dc130f0e116262be69 new file mode 100644 index 0000000..739c291 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c7/c7ef9785047b31dc130f0e116262be69 differ diff --git a/PatchTestProject/Library/Artifacts/c8/c82ef58c638dd61dd0ba20e9798e4d19 b/PatchTestProject/Library/Artifacts/c8/c82ef58c638dd61dd0ba20e9798e4d19 new file mode 100644 index 0000000..3c087c0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c8/c82ef58c638dd61dd0ba20e9798e4d19 differ diff --git a/PatchTestProject/Library/Artifacts/c8/c845a509d9b663649ba01fed43e44947 b/PatchTestProject/Library/Artifacts/c8/c845a509d9b663649ba01fed43e44947 new file mode 100644 index 0000000..3a3c9dd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c8/c845a509d9b663649ba01fed43e44947 differ diff --git a/PatchTestProject/Library/Artifacts/c8/c8e47beda72b5e6a46cacbba7dd1676a b/PatchTestProject/Library/Artifacts/c8/c8e47beda72b5e6a46cacbba7dd1676a new file mode 100644 index 0000000..36c713d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c8/c8e47beda72b5e6a46cacbba7dd1676a differ diff --git a/PatchTestProject/Library/Artifacts/c9/c90703f63f5c6fd102ea33d97361d9fc b/PatchTestProject/Library/Artifacts/c9/c90703f63f5c6fd102ea33d97361d9fc new file mode 100644 index 0000000..d207bed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c90703f63f5c6fd102ea33d97361d9fc differ diff --git a/PatchTestProject/Library/Artifacts/c9/c91e6013e2aeab6452cfcf95c24c0053 b/PatchTestProject/Library/Artifacts/c9/c91e6013e2aeab6452cfcf95c24c0053 new file mode 100644 index 0000000..3d8c1f3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c91e6013e2aeab6452cfcf95c24c0053 differ diff --git a/PatchTestProject/Library/Artifacts/c9/c9783e0026d0b5c8dc5bda1a62de8831 b/PatchTestProject/Library/Artifacts/c9/c9783e0026d0b5c8dc5bda1a62de8831 new file mode 100644 index 0000000..72c4419 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c9783e0026d0b5c8dc5bda1a62de8831 differ diff --git a/PatchTestProject/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a b/PatchTestProject/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a new file mode 100644 index 0000000..68daecd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a differ diff --git a/PatchTestProject/Library/Artifacts/c9/c9c9676fdcb5e0ea75dd8e9fb1e1c8a5 b/PatchTestProject/Library/Artifacts/c9/c9c9676fdcb5e0ea75dd8e9fb1e1c8a5 new file mode 100644 index 0000000..2465414 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c9c9676fdcb5e0ea75dd8e9fb1e1c8a5 differ diff --git a/PatchTestProject/Library/Artifacts/c9/c9dc0f613483953c184fe1edaa0a9da2 b/PatchTestProject/Library/Artifacts/c9/c9dc0f613483953c184fe1edaa0a9da2 new file mode 100644 index 0000000..7dce0e4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c9dc0f613483953c184fe1edaa0a9da2 differ diff --git a/PatchTestProject/Library/Artifacts/c9/c9f932673032930fce9bbf50009d3988 b/PatchTestProject/Library/Artifacts/c9/c9f932673032930fce9bbf50009d3988 new file mode 100644 index 0000000..588b6cb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/c9/c9f932673032930fce9bbf50009d3988 differ diff --git a/PatchTestProject/Library/Artifacts/ca/ca1936392571cbf2effacfafdb4254a4 b/PatchTestProject/Library/Artifacts/ca/ca1936392571cbf2effacfafdb4254a4 new file mode 100644 index 0000000..0785cfa Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ca/ca1936392571cbf2effacfafdb4254a4 differ diff --git a/PatchTestProject/Library/Artifacts/ca/ca4d506761fe7e4ab25860329f246fca b/PatchTestProject/Library/Artifacts/ca/ca4d506761fe7e4ab25860329f246fca new file mode 100644 index 0000000..b77ff0a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ca/ca4d506761fe7e4ab25860329f246fca differ diff --git a/PatchTestProject/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 b/PatchTestProject/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 new file mode 100644 index 0000000..7d80c6a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 differ diff --git a/PatchTestProject/Library/Artifacts/ca/cace42c51a06f8305aa96c6ab64842a6 b/PatchTestProject/Library/Artifacts/ca/cace42c51a06f8305aa96c6ab64842a6 new file mode 100644 index 0000000..879702e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ca/cace42c51a06f8305aa96c6ab64842a6 differ diff --git a/PatchTestProject/Library/Artifacts/ca/cae454a977c642e507676c7e163f76fc b/PatchTestProject/Library/Artifacts/ca/cae454a977c642e507676c7e163f76fc new file mode 100644 index 0000000..45ae061 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ca/cae454a977c642e507676c7e163f76fc differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb187c62c103da1afdeb20265a305561 b/PatchTestProject/Library/Artifacts/cb/cb187c62c103da1afdeb20265a305561 new file mode 100644 index 0000000..c87d613 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb187c62c103da1afdeb20265a305561 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb550c08d92f98900ee66dd22ae20473 b/PatchTestProject/Library/Artifacts/cb/cb550c08d92f98900ee66dd22ae20473 new file mode 100644 index 0000000..72a8467 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb550c08d92f98900ee66dd22ae20473 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb57b815b0eeac5b8c1ce4a2f7d9c087 b/PatchTestProject/Library/Artifacts/cb/cb57b815b0eeac5b8c1ce4a2f7d9c087 new file mode 100644 index 0000000..2b56211 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb57b815b0eeac5b8c1ce4a2f7d9c087 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb7458c01cfd2962b5a858c81a6f1676 b/PatchTestProject/Library/Artifacts/cb/cb7458c01cfd2962b5a858c81a6f1676 new file mode 100644 index 0000000..f37c71a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb7458c01cfd2962b5a858c81a6f1676 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb867c1750fab349f3c673d8ea6e5124 b/PatchTestProject/Library/Artifacts/cb/cb867c1750fab349f3c673d8ea6e5124 new file mode 100644 index 0000000..8c96194 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb867c1750fab349f3c673d8ea6e5124 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb8a5becbb58b14b7f84a8cb99a3a913 b/PatchTestProject/Library/Artifacts/cb/cb8a5becbb58b14b7f84a8cb99a3a913 new file mode 100644 index 0000000..8e73588 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb8a5becbb58b14b7f84a8cb99a3a913 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 b/PatchTestProject/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 new file mode 100644 index 0000000..26804c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cb95a54b545510128dcb6590ddd0e8df b/PatchTestProject/Library/Artifacts/cb/cb95a54b545510128dcb6590ddd0e8df new file mode 100644 index 0000000..c183344 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cb95a54b545510128dcb6590ddd0e8df differ diff --git a/PatchTestProject/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 b/PatchTestProject/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 new file mode 100644 index 0000000..ff53521 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 differ diff --git a/PatchTestProject/Library/Artifacts/cb/cbe724367bf289693e69f5ae05aa5f8c b/PatchTestProject/Library/Artifacts/cb/cbe724367bf289693e69f5ae05aa5f8c new file mode 100644 index 0000000..8ce113a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cb/cbe724367bf289693e69f5ae05aa5f8c differ diff --git a/PatchTestProject/Library/Artifacts/cc/cc21ddfaadb2992a70eb150557ec8794 b/PatchTestProject/Library/Artifacts/cc/cc21ddfaadb2992a70eb150557ec8794 new file mode 100644 index 0000000..5db439d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cc/cc21ddfaadb2992a70eb150557ec8794 differ diff --git a/PatchTestProject/Library/Artifacts/cc/cc4b25210bcb979ebdffe8893933c4b5 b/PatchTestProject/Library/Artifacts/cc/cc4b25210bcb979ebdffe8893933c4b5 new file mode 100644 index 0000000..8dc77db Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cc/cc4b25210bcb979ebdffe8893933c4b5 differ diff --git a/PatchTestProject/Library/Artifacts/cc/cca1af99f77fad7aa979f1dcc978c48a b/PatchTestProject/Library/Artifacts/cc/cca1af99f77fad7aa979f1dcc978c48a new file mode 100644 index 0000000..ad213cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cc/cca1af99f77fad7aa979f1dcc978c48a differ diff --git a/PatchTestProject/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 b/PatchTestProject/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 new file mode 100644 index 0000000..dba23cb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 differ diff --git a/PatchTestProject/Library/Artifacts/cd/cd1bc2cca30143e92a3d9a46862a7da5 b/PatchTestProject/Library/Artifacts/cd/cd1bc2cca30143e92a3d9a46862a7da5 new file mode 100644 index 0000000..4c0045c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cd1bc2cca30143e92a3d9a46862a7da5 differ diff --git a/PatchTestProject/Library/Artifacts/cd/cd56d0878a5b9f70a79b12dca5bce1a0 b/PatchTestProject/Library/Artifacts/cd/cd56d0878a5b9f70a79b12dca5bce1a0 new file mode 100644 index 0000000..594d7fe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cd56d0878a5b9f70a79b12dca5bce1a0 differ diff --git a/PatchTestProject/Library/Artifacts/cd/cd5a3064a3b6b377d9b5f9b6417b93a1 b/PatchTestProject/Library/Artifacts/cd/cd5a3064a3b6b377d9b5f9b6417b93a1 new file mode 100644 index 0000000..4d7c974 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cd5a3064a3b6b377d9b5f9b6417b93a1 differ diff --git a/PatchTestProject/Library/Artifacts/cd/cda06bb4dc7b027088c42ee23343589f b/PatchTestProject/Library/Artifacts/cd/cda06bb4dc7b027088c42ee23343589f new file mode 100644 index 0000000..ebcc61a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cda06bb4dc7b027088c42ee23343589f differ diff --git a/PatchTestProject/Library/Artifacts/cd/cdb3ebfcbfa399106dd45e2b5dd18ac1 b/PatchTestProject/Library/Artifacts/cd/cdb3ebfcbfa399106dd45e2b5dd18ac1 new file mode 100644 index 0000000..228888c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cdb3ebfcbfa399106dd45e2b5dd18ac1 differ diff --git a/PatchTestProject/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 b/PatchTestProject/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 new file mode 100644 index 0000000..d8731b7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 differ diff --git a/PatchTestProject/Library/Artifacts/cd/cdda486e4d09f5ac1a5daadfdd936cba b/PatchTestProject/Library/Artifacts/cd/cdda486e4d09f5ac1a5daadfdd936cba new file mode 100644 index 0000000..78abb6d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cdda486e4d09f5ac1a5daadfdd936cba differ diff --git a/PatchTestProject/Library/Artifacts/cd/cdf5a3e82fc876b17ed81841e9df7d88 b/PatchTestProject/Library/Artifacts/cd/cdf5a3e82fc876b17ed81841e9df7d88 new file mode 100644 index 0000000..7c8a165 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cd/cdf5a3e82fc876b17ed81841e9df7d88 differ diff --git a/PatchTestProject/Library/Artifacts/ce/ce3aa923f37afc334c2c04400c670722 b/PatchTestProject/Library/Artifacts/ce/ce3aa923f37afc334c2c04400c670722 new file mode 100644 index 0000000..f9347fd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ce/ce3aa923f37afc334c2c04400c670722 differ diff --git a/PatchTestProject/Library/Artifacts/cf/cf58c39a5ecaa809a91ee7fad18cdb91 b/PatchTestProject/Library/Artifacts/cf/cf58c39a5ecaa809a91ee7fad18cdb91 new file mode 100644 index 0000000..8fc0294 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cf58c39a5ecaa809a91ee7fad18cdb91 differ diff --git a/PatchTestProject/Library/Artifacts/cf/cf747630281a8983d4bc9634a3f51c9b b/PatchTestProject/Library/Artifacts/cf/cf747630281a8983d4bc9634a3f51c9b new file mode 100644 index 0000000..39c2630 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cf747630281a8983d4bc9634a3f51c9b differ diff --git a/PatchTestProject/Library/Artifacts/cf/cf770093c051dfd0fe3128a50b87bff3 b/PatchTestProject/Library/Artifacts/cf/cf770093c051dfd0fe3128a50b87bff3 new file mode 100644 index 0000000..6adbdbe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cf770093c051dfd0fe3128a50b87bff3 differ diff --git a/PatchTestProject/Library/Artifacts/cf/cfb1ba22777167602bce12b9dce8964c b/PatchTestProject/Library/Artifacts/cf/cfb1ba22777167602bce12b9dce8964c new file mode 100644 index 0000000..c5adcc6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cfb1ba22777167602bce12b9dce8964c differ diff --git a/PatchTestProject/Library/Artifacts/cf/cfba6b8d55f8ee7cb8e37b538b53429a b/PatchTestProject/Library/Artifacts/cf/cfba6b8d55f8ee7cb8e37b538b53429a new file mode 100644 index 0000000..af5a0b5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cfba6b8d55f8ee7cb8e37b538b53429a differ diff --git a/PatchTestProject/Library/Artifacts/cf/cfdcedd0b62d1a0b94d85ef22f48e1be b/PatchTestProject/Library/Artifacts/cf/cfdcedd0b62d1a0b94d85ef22f48e1be new file mode 100644 index 0000000..eab76f7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cfdcedd0b62d1a0b94d85ef22f48e1be differ diff --git a/PatchTestProject/Library/Artifacts/cf/cff7fe72ed35c6d3816d1a4ccd875d38 b/PatchTestProject/Library/Artifacts/cf/cff7fe72ed35c6d3816d1a4ccd875d38 new file mode 100644 index 0000000..d9392ba Binary files /dev/null and b/PatchTestProject/Library/Artifacts/cf/cff7fe72ed35c6d3816d1a4ccd875d38 differ diff --git a/PatchTestProject/Library/Artifacts/d0/d00527879a5016bccb9e3dd271bad00d b/PatchTestProject/Library/Artifacts/d0/d00527879a5016bccb9e3dd271bad00d new file mode 100644 index 0000000..72c69bf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d0/d00527879a5016bccb9e3dd271bad00d differ diff --git a/PatchTestProject/Library/Artifacts/d0/d03e4cd06cc9411a15f33e312c2f132a b/PatchTestProject/Library/Artifacts/d0/d03e4cd06cc9411a15f33e312c2f132a new file mode 100644 index 0000000..e5048f3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d0/d03e4cd06cc9411a15f33e312c2f132a differ diff --git a/PatchTestProject/Library/Artifacts/d0/d0c7bafa9a1ee2eae79929d6c12b96c8 b/PatchTestProject/Library/Artifacts/d0/d0c7bafa9a1ee2eae79929d6c12b96c8 new file mode 100644 index 0000000..4da9c6d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d0/d0c7bafa9a1ee2eae79929d6c12b96c8 differ diff --git a/PatchTestProject/Library/Artifacts/d0/d0dcc2e43fdf83d7deb32d1b8a8d7c90 b/PatchTestProject/Library/Artifacts/d0/d0dcc2e43fdf83d7deb32d1b8a8d7c90 new file mode 100644 index 0000000..cea7bf0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d0/d0dcc2e43fdf83d7deb32d1b8a8d7c90 differ diff --git a/PatchTestProject/Library/Artifacts/d0/d0fe87f37883267bbd66465d35d4a91d b/PatchTestProject/Library/Artifacts/d0/d0fe87f37883267bbd66465d35d4a91d new file mode 100644 index 0000000..f15eea5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d0/d0fe87f37883267bbd66465d35d4a91d differ diff --git a/PatchTestProject/Library/Artifacts/d1/d160e3269147d0404b184a033a157c74 b/PatchTestProject/Library/Artifacts/d1/d160e3269147d0404b184a033a157c74 new file mode 100644 index 0000000..b733efd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d1/d160e3269147d0404b184a033a157c74 differ diff --git a/PatchTestProject/Library/Artifacts/d1/d1a8259f42a575beaa4b2fbbacc18466 b/PatchTestProject/Library/Artifacts/d1/d1a8259f42a575beaa4b2fbbacc18466 new file mode 100644 index 0000000..7c65fa3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d1/d1a8259f42a575beaa4b2fbbacc18466 differ diff --git a/PatchTestProject/Library/Artifacts/d1/d1b155495dc371165be8bdfd18be0986 b/PatchTestProject/Library/Artifacts/d1/d1b155495dc371165be8bdfd18be0986 new file mode 100644 index 0000000..91ff917 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d1/d1b155495dc371165be8bdfd18be0986 differ diff --git a/PatchTestProject/Library/Artifacts/d2/d25f8a2eddbd49624d3a2e1624349885 b/PatchTestProject/Library/Artifacts/d2/d25f8a2eddbd49624d3a2e1624349885 new file mode 100644 index 0000000..8490c26 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d2/d25f8a2eddbd49624d3a2e1624349885 differ diff --git a/PatchTestProject/Library/Artifacts/d2/d27816d9c14426f6a5efcc343754452f b/PatchTestProject/Library/Artifacts/d2/d27816d9c14426f6a5efcc343754452f new file mode 100644 index 0000000..ea4d224 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d2/d27816d9c14426f6a5efcc343754452f differ diff --git a/PatchTestProject/Library/Artifacts/d2/d296231c55a6943478c2c6caa365936d b/PatchTestProject/Library/Artifacts/d2/d296231c55a6943478c2c6caa365936d new file mode 100644 index 0000000..1d458ad Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d2/d296231c55a6943478c2c6caa365936d differ diff --git a/PatchTestProject/Library/Artifacts/d2/d2ab05ab52677ec05aff5c4aed19c033 b/PatchTestProject/Library/Artifacts/d2/d2ab05ab52677ec05aff5c4aed19c033 new file mode 100644 index 0000000..db10b04 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d2/d2ab05ab52677ec05aff5c4aed19c033 differ diff --git a/PatchTestProject/Library/Artifacts/d2/d2f6d382b46599d3e4afd3829e1a1617 b/PatchTestProject/Library/Artifacts/d2/d2f6d382b46599d3e4afd3829e1a1617 new file mode 100644 index 0000000..b3303c5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d2/d2f6d382b46599d3e4afd3829e1a1617 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d30be6cc01577310ac1f1be418a21845 b/PatchTestProject/Library/Artifacts/d3/d30be6cc01577310ac1f1be418a21845 new file mode 100644 index 0000000..0c6f53a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d30be6cc01577310ac1f1be418a21845 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d30e362f05e6ce3d08d1740d02976121 b/PatchTestProject/Library/Artifacts/d3/d30e362f05e6ce3d08d1740d02976121 new file mode 100644 index 0000000..217757d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d30e362f05e6ce3d08d1740d02976121 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d3305cc90e663da6c32fac6fd6fdd09e b/PatchTestProject/Library/Artifacts/d3/d3305cc90e663da6c32fac6fd6fdd09e new file mode 100644 index 0000000..66e5c6d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d3305cc90e663da6c32fac6fd6fdd09e differ diff --git a/PatchTestProject/Library/Artifacts/d3/d362c7d8bd9642d8cc4331a9831bb7e1 b/PatchTestProject/Library/Artifacts/d3/d362c7d8bd9642d8cc4331a9831bb7e1 new file mode 100644 index 0000000..11c7490 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d362c7d8bd9642d8cc4331a9831bb7e1 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d366402cf99c4dea77d3577e402e7788 b/PatchTestProject/Library/Artifacts/d3/d366402cf99c4dea77d3577e402e7788 new file mode 100644 index 0000000..13ddfef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d366402cf99c4dea77d3577e402e7788 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d36679ee03872fd23b4f5c8db8f267c4 b/PatchTestProject/Library/Artifacts/d3/d36679ee03872fd23b4f5c8db8f267c4 new file mode 100644 index 0000000..c117675 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d36679ee03872fd23b4f5c8db8f267c4 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d37a74b7306be6d956ede43b70b796b9 b/PatchTestProject/Library/Artifacts/d3/d37a74b7306be6d956ede43b70b796b9 new file mode 100644 index 0000000..6fb5fca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d37a74b7306be6d956ede43b70b796b9 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d3dd8e8e533d163719863f1013ca5c41 b/PatchTestProject/Library/Artifacts/d3/d3dd8e8e533d163719863f1013ca5c41 new file mode 100644 index 0000000..6bedb50 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d3dd8e8e533d163719863f1013ca5c41 differ diff --git a/PatchTestProject/Library/Artifacts/d3/d3eb948b7e0d332205189ce3c405322c b/PatchTestProject/Library/Artifacts/d3/d3eb948b7e0d332205189ce3c405322c new file mode 100644 index 0000000..f854fb3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d3/d3eb948b7e0d332205189ce3c405322c differ diff --git a/PatchTestProject/Library/Artifacts/d4/d4060b40883d22a1bd29d5c7dde49884 b/PatchTestProject/Library/Artifacts/d4/d4060b40883d22a1bd29d5c7dde49884 new file mode 100644 index 0000000..c4edfc2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d4060b40883d22a1bd29d5c7dde49884 differ diff --git a/PatchTestProject/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 b/PatchTestProject/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 new file mode 100644 index 0000000..75ec283 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 differ diff --git a/PatchTestProject/Library/Artifacts/d4/d43b2fa88d3f2b23c4b69624c7c52c16 b/PatchTestProject/Library/Artifacts/d4/d43b2fa88d3f2b23c4b69624c7c52c16 new file mode 100644 index 0000000..43e8cf6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d43b2fa88d3f2b23c4b69624c7c52c16 differ diff --git a/PatchTestProject/Library/Artifacts/d4/d445b8f1270b9a92ba1165c7d570dd57 b/PatchTestProject/Library/Artifacts/d4/d445b8f1270b9a92ba1165c7d570dd57 new file mode 100644 index 0000000..f0d6321 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d445b8f1270b9a92ba1165c7d570dd57 differ diff --git a/PatchTestProject/Library/Artifacts/d4/d4c7d197a4e2f25e517d1777eb34936a b/PatchTestProject/Library/Artifacts/d4/d4c7d197a4e2f25e517d1777eb34936a new file mode 100644 index 0000000..603580e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d4c7d197a4e2f25e517d1777eb34936a differ diff --git a/PatchTestProject/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 b/PatchTestProject/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 new file mode 100644 index 0000000..ac1391f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 differ diff --git a/PatchTestProject/Library/Artifacts/d4/d4ffd02fae2a675be059e875edf51499 b/PatchTestProject/Library/Artifacts/d4/d4ffd02fae2a675be059e875edf51499 new file mode 100644 index 0000000..04a8067 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d4/d4ffd02fae2a675be059e875edf51499 differ diff --git a/PatchTestProject/Library/Artifacts/d5/d5488f1fbfabdcbac0ee5116e685e4e2 b/PatchTestProject/Library/Artifacts/d5/d5488f1fbfabdcbac0ee5116e685e4e2 new file mode 100644 index 0000000..621a216 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d5/d5488f1fbfabdcbac0ee5116e685e4e2 differ diff --git a/PatchTestProject/Library/Artifacts/d5/d571c0495bf68c337ca8d62115dbd603 b/PatchTestProject/Library/Artifacts/d5/d571c0495bf68c337ca8d62115dbd603 new file mode 100644 index 0000000..c22b16d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d5/d571c0495bf68c337ca8d62115dbd603 differ diff --git a/PatchTestProject/Library/Artifacts/d5/d5956655b908829f00580d6de9096d16 b/PatchTestProject/Library/Artifacts/d5/d5956655b908829f00580d6de9096d16 new file mode 100644 index 0000000..801db49 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d5/d5956655b908829f00580d6de9096d16 differ diff --git a/PatchTestProject/Library/Artifacts/d5/d5db9256afaa18305669ef614111846a b/PatchTestProject/Library/Artifacts/d5/d5db9256afaa18305669ef614111846a new file mode 100644 index 0000000..408217e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d5/d5db9256afaa18305669ef614111846a differ diff --git a/PatchTestProject/Library/Artifacts/d6/d66d37c5d3b2ba3387a0a791cf17d6c4 b/PatchTestProject/Library/Artifacts/d6/d66d37c5d3b2ba3387a0a791cf17d6c4 new file mode 100644 index 0000000..6f2d8e1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d6/d66d37c5d3b2ba3387a0a791cf17d6c4 differ diff --git a/PatchTestProject/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f b/PatchTestProject/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f new file mode 100644 index 0000000..76b8775 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f differ diff --git a/PatchTestProject/Library/Artifacts/d6/d69303ab790d2785954f1d3cd62c2d79 b/PatchTestProject/Library/Artifacts/d6/d69303ab790d2785954f1d3cd62c2d79 new file mode 100644 index 0000000..5d6c9fb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d6/d69303ab790d2785954f1d3cd62c2d79 differ diff --git a/PatchTestProject/Library/Artifacts/d6/d69c36b45a7122936001b6e8551f9c93 b/PatchTestProject/Library/Artifacts/d6/d69c36b45a7122936001b6e8551f9c93 new file mode 100644 index 0000000..bf296ba Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d6/d69c36b45a7122936001b6e8551f9c93 differ diff --git a/PatchTestProject/Library/Artifacts/d6/d69fcc35eb1a209cee218dac47692859 b/PatchTestProject/Library/Artifacts/d6/d69fcc35eb1a209cee218dac47692859 new file mode 100644 index 0000000..85fa65d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d6/d69fcc35eb1a209cee218dac47692859 differ diff --git a/PatchTestProject/Library/Artifacts/d6/d6e1b691cbe2472f517beb03a97e512f b/PatchTestProject/Library/Artifacts/d6/d6e1b691cbe2472f517beb03a97e512f new file mode 100644 index 0000000..3f7a52a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d6/d6e1b691cbe2472f517beb03a97e512f differ diff --git a/PatchTestProject/Library/Artifacts/d7/d71d82e4d8433b891360bc31d91b1a5d b/PatchTestProject/Library/Artifacts/d7/d71d82e4d8433b891360bc31d91b1a5d new file mode 100644 index 0000000..ede1d8c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d71d82e4d8433b891360bc31d91b1a5d differ diff --git a/PatchTestProject/Library/Artifacts/d7/d755bf2dc3d3a53124127b443d2c1702 b/PatchTestProject/Library/Artifacts/d7/d755bf2dc3d3a53124127b443d2c1702 new file mode 100644 index 0000000..28751eb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d755bf2dc3d3a53124127b443d2c1702 differ diff --git a/PatchTestProject/Library/Artifacts/d7/d7567e5d4d4033a8fd66b7eb0b49c306 b/PatchTestProject/Library/Artifacts/d7/d7567e5d4d4033a8fd66b7eb0b49c306 new file mode 100644 index 0000000..6e38ad7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d7567e5d4d4033a8fd66b7eb0b49c306 differ diff --git a/PatchTestProject/Library/Artifacts/d7/d75b355d43d5429cb75b2fcd3c9740e6 b/PatchTestProject/Library/Artifacts/d7/d75b355d43d5429cb75b2fcd3c9740e6 new file mode 100644 index 0000000..37340ff Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d75b355d43d5429cb75b2fcd3c9740e6 differ diff --git a/PatchTestProject/Library/Artifacts/d7/d778abc227b1fa27574d5f6c25cefddc b/PatchTestProject/Library/Artifacts/d7/d778abc227b1fa27574d5f6c25cefddc new file mode 100644 index 0000000..8761d2f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d778abc227b1fa27574d5f6c25cefddc differ diff --git a/PatchTestProject/Library/Artifacts/d7/d7a628564c9d48d2836a3a8bdc885f4a b/PatchTestProject/Library/Artifacts/d7/d7a628564c9d48d2836a3a8bdc885f4a new file mode 100644 index 0000000..9f151bf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d7a628564c9d48d2836a3a8bdc885f4a differ diff --git a/PatchTestProject/Library/Artifacts/d7/d7b79ff2fe5aab5d4b8d7dd6600644b2 b/PatchTestProject/Library/Artifacts/d7/d7b79ff2fe5aab5d4b8d7dd6600644b2 new file mode 100644 index 0000000..20dc6d5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d7b79ff2fe5aab5d4b8d7dd6600644b2 differ diff --git a/PatchTestProject/Library/Artifacts/d7/d7c5b15feac6cdacd7cfc3fd362fdc52 b/PatchTestProject/Library/Artifacts/d7/d7c5b15feac6cdacd7cfc3fd362fdc52 new file mode 100644 index 0000000..6a5d729 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d7/d7c5b15feac6cdacd7cfc3fd362fdc52 differ diff --git a/PatchTestProject/Library/Artifacts/d8/d80a39e0fcccea9502145332558161af b/PatchTestProject/Library/Artifacts/d8/d80a39e0fcccea9502145332558161af new file mode 100644 index 0000000..51a75a0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d8/d80a39e0fcccea9502145332558161af differ diff --git a/PatchTestProject/Library/Artifacts/d8/d829bda69bdd6a252bd2e4d5a2e52193 b/PatchTestProject/Library/Artifacts/d8/d829bda69bdd6a252bd2e4d5a2e52193 new file mode 100644 index 0000000..7b0a42c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d8/d829bda69bdd6a252bd2e4d5a2e52193 differ diff --git a/PatchTestProject/Library/Artifacts/d8/d87f6de3af4984273e78481a9ee94b75 b/PatchTestProject/Library/Artifacts/d8/d87f6de3af4984273e78481a9ee94b75 new file mode 100644 index 0000000..2982045 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d8/d87f6de3af4984273e78481a9ee94b75 differ diff --git a/PatchTestProject/Library/Artifacts/d8/d886d43caaf3f36e51781be89eebb710 b/PatchTestProject/Library/Artifacts/d8/d886d43caaf3f36e51781be89eebb710 new file mode 100644 index 0000000..d476faf Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d8/d886d43caaf3f36e51781be89eebb710 differ diff --git a/PatchTestProject/Library/Artifacts/d8/d8f62dd67922e5c839214c824536e859 b/PatchTestProject/Library/Artifacts/d8/d8f62dd67922e5c839214c824536e859 new file mode 100644 index 0000000..e4208cd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d8/d8f62dd67922e5c839214c824536e859 differ diff --git a/PatchTestProject/Library/Artifacts/d8/d8fa6c20e90e8142d5a796e5cb0ba698 b/PatchTestProject/Library/Artifacts/d8/d8fa6c20e90e8142d5a796e5cb0ba698 new file mode 100644 index 0000000..bcffb0b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d8/d8fa6c20e90e8142d5a796e5cb0ba698 differ diff --git a/PatchTestProject/Library/Artifacts/d9/d957d45d8f415acead75b187321dcd4a b/PatchTestProject/Library/Artifacts/d9/d957d45d8f415acead75b187321dcd4a new file mode 100644 index 0000000..0a7cfba Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d9/d957d45d8f415acead75b187321dcd4a differ diff --git a/PatchTestProject/Library/Artifacts/d9/d99ed9734787401f2393860a260a0423 b/PatchTestProject/Library/Artifacts/d9/d99ed9734787401f2393860a260a0423 new file mode 100644 index 0000000..10bc82f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d9/d99ed9734787401f2393860a260a0423 differ diff --git a/PatchTestProject/Library/Artifacts/d9/d9bf4a6b82c23d8678208a2ac15fea2e b/PatchTestProject/Library/Artifacts/d9/d9bf4a6b82c23d8678208a2ac15fea2e new file mode 100644 index 0000000..97bad13 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d9/d9bf4a6b82c23d8678208a2ac15fea2e differ diff --git a/PatchTestProject/Library/Artifacts/d9/d9dc782e3d3002f16647ad58a4e964d8 b/PatchTestProject/Library/Artifacts/d9/d9dc782e3d3002f16647ad58a4e964d8 new file mode 100644 index 0000000..06aa5b8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/d9/d9dc782e3d3002f16647ad58a4e964d8 differ diff --git a/PatchTestProject/Library/Artifacts/da/da0a04ed7f2e376fab51341331224872 b/PatchTestProject/Library/Artifacts/da/da0a04ed7f2e376fab51341331224872 new file mode 100644 index 0000000..43e86a9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/da/da0a04ed7f2e376fab51341331224872 differ diff --git a/PatchTestProject/Library/Artifacts/da/da7b743062c62e0e825fea9153725a9e b/PatchTestProject/Library/Artifacts/da/da7b743062c62e0e825fea9153725a9e new file mode 100644 index 0000000..cdad1e8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/da/da7b743062c62e0e825fea9153725a9e differ diff --git a/PatchTestProject/Library/Artifacts/da/dac3ab58f9e057c12b1dc2c714e2c474 b/PatchTestProject/Library/Artifacts/da/dac3ab58f9e057c12b1dc2c714e2c474 new file mode 100644 index 0000000..bfee9c2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/da/dac3ab58f9e057c12b1dc2c714e2c474 differ diff --git a/PatchTestProject/Library/Artifacts/db/db0fbc200d76f323dc0d2b9b89edc54b b/PatchTestProject/Library/Artifacts/db/db0fbc200d76f323dc0d2b9b89edc54b new file mode 100644 index 0000000..fdbf6af Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/db0fbc200d76f323dc0d2b9b89edc54b differ diff --git a/PatchTestProject/Library/Artifacts/db/db32cdaf605769fc189ecb3794829a46 b/PatchTestProject/Library/Artifacts/db/db32cdaf605769fc189ecb3794829a46 new file mode 100644 index 0000000..88ab0b4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/db32cdaf605769fc189ecb3794829a46 differ diff --git a/PatchTestProject/Library/Artifacts/db/db70d3fc13657bbcfc79fc0bade4d78c b/PatchTestProject/Library/Artifacts/db/db70d3fc13657bbcfc79fc0bade4d78c new file mode 100644 index 0000000..f9f43ed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/db70d3fc13657bbcfc79fc0bade4d78c differ diff --git a/PatchTestProject/Library/Artifacts/db/db80982ef8a3a0b71afac92478c7338e b/PatchTestProject/Library/Artifacts/db/db80982ef8a3a0b71afac92478c7338e new file mode 100644 index 0000000..7983dc5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/db80982ef8a3a0b71afac92478c7338e differ diff --git a/PatchTestProject/Library/Artifacts/db/db84f05c5326e522d2417a703122a509 b/PatchTestProject/Library/Artifacts/db/db84f05c5326e522d2417a703122a509 new file mode 100644 index 0000000..7dbad14 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/db84f05c5326e522d2417a703122a509 differ diff --git a/PatchTestProject/Library/Artifacts/db/dbc4eb1f0b1d495ae806b930a72396a0 b/PatchTestProject/Library/Artifacts/db/dbc4eb1f0b1d495ae806b930a72396a0 new file mode 100644 index 0000000..ab0e32d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/dbc4eb1f0b1d495ae806b930a72396a0 differ diff --git a/PatchTestProject/Library/Artifacts/db/dbc85144fcd58d7535fd95092f343005 b/PatchTestProject/Library/Artifacts/db/dbc85144fcd58d7535fd95092f343005 new file mode 100644 index 0000000..4ba0314 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/db/dbc85144fcd58d7535fd95092f343005 differ diff --git a/PatchTestProject/Library/Artifacts/dc/dc136646961dcaea1c68bfaf473ad8de b/PatchTestProject/Library/Artifacts/dc/dc136646961dcaea1c68bfaf473ad8de new file mode 100644 index 0000000..2a24a8d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dc136646961dcaea1c68bfaf473ad8de differ diff --git a/PatchTestProject/Library/Artifacts/dc/dc486349d213140f4f7e1734019a0274 b/PatchTestProject/Library/Artifacts/dc/dc486349d213140f4f7e1734019a0274 new file mode 100644 index 0000000..9719777 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dc486349d213140f4f7e1734019a0274 differ diff --git a/PatchTestProject/Library/Artifacts/dc/dc523c3552afef80dbb8776f966cecb7 b/PatchTestProject/Library/Artifacts/dc/dc523c3552afef80dbb8776f966cecb7 new file mode 100644 index 0000000..ae2dfc9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dc523c3552afef80dbb8776f966cecb7 differ diff --git a/PatchTestProject/Library/Artifacts/dc/dc74819cd4f6e1f20e665e778d04db1b b/PatchTestProject/Library/Artifacts/dc/dc74819cd4f6e1f20e665e778d04db1b new file mode 100644 index 0000000..2e87f65 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dc74819cd4f6e1f20e665e778d04db1b differ diff --git a/PatchTestProject/Library/Artifacts/dc/dca854eadc3f0f7b3c74034db35f830a b/PatchTestProject/Library/Artifacts/dc/dca854eadc3f0f7b3c74034db35f830a new file mode 100644 index 0000000..d78d28d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dca854eadc3f0f7b3c74034db35f830a differ diff --git a/PatchTestProject/Library/Artifacts/dc/dcad6ad11d1c2e0dddcd37e494518576 b/PatchTestProject/Library/Artifacts/dc/dcad6ad11d1c2e0dddcd37e494518576 new file mode 100644 index 0000000..3580dfb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dcad6ad11d1c2e0dddcd37e494518576 differ diff --git a/PatchTestProject/Library/Artifacts/dc/dcdd4e0de3dd13e1638c12e4c61d24e7 b/PatchTestProject/Library/Artifacts/dc/dcdd4e0de3dd13e1638c12e4c61d24e7 new file mode 100644 index 0000000..7133991 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dcdd4e0de3dd13e1638c12e4c61d24e7 differ diff --git a/PatchTestProject/Library/Artifacts/dc/dcf68711b8e31ae2753b279dc9a78d20 b/PatchTestProject/Library/Artifacts/dc/dcf68711b8e31ae2753b279dc9a78d20 new file mode 100644 index 0000000..8d4d022 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dcf68711b8e31ae2753b279dc9a78d20 differ diff --git a/PatchTestProject/Library/Artifacts/dc/dcf7f5ac4ab2d578be3376b5740557c9 b/PatchTestProject/Library/Artifacts/dc/dcf7f5ac4ab2d578be3376b5740557c9 new file mode 100644 index 0000000..ce4c3f1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dc/dcf7f5ac4ab2d578be3376b5740557c9 differ diff --git a/PatchTestProject/Library/Artifacts/dd/dd07dcad103cd35b09d7456de0c147a6 b/PatchTestProject/Library/Artifacts/dd/dd07dcad103cd35b09d7456de0c147a6 new file mode 100644 index 0000000..1dbfbc5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dd/dd07dcad103cd35b09d7456de0c147a6 differ diff --git a/PatchTestProject/Library/Artifacts/dd/dd31f665bf0968c446a542aaac4f3f2c b/PatchTestProject/Library/Artifacts/dd/dd31f665bf0968c446a542aaac4f3f2c new file mode 100644 index 0000000..c99e338 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dd/dd31f665bf0968c446a542aaac4f3f2c differ diff --git a/PatchTestProject/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b b/PatchTestProject/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b new file mode 100644 index 0000000..965c0bd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b differ diff --git a/PatchTestProject/Library/Artifacts/dd/dd99a119ad7f2d6ab7e03ec9427a947e b/PatchTestProject/Library/Artifacts/dd/dd99a119ad7f2d6ab7e03ec9427a947e new file mode 100644 index 0000000..6dde977 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dd/dd99a119ad7f2d6ab7e03ec9427a947e differ diff --git a/PatchTestProject/Library/Artifacts/dd/dda16cf4c6188a16ae53aadb43e117e8 b/PatchTestProject/Library/Artifacts/dd/dda16cf4c6188a16ae53aadb43e117e8 new file mode 100644 index 0000000..0f097ac Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dd/dda16cf4c6188a16ae53aadb43e117e8 differ diff --git a/PatchTestProject/Library/Artifacts/dd/ddb168ef8a778cddc16afe636c5b1fc7 b/PatchTestProject/Library/Artifacts/dd/ddb168ef8a778cddc16afe636c5b1fc7 new file mode 100644 index 0000000..d73923b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/dd/ddb168ef8a778cddc16afe636c5b1fc7 differ diff --git a/PatchTestProject/Library/Artifacts/de/de00b5727be59aed30aa4c63b0f8d576 b/PatchTestProject/Library/Artifacts/de/de00b5727be59aed30aa4c63b0f8d576 new file mode 100644 index 0000000..18ef776 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/de/de00b5727be59aed30aa4c63b0f8d576 differ diff --git a/PatchTestProject/Library/Artifacts/de/de0c31a10d25617a75c4909cc220db0d b/PatchTestProject/Library/Artifacts/de/de0c31a10d25617a75c4909cc220db0d new file mode 100644 index 0000000..c776ccc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/de/de0c31a10d25617a75c4909cc220db0d differ diff --git a/PatchTestProject/Library/Artifacts/de/de4e306e2b16675254b1dc8489e526f0 b/PatchTestProject/Library/Artifacts/de/de4e306e2b16675254b1dc8489e526f0 new file mode 100644 index 0000000..aee0715 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/de/de4e306e2b16675254b1dc8489e526f0 differ diff --git a/PatchTestProject/Library/Artifacts/de/de7633db18cafacde760a3162afc5d0c b/PatchTestProject/Library/Artifacts/de/de7633db18cafacde760a3162afc5d0c new file mode 100644 index 0000000..3a558c6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/de/de7633db18cafacde760a3162afc5d0c differ diff --git a/PatchTestProject/Library/Artifacts/de/dec101a4c96f874a7f7582774d72a80a b/PatchTestProject/Library/Artifacts/de/dec101a4c96f874a7f7582774d72a80a new file mode 100644 index 0000000..9784af4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/de/dec101a4c96f874a7f7582774d72a80a differ diff --git a/PatchTestProject/Library/Artifacts/de/dec2bd02d22102d5c4f97d096c8235bf b/PatchTestProject/Library/Artifacts/de/dec2bd02d22102d5c4f97d096c8235bf new file mode 100644 index 0000000..4588476 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/de/dec2bd02d22102d5c4f97d096c8235bf differ diff --git a/PatchTestProject/Library/Artifacts/df/df2631a0b7a8563de647511dc70ee777 b/PatchTestProject/Library/Artifacts/df/df2631a0b7a8563de647511dc70ee777 new file mode 100644 index 0000000..530dc18 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/df2631a0b7a8563de647511dc70ee777 differ diff --git a/PatchTestProject/Library/Artifacts/df/df414a85c4c59736dcbef76d23fa2547 b/PatchTestProject/Library/Artifacts/df/df414a85c4c59736dcbef76d23fa2547 new file mode 100644 index 0000000..d831aec Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/df414a85c4c59736dcbef76d23fa2547 differ diff --git a/PatchTestProject/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 b/PatchTestProject/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 new file mode 100644 index 0000000..2676356 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 differ diff --git a/PatchTestProject/Library/Artifacts/df/df5d1746df0e220a742b5c5844ea5846 b/PatchTestProject/Library/Artifacts/df/df5d1746df0e220a742b5c5844ea5846 new file mode 100644 index 0000000..76d100f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/df5d1746df0e220a742b5c5844ea5846 differ diff --git a/PatchTestProject/Library/Artifacts/df/df83037b1fb0caa483e8111158cd47ca b/PatchTestProject/Library/Artifacts/df/df83037b1fb0caa483e8111158cd47ca new file mode 100644 index 0000000..da3ad68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/df83037b1fb0caa483e8111158cd47ca differ diff --git a/PatchTestProject/Library/Artifacts/df/dfaed58f517faafb1e310e18d5c57ceb b/PatchTestProject/Library/Artifacts/df/dfaed58f517faafb1e310e18d5c57ceb new file mode 100644 index 0000000..47c83b2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/dfaed58f517faafb1e310e18d5c57ceb differ diff --git a/PatchTestProject/Library/Artifacts/df/dfdddcad69bb0471cd971e0e5d42b4c7 b/PatchTestProject/Library/Artifacts/df/dfdddcad69bb0471cd971e0e5d42b4c7 new file mode 100644 index 0000000..022a416 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/dfdddcad69bb0471cd971e0e5d42b4c7 differ diff --git a/PatchTestProject/Library/Artifacts/df/dff189d14f124794a5c3d91ec6619bba b/PatchTestProject/Library/Artifacts/df/dff189d14f124794a5c3d91ec6619bba new file mode 100644 index 0000000..d1417a8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/dff189d14f124794a5c3d91ec6619bba differ diff --git a/PatchTestProject/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 b/PatchTestProject/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 new file mode 100644 index 0000000..6ef61be Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 differ diff --git a/PatchTestProject/Library/Artifacts/df/dffcb8efaa1d7d557a815de376af4316 b/PatchTestProject/Library/Artifacts/df/dffcb8efaa1d7d557a815de376af4316 new file mode 100644 index 0000000..45461ed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/df/dffcb8efaa1d7d557a815de376af4316 differ diff --git a/PatchTestProject/Library/Artifacts/e0/e02c1fb19d0aa40d471704b6549af13a b/PatchTestProject/Library/Artifacts/e0/e02c1fb19d0aa40d471704b6549af13a new file mode 100644 index 0000000..f79e7e9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e0/e02c1fb19d0aa40d471704b6549af13a differ diff --git a/PatchTestProject/Library/Artifacts/e0/e04df47794e788b053a3624ca7404c83 b/PatchTestProject/Library/Artifacts/e0/e04df47794e788b053a3624ca7404c83 new file mode 100644 index 0000000..c4e9f99 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e0/e04df47794e788b053a3624ca7404c83 differ diff --git a/PatchTestProject/Library/Artifacts/e0/e08265d33c26e186e9f004ca8b032e76 b/PatchTestProject/Library/Artifacts/e0/e08265d33c26e186e9f004ca8b032e76 new file mode 100644 index 0000000..2079378 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e0/e08265d33c26e186e9f004ca8b032e76 differ diff --git a/PatchTestProject/Library/Artifacts/e0/e0a6bf0a699a5d7297c718c9c7646204 b/PatchTestProject/Library/Artifacts/e0/e0a6bf0a699a5d7297c718c9c7646204 new file mode 100644 index 0000000..9f7ec6c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e0/e0a6bf0a699a5d7297c718c9c7646204 differ diff --git a/PatchTestProject/Library/Artifacts/e0/e0b6e0c8f11ad0d659477f71d2e93278 b/PatchTestProject/Library/Artifacts/e0/e0b6e0c8f11ad0d659477f71d2e93278 new file mode 100644 index 0000000..74c86a0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e0/e0b6e0c8f11ad0d659477f71d2e93278 differ diff --git a/PatchTestProject/Library/Artifacts/e0/e0d8c20ff6b7ed23e86345bb87608dfd b/PatchTestProject/Library/Artifacts/e0/e0d8c20ff6b7ed23e86345bb87608dfd new file mode 100644 index 0000000..49d8256 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e0/e0d8c20ff6b7ed23e86345bb87608dfd differ diff --git a/PatchTestProject/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f b/PatchTestProject/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f new file mode 100644 index 0000000..5b687ca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f differ diff --git a/PatchTestProject/Library/Artifacts/e1/e1cf2236a327938559f9030840af0f90 b/PatchTestProject/Library/Artifacts/e1/e1cf2236a327938559f9030840af0f90 new file mode 100644 index 0000000..5ff1fb0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e1/e1cf2236a327938559f9030840af0f90 differ diff --git a/PatchTestProject/Library/Artifacts/e1/e1d3a36df73c90f1b26ff40e62fedc74 b/PatchTestProject/Library/Artifacts/e1/e1d3a36df73c90f1b26ff40e62fedc74 new file mode 100644 index 0000000..2881b5a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e1/e1d3a36df73c90f1b26ff40e62fedc74 differ diff --git a/PatchTestProject/Library/Artifacts/e1/e1d777168eccb0d43bb40eff860883c8 b/PatchTestProject/Library/Artifacts/e1/e1d777168eccb0d43bb40eff860883c8 new file mode 100644 index 0000000..a038f25 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e1/e1d777168eccb0d43bb40eff860883c8 differ diff --git a/PatchTestProject/Library/Artifacts/e1/e1f24035c3cbbcc3895a1dc5e9e149a2 b/PatchTestProject/Library/Artifacts/e1/e1f24035c3cbbcc3895a1dc5e9e149a2 new file mode 100644 index 0000000..073207c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e1/e1f24035c3cbbcc3895a1dc5e9e149a2 differ diff --git a/PatchTestProject/Library/Artifacts/e1/e1fb4825e7a615f089803979c93e671a b/PatchTestProject/Library/Artifacts/e1/e1fb4825e7a615f089803979c93e671a new file mode 100644 index 0000000..1faeeae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e1/e1fb4825e7a615f089803979c93e671a differ diff --git a/PatchTestProject/Library/Artifacts/e2/e22b213ef39de12eb250f62d50d25740 b/PatchTestProject/Library/Artifacts/e2/e22b213ef39de12eb250f62d50d25740 new file mode 100644 index 0000000..d1466a6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e22b213ef39de12eb250f62d50d25740 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e22c0ecd7ff92e3599e10ad686967f38 b/PatchTestProject/Library/Artifacts/e2/e22c0ecd7ff92e3599e10ad686967f38 new file mode 100644 index 0000000..10a6dca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e22c0ecd7ff92e3599e10ad686967f38 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e235737f7ecf29e0302e483a9285b379 b/PatchTestProject/Library/Artifacts/e2/e235737f7ecf29e0302e483a9285b379 new file mode 100644 index 0000000..7394b8c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e235737f7ecf29e0302e483a9285b379 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e23ae9b712c2e37fb319a06570bfda81 b/PatchTestProject/Library/Artifacts/e2/e23ae9b712c2e37fb319a06570bfda81 new file mode 100644 index 0000000..e024d48 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e23ae9b712c2e37fb319a06570bfda81 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e2475156680575eee488292036bc24eb b/PatchTestProject/Library/Artifacts/e2/e2475156680575eee488292036bc24eb new file mode 100644 index 0000000..76733e9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e2475156680575eee488292036bc24eb differ diff --git a/PatchTestProject/Library/Artifacts/e2/e25f1b884e5e26c01382d25387a374a8 b/PatchTestProject/Library/Artifacts/e2/e25f1b884e5e26c01382d25387a374a8 new file mode 100644 index 0000000..90666b3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e25f1b884e5e26c01382d25387a374a8 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e272cd850f6fae7b5cd329b3cb9836c2 b/PatchTestProject/Library/Artifacts/e2/e272cd850f6fae7b5cd329b3cb9836c2 new file mode 100644 index 0000000..ceacbc4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e272cd850f6fae7b5cd329b3cb9836c2 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e27650b4ce89e68349bf9be49863e7f9 b/PatchTestProject/Library/Artifacts/e2/e27650b4ce89e68349bf9be49863e7f9 new file mode 100644 index 0000000..034b0b8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e27650b4ce89e68349bf9be49863e7f9 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e27f9f70cb0ed964af1bd548d33a0f91 b/PatchTestProject/Library/Artifacts/e2/e27f9f70cb0ed964af1bd548d33a0f91 new file mode 100644 index 0000000..4fe1f0d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e27f9f70cb0ed964af1bd548d33a0f91 differ diff --git a/PatchTestProject/Library/Artifacts/e2/e2af815bdfe10f7e47d18f5d1285ae76 b/PatchTestProject/Library/Artifacts/e2/e2af815bdfe10f7e47d18f5d1285ae76 new file mode 100644 index 0000000..95dc771 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e2/e2af815bdfe10f7e47d18f5d1285ae76 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e31b6a43498144b042758a21ee03cd26 b/PatchTestProject/Library/Artifacts/e3/e31b6a43498144b042758a21ee03cd26 new file mode 100644 index 0000000..61b7e08 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e31b6a43498144b042758a21ee03cd26 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e32e9fd4c7d3b63ce8639650b691b83f b/PatchTestProject/Library/Artifacts/e3/e32e9fd4c7d3b63ce8639650b691b83f new file mode 100644 index 0000000..fe7c644 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e32e9fd4c7d3b63ce8639650b691b83f differ diff --git a/PatchTestProject/Library/Artifacts/e3/e33c211c1679262dc1584cc4a851e204 b/PatchTestProject/Library/Artifacts/e3/e33c211c1679262dc1584cc4a851e204 new file mode 100644 index 0000000..1734e31 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e33c211c1679262dc1584cc4a851e204 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e355663c0d4cb6a1309d160af825a239 b/PatchTestProject/Library/Artifacts/e3/e355663c0d4cb6a1309d160af825a239 new file mode 100644 index 0000000..1359128 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e355663c0d4cb6a1309d160af825a239 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e374395ee5faf42fbdd256247c0b8968 b/PatchTestProject/Library/Artifacts/e3/e374395ee5faf42fbdd256247c0b8968 new file mode 100644 index 0000000..be4a6ae Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e374395ee5faf42fbdd256247c0b8968 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e378dea69d9cfcac2595f266ba17a301 b/PatchTestProject/Library/Artifacts/e3/e378dea69d9cfcac2595f266ba17a301 new file mode 100644 index 0000000..d3c0d83 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e378dea69d9cfcac2595f266ba17a301 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e39b7d3d5a53fb0c28959544e6ecd93a b/PatchTestProject/Library/Artifacts/e3/e39b7d3d5a53fb0c28959544e6ecd93a new file mode 100644 index 0000000..d063811 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e39b7d3d5a53fb0c28959544e6ecd93a differ diff --git a/PatchTestProject/Library/Artifacts/e3/e3a9faafbc467a54bef33817897ac3a9 b/PatchTestProject/Library/Artifacts/e3/e3a9faafbc467a54bef33817897ac3a9 new file mode 100644 index 0000000..5a6aa68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e3a9faafbc467a54bef33817897ac3a9 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e3c3f67ab2b392eb74bad5dfd64a1cb2 b/PatchTestProject/Library/Artifacts/e3/e3c3f67ab2b392eb74bad5dfd64a1cb2 new file mode 100644 index 0000000..5c10ff2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e3c3f67ab2b392eb74bad5dfd64a1cb2 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e3c72910f1157fdcee5f7307db6591ce b/PatchTestProject/Library/Artifacts/e3/e3c72910f1157fdcee5f7307db6591ce new file mode 100644 index 0000000..50e4ccd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e3c72910f1157fdcee5f7307db6591ce differ diff --git a/PatchTestProject/Library/Artifacts/e3/e3deaaa28477d2d5f727b0ae2df0f030 b/PatchTestProject/Library/Artifacts/e3/e3deaaa28477d2d5f727b0ae2df0f030 new file mode 100644 index 0000000..ec53b36 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e3deaaa28477d2d5f727b0ae2df0f030 differ diff --git a/PatchTestProject/Library/Artifacts/e3/e3fe055c3d4d2236b1e99b01e965e2a9 b/PatchTestProject/Library/Artifacts/e3/e3fe055c3d4d2236b1e99b01e965e2a9 new file mode 100644 index 0000000..4cb427c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e3/e3fe055c3d4d2236b1e99b01e965e2a9 differ diff --git a/PatchTestProject/Library/Artifacts/e4/e468606323567aa79ea6146bb1f781bb b/PatchTestProject/Library/Artifacts/e4/e468606323567aa79ea6146bb1f781bb new file mode 100644 index 0000000..d421e68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e4/e468606323567aa79ea6146bb1f781bb differ diff --git a/PatchTestProject/Library/Artifacts/e4/e4a5ab6209822eb9ffe56be82fbec41f b/PatchTestProject/Library/Artifacts/e4/e4a5ab6209822eb9ffe56be82fbec41f new file mode 100644 index 0000000..144acc1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e4/e4a5ab6209822eb9ffe56be82fbec41f differ diff --git a/PatchTestProject/Library/Artifacts/e4/e4b1807a0bf895a608a1c1095b0338de b/PatchTestProject/Library/Artifacts/e4/e4b1807a0bf895a608a1c1095b0338de new file mode 100644 index 0000000..da8e389 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e4/e4b1807a0bf895a608a1c1095b0338de differ diff --git a/PatchTestProject/Library/Artifacts/e4/e4b800be5cc2c55c61079c5b973cbebf b/PatchTestProject/Library/Artifacts/e4/e4b800be5cc2c55c61079c5b973cbebf new file mode 100644 index 0000000..e60315c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e4/e4b800be5cc2c55c61079c5b973cbebf differ diff --git a/PatchTestProject/Library/Artifacts/e4/e4f3708d1fc7b80935074f561471ae11 b/PatchTestProject/Library/Artifacts/e4/e4f3708d1fc7b80935074f561471ae11 new file mode 100644 index 0000000..e6f0f43 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e4/e4f3708d1fc7b80935074f561471ae11 differ diff --git a/PatchTestProject/Library/Artifacts/e5/e51c43e7a3e4d34b2a1e2113ecbea02a b/PatchTestProject/Library/Artifacts/e5/e51c43e7a3e4d34b2a1e2113ecbea02a new file mode 100644 index 0000000..6f7ecdb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e51c43e7a3e4d34b2a1e2113ecbea02a differ diff --git a/PatchTestProject/Library/Artifacts/e5/e52a4c21cbcf772ab3f3266007de5eb0 b/PatchTestProject/Library/Artifacts/e5/e52a4c21cbcf772ab3f3266007de5eb0 new file mode 100644 index 0000000..6da36f3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e52a4c21cbcf772ab3f3266007de5eb0 differ diff --git a/PatchTestProject/Library/Artifacts/e5/e52ad2762554a5a341fdb578b2b418e0 b/PatchTestProject/Library/Artifacts/e5/e52ad2762554a5a341fdb578b2b418e0 new file mode 100644 index 0000000..5245694 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e52ad2762554a5a341fdb578b2b418e0 differ diff --git a/PatchTestProject/Library/Artifacts/e5/e5691553700de9581fa4cd384fe87a04 b/PatchTestProject/Library/Artifacts/e5/e5691553700de9581fa4cd384fe87a04 new file mode 100644 index 0000000..0388568 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e5691553700de9581fa4cd384fe87a04 differ diff --git a/PatchTestProject/Library/Artifacts/e5/e5b1a7af91e05d9f0368c8f5f9dfcfdb b/PatchTestProject/Library/Artifacts/e5/e5b1a7af91e05d9f0368c8f5f9dfcfdb new file mode 100644 index 0000000..efd4017 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e5b1a7af91e05d9f0368c8f5f9dfcfdb differ diff --git a/PatchTestProject/Library/Artifacts/e5/e5f4a09e4370cfee676eecad2bd2d1a5 b/PatchTestProject/Library/Artifacts/e5/e5f4a09e4370cfee676eecad2bd2d1a5 new file mode 100644 index 0000000..edaa18c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e5f4a09e4370cfee676eecad2bd2d1a5 differ diff --git a/PatchTestProject/Library/Artifacts/e5/e5f889d40d2b99a9a45d946c8e4f5bdc b/PatchTestProject/Library/Artifacts/e5/e5f889d40d2b99a9a45d946c8e4f5bdc new file mode 100644 index 0000000..08ae507 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e5/e5f889d40d2b99a9a45d946c8e4f5bdc differ diff --git a/PatchTestProject/Library/Artifacts/e6/e611e1cea6ad978d204868dae7e63dd1 b/PatchTestProject/Library/Artifacts/e6/e611e1cea6ad978d204868dae7e63dd1 new file mode 100644 index 0000000..c515f82 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e6/e611e1cea6ad978d204868dae7e63dd1 differ diff --git a/PatchTestProject/Library/Artifacts/e6/e61589aed7452a364de5af6f6e90e07a b/PatchTestProject/Library/Artifacts/e6/e61589aed7452a364de5af6f6e90e07a new file mode 100644 index 0000000..1600a38 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e6/e61589aed7452a364de5af6f6e90e07a differ diff --git a/PatchTestProject/Library/Artifacts/e6/e67b10440ff772462ca33f5c364e7135 b/PatchTestProject/Library/Artifacts/e6/e67b10440ff772462ca33f5c364e7135 new file mode 100644 index 0000000..77f8206 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e6/e67b10440ff772462ca33f5c364e7135 differ diff --git a/PatchTestProject/Library/Artifacts/e6/e6ba149ae8450e96512217163a90e6fd b/PatchTestProject/Library/Artifacts/e6/e6ba149ae8450e96512217163a90e6fd new file mode 100644 index 0000000..444e4ce Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e6/e6ba149ae8450e96512217163a90e6fd differ diff --git a/PatchTestProject/Library/Artifacts/e6/e6d5b0b1b9422b05859f0ac44204826f b/PatchTestProject/Library/Artifacts/e6/e6d5b0b1b9422b05859f0ac44204826f new file mode 100644 index 0000000..ba32677 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e6/e6d5b0b1b9422b05859f0ac44204826f differ diff --git a/PatchTestProject/Library/Artifacts/e7/e761846bcf3e71d4ecb1e27b91fec726 b/PatchTestProject/Library/Artifacts/e7/e761846bcf3e71d4ecb1e27b91fec726 new file mode 100644 index 0000000..f7f1bc3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e7/e761846bcf3e71d4ecb1e27b91fec726 differ diff --git a/PatchTestProject/Library/Artifacts/e7/e7739a46ce2fc467a45f20a55f2af59a b/PatchTestProject/Library/Artifacts/e7/e7739a46ce2fc467a45f20a55f2af59a new file mode 100644 index 0000000..79668c7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e7/e7739a46ce2fc467a45f20a55f2af59a differ diff --git a/PatchTestProject/Library/Artifacts/e7/e7ab04cf4b5f27d4111a2fab82e5fda6 b/PatchTestProject/Library/Artifacts/e7/e7ab04cf4b5f27d4111a2fab82e5fda6 new file mode 100644 index 0000000..49d0b4c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e7/e7ab04cf4b5f27d4111a2fab82e5fda6 differ diff --git a/PatchTestProject/Library/Artifacts/e7/e7cf1effb98508d19e470ddfec2ecebe b/PatchTestProject/Library/Artifacts/e7/e7cf1effb98508d19e470ddfec2ecebe new file mode 100644 index 0000000..efd5db8 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e7/e7cf1effb98508d19e470ddfec2ecebe differ diff --git a/PatchTestProject/Library/Artifacts/e7/e7d4510877d9ca398f925d48a5fe70be b/PatchTestProject/Library/Artifacts/e7/e7d4510877d9ca398f925d48a5fe70be new file mode 100644 index 0000000..bffb37d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e7/e7d4510877d9ca398f925d48a5fe70be differ diff --git a/PatchTestProject/Library/Artifacts/e7/e7d648b8a8d2012df9e1fa01fddd6846 b/PatchTestProject/Library/Artifacts/e7/e7d648b8a8d2012df9e1fa01fddd6846 new file mode 100644 index 0000000..d3e2d48 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e7/e7d648b8a8d2012df9e1fa01fddd6846 differ diff --git a/PatchTestProject/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 b/PatchTestProject/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 new file mode 100644 index 0000000..aabd9df Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 differ diff --git a/PatchTestProject/Library/Artifacts/e8/e8ab1e1040d2119e040997c2fccd0732 b/PatchTestProject/Library/Artifacts/e8/e8ab1e1040d2119e040997c2fccd0732 new file mode 100644 index 0000000..19bfcb7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e8/e8ab1e1040d2119e040997c2fccd0732 differ diff --git a/PatchTestProject/Library/Artifacts/e8/e8bdea1c6dd39e2086934786a8ac183b b/PatchTestProject/Library/Artifacts/e8/e8bdea1c6dd39e2086934786a8ac183b new file mode 100644 index 0000000..e1b2075 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e8/e8bdea1c6dd39e2086934786a8ac183b differ diff --git a/PatchTestProject/Library/Artifacts/e8/e8c3d7630f92dda89569ea9f4a2250f7 b/PatchTestProject/Library/Artifacts/e8/e8c3d7630f92dda89569ea9f4a2250f7 new file mode 100644 index 0000000..5df9ceb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e8/e8c3d7630f92dda89569ea9f4a2250f7 differ diff --git a/PatchTestProject/Library/Artifacts/e9/e918f2de5a2a302910173f332dbbd0c5 b/PatchTestProject/Library/Artifacts/e9/e918f2de5a2a302910173f332dbbd0c5 new file mode 100644 index 0000000..4201917 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e9/e918f2de5a2a302910173f332dbbd0c5 differ diff --git a/PatchTestProject/Library/Artifacts/e9/e93c93a7c350bfcc9d7db30d2281c3c4 b/PatchTestProject/Library/Artifacts/e9/e93c93a7c350bfcc9d7db30d2281c3c4 new file mode 100644 index 0000000..9ae2205 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e9/e93c93a7c350bfcc9d7db30d2281c3c4 differ diff --git a/PatchTestProject/Library/Artifacts/e9/e98e77004faa90d787719157f57000da b/PatchTestProject/Library/Artifacts/e9/e98e77004faa90d787719157f57000da new file mode 100644 index 0000000..aea0d79 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/e9/e98e77004faa90d787719157f57000da differ diff --git a/PatchTestProject/Library/Artifacts/ea/ea391ba66a2d5f320d0fece2140d2230 b/PatchTestProject/Library/Artifacts/ea/ea391ba66a2d5f320d0fece2140d2230 new file mode 100644 index 0000000..2f2975f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ea/ea391ba66a2d5f320d0fece2140d2230 differ diff --git a/PatchTestProject/Library/Artifacts/ea/ea3ec26114efe75c7a3275ff9c8365fa b/PatchTestProject/Library/Artifacts/ea/ea3ec26114efe75c7a3275ff9c8365fa new file mode 100644 index 0000000..8f1130f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ea/ea3ec26114efe75c7a3275ff9c8365fa differ diff --git a/PatchTestProject/Library/Artifacts/ea/ea5ce4ed6174d3c014c4eb724d20d631 b/PatchTestProject/Library/Artifacts/ea/ea5ce4ed6174d3c014c4eb724d20d631 new file mode 100644 index 0000000..c83049c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ea/ea5ce4ed6174d3c014c4eb724d20d631 differ diff --git a/PatchTestProject/Library/Artifacts/ea/eaccbdb903991f482407f6c2cdb5992a b/PatchTestProject/Library/Artifacts/ea/eaccbdb903991f482407f6c2cdb5992a new file mode 100644 index 0000000..ec3b924 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ea/eaccbdb903991f482407f6c2cdb5992a differ diff --git a/PatchTestProject/Library/Artifacts/ea/eaf92cbeb559005401b89db19e995ee6 b/PatchTestProject/Library/Artifacts/ea/eaf92cbeb559005401b89db19e995ee6 new file mode 100644 index 0000000..2772087 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ea/eaf92cbeb559005401b89db19e995ee6 differ diff --git a/PatchTestProject/Library/Artifacts/ea/eafc2d3d7468201299ff3e7157ae4f4c b/PatchTestProject/Library/Artifacts/ea/eafc2d3d7468201299ff3e7157ae4f4c new file mode 100644 index 0000000..078ed23 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ea/eafc2d3d7468201299ff3e7157ae4f4c differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb063f1d115f0852d9100c0f50d16159 b/PatchTestProject/Library/Artifacts/eb/eb063f1d115f0852d9100c0f50d16159 new file mode 100644 index 0000000..876832d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb063f1d115f0852d9100c0f50d16159 differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb22064b10e9071984d9a5403a047b81 b/PatchTestProject/Library/Artifacts/eb/eb22064b10e9071984d9a5403a047b81 new file mode 100644 index 0000000..e3a5b44 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb22064b10e9071984d9a5403a047b81 differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb2aa621fb48bbcb6b3736aa8c1f31bd b/PatchTestProject/Library/Artifacts/eb/eb2aa621fb48bbcb6b3736aa8c1f31bd new file mode 100644 index 0000000..929d9a7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb2aa621fb48bbcb6b3736aa8c1f31bd differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb2af5d6b9459c9472f84267d703587a b/PatchTestProject/Library/Artifacts/eb/eb2af5d6b9459c9472f84267d703587a new file mode 100644 index 0000000..9cc8ead Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb2af5d6b9459c9472f84267d703587a differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 b/PatchTestProject/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 new file mode 100644 index 0000000..a93caf9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb48c1f20fa63fb00c77119ba141aacd b/PatchTestProject/Library/Artifacts/eb/eb48c1f20fa63fb00c77119ba141aacd new file mode 100644 index 0000000..be7d966 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb48c1f20fa63fb00c77119ba141aacd differ diff --git a/PatchTestProject/Library/Artifacts/eb/eb9ba21b3b192d9c11f944a9858621fd b/PatchTestProject/Library/Artifacts/eb/eb9ba21b3b192d9c11f944a9858621fd new file mode 100644 index 0000000..02e1bb6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eb9ba21b3b192d9c11f944a9858621fd differ diff --git a/PatchTestProject/Library/Artifacts/eb/eba2af51df48e42e048aa5aeab00361e b/PatchTestProject/Library/Artifacts/eb/eba2af51df48e42e048aa5aeab00361e new file mode 100644 index 0000000..69c89b4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/eba2af51df48e42e048aa5aeab00361e differ diff --git a/PatchTestProject/Library/Artifacts/eb/ebb2e709acd82311bb016db4a6d1ee75 b/PatchTestProject/Library/Artifacts/eb/ebb2e709acd82311bb016db4a6d1ee75 new file mode 100644 index 0000000..5a53579 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/ebb2e709acd82311bb016db4a6d1ee75 differ diff --git a/PatchTestProject/Library/Artifacts/eb/ebc07d4dc40b6420ea8bb6725dc3b02e b/PatchTestProject/Library/Artifacts/eb/ebc07d4dc40b6420ea8bb6725dc3b02e new file mode 100644 index 0000000..570991f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/eb/ebc07d4dc40b6420ea8bb6725dc3b02e differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec2a6cb288ff5ca74c1c056809d34f58 b/PatchTestProject/Library/Artifacts/ec/ec2a6cb288ff5ca74c1c056809d34f58 new file mode 100644 index 0000000..8a4c545 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec2a6cb288ff5ca74c1c056809d34f58 differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec2c7d2c2819af80ccfa34c7305019a7 b/PatchTestProject/Library/Artifacts/ec/ec2c7d2c2819af80ccfa34c7305019a7 new file mode 100644 index 0000000..71675e0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec2c7d2c2819af80ccfa34c7305019a7 differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 b/PatchTestProject/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 new file mode 100644 index 0000000..c95b175 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec5809cb14fed7ee14fdf17caf596c9b b/PatchTestProject/Library/Artifacts/ec/ec5809cb14fed7ee14fdf17caf596c9b new file mode 100644 index 0000000..5d9836a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec5809cb14fed7ee14fdf17caf596c9b differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec6b8fc742764a4df620e4941704ebd9 b/PatchTestProject/Library/Artifacts/ec/ec6b8fc742764a4df620e4941704ebd9 new file mode 100644 index 0000000..028afc6 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec6b8fc742764a4df620e4941704ebd9 differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec7a1f7671d033e2ea89d42da248ef6d b/PatchTestProject/Library/Artifacts/ec/ec7a1f7671d033e2ea89d42da248ef6d new file mode 100644 index 0000000..73a5c9f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec7a1f7671d033e2ea89d42da248ef6d differ diff --git a/PatchTestProject/Library/Artifacts/ec/ec858167a91e6d130f1978dbc43a02d2 b/PatchTestProject/Library/Artifacts/ec/ec858167a91e6d130f1978dbc43a02d2 new file mode 100644 index 0000000..72d179b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ec858167a91e6d130f1978dbc43a02d2 differ diff --git a/PatchTestProject/Library/Artifacts/ec/eca3f9d1114e4e54076d4cd838956961 b/PatchTestProject/Library/Artifacts/ec/eca3f9d1114e4e54076d4cd838956961 new file mode 100644 index 0000000..f6f9970 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/eca3f9d1114e4e54076d4cd838956961 differ diff --git a/PatchTestProject/Library/Artifacts/ec/ecc84051d7fb19d9bc51f22305791904 b/PatchTestProject/Library/Artifacts/ec/ecc84051d7fb19d9bc51f22305791904 new file mode 100644 index 0000000..73eda59 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ecc84051d7fb19d9bc51f22305791904 differ diff --git a/PatchTestProject/Library/Artifacts/ec/ecf35a9a3699239981cbc2e79525f3ab b/PatchTestProject/Library/Artifacts/ec/ecf35a9a3699239981cbc2e79525f3ab new file mode 100644 index 0000000..0aa0661 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ec/ecf35a9a3699239981cbc2e79525f3ab differ diff --git a/PatchTestProject/Library/Artifacts/ed/ed11c9b594b5f0353e1162ce0568d085 b/PatchTestProject/Library/Artifacts/ed/ed11c9b594b5f0353e1162ce0568d085 new file mode 100644 index 0000000..f248732 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ed/ed11c9b594b5f0353e1162ce0568d085 differ diff --git a/PatchTestProject/Library/Artifacts/ed/ed29f74f8fcecd930f82efae7e8db6d4 b/PatchTestProject/Library/Artifacts/ed/ed29f74f8fcecd930f82efae7e8db6d4 new file mode 100644 index 0000000..07b02f1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ed/ed29f74f8fcecd930f82efae7e8db6d4 differ diff --git a/PatchTestProject/Library/Artifacts/ed/ed899df71c8a8c0f5cd41048d2c491bd b/PatchTestProject/Library/Artifacts/ed/ed899df71c8a8c0f5cd41048d2c491bd new file mode 100644 index 0000000..f42cb84 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ed/ed899df71c8a8c0f5cd41048d2c491bd differ diff --git a/PatchTestProject/Library/Artifacts/ed/ed8aea177fac808b141f6e7f1ae57341 b/PatchTestProject/Library/Artifacts/ed/ed8aea177fac808b141f6e7f1ae57341 new file mode 100644 index 0000000..bcec432 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ed/ed8aea177fac808b141f6e7f1ae57341 differ diff --git a/PatchTestProject/Library/Artifacts/ed/edbb1d5fc595a43d715403bacab4aac8 b/PatchTestProject/Library/Artifacts/ed/edbb1d5fc595a43d715403bacab4aac8 new file mode 100644 index 0000000..07e866d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ed/edbb1d5fc595a43d715403bacab4aac8 differ diff --git a/PatchTestProject/Library/Artifacts/ed/edd65dfd69147ea5a740606e7d7fb4cf b/PatchTestProject/Library/Artifacts/ed/edd65dfd69147ea5a740606e7d7fb4cf new file mode 100644 index 0000000..0d46484 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ed/edd65dfd69147ea5a740606e7d7fb4cf differ diff --git a/PatchTestProject/Library/Artifacts/ee/ee0a8e2ecb85b18f1d18f9a691a31a0f b/PatchTestProject/Library/Artifacts/ee/ee0a8e2ecb85b18f1d18f9a691a31a0f new file mode 100644 index 0000000..f3c4596 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ee/ee0a8e2ecb85b18f1d18f9a691a31a0f differ diff --git a/PatchTestProject/Library/Artifacts/ee/ee1c0def0cc436ecf0e208ab2d862037 b/PatchTestProject/Library/Artifacts/ee/ee1c0def0cc436ecf0e208ab2d862037 new file mode 100644 index 0000000..a3ae690 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ee/ee1c0def0cc436ecf0e208ab2d862037 differ diff --git a/PatchTestProject/Library/Artifacts/ee/ee4de7e575ea289eba3e007376d74250 b/PatchTestProject/Library/Artifacts/ee/ee4de7e575ea289eba3e007376d74250 new file mode 100644 index 0000000..47e5a33 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ee/ee4de7e575ea289eba3e007376d74250 differ diff --git a/PatchTestProject/Library/Artifacts/ee/eec6668ebd10e172e6b9d11f95d094c6 b/PatchTestProject/Library/Artifacts/ee/eec6668ebd10e172e6b9d11f95d094c6 new file mode 100644 index 0000000..9e4371f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ee/eec6668ebd10e172e6b9d11f95d094c6 differ diff --git a/PatchTestProject/Library/Artifacts/ef/ef7487c927b6c80901f5ea5d72b1c28c b/PatchTestProject/Library/Artifacts/ef/ef7487c927b6c80901f5ea5d72b1c28c new file mode 100644 index 0000000..900e18c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ef/ef7487c927b6c80901f5ea5d72b1c28c differ diff --git a/PatchTestProject/Library/Artifacts/ef/efb969a645a5b871609e20bb1b9dff34 b/PatchTestProject/Library/Artifacts/ef/efb969a645a5b871609e20bb1b9dff34 new file mode 100644 index 0000000..5aae9b5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ef/efb969a645a5b871609e20bb1b9dff34 differ diff --git a/PatchTestProject/Library/Artifacts/f0/f01102ed3df6164cc0552960d7bc041c b/PatchTestProject/Library/Artifacts/f0/f01102ed3df6164cc0552960d7bc041c new file mode 100644 index 0000000..ded718b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f01102ed3df6164cc0552960d7bc041c differ diff --git a/PatchTestProject/Library/Artifacts/f0/f0388ce27d963c7fabdf4b1d6f12f3e5 b/PatchTestProject/Library/Artifacts/f0/f0388ce27d963c7fabdf4b1d6f12f3e5 new file mode 100644 index 0000000..6230050 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f0388ce27d963c7fabdf4b1d6f12f3e5 differ diff --git a/PatchTestProject/Library/Artifacts/f0/f0604be9d3f07d6e250ed7e32b767f5f b/PatchTestProject/Library/Artifacts/f0/f0604be9d3f07d6e250ed7e32b767f5f new file mode 100644 index 0000000..e02133d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f0604be9d3f07d6e250ed7e32b767f5f differ diff --git a/PatchTestProject/Library/Artifacts/f0/f074e0680e1cc0c0631574857cc000de b/PatchTestProject/Library/Artifacts/f0/f074e0680e1cc0c0631574857cc000de new file mode 100644 index 0000000..3dfb680 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f074e0680e1cc0c0631574857cc000de differ diff --git a/PatchTestProject/Library/Artifacts/f0/f0a64141b713c852715d7c8e13d081b1 b/PatchTestProject/Library/Artifacts/f0/f0a64141b713c852715d7c8e13d081b1 new file mode 100644 index 0000000..171cb29 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f0a64141b713c852715d7c8e13d081b1 differ diff --git a/PatchTestProject/Library/Artifacts/f0/f0a8387d4e320b943436af116045e1ee b/PatchTestProject/Library/Artifacts/f0/f0a8387d4e320b943436af116045e1ee new file mode 100644 index 0000000..978d05a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f0a8387d4e320b943436af116045e1ee differ diff --git a/PatchTestProject/Library/Artifacts/f0/f0b6a1e1ab77e89c765e99bad432a1db b/PatchTestProject/Library/Artifacts/f0/f0b6a1e1ab77e89c765e99bad432a1db new file mode 100644 index 0000000..81312ce Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f0b6a1e1ab77e89c765e99bad432a1db differ diff --git a/PatchTestProject/Library/Artifacts/f0/f0cdda8ff0c0dc69b0396d4e4d2a9f25 b/PatchTestProject/Library/Artifacts/f0/f0cdda8ff0c0dc69b0396d4e4d2a9f25 new file mode 100644 index 0000000..5e44ead Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f0/f0cdda8ff0c0dc69b0396d4e4d2a9f25 differ diff --git a/PatchTestProject/Library/Artifacts/f1/f180bd87264126fe1e150410ab5e395e b/PatchTestProject/Library/Artifacts/f1/f180bd87264126fe1e150410ab5e395e new file mode 100644 index 0000000..f792d2c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f1/f180bd87264126fe1e150410ab5e395e differ diff --git a/PatchTestProject/Library/Artifacts/f1/f184d45efbae07350ea643ae97cc5b16 b/PatchTestProject/Library/Artifacts/f1/f184d45efbae07350ea643ae97cc5b16 new file mode 100644 index 0000000..2894c2e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f1/f184d45efbae07350ea643ae97cc5b16 differ diff --git a/PatchTestProject/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 b/PatchTestProject/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 new file mode 100644 index 0000000..bd13f39 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 differ diff --git a/PatchTestProject/Library/Artifacts/f2/f224611ded98838ef4a39f97f364b332 b/PatchTestProject/Library/Artifacts/f2/f224611ded98838ef4a39f97f364b332 new file mode 100644 index 0000000..5ede653 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f224611ded98838ef4a39f97f364b332 differ diff --git a/PatchTestProject/Library/Artifacts/f2/f2435b0525061199f6f5ecbecd57183c b/PatchTestProject/Library/Artifacts/f2/f2435b0525061199f6f5ecbecd57183c new file mode 100644 index 0000000..3fae127 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f2435b0525061199f6f5ecbecd57183c differ diff --git a/PatchTestProject/Library/Artifacts/f2/f2533ad2a36e4d52397119f528985f8e b/PatchTestProject/Library/Artifacts/f2/f2533ad2a36e4d52397119f528985f8e new file mode 100644 index 0000000..5e5e3f4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f2533ad2a36e4d52397119f528985f8e differ diff --git a/PatchTestProject/Library/Artifacts/f2/f26591a8758446117ba377d8f36eb85a b/PatchTestProject/Library/Artifacts/f2/f26591a8758446117ba377d8f36eb85a new file mode 100644 index 0000000..7f9a1f2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f26591a8758446117ba377d8f36eb85a differ diff --git a/PatchTestProject/Library/Artifacts/f2/f2784a41b0f1127ea216f2ea1bbea830 b/PatchTestProject/Library/Artifacts/f2/f2784a41b0f1127ea216f2ea1bbea830 new file mode 100644 index 0000000..1670d7b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f2784a41b0f1127ea216f2ea1bbea830 differ diff --git a/PatchTestProject/Library/Artifacts/f2/f283c95a1159d16512c129021dcd7507 b/PatchTestProject/Library/Artifacts/f2/f283c95a1159d16512c129021dcd7507 new file mode 100644 index 0000000..d73f7ea Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f283c95a1159d16512c129021dcd7507 differ diff --git a/PatchTestProject/Library/Artifacts/f2/f29a4b1321ef91a7be3c7cda107e3503 b/PatchTestProject/Library/Artifacts/f2/f29a4b1321ef91a7be3c7cda107e3503 new file mode 100644 index 0000000..495cd30 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f2/f29a4b1321ef91a7be3c7cda107e3503 differ diff --git a/PatchTestProject/Library/Artifacts/f3/f35afb732ac5c6534f55222f6e65b117 b/PatchTestProject/Library/Artifacts/f3/f35afb732ac5c6534f55222f6e65b117 new file mode 100644 index 0000000..2aaa46f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f3/f35afb732ac5c6534f55222f6e65b117 differ diff --git a/PatchTestProject/Library/Artifacts/f3/f3693c58ee887d7be510d67d852cabc2 b/PatchTestProject/Library/Artifacts/f3/f3693c58ee887d7be510d67d852cabc2 new file mode 100644 index 0000000..d684713 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f3/f3693c58ee887d7be510d67d852cabc2 differ diff --git a/PatchTestProject/Library/Artifacts/f3/f3845a7c7f3eb1a5bb81d291dda91f57 b/PatchTestProject/Library/Artifacts/f3/f3845a7c7f3eb1a5bb81d291dda91f57 new file mode 100644 index 0000000..0f56a64 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f3/f3845a7c7f3eb1a5bb81d291dda91f57 differ diff --git a/PatchTestProject/Library/Artifacts/f3/f388031385551623d93fcc128ae68aa8 b/PatchTestProject/Library/Artifacts/f3/f388031385551623d93fcc128ae68aa8 new file mode 100644 index 0000000..e6f25bb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f3/f388031385551623d93fcc128ae68aa8 differ diff --git a/PatchTestProject/Library/Artifacts/f3/f3a318b39b678c1009d7a8054436f2b9 b/PatchTestProject/Library/Artifacts/f3/f3a318b39b678c1009d7a8054436f2b9 new file mode 100644 index 0000000..76e9f3f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f3/f3a318b39b678c1009d7a8054436f2b9 differ diff --git a/PatchTestProject/Library/Artifacts/f3/f3bb549d4434e68370c8131991b25a6f b/PatchTestProject/Library/Artifacts/f3/f3bb549d4434e68370c8131991b25a6f new file mode 100644 index 0000000..ec6baca Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f3/f3bb549d4434e68370c8131991b25a6f differ diff --git a/PatchTestProject/Library/Artifacts/f4/f416e260f88ec302014abda5810213c9 b/PatchTestProject/Library/Artifacts/f4/f416e260f88ec302014abda5810213c9 new file mode 100644 index 0000000..92166c5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f4/f416e260f88ec302014abda5810213c9 differ diff --git a/PatchTestProject/Library/Artifacts/f4/f42ac44d2627a45c174b38f48e910c59 b/PatchTestProject/Library/Artifacts/f4/f42ac44d2627a45c174b38f48e910c59 new file mode 100644 index 0000000..647d1ef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f4/f42ac44d2627a45c174b38f48e910c59 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f51205e83167b0db3a9e3c57e41fb5e3 b/PatchTestProject/Library/Artifacts/f5/f51205e83167b0db3a9e3c57e41fb5e3 new file mode 100644 index 0000000..c23c6c2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f51205e83167b0db3a9e3c57e41fb5e3 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f5188872806bf8d5fdb0e6fa681ae6d7 b/PatchTestProject/Library/Artifacts/f5/f5188872806bf8d5fdb0e6fa681ae6d7 new file mode 100644 index 0000000..36812d5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f5188872806bf8d5fdb0e6fa681ae6d7 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f53624e7ac68c0f88d0b892b3b427b59 b/PatchTestProject/Library/Artifacts/f5/f53624e7ac68c0f88d0b892b3b427b59 new file mode 100644 index 0000000..00ce2eb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f53624e7ac68c0f88d0b892b3b427b59 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 b/PatchTestProject/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 new file mode 100644 index 0000000..b49e708 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f580449852f3adec1d279c6c10325c11 b/PatchTestProject/Library/Artifacts/f5/f580449852f3adec1d279c6c10325c11 new file mode 100644 index 0000000..fe6e5c7 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f580449852f3adec1d279c6c10325c11 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f590ca7def9b28b4310e77be09bb1f0a b/PatchTestProject/Library/Artifacts/f5/f590ca7def9b28b4310e77be09bb1f0a new file mode 100644 index 0000000..d9f6aed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f590ca7def9b28b4310e77be09bb1f0a differ diff --git a/PatchTestProject/Library/Artifacts/f5/f59d2be58f6988994a0e5c08ef4abf54 b/PatchTestProject/Library/Artifacts/f5/f59d2be58f6988994a0e5c08ef4abf54 new file mode 100644 index 0000000..58712ea Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f59d2be58f6988994a0e5c08ef4abf54 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f5c145d06454cab2bcc469c2c4e28e84 b/PatchTestProject/Library/Artifacts/f5/f5c145d06454cab2bcc469c2c4e28e84 new file mode 100644 index 0000000..b6bc9f4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f5c145d06454cab2bcc469c2c4e28e84 differ diff --git a/PatchTestProject/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe b/PatchTestProject/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe new file mode 100644 index 0000000..3b1c9ef Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe differ diff --git a/PatchTestProject/Library/Artifacts/f5/f5dd357c0435878b82ade7bc43130f01 b/PatchTestProject/Library/Artifacts/f5/f5dd357c0435878b82ade7bc43130f01 new file mode 100644 index 0000000..6bbbbc4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f5/f5dd357c0435878b82ade7bc43130f01 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f600b920df2c6fdf53adab1d610d4129 b/PatchTestProject/Library/Artifacts/f6/f600b920df2c6fdf53adab1d610d4129 new file mode 100644 index 0000000..d1e6463 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f600b920df2c6fdf53adab1d610d4129 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f623295532878b09e41d1c9724c1b689 b/PatchTestProject/Library/Artifacts/f6/f623295532878b09e41d1c9724c1b689 new file mode 100644 index 0000000..4ba770d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f623295532878b09e41d1c9724c1b689 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f6463c78736656597211e7d84f57b2c9 b/PatchTestProject/Library/Artifacts/f6/f6463c78736656597211e7d84f57b2c9 new file mode 100644 index 0000000..59c5844 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f6463c78736656597211e7d84f57b2c9 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f672599e3c9e7a3121aa74a3b90af1cc b/PatchTestProject/Library/Artifacts/f6/f672599e3c9e7a3121aa74a3b90af1cc new file mode 100644 index 0000000..898515e Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f672599e3c9e7a3121aa74a3b90af1cc differ diff --git a/PatchTestProject/Library/Artifacts/f6/f67c91836af4c282e9984a0cd73d2f18 b/PatchTestProject/Library/Artifacts/f6/f67c91836af4c282e9984a0cd73d2f18 new file mode 100644 index 0000000..e66ebe9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f67c91836af4c282e9984a0cd73d2f18 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f683eb1de8c86e49489a9c1f27928b90 b/PatchTestProject/Library/Artifacts/f6/f683eb1de8c86e49489a9c1f27928b90 new file mode 100644 index 0000000..73946a2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f683eb1de8c86e49489a9c1f27928b90 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f68a632969530ef665630f2523a5787b b/PatchTestProject/Library/Artifacts/f6/f68a632969530ef665630f2523a5787b new file mode 100644 index 0000000..c2fc768 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f68a632969530ef665630f2523a5787b differ diff --git a/PatchTestProject/Library/Artifacts/f6/f698af53966709609e47bbff87b77e22 b/PatchTestProject/Library/Artifacts/f6/f698af53966709609e47bbff87b77e22 new file mode 100644 index 0000000..428f726 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f698af53966709609e47bbff87b77e22 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f6b3c3238d97b847233f0978e645f424 b/PatchTestProject/Library/Artifacts/f6/f6b3c3238d97b847233f0978e645f424 new file mode 100644 index 0000000..7692bf9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f6b3c3238d97b847233f0978e645f424 differ diff --git a/PatchTestProject/Library/Artifacts/f6/f6e1319629914911cff769ed4f4acca8 b/PatchTestProject/Library/Artifacts/f6/f6e1319629914911cff769ed4f4acca8 new file mode 100644 index 0000000..6546a6a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f6/f6e1319629914911cff769ed4f4acca8 differ diff --git a/PatchTestProject/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 b/PatchTestProject/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 new file mode 100644 index 0000000..4e07cce Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 differ diff --git a/PatchTestProject/Library/Artifacts/f7/f736d62d21eb18ee9f3ed2886064bf52 b/PatchTestProject/Library/Artifacts/f7/f736d62d21eb18ee9f3ed2886064bf52 new file mode 100644 index 0000000..d035f90 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f7/f736d62d21eb18ee9f3ed2886064bf52 differ diff --git a/PatchTestProject/Library/Artifacts/f7/f7a33d26d2923b2bda80c64fec104052 b/PatchTestProject/Library/Artifacts/f7/f7a33d26d2923b2bda80c64fec104052 new file mode 100644 index 0000000..248746f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f7/f7a33d26d2923b2bda80c64fec104052 differ diff --git a/PatchTestProject/Library/Artifacts/f7/f7c25cae3405c94345691f78a796b95b b/PatchTestProject/Library/Artifacts/f7/f7c25cae3405c94345691f78a796b95b new file mode 100644 index 0000000..ce75691 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f7/f7c25cae3405c94345691f78a796b95b differ diff --git a/PatchTestProject/Library/Artifacts/f8/f80fe07d57f993e988ecd496ebe384ea b/PatchTestProject/Library/Artifacts/f8/f80fe07d57f993e988ecd496ebe384ea new file mode 100644 index 0000000..2586406 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f8/f80fe07d57f993e988ecd496ebe384ea differ diff --git a/PatchTestProject/Library/Artifacts/f8/f859b8afa8cebbdbbe4223694adcd3d0 b/PatchTestProject/Library/Artifacts/f8/f859b8afa8cebbdbbe4223694adcd3d0 new file mode 100644 index 0000000..5bef025 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f8/f859b8afa8cebbdbbe4223694adcd3d0 differ diff --git a/PatchTestProject/Library/Artifacts/f8/f88969c08b62cb8f95c3dfcf064541a1 b/PatchTestProject/Library/Artifacts/f8/f88969c08b62cb8f95c3dfcf064541a1 new file mode 100644 index 0000000..c55598f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f8/f88969c08b62cb8f95c3dfcf064541a1 differ diff --git a/PatchTestProject/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 b/PatchTestProject/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 new file mode 100644 index 0000000..d6c09bb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 b/PatchTestProject/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 new file mode 100644 index 0000000..0b0c07a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 b/PatchTestProject/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 new file mode 100644 index 0000000..b5c6836 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f94bd43389368033ad8a36900be0c1e9 b/PatchTestProject/Library/Artifacts/f9/f94bd43389368033ad8a36900be0c1e9 new file mode 100644 index 0000000..4954e9f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f94bd43389368033ad8a36900be0c1e9 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f951df6fffd3102a38c491218e746f4f b/PatchTestProject/Library/Artifacts/f9/f951df6fffd3102a38c491218e746f4f new file mode 100644 index 0000000..33a33a9 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f951df6fffd3102a38c491218e746f4f differ diff --git a/PatchTestProject/Library/Artifacts/f9/f99404a6d719f76eb8fe970438c417c1 b/PatchTestProject/Library/Artifacts/f9/f99404a6d719f76eb8fe970438c417c1 new file mode 100644 index 0000000..5fae782 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f99404a6d719f76eb8fe970438c417c1 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f99baaa51e0e8e839068adf2223a8bbd b/PatchTestProject/Library/Artifacts/f9/f99baaa51e0e8e839068adf2223a8bbd new file mode 100644 index 0000000..c74ebcb Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f99baaa51e0e8e839068adf2223a8bbd differ diff --git a/PatchTestProject/Library/Artifacts/f9/f99cdfc941a3e185b5715899df979863 b/PatchTestProject/Library/Artifacts/f9/f99cdfc941a3e185b5715899df979863 new file mode 100644 index 0000000..0f83b3a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f99cdfc941a3e185b5715899df979863 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f9ad7de3b715e7cf4419f8626e8f219d b/PatchTestProject/Library/Artifacts/f9/f9ad7de3b715e7cf4419f8626e8f219d new file mode 100644 index 0000000..a141508 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f9ad7de3b715e7cf4419f8626e8f219d differ diff --git a/PatchTestProject/Library/Artifacts/f9/f9ae56757ad92d13847e8378de316a87 b/PatchTestProject/Library/Artifacts/f9/f9ae56757ad92d13847e8378de316a87 new file mode 100644 index 0000000..3d139b2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f9ae56757ad92d13847e8378de316a87 differ diff --git a/PatchTestProject/Library/Artifacts/f9/f9c76f9f93310e1d9fb09295c743667b b/PatchTestProject/Library/Artifacts/f9/f9c76f9f93310e1d9fb09295c743667b new file mode 100644 index 0000000..eb8eed1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f9c76f9f93310e1d9fb09295c743667b differ diff --git a/PatchTestProject/Library/Artifacts/f9/f9d16bb758521a4f828784964e40b40d b/PatchTestProject/Library/Artifacts/f9/f9d16bb758521a4f828784964e40b40d new file mode 100644 index 0000000..ae4d8b0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f9d16bb758521a4f828784964e40b40d differ diff --git a/PatchTestProject/Library/Artifacts/f9/f9d6405211c5c10006fa6ef02463290e b/PatchTestProject/Library/Artifacts/f9/f9d6405211c5c10006fa6ef02463290e new file mode 100644 index 0000000..4359796 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/f9/f9d6405211c5c10006fa6ef02463290e differ diff --git a/PatchTestProject/Library/Artifacts/fa/fa033037c9de1af64f7e9b059942d81d b/PatchTestProject/Library/Artifacts/fa/fa033037c9de1af64f7e9b059942d81d new file mode 100644 index 0000000..b694708 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fa/fa033037c9de1af64f7e9b059942d81d differ diff --git a/PatchTestProject/Library/Artifacts/fa/fa36ccb45ac9b545396f4f127e97f0bd b/PatchTestProject/Library/Artifacts/fa/fa36ccb45ac9b545396f4f127e97f0bd new file mode 100644 index 0000000..ee9a1ed Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fa/fa36ccb45ac9b545396f4f127e97f0bd differ diff --git a/PatchTestProject/Library/Artifacts/fa/fa92579ad9f64902d6581d5a66fe2780 b/PatchTestProject/Library/Artifacts/fa/fa92579ad9f64902d6581d5a66fe2780 new file mode 100644 index 0000000..857736c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fa/fa92579ad9f64902d6581d5a66fe2780 differ diff --git a/PatchTestProject/Library/Artifacts/fa/faa8d73501ec86a2dd9eb0d227245ac8 b/PatchTestProject/Library/Artifacts/fa/faa8d73501ec86a2dd9eb0d227245ac8 new file mode 100644 index 0000000..6139cb4 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fa/faa8d73501ec86a2dd9eb0d227245ac8 differ diff --git a/PatchTestProject/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 b/PatchTestProject/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 new file mode 100644 index 0000000..f9dff94 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 differ diff --git a/PatchTestProject/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 b/PatchTestProject/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 new file mode 100644 index 0000000..b4ef869 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fb2838bff80d0f41062715b79345d146 b/PatchTestProject/Library/Artifacts/fb/fb2838bff80d0f41062715b79345d146 new file mode 100644 index 0000000..36bef52 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fb2838bff80d0f41062715b79345d146 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fb44e921982f1567b1c022c070335373 b/PatchTestProject/Library/Artifacts/fb/fb44e921982f1567b1c022c070335373 new file mode 100644 index 0000000..b4f07a5 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fb44e921982f1567b1c022c070335373 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fb4ce0646a7bfea66089b6828e277cf5 b/PatchTestProject/Library/Artifacts/fb/fb4ce0646a7bfea66089b6828e277cf5 new file mode 100644 index 0000000..bb56059 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fb4ce0646a7bfea66089b6828e277cf5 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fb561ef17d7735df2f41b392dcf3e9c0 b/PatchTestProject/Library/Artifacts/fb/fb561ef17d7735df2f41b392dcf3e9c0 new file mode 100644 index 0000000..84b0a00 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fb561ef17d7735df2f41b392dcf3e9c0 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fbc184da24f2659e468832f4f1fdc28f b/PatchTestProject/Library/Artifacts/fb/fbc184da24f2659e468832f4f1fdc28f new file mode 100644 index 0000000..bf0e5ea Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fbc184da24f2659e468832f4f1fdc28f differ diff --git a/PatchTestProject/Library/Artifacts/fb/fbd67bc10503b2f48b7a033ea7e1ec5e b/PatchTestProject/Library/Artifacts/fb/fbd67bc10503b2f48b7a033ea7e1ec5e new file mode 100644 index 0000000..1912a63 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fbd67bc10503b2f48b7a033ea7e1ec5e differ diff --git a/PatchTestProject/Library/Artifacts/fb/fbe81f6f48698f78141fe8b23ce10743 b/PatchTestProject/Library/Artifacts/fb/fbe81f6f48698f78141fe8b23ce10743 new file mode 100644 index 0000000..4fb05cc Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fbe81f6f48698f78141fe8b23ce10743 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fbe8cd83cad33e4880596ea049772043 b/PatchTestProject/Library/Artifacts/fb/fbe8cd83cad33e4880596ea049772043 new file mode 100644 index 0000000..893e66a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fbe8cd83cad33e4880596ea049772043 differ diff --git a/PatchTestProject/Library/Artifacts/fb/fbed94b0b3652472d5204a7dca01b43d b/PatchTestProject/Library/Artifacts/fb/fbed94b0b3652472d5204a7dca01b43d new file mode 100644 index 0000000..818eaf1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fbed94b0b3652472d5204a7dca01b43d differ diff --git a/PatchTestProject/Library/Artifacts/fb/fbfffdef6392b64ec781e6a62a5cef8f b/PatchTestProject/Library/Artifacts/fb/fbfffdef6392b64ec781e6a62a5cef8f new file mode 100644 index 0000000..fac4cfd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fb/fbfffdef6392b64ec781e6a62a5cef8f differ diff --git a/PatchTestProject/Library/Artifacts/fc/fc07b1d8ed2c5aa6be8e47a578f04026 b/PatchTestProject/Library/Artifacts/fc/fc07b1d8ed2c5aa6be8e47a578f04026 new file mode 100644 index 0000000..8c91b2d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fc07b1d8ed2c5aa6be8e47a578f04026 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fc3c34ddcb50a18c6a41d6c4ceb884b0 b/PatchTestProject/Library/Artifacts/fc/fc3c34ddcb50a18c6a41d6c4ceb884b0 new file mode 100644 index 0000000..133b39d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fc3c34ddcb50a18c6a41d6c4ceb884b0 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fc3d7ec70184cacdb046afc1ad69cbf9 b/PatchTestProject/Library/Artifacts/fc/fc3d7ec70184cacdb046afc1ad69cbf9 new file mode 100644 index 0000000..9f951ba Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fc3d7ec70184cacdb046afc1ad69cbf9 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fc4c3df5e1d670a83b82538764957b1d b/PatchTestProject/Library/Artifacts/fc/fc4c3df5e1d670a83b82538764957b1d new file mode 100644 index 0000000..c47355c Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fc4c3df5e1d670a83b82538764957b1d differ diff --git a/PatchTestProject/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 b/PatchTestProject/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 new file mode 100644 index 0000000..966aac2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fcaa291835c297fc5b6f5bc9825b6ca8 b/PatchTestProject/Library/Artifacts/fc/fcaa291835c297fc5b6f5bc9825b6ca8 new file mode 100644 index 0000000..ac33780 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fcaa291835c297fc5b6f5bc9825b6ca8 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fcd626231e901ea0e65e563119f85945 b/PatchTestProject/Library/Artifacts/fc/fcd626231e901ea0e65e563119f85945 new file mode 100644 index 0000000..b996c51 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fcd626231e901ea0e65e563119f85945 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 b/PatchTestProject/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 new file mode 100644 index 0000000..5da373d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fcf15302129a43c0841adc304b7a93d6 b/PatchTestProject/Library/Artifacts/fc/fcf15302129a43c0841adc304b7a93d6 new file mode 100644 index 0000000..bc57be0 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fcf15302129a43c0841adc304b7a93d6 differ diff --git a/PatchTestProject/Library/Artifacts/fc/fcf30ee31abbf92d6122cfb64ae9d5b6 b/PatchTestProject/Library/Artifacts/fc/fcf30ee31abbf92d6122cfb64ae9d5b6 new file mode 100644 index 0000000..b48131a Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fc/fcf30ee31abbf92d6122cfb64ae9d5b6 differ diff --git a/PatchTestProject/Library/Artifacts/fd/fd05b733267ddfa961a285e63cbd3d2f b/PatchTestProject/Library/Artifacts/fd/fd05b733267ddfa961a285e63cbd3d2f new file mode 100644 index 0000000..64b0a28 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fd/fd05b733267ddfa961a285e63cbd3d2f differ diff --git a/PatchTestProject/Library/Artifacts/fd/fd05fdcb3925d567e2d687b82d5f5477 b/PatchTestProject/Library/Artifacts/fd/fd05fdcb3925d567e2d687b82d5f5477 new file mode 100644 index 0000000..1577d10 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fd/fd05fdcb3925d567e2d687b82d5f5477 differ diff --git a/PatchTestProject/Library/Artifacts/fd/fd19f9df158e65bbd9f7221dd0c5e4e4 b/PatchTestProject/Library/Artifacts/fd/fd19f9df158e65bbd9f7221dd0c5e4e4 new file mode 100644 index 0000000..ecad9be Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fd/fd19f9df158e65bbd9f7221dd0c5e4e4 differ diff --git a/PatchTestProject/Library/Artifacts/fd/fde5cfc2979d551fe0100daf08349edc b/PatchTestProject/Library/Artifacts/fd/fde5cfc2979d551fe0100daf08349edc new file mode 100644 index 0000000..4ffa36f Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fd/fde5cfc2979d551fe0100daf08349edc differ diff --git a/PatchTestProject/Library/Artifacts/fe/fe5bbd39c06e461af57a231de0870ec7 b/PatchTestProject/Library/Artifacts/fe/fe5bbd39c06e461af57a231de0870ec7 new file mode 100644 index 0000000..b6cc15b Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fe/fe5bbd39c06e461af57a231de0870ec7 differ diff --git a/PatchTestProject/Library/Artifacts/fe/fe961b6e5f0698ae09f3d38f03d4ac63 b/PatchTestProject/Library/Artifacts/fe/fe961b6e5f0698ae09f3d38f03d4ac63 new file mode 100644 index 0000000..f7d1b49 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fe/fe961b6e5f0698ae09f3d38f03d4ac63 differ diff --git a/PatchTestProject/Library/Artifacts/fe/fec4aaf97ffdb47f1f051814fc7cb573 b/PatchTestProject/Library/Artifacts/fe/fec4aaf97ffdb47f1f051814fc7cb573 new file mode 100644 index 0000000..4944de2 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fe/fec4aaf97ffdb47f1f051814fc7cb573 differ diff --git a/PatchTestProject/Library/Artifacts/fe/fee01df06c224b7d7c92c71ecdb859f9 b/PatchTestProject/Library/Artifacts/fe/fee01df06c224b7d7c92c71ecdb859f9 new file mode 100644 index 0000000..9d18621 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fe/fee01df06c224b7d7c92c71ecdb859f9 differ diff --git a/PatchTestProject/Library/Artifacts/fe/fef80128f4ec5d3c3a020a243f0930c7 b/PatchTestProject/Library/Artifacts/fe/fef80128f4ec5d3c3a020a243f0930c7 new file mode 100644 index 0000000..151aedd Binary files /dev/null and b/PatchTestProject/Library/Artifacts/fe/fef80128f4ec5d3c3a020a243f0930c7 differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff0c50936b2f138cab15b2dbd75fcd68 b/PatchTestProject/Library/Artifacts/ff/ff0c50936b2f138cab15b2dbd75fcd68 new file mode 100644 index 0000000..397ef76 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff0c50936b2f138cab15b2dbd75fcd68 differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff1bb4ff85030b96c61e8ff2aa514789 b/PatchTestProject/Library/Artifacts/ff/ff1bb4ff85030b96c61e8ff2aa514789 new file mode 100644 index 0000000..d51c035 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff1bb4ff85030b96c61e8ff2aa514789 differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff43dcb8cbebff6b7354b31735621892 b/PatchTestProject/Library/Artifacts/ff/ff43dcb8cbebff6b7354b31735621892 new file mode 100644 index 0000000..6f70fb3 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff43dcb8cbebff6b7354b31735621892 differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 b/PatchTestProject/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 new file mode 100644 index 0000000..5e3c113 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff5c5c90870af0259978f60967211f4a b/PatchTestProject/Library/Artifacts/ff/ff5c5c90870af0259978f60967211f4a new file mode 100644 index 0000000..b5f6d68 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff5c5c90870af0259978f60967211f4a differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff74b3bbee24375dcb42425ac882cf1f b/PatchTestProject/Library/Artifacts/ff/ff74b3bbee24375dcb42425ac882cf1f new file mode 100644 index 0000000..c1f3d3d Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff74b3bbee24375dcb42425ac882cf1f differ diff --git a/PatchTestProject/Library/Artifacts/ff/ff81949fcebe86e700544c8fafce117f b/PatchTestProject/Library/Artifacts/ff/ff81949fcebe86e700544c8fafce117f new file mode 100644 index 0000000..e148ebe Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ff81949fcebe86e700544c8fafce117f differ diff --git a/PatchTestProject/Library/Artifacts/ff/ffb73aa1c6421ead525a8640f3dec6ce b/PatchTestProject/Library/Artifacts/ff/ffb73aa1c6421ead525a8640f3dec6ce new file mode 100644 index 0000000..4dffc84 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ffb73aa1c6421ead525a8640f3dec6ce differ diff --git a/PatchTestProject/Library/Artifacts/ff/ffd2d61d95ff219563cbddc717f6af3e b/PatchTestProject/Library/Artifacts/ff/ffd2d61d95ff219563cbddc717f6af3e new file mode 100644 index 0000000..6d5c4c1 Binary files /dev/null and b/PatchTestProject/Library/Artifacts/ff/ffd2d61d95ff219563cbddc717f6af3e differ diff --git a/PatchTestProject/Library/AssetImportState b/PatchTestProject/Library/AssetImportState new file mode 100644 index 0000000..21c67d7 --- /dev/null +++ b/PatchTestProject/Library/AssetImportState @@ -0,0 +1 @@ +-2;0;0;0;-1 \ No newline at end of file diff --git a/PatchTestProject/Library/BuildPlayer.prefs b/PatchTestProject/Library/BuildPlayer.prefs new file mode 100644 index 0000000..e69de29 diff --git a/PatchTestProject/Library/BuildSettings.asset b/PatchTestProject/Library/BuildSettings.asset new file mode 100644 index 0000000..faf7d7b Binary files /dev/null and b/PatchTestProject/Library/BuildSettings.asset differ diff --git a/PatchTestProject/Library/CurrentLayout-default.dwlt b/PatchTestProject/Library/CurrentLayout-default.dwlt new file mode 100644 index 0000000..4ec6d0c --- /dev/null +++ b/PatchTestProject/Library/CurrentLayout-default.dwlt @@ -0,0 +1,875 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PixelRect: + serializedVersion: 2 + x: 433 + y: 332 + width: 1092 + height: 654 + m_ShowMode: 4 + m_Title: + m_RootView: {fileID: 3} + m_MinSize: {x: 875, y: 1142} + m_MaxSize: {x: 10000, y: 10000} + m_Maximized: 0 +--- !u!114 &2 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 321 + height: 567 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} + vertical: 0 + controlID: 3022 +--- !u!114 &3 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 4} + - {fileID: 6} + - {fileID: 5} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1092 + height: 654 + m_MinSize: {x: 875, y: 1142} + m_MaxSize: {x: 10000, y: 10000} +--- !u!114 &4 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1092 + height: 30 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} + m_LastLoadedLayoutName: +--- !u!114 &5 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 634 + width: 1092 + height: 20 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} +--- !u!114 &6 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 7} + - {fileID: 10} + - {fileID: 13} + m_Position: + serializedVersion: 2 + x: 0 + y: 30 + width: 1092 + height: 604 + m_MinSize: {x: 709, y: 471} + m_MaxSize: {x: 18004, y: 14021} + vertical: 0 + controlID: 34 +--- !u!114 &7 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 8} + - {fileID: 9} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 404 + height: 604 + m_MinSize: {x: 201, y: 342} + m_MaxSize: {x: 4001, y: 8042} + vertical: 1 + controlID: 35 +--- !u!114 &8 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: SceneView + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 404 + height: 259 + m_MinSize: {x: 201, y: 221} + m_MaxSize: {x: 4001, y: 4021} + m_ActualView: {fileID: 16} + m_Panes: + - {fileID: 16} + - {fileID: 17} + m_Selected: 0 + m_LastSelected: 1 +--- !u!114 &9 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: GameView + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 259 + width: 404 + height: 345 + m_MinSize: {x: 101, y: 121} + m_MaxSize: {x: 4001, y: 4021} + m_ActualView: {fileID: 15} + m_Panes: + - {fileID: 15} + m_Selected: 0 + m_LastSelected: 0 +--- !u!114 &10 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 11} + - {fileID: 12} + m_Position: + serializedVersion: 2 + x: 404 + y: 0 + width: 232 + height: 604 + m_MinSize: {x: 232, y: 471} + m_MaxSize: {x: 10002, y: 14021} + vertical: 1 + controlID: 100 +--- !u!114 &11 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 232 + height: 213 + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 18} + m_Panes: + - {fileID: 18} + m_Selected: 0 + m_LastSelected: 0 +--- !u!114 &12 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: ProjectBrowser + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 213 + width: 232 + height: 391 + m_MinSize: {x: 232, y: 271} + m_MaxSize: {x: 10002, y: 10021} + m_ActualView: {fileID: 19} + m_Panes: + - {fileID: 19} + - {fileID: 20} + m_Selected: 0 + m_LastSelected: 1 +--- !u!114 &13 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: InspectorWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 636 + y: 0 + width: 456 + height: 604 + m_MinSize: {x: 276, y: 71} + m_MaxSize: {x: 4001, y: 4021} + m_ActualView: {fileID: 21} + m_Panes: + - {fileID: 21} + - {fileID: 14} + m_Selected: 0 + m_LastSelected: 1 +--- !u!114 &14 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e771fd2426d482543b337a811bb8d16d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 800, y: 600} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: PATCH - Admin Tool + m_Image: {fileID: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 1119 + y: 73 + width: 800 + height: 926 + m_ViewDataDictionary: {fileID: 0} +--- !u!114 &15 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Game + m_Image: {fileID: -6423792434712278376, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 433 + y: 579 + width: 403 + height: 324 + m_ViewDataDictionary: {fileID: 0} + m_SerializedViewNames: [] + m_SerializedViewValues: [] + m_SerializedCustomFieldsNames: [] + m_SerializedCustomFieldsValues: [] + m_PlayModeViewName: GameView + m_ShowGizmos: 0 + m_TargetDisplay: 0 + m_ClearColor: {r: 0, g: 0, b: 0, a: 0} + m_TargetSize: {x: 403, y: 303} + m_TextureFilterMode: 0 + m_TextureHideFlags: 61 + m_RenderIMGUI: 1 + m_MaximizeOnPlay: 0 + m_UseMipMap: 0 + m_VSyncEnabled: 0 + m_Gizmos: 0 + m_Stats: 0 + m_SelectedSizes: 00000000000000000000000012000000000000000000000000000000000000000000000000000000 + m_ZoomArea: + m_HRangeLocked: 0 + m_VRangeLocked: 0 + hZoomLockedByDefault: 0 + vZoomLockedByDefault: 0 + m_HBaseRangeMin: -201.5 + m_HBaseRangeMax: 201.5 + m_VBaseRangeMin: -151.5 + m_VBaseRangeMax: 151.5 + m_HAllowExceedBaseRangeMin: 1 + m_HAllowExceedBaseRangeMax: 1 + m_VAllowExceedBaseRangeMin: 1 + m_VAllowExceedBaseRangeMax: 1 + m_ScaleWithWindow: 0 + m_HSlider: 0 + m_VSlider: 0 + m_IgnoreScrollWheelUntilClicked: 0 + m_EnableMouseInput: 1 + m_EnableSliderZoomHorizontal: 0 + m_EnableSliderZoomVertical: 0 + m_UniformScale: 1 + m_UpDirection: 1 + m_DrawArea: + serializedVersion: 2 + x: 0 + y: 21 + width: 403 + height: 303 + m_Scale: {x: 1, y: 1} + m_Translation: {x: 201.5, y: 151.5} + m_MarginLeft: 0 + m_MarginRight: 0 + m_MarginTop: 0 + m_MarginBottom: 0 + m_LastShownAreaInsideMargins: + serializedVersion: 2 + x: -201.5 + y: -151.5 + width: 403 + height: 303 + m_MinimalGUI: 1 + m_defaultScale: 1 + m_LastWindowPixelSize: {x: 403, y: 324} + m_ClearInEditMode: 1 + m_NoCameraWarning: 1 + m_LowResolutionForAspectRatios: 01000001000000000000 + m_XRRenderMode: 0 + m_RenderTexture: {fileID: 0} +--- !u!114 &16 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Scene + m_Image: {fileID: 2593428753322112591, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 433 + y: 320 + width: 403 + height: 238 + m_ViewDataDictionary: {fileID: 0} + m_ShowContextualTools: 0 + m_WindowGUID: a313790af9dbe87458dee785a7a04ce9 + m_Gizmos: 0 + m_SceneIsLit: 1 + m_SceneLighting: 1 + m_2DMode: 0 + m_isRotationLocked: 0 + m_PlayAudio: 0 + m_AudioPlay: 0 + m_Position: + m_Target: {x: 0, y: 0, z: 0} + speed: 2 + m_Value: {x: 0, y: 0, z: 0} + m_RenderMode: 0 + m_CameraMode: + drawMode: 0 + name: Shaded + section: Shading Mode + m_ValidateTrueMetals: 0 + m_DoValidateTrueMetals: 0 + m_ExposureSliderValue: 0 + m_ExposureSliderMax: 10 + m_SceneViewState: + showFog: 1 + showMaterialUpdate: 1 + showSkybox: 1 + showFlares: 1 + showImageEffects: 1 + showParticleSystems: 1 + m_Grid: + xGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 0 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 0, y: 0} + yGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 0 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 1, y: 1} + zGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 1 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 1, y: 1} + m_ShowGrid: 0 + m_GridAxis: 1 + m_gridOpacity: 0.5 + m_Rotation: + m_Target: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226} + speed: 2 + m_Value: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226} + m_Size: + m_Target: 10 + speed: 2 + m_Value: 10 + m_Ortho: + m_Target: 0 + speed: 2 + m_Value: 0 + m_CameraSettings: + m_Speed: 2 + m_SpeedNormalized: 1 + m_SpeedMin: 0.01 + m_SpeedMax: 2 + m_EasingEnabled: 1 + m_EasingDuration: 0.4 + m_AccelerationEnabled: 1 + m_FieldOfViewHorizontalOrVertical: 60 + m_NearClip: 0.03 + m_FarClip: 10000 + m_DynamicClip: 1 + m_OcclusionCulling: 0 + m_LastSceneViewRotation: {x: -0.108585656, y: 0.8701915, z: -0.22155659, w: -0.42648384} + m_LastSceneViewOrtho: 0 + m_ReplacementShader: {fileID: 0} + m_ReplacementString: + m_SceneVisActive: 0 + m_LastLockedObject: {fileID: 0} + m_ViewIsLockedToObject: 0 +--- !u!114 &17 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12914, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Animator + m_Image: {fileID: -1673928668082335149, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 73.6 + width: 891 + height: 482 + m_ViewDataDictionary: {fileID: 0} + m_ViewTransforms: + m_KeySerializationHelper: + - {fileID: 1107771261155152084, guid: 063e659554520db45a9130a902445c96, type: 2} + m_ValueSerializationHelper: + - e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_PreviewAnimator: {fileID: 0} + m_AnimatorController: {fileID: 9100000, guid: 063e659554520db45a9130a902445c96, + type: 2} + m_BreadCrumbs: + - m_Target: {fileID: 1107771261155152084, guid: 063e659554520db45a9130a902445c96, + type: 2} + m_ScrollPosition: {x: 0, y: 0} + stateMachineGraph: {fileID: 0} + stateMachineGraphGUI: {fileID: 0} + blendTreeGraph: {fileID: 0} + blendTreeGraphGUI: {fileID: 0} + m_AutoLiveLink: 1 + m_MiniTool: 0 + m_LockTracker: + m_IsLocked: 0 + m_CurrentEditor: 0 + m_LayerEditor: + m_SelectedLayerIndex: 0 +--- !u!114 &18 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Hierarchy + m_Image: {fileID: 7966133145522015247, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 837 + y: 320 + width: 230 + height: 192 + m_ViewDataDictionary: {fileID: 0} + m_SceneHierarchy: + m_TreeViewState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 4c410000 + m_LastClickedID: 16716 + m_ExpandedIDs: 14f6ffff92f6ffff62f7ffff58f8ffff30fbffff + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 0 + m_ClientGUIView: {fileID: 11} + m_SearchString: + m_ExpandedScenes: [] + m_CurrenRootInstanceID: 0 + m_LockTracker: + m_IsLocked: 0 + m_CurrentSortingName: TransformSorting + m_WindowGUID: 498d9d52080b6374c9b3dc16cd1d1882 +--- !u!114 &19 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 230, y: 250} + m_MaxSize: {x: 10000, y: 10000} + m_TitleContent: + m_Text: Project + m_Image: {fileID: -5467254957812901981, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 837 + y: 533 + width: 230 + height: 370 + m_ViewDataDictionary: {fileID: 0} + m_SearchFilter: + m_NameFilter: + m_ClassNames: [] + m_AssetLabels: [] + m_AssetBundleNames: [] + m_VersionControlStates: [] + m_SoftLockControlStates: [] + m_ReferencingInstanceIDs: + m_SceneHandles: + m_ShowAllHits: 0 + m_SkipHidden: 0 + m_SearchArea: 1 + m_Folders: + - Assets/MHLab/Patch/Launcher/Scenes + m_ViewMode: 0 + m_StartGridSize: 16 + m_LastFolders: [] + m_LastFoldersGridSize: -1 + m_LastProjectPath: C:\Users\Glad Park\Documents\Github\PatchTestWebServer\PatchTestProject\PatchTestProject + m_LockTracker: + m_IsLocked: 0 + m_FolderTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 82030100 + m_LastClickedID: 66434 + m_ExpandedIDs: + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 12} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_AssetTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 0 + m_ExpandedIDs: ffffffffdc3c0000f23d0000fa3d0000023e0000083e0000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 12} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_ListAreaState: + m_SelectedInstanceIDs: + m_LastClickedInstanceID: 0 + m_HadKeyboardFocusLastEvent: 0 + m_ExpandedInstanceIDs: + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 12} + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_NewAssetIndexInList: -1 + m_ScrollPosition: {x: 0, y: 0} + m_GridSize: 16 + m_SkipHiddenPackages: 0 + m_DirectoriesAreaWidth: 304 +--- !u!114 &20 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Console + m_Image: {fileID: -4327648978806127646, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 892.8 + y: 600.8 + width: 643 + height: 463 + m_ViewDataDictionary: {fileID: 0} +--- !u!114 &21 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Inspector + m_Image: {fileID: -2667387946076563598, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 1069 + y: 320 + width: 455 + height: 583 + m_ViewDataDictionary: {fileID: 0} + m_OpenAddComponentMenu: 0 + m_ObjectsLockedBeforeSerialization: [] + m_InstanceIDsLockedBeforeSerialization: + m_LockTracker: + m_IsLocked: 0 + m_PreviewResizer: + m_CachedPref: 205 + m_ControlHash: -371814159 + m_PrefName: Preview_InspectorPreview + m_PreviewWindow: {fileID: 0} + m_LastInspectedObjectInstanceID: -1 + m_LastVerticalScrollValue: 0 diff --git a/PatchTestProject/Library/EditorOnlyScriptingSettings.json b/PatchTestProject/Library/EditorOnlyScriptingSettings.json new file mode 100644 index 0000000..8e1824c --- /dev/null +++ b/PatchTestProject/Library/EditorOnlyScriptingSettings.json @@ -0,0 +1 @@ +{"m_DefineSymbols":[],"m_AllowUnsafeCode":false} \ No newline at end of file diff --git a/PatchTestProject/Library/EditorSnapSettings.asset b/PatchTestProject/Library/EditorSnapSettings.asset new file mode 100644 index 0000000..7a90624 --- /dev/null +++ b/PatchTestProject/Library/EditorSnapSettings.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13954, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_SnapEnabled: 0 + m_SnapSettings: + m_SnapValue: {x: 0.25, y: 0.25, z: 0.25} + m_SnapMultiplier: {x: 2048, y: 2048, z: 2048} + m_Rotation: 15 + m_Scale: 1 diff --git a/PatchTestProject/Library/EditorUserBuildSettings.asset b/PatchTestProject/Library/EditorUserBuildSettings.asset new file mode 100644 index 0000000..0c72ca3 Binary files /dev/null and b/PatchTestProject/Library/EditorUserBuildSettings.asset differ diff --git a/PatchTestProject/Library/EditorUserSettings.asset b/PatchTestProject/Library/EditorUserSettings.asset new file mode 100644 index 0000000..4681d1d --- /dev/null +++ b/PatchTestProject/Library/EditorUserSettings.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!162 &1 +EditorUserSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_ConfigSettings: + vcSharedLogLevel: + value: 0d5e400f0650 + flags: 0 + m_VCAutomaticAdd: 1 + m_VCDebugCom: 0 + m_VCDebugCmd: 0 + m_VCDebugOut: 0 + m_SemanticMergeMode: 2 + m_VCShowFailedCheckout: 1 + m_VCOverwriteFailedCheckoutAssets: 1 + m_VCOverlayIcons: 1 + m_VCAllowAsyncUpdate: 0 diff --git a/PatchTestProject/Library/InspectorExpandedItems.asset b/PatchTestProject/Library/InspectorExpandedItems.asset new file mode 100644 index 0000000..d409a72 Binary files /dev/null and b/PatchTestProject/Library/InspectorExpandedItems.asset differ diff --git a/PatchTestProject/Library/LastSceneManagerSetup.txt b/PatchTestProject/Library/LastSceneManagerSetup.txt new file mode 100644 index 0000000..90a45bf --- /dev/null +++ b/PatchTestProject/Library/LastSceneManagerSetup.txt @@ -0,0 +1,5 @@ +sceneSetups: +- path: Assets/MHLab/Patch/Launcher/Scenes/Launcher.unity + isLoaded: 1 + isActive: 1 + isSubScene: 0 diff --git a/PatchTestProject/Library/LibraryFormatVersion.txt b/PatchTestProject/Library/LibraryFormatVersion.txt new file mode 100644 index 0000000..6185f09 --- /dev/null +++ b/PatchTestProject/Library/LibraryFormatVersion.txt @@ -0,0 +1,2 @@ +unityRebuildLibraryVersion: 11 +unityForwardCompatibleVersion: 40 diff --git a/PatchTestProject/Library/MonoManager.asset b/PatchTestProject/Library/MonoManager.asset new file mode 100644 index 0000000..a243ab7 Binary files /dev/null and b/PatchTestProject/Library/MonoManager.asset differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore new file mode 100644 index 0000000..1586aea --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore @@ -0,0 +1,6 @@ + +automation/** +utr_output/** +.Editor/** +.yamato/** +*.zip* \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md new file mode 100644 index 0000000..3c6c85d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog +All notable changes to this package will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [1.2.16] - 2019-02-11 +Update stylesheet to pass USS validation + +## [1.2.15] - 2018-11-16 +Added support for non-experimental UIElements. + +## [1.2.11] - 2018-09-04 +Made some performance improvements to reduce impact on ReloadAssemblies. + +## [1.2.9] - 2018-08-13 +Test issues for the Collab History Window are now fixed. + +## [1.2.7] - 2018-08-07 +Toolbar drop-down will no longer show up when package is uninstalled. + +## [1.2.6] - 2018-06-15 +Fixed an issue where Collab's History window wouldn't load properly. + +## [1.2.5] - 2018-05-21 +This is the first release of *Unity Package CollabProxy*. + +### Added +- Collab history and toolbar windows +- Collab view and presenter classes +- Collab Editor tests for view and presenter diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta new file mode 100644 index 0000000..38274a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 782c49e6e68074dc7ba12c95537825ce +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md new file mode 100644 index 0000000..57808d5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md @@ -0,0 +1,9 @@ + + + + Unity.CollabProxy.Dependencies + 1.1.0-experimental + Rohit Garg + Dependencies for the CollabProxy package + + diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta new file mode 100644 index 0000000..24e45c2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 470530e667ad4475786b28fa3187ce95 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md new file mode 100644 index 0000000..c1800d6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md @@ -0,0 +1,5 @@ +# About Unity Collaborate + +Collaborate is a simple way for teams to save, share, and sync their Unity project. + +Please refer to the online documentation [here.](https://docs.unity3d.com/Manual/UnityCollaborate.html) \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta new file mode 100644 index 0000000..b54ca87 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d31e5d760880a4e52a3a75322481d0d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs new file mode 100644 index 0000000..d7266b6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; +using UnityEngine; + +[assembly: InternalsVisibleTo("Unity.CollabProxy.EditorTests")] diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta new file mode 100644 index 0000000..e384b31 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d4ef26aa386b44923b61c9c4b505a67c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta new file mode 100644 index 0000000..694fc4e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c18cb9388313e4287ad5895ee735c47d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs new file mode 100644 index 0000000..029ce1c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs @@ -0,0 +1,24 @@ +using UnityEditor; +using UnityEditor.Collaboration; +using UnityEngine; + +namespace CollabProxy.UI +{ + [InitializeOnLoad] + public class Bootstrap + { + private const float kCollabToolbarButtonWidth = 78.0f; + + static Bootstrap() + { + Collab.ShowHistoryWindow = CollabHistoryWindow.ShowHistoryWindow; + Collab.ShowToolbarAtPosition = CollabToolbarWindow.ShowCenteredAtPosition; + Collab.IsToolbarVisible = CollabToolbarWindow.IsVisible; + Collab.CloseToolbar = CollabToolbarWindow.CloseToolbar; + Toolbar.AddSubToolbar(new CollabToolbarButton + { + Width = kCollabToolbarButtonWidth + }); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta new file mode 100644 index 0000000..641d54b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8aa8171e088f94069bbd1978a053f7dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs new file mode 100644 index 0000000..c7f90aa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs @@ -0,0 +1,21 @@ +using System; + +namespace UnityEditor.Collaboration +{ + internal static class CollabAnalytics + { + [Serializable] + private struct CollabUserActionAnalyticsEvent + { + public string category; + public string action; + } + + public static void SendUserAction(string category, string action) + { + EditorAnalytics.SendCollabUserAction(new CollabUserActionAnalyticsEvent() { category = category, action = action }); + } + + public static readonly string historyCategoryString = "History"; + }; +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta new file mode 100644 index 0000000..2f46e9b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f944311c8fff2479fa3ba741f6039fc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs new file mode 100644 index 0000000..b855bce --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs @@ -0,0 +1,330 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using UnityEditor.Collaboration; + +#if UNITY_2019_1_OR_NEWER +using UnityEditor.UIElements; +using UnityEngine.UIElements; +#else +using UnityEditor.Experimental.UIElements; +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +using UnityEngine; +using UnityEditor.Connect; + +namespace UnityEditor +{ + internal class CollabHistoryWindow : EditorWindow, ICollabHistoryWindow + { +#if UNITY_2019_1_OR_NEWER + private const string ResourcesPath = "Packages/com.unity.collab-proxy/Editor/Resources/Styles/"; +#else + private const string ResourcesPath = "StyleSheets/"; +#endif + + + const string kWindowTitle = "Collab History"; + const string kServiceUrl = "developer.cloud.unity3d.com"; + + [MenuItem("Window/Asset Management/Collab History", false, 1)] + public static void ShowHistoryWindow() + { + EditorWindow.GetWindow(kWindowTitle); + } + + [MenuItem("Window/Asset Management/Collab History", true)] + public static bool ValidateShowHistoryWindow() + { + return Collab.instance.IsCollabEnabledForCurrentProject(); + } + + CollabHistoryPresenter m_Presenter; + Dictionary m_Views; + List m_HistoryItems = new List(); + HistoryState m_State; + VisualElement m_Container; + PagedListView m_Pager; + ScrollView m_HistoryView; + int m_ItemsPerPage = 5; + string m_InProgressRev; + bool m_RevisionActionsEnabled; + + public CollabHistoryWindow() + { + minSize = new Vector2(275, 50); + } + + public void OnEnable() + { + SetupGUI(); + name = "CollabHistory"; + + if (m_Presenter == null) + { + m_Presenter = new CollabHistoryPresenter(this, new CollabHistoryItemFactory(), new RevisionsService(Collab.instance, UnityConnect.instance)); + } + m_Presenter.OnWindowEnabled(); + } + + public void OnDisable() + { + m_Presenter.OnWindowDisabled(); + } + + public bool revisionActionsEnabled + { + get { return m_RevisionActionsEnabled; } + set + { + if (m_RevisionActionsEnabled == value) + return; + + m_RevisionActionsEnabled = value; + foreach (var historyItem in m_HistoryItems) + { + historyItem.RevisionActionsEnabled = value; + } + } + } + + private void AddStyleSheetPath(VisualElement root, string path) + { +#if UNITY_2019_1_OR_NEWER + root.styleSheets.Add(EditorGUIUtility.Load(path) as StyleSheet); +#else + root.AddStyleSheetPath(path); +#endif + } + + + public void SetupGUI() + { +#if UNITY_2019_1_OR_NEWER + var root = this.rootVisualElement; +#else + var root = this.GetRootVisualContainer(); +#endif + AddStyleSheetPath(root, ResourcesPath + "CollabHistoryCommon.uss"); + if (EditorGUIUtility.isProSkin) + { + AddStyleSheetPath(root, ResourcesPath + "CollabHistoryDark.uss"); + } + else + { + AddStyleSheetPath(root, ResourcesPath + "CollabHistoryLight.uss"); + } + + m_Container = new VisualElement(); + m_Container.StretchToParentSize(); + root.Add(m_Container); + + m_Pager = new PagedListView() + { + name = "PagedElement", + pageSize = m_ItemsPerPage + }; + + var errorView = new StatusView() + { + message = "An Error Occurred", + icon = EditorGUIUtility.LoadIconRequired("Collab.Warning") as Texture, + }; + + var noInternetView = new StatusView() + { + message = "No Internet Connection", + icon = EditorGUIUtility.LoadIconRequired("Collab.NoInternet") as Texture, + }; + + var maintenanceView = new StatusView() + { + message = "Maintenance", + }; + + var loginView = new StatusView() + { + message = "Sign in to access Collaborate", + buttonText = "Sign in...", + callback = SignInClick, + }; + + var noSeatView = new StatusView() + { + message = "Ask your project owner for access to Unity Teams", + buttonText = "Learn More", + callback = NoSeatClick, + }; + + var waitingView = new StatusView() + { + message = "Updating...", + }; + + m_HistoryView = new ScrollView() { name = "HistoryContainer", showHorizontal = false}; + m_HistoryView.contentContainer.StretchToParentWidth(); + m_HistoryView.Add(m_Pager); + + m_Views = new Dictionary() + { + {HistoryState.Error, errorView}, + {HistoryState.Offline, noInternetView}, + {HistoryState.Maintenance, maintenanceView}, + {HistoryState.LoggedOut, loginView}, + {HistoryState.NoSeat, noSeatView}, + {HistoryState.Waiting, waitingView}, + {HistoryState.Ready, m_HistoryView} + }; + } + + public void UpdateState(HistoryState state, bool force) + { + if (state == m_State && !force) + return; + + m_State = state; + switch (state) + { + case HistoryState.Ready: + UpdateHistoryView(m_Pager); + break; + case HistoryState.Disabled: + Close(); + return; + } + + m_Container.Clear(); + m_Container.Add(m_Views[m_State]); + } + + public void UpdateRevisions(IEnumerable datas, string tip, int totalRevisions, int currentPage) + { + var elements = new List(); + var isFullDateObtained = false; // Has everything from this date been obtained? + m_HistoryItems.Clear(); + + if (datas != null) + { + DateTime currentDate = DateTime.MinValue; + foreach (var data in datas) + { + if (data.timeStamp.Date != currentDate.Date) + { + elements.Add(new CollabHistoryRevisionLine(data.timeStamp, isFullDateObtained)); + currentDate = data.timeStamp; + } + + var item = new CollabHistoryItem(data); + m_HistoryItems.Add(item); + + var container = new VisualElement(); + container.style.flexDirection = FlexDirection.Row; + if (data.current) + { + isFullDateObtained = true; + container.AddToClassList("currentRevision"); + container.AddToClassList("obtainedRevision"); + } + else if (data.obtained) + { + container.AddToClassList("obtainedRevision"); + } + else + { + container.AddToClassList("absentRevision"); + } + // If we use the index as-is, the latest commit will become #1, but we want it to be last + container.Add(new CollabHistoryRevisionLine(data.index)); + container.Add(item); + elements.Add(container); + } + } + + m_HistoryView.scrollOffset = new Vector2(0, 0); + m_Pager.totalItems = totalRevisions; + m_Pager.curPage = currentPage; + m_Pager.items = elements; + } + + public string inProgressRevision + { + get { return m_InProgressRev; } + set + { + m_InProgressRev = value; + foreach (var historyItem in m_HistoryItems) + { + historyItem.SetInProgressStatus(value); + } + } + } + + public int itemsPerPage + { + set + { + if (m_ItemsPerPage == value) + return; + m_Pager.pageSize = m_ItemsPerPage; + } + } + + public PageChangeAction OnPageChangeAction + { + set { m_Pager.OnPageChanged = value; } + } + + public RevisionAction OnGoBackAction + { + set { CollabHistoryItem.s_OnGoBack = value; } + } + + public RevisionAction OnUpdateAction + { + set { CollabHistoryItem.s_OnUpdate = value; } + } + + public RevisionAction OnRestoreAction + { + set { CollabHistoryItem.s_OnRestore = value; } + } + + public ShowBuildAction OnShowBuildAction + { + set { CollabHistoryItem.s_OnShowBuild = value; } + } + + public Action OnShowServicesAction + { + set { CollabHistoryItem.s_OnShowServices = value; } + } + + void UpdateHistoryView(VisualElement history) + { + } + + void NoSeatClick() + { + var connection = UnityConnect.instance; + var env = connection.GetEnvironment(); + // Map environment to url - prod is special + if (env == "production") + env = ""; + else + env += "-"; + + var url = "https://" + env + kServiceUrl + + "/orgs/" + connection.GetOrganizationId() + + "/projects/" + connection.GetProjectName() + + "/unity-teams/"; + Application.OpenURL(url); + } + + void SignInClick() + { + UnityConnect.instance.ShowLogin(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta new file mode 100644 index 0000000..74358d4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fed9dda667cab45d398d06402bba03f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs new file mode 100644 index 0000000..eebe4ac --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs @@ -0,0 +1,297 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Collaboration; +using UnityEditor.Connect; +using UnityEditor.Web; +using UnityEngine; + +namespace UnityEditor +{ + internal class CollabToolbarButton : SubToolbar, IDisposable + { + // Must match s_CollabIcon array + enum CollabToolbarState + { + NeedToEnableCollab, + UpToDate, + Conflict, + OperationError, + ServerHasChanges, + FilesToPush, + InProgress, + Disabled, + Offline + } + + private class CollabToolbarContent + { + readonly string m_iconName; + readonly string m_toolTip; + readonly CollabToolbarState m_state; + + static Dictionary m_CollabIcons; + + public CollabToolbarState RegisteredForState + { + get { return m_state; } + } + + public GUIContent GuiContent + { + get + { + if (m_CollabIcons == null) + { + m_CollabIcons = new Dictionary(); + } + + if (!m_CollabIcons.ContainsKey(this)) + { + m_CollabIcons.Add(this, EditorGUIUtility.TrTextContentWithIcon("Collab", m_toolTip, m_iconName)); + } + + return m_CollabIcons[this]; + } + } + + public CollabToolbarContent(CollabToolbarState state, string iconName, string toolTip) + { + m_state = state; + m_iconName = iconName; + m_toolTip = toolTip; + } + } + + CollabToolbarContent[] m_toolbarContents; + CollabToolbarState m_CollabToolbarState = CollabToolbarState.UpToDate; + const float kCollabButtonWidth = 78.0f; + ButtonWithAnimatedIconRotation m_CollabButton; + string m_DynamicTooltip; + static bool m_ShowCollabTooltip = false; + + private GUIContent currentCollabContent + { + get + { + CollabToolbarContent toolbarContent = + m_toolbarContents.FirstOrDefault(c => c.RegisteredForState.Equals(m_CollabToolbarState)); + GUIContent content = new GUIContent(toolbarContent == null? m_toolbarContents.First().GuiContent : toolbarContent.GuiContent); + if (!m_ShowCollabTooltip) + { + content.tooltip = null; + } + else if (m_DynamicTooltip != "") + { + content.tooltip = m_DynamicTooltip; + } + + if (Collab.instance.AreTestsRunning()) + { + content.text = "CTF"; + } + + return content; + } + } + + public CollabToolbarButton() + { + m_toolbarContents = new[] + { + new CollabToolbarContent(CollabToolbarState.NeedToEnableCollab, "CollabNew", " You need to enable collab."), + new CollabToolbarContent(CollabToolbarState.UpToDate, "Collab", " You are up to date."), + new CollabToolbarContent(CollabToolbarState.Conflict, "CollabConflict", " Please fix your conflicts prior to publishing."), + new CollabToolbarContent(CollabToolbarState.OperationError, "CollabError", " Last operation failed. Please retry later."), + new CollabToolbarContent(CollabToolbarState.ServerHasChanges, "CollabPull", " Please update, there are server changes."), + new CollabToolbarContent(CollabToolbarState.FilesToPush, "CollabPush", " You have files to publish."), + new CollabToolbarContent(CollabToolbarState.InProgress, "CollabProgress", " Operation in progress."), + new CollabToolbarContent(CollabToolbarState.Disabled, "CollabNew", " Collab is disabled."), + new CollabToolbarContent(CollabToolbarState.Offline, "CollabNew", " Please check your network connection.") + }; + + Collab.instance.StateChanged += OnCollabStateChanged; + UnityConnect.instance.StateChanged += OnUnityConnectStateChanged; + UnityConnect.instance.UserStateChanged += OnUnityConnectUserStateChanged; + } + + void OnUnityConnectUserStateChanged(UserInfo state) + { + UpdateCollabToolbarState(); + } + + void OnUnityConnectStateChanged(ConnectInfo state) + { + UpdateCollabToolbarState(); + } + + public override void OnGUI(Rect rect) + { + DoCollabDropDown(rect); + } + + Rect GUIToScreenRect(Rect guiRect) + { + Vector2 screenPoint = GUIUtility.GUIToScreenPoint(new Vector2(guiRect.x, guiRect.y)); + guiRect.x = screenPoint.x; + guiRect.y = screenPoint.y; + return guiRect; + } + + void ShowPopup(Rect rect) + { + // window should be centered on the button + ReserveRight(kCollabButtonWidth / 2, ref rect); + ReserveBottom(5, ref rect); + // calculate screen rect before saving assets since it might open the AssetSaveDialog window + var screenRect = GUIToScreenRect(rect); + // save all the assets + AssetDatabase.SaveAssets(); + if (Collab.ShowToolbarAtPosition != null && Collab.ShowToolbarAtPosition(screenRect)) + { + GUIUtility.ExitGUI(); + } + } + + void DoCollabDropDown(Rect rect) + { + UpdateCollabToolbarState(); + GUIStyle collabButtonStyle = "OffsetDropDown"; + bool showPopup = Toolbar.requestShowCollabToolbar; + Toolbar.requestShowCollabToolbar = false; + + bool enable = !EditorApplication.isPlaying; + + using (new EditorGUI.DisabledScope(!enable)) + { + bool animate = m_CollabToolbarState == CollabToolbarState.InProgress; + + EditorGUIUtility.SetIconSize(new Vector2(12, 12)); + if (GetCollabButton().OnGUI(rect, currentCollabContent, animate, collabButtonStyle)) + { + showPopup = true; + } + EditorGUIUtility.SetIconSize(Vector2.zero); + } + + if (m_CollabToolbarState == CollabToolbarState.Disabled) + return; + + if (showPopup) + { + ShowPopup(rect); + } + } + + public void OnCollabStateChanged(CollabInfo info) + { + UpdateCollabToolbarState(); + } + + public void UpdateCollabToolbarState() + { + var currentCollabState = CollabToolbarState.UpToDate; + bool networkAvailable = UnityConnect.instance.connectInfo.online && UnityConnect.instance.connectInfo.loggedIn; + m_DynamicTooltip = ""; + + if (UnityConnect.instance.isDisableCollabWindow) + { + currentCollabState = CollabToolbarState.Disabled; + } + else if (networkAvailable) + { + Collab collab = Collab.instance; + CollabInfo currentInfo = collab.collabInfo; + UnityErrorInfo errInfo; + bool error = false; + if (collab.GetError((UnityConnect.UnityErrorFilter.ByContext | UnityConnect.UnityErrorFilter.ByChild), out errInfo)) + { + error = (errInfo.priority <= (int)UnityConnect.UnityErrorPriority.Error); + m_DynamicTooltip = errInfo.shortMsg; + } + + if (!currentInfo.ready) + { + currentCollabState = CollabToolbarState.InProgress; + } + else if (error) + { + currentCollabState = CollabToolbarState.OperationError; + } + else if (currentInfo.inProgress) + { + currentCollabState = CollabToolbarState.InProgress; + } + else + { + bool collabEnable = Collab.instance.IsCollabEnabledForCurrentProject(); + + if (UnityConnect.instance.projectInfo.projectBound == false || !collabEnable) + { + currentCollabState = CollabToolbarState.NeedToEnableCollab; + } + else if (currentInfo.update) + { + currentCollabState = CollabToolbarState.ServerHasChanges; + } + else if (currentInfo.conflict) + { + currentCollabState = CollabToolbarState.Conflict; + } + else if (currentInfo.publish) + { + currentCollabState = CollabToolbarState.FilesToPush; + } + } + } + else + { + currentCollabState = CollabToolbarState.Offline; + } + + if (Collab.IsToolbarVisible != null) + { + if (currentCollabState != m_CollabToolbarState || + Collab.IsToolbarVisible() == m_ShowCollabTooltip) + { + m_CollabToolbarState = currentCollabState; + m_ShowCollabTooltip = !Collab.IsToolbarVisible(); + Toolbar.RepaintToolbar(); + } + } + } + + void ReserveRight(float width, ref Rect pos) + { + pos.x += width; + } + + void ReserveBottom(float height, ref Rect pos) + { + pos.y += height; + } + + ButtonWithAnimatedIconRotation GetCollabButton() + { + if (m_CollabButton == null) + { + const int repaintsPerSecond = 20; + const float animSpeed = 500f; + const bool mouseDownButton = true; + m_CollabButton = new ButtonWithAnimatedIconRotation(() => (float)EditorApplication.timeSinceStartup * animSpeed, Toolbar.RepaintToolbar, repaintsPerSecond, mouseDownButton); + } + + return m_CollabButton; + } + + public void Dispose() + { + Collab.instance.StateChanged -= OnCollabStateChanged; + UnityConnect.instance.StateChanged -= OnUnityConnectStateChanged; + UnityConnect.instance.UserStateChanged -= OnUnityConnectUserStateChanged; + + if (m_CollabButton != null) + m_CollabButton.Clear(); + } + } +} // namespace \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta new file mode 100644 index 0000000..949d8db --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 882f1a4147a284f028899b9c018e63eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs new file mode 100644 index 0000000..2793875 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs @@ -0,0 +1,137 @@ +using UnityEngine; +using UnityEditor.Collaboration; +using UnityEditor.Web; +using UnityEditor.Connect; + +namespace UnityEditor +{ + [InitializeOnLoad] + internal class WebViewStatic : ScriptableSingleton + { + [SerializeField] + WebView m_WebView; + + static public WebView GetWebView() + { + return instance.m_WebView; + } + + static public void SetWebView(WebView webView) + { + instance.m_WebView = webView; + } + } + + [InitializeOnLoad] + internal class CollabToolbarWindow : WebViewEditorStaticWindow, IHasCustomMenu + { + internal override WebView webView + { + get {return WebViewStatic.GetWebView(); } + set {WebViewStatic.SetWebView(value); } + } + + private const string kWindowName = "Unity Collab Toolbar"; + + private static long s_LastClosedTime; + private static CollabToolbarWindow s_CollabToolbarWindow; + + public static bool s_ToolbarIsVisible = false; + + const int kWindowWidth = 320; + const int kWindowHeight = 350; + + public static void CloseToolbar() + { + foreach (CollabToolbarWindow window in Resources.FindObjectsOfTypeAll()) + window.Close(); + } + + [MenuItem("Window/Asset Management/Collab Toolbar", false /*IsValidateFunction*/, 2, true /* IsInternalMenu */)] + public static CollabToolbarWindow ShowToolbarWindow() + { + //Create a new window if it does not exist + if (s_CollabToolbarWindow == null) + { + s_CollabToolbarWindow = GetWindow(false, kWindowName) as CollabToolbarWindow; + } + + return s_CollabToolbarWindow; + } + + [MenuItem("Window/Asset Management/Collab Toolbar", true /*IsValidateFunction*/)] + public static bool ValidateShowToolbarWindow() + { + return true; + } + + public static bool IsVisible() + { + return s_ToolbarIsVisible; + } + + public static bool ShowCenteredAtPosition(Rect buttonRect) + { + buttonRect.x -= kWindowWidth / 2; + // We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time. + long nowMilliSeconds = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond; + bool justClosed = nowMilliSeconds < s_LastClosedTime + 50; + if (!justClosed) + { + // Method may have been triggered programmatically, without a user event to consume. + if (Event.current.type != EventType.Layout) + { + Event.current.Use(); + } + if (s_CollabToolbarWindow == null) + s_CollabToolbarWindow = CreateInstance() as CollabToolbarWindow; + var windowSize = new Vector2(kWindowWidth, kWindowHeight); + s_CollabToolbarWindow.initialOpenUrl = "file:///" + EditorApplication.userJavascriptPackagesPath + "unityeditor-collab-toolbar/dist/index.html"; + s_CollabToolbarWindow.Init(); + s_CollabToolbarWindow.ShowAsDropDown(buttonRect, windowSize); + s_CollabToolbarWindow.OnFocus(); + return true; + } + return false; + } + + // Receives HTML title + public void OnReceiveTitle(string title) + { + titleContent.text = title; + } + + public new void OnInitScripting() + { + base.OnInitScripting(); + } + + public override void OnEnable() + { + minSize = new Vector2(kWindowWidth, kWindowHeight); + maxSize = new Vector2(kWindowWidth, kWindowHeight); + initialOpenUrl = "file:///" + EditorApplication.userJavascriptPackagesPath + "unityeditor-collab-toolbar/dist/index.html"; + base.OnEnable(); + s_ToolbarIsVisible = true; + } + + internal new void OnDisable() + { + s_LastClosedTime = System.DateTime.Now.Ticks / System.TimeSpan.TicksPerMillisecond; + if (s_CollabToolbarWindow) + { + s_ToolbarIsVisible = false; + NotifyVisibility(s_ToolbarIsVisible); + } + s_CollabToolbarWindow = null; + + base.OnDisable(); + } + + public new void OnDestroy() + { + OnLostFocus(); + base.OnDestroy(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta new file mode 100644 index 0000000..b08bf2a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f516f1ec21a54a59a92bf99db2d9535 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta new file mode 100644 index 0000000..9133153 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d437fe60bb34f45728664a5d930c1635 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs new file mode 100644 index 0000000..91d500b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs @@ -0,0 +1,228 @@ +using System.Collections.Generic; +using UnityEditor.Connect; +using UnityEditor.Web; + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryPresenter + { + public const int ItemsPerPage = 5; + ICollabHistoryWindow m_Window; + ICollabHistoryItemFactory m_Factory; + IRevisionsService m_Service; + ConnectInfo m_ConnectState; + CollabInfo m_CollabState; + bool m_IsCollabError; + int m_TotalRevisions; + int m_CurrentPage; + int m_RequestedPage; + bool m_FetchInProgress; + + BuildAccess m_BuildAccess; + string m_ProgressRevision; + public bool BuildServiceEnabled {get; set; } + + public CollabHistoryPresenter(ICollabHistoryWindow window, ICollabHistoryItemFactory factory, IRevisionsService service) + { + m_Window = window; + m_Factory = factory; + m_Service = service; + m_CurrentPage = 0; + m_BuildAccess = new BuildAccess(); + m_Service.FetchRevisionsCallback += OnFetchRevisions; + } + + public void OnWindowEnabled() + { + UnityConnect.instance.StateChanged += OnConnectStateChanged; + Collab.instance.StateChanged += OnCollabStateChanged; + Collab.instance.RevisionUpdated += OnCollabRevisionUpdated; + Collab.instance.JobsCompleted += OnCollabJobsCompleted; + Collab.instance.ErrorOccurred += OnCollabError; + Collab.instance.ErrorCleared += OnCollabErrorCleared; + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + m_ConnectState = UnityConnect.instance.GetConnectInfo(); + m_CollabState = Collab.instance.GetCollabInfo(); + + m_Window.revisionActionsEnabled = !EditorApplication.isPlayingOrWillChangePlaymode; + + // Setup window callbacks + m_Window.OnPageChangeAction = OnUpdatePage; + m_Window.OnUpdateAction = OnUpdate; + m_Window.OnRestoreAction = OnRestore; + m_Window.OnGoBackAction = OnGoBack; + m_Window.OnShowBuildAction = ShowBuildForCommit; + m_Window.OnShowServicesAction = ShowServicePage; + m_Window.itemsPerPage = ItemsPerPage; + + // Initialize data + UpdateBuildServiceStatus(); + var state = RecalculateState(); + // Only try to load the page if we're ready + if (state == HistoryState.Ready) + OnUpdatePage(m_CurrentPage); + m_Window.UpdateState(state, true); + } + + public void OnWindowDisabled() + { + UnityConnect.instance.StateChanged -= OnConnectStateChanged; + Collab.instance.StateChanged -= OnCollabStateChanged; + Collab.instance.RevisionUpdated -= OnCollabRevisionUpdated; + Collab.instance.JobsCompleted -= OnCollabJobsCompleted; + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + + private void OnConnectStateChanged(ConnectInfo state) + { + m_ConnectState = state; + + m_Window.UpdateState(RecalculateState(), false); + } + + private void OnCollabStateChanged(CollabInfo state) + { + // Sometimes a collab state change will trigger even though everything is the same + if (m_CollabState.Equals(state)) + return; + + if (m_CollabState.tip != state.tip) + OnUpdatePage(m_CurrentPage); + + m_CollabState = state; + m_Window.UpdateState(RecalculateState(), false); + if (state.inProgress) + { + m_Window.inProgressRevision = m_ProgressRevision; + } + else + { + m_Window.inProgressRevision = null; + } + } + + private void OnCollabRevisionUpdated(CollabInfo state) + { + OnUpdatePage(m_CurrentPage); + } + + private void OnCollabJobsCompleted(CollabInfo state) + { + m_ProgressRevision = null; + } + + private void OnCollabError() + { + m_IsCollabError = true; + m_Window.UpdateState(RecalculateState(), false); + } + + private void OnCollabErrorCleared() + { + m_IsCollabError = false; + m_FetchInProgress = true; + m_Service.GetRevisions(m_CurrentPage * ItemsPerPage, ItemsPerPage); + m_Window.UpdateState(RecalculateState(), false); + } + + private void OnPlayModeStateChanged(PlayModeStateChange stateChange) + { + // If entering play mode, disable + if (stateChange == PlayModeStateChange.ExitingEditMode || + stateChange == PlayModeStateChange.EnteredPlayMode) + { + m_Window.revisionActionsEnabled = false; + } + // If exiting play mode, enable! + else if (stateChange == PlayModeStateChange.EnteredEditMode || + stateChange == PlayModeStateChange.ExitingPlayMode) + { + m_Window.revisionActionsEnabled = true; + } + } + + private HistoryState RecalculateState() + { + if (!m_ConnectState.online) + return HistoryState.Offline; + if (m_ConnectState.maintenance || m_CollabState.maintenance) + return HistoryState.Maintenance; + if (!m_ConnectState.loggedIn) + return HistoryState.LoggedOut; + if (!m_CollabState.seat) + return HistoryState.NoSeat; + if (!Collab.instance.IsCollabEnabledForCurrentProject()) + return HistoryState.Disabled; + if (!Collab.instance.IsConnected() || !m_CollabState.ready || m_FetchInProgress) + return HistoryState.Waiting; + if (m_ConnectState.error || m_IsCollabError) + return HistoryState.Error; + + return HistoryState.Ready; + } + + // TODO: Eventually this can be a listener on the build service status + public void UpdateBuildServiceStatus() + { + foreach (var service in UnityConnectServiceCollection.instance.GetAllServiceInfos()) + { + if (service.name.Equals("Build")) + { + BuildServiceEnabled = service.enabled; + } + } + } + + public void ShowBuildForCommit(string revisionID) + { + m_BuildAccess.ShowBuildForCommit(revisionID); + } + + public void ShowServicePage() + { + m_BuildAccess.ShowServicePage(); + } + + public void OnUpdatePage(int page) + { + m_FetchInProgress = true; + m_Service.GetRevisions(page * ItemsPerPage, ItemsPerPage); + m_Window.UpdateState(RecalculateState(), false); + m_RequestedPage = page; + } + + private void OnFetchRevisions(RevisionsResult data) + { + m_FetchInProgress = false; + IEnumerable items = null; + if (data != null) + { + m_CurrentPage = m_RequestedPage; + m_TotalRevisions = data.RevisionsInRepo; + items = m_Factory.GenerateElements(data.Revisions, m_TotalRevisions, m_CurrentPage * ItemsPerPage, m_Service.tipRevision, m_Window.inProgressRevision, m_Window.revisionActionsEnabled, BuildServiceEnabled, m_Service.currentUser); + } + + // State must be recalculated prior to inserting items + m_Window.UpdateState(RecalculateState(), false); + m_Window.UpdateRevisions(items, m_Service.tipRevision, m_TotalRevisions, m_CurrentPage); + } + + private void OnRestore(string revisionId, bool updatetorevision) + { + m_ProgressRevision = revisionId; + Collab.instance.ResyncToRevision(revisionId); + } + + private void OnGoBack(string revisionId, bool updatetorevision) + { + m_ProgressRevision = revisionId; + Collab.instance.GoBackToRevision(revisionId, false); + } + + private void OnUpdate(string revisionId, bool updatetorevision) + { + m_ProgressRevision = revisionId; + Collab.instance.Update(revisionId, updatetorevision); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta new file mode 100644 index 0000000..9c37ecd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7c91a123806d41a0873fcdcb629b1c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta new file mode 100644 index 0000000..f62ac6b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fd0a39b4d296d4d509b4f1dbd08d0630 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs new file mode 100644 index 0000000..ac3754d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs @@ -0,0 +1,53 @@ +using System; +using UnityEditor; +using UnityEditor.Collaboration; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal class BuildStatusButton : Button + { + private readonly string iconPrefix = "Icons/Collab.Build"; + private readonly string iconSuffix = ".png"; + Label labelElement = new Label(); + Image iconElement = new Image() {name = "BuildIcon"}; + + public BuildStatusButton(Action clickEvent) : base(clickEvent) + { + iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture; + labelElement.text = "Build Now"; + Add(iconElement); + Add(labelElement); + } + + public BuildStatusButton(Action clickEvent, BuildState state, int failures) : base(clickEvent) + { + switch (state) + { + case BuildState.InProgress: + iconElement.image = EditorGUIUtility.Load(iconPrefix + iconSuffix) as Texture; + labelElement.text = "In progress"; + break; + + case BuildState.Failed: + iconElement.image = EditorGUIUtility.Load(iconPrefix + "Failed" + iconSuffix) as Texture; + labelElement.text = failures + ((failures == 1) ? " failure" : " failures"); + break; + + case BuildState.Success: + iconElement.image = EditorGUIUtility.Load(iconPrefix + "Succeeded" + iconSuffix) as Texture; + labelElement.text = "success"; + break; + } + + Add(iconElement); + Add(labelElement); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta new file mode 100644 index 0000000..d74a58a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0217a80286f79419daa202f69409f19b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs new file mode 100644 index 0000000..e3bb05a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs @@ -0,0 +1,78 @@ +using UnityEngine; +using System.Collections.Generic; +using UnityEditor.Connect; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryDropDown : VisualElement + { + private readonly VisualElement m_FilesContainer; + private readonly Label m_ToggleLabel; + private int m_ChangesTotal; + private string m_RevisionId; + + public CollabHistoryDropDown(ICollection changes, int changesTotal, bool changesTruncated, string revisionId) + { + m_FilesContainer = new VisualElement(); + m_ChangesTotal = changesTotal; + m_RevisionId = revisionId; + + m_ToggleLabel = new Label(ToggleText(false)); + m_ToggleLabel.AddManipulator(new Clickable(ToggleDropdown)); + Add(m_ToggleLabel); + + foreach (ChangeData change in changes) + { + m_FilesContainer.Add(new CollabHistoryDropDownItem(change.path, change.action)); + } + + if (changesTruncated) + { + m_FilesContainer.Add(new Button(ShowAllClick) + { + text = "Show all on dashboard" + }); + } + } + + private void ToggleDropdown() + { + if (Contains(m_FilesContainer)) + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "CollapseAssets"); + Remove(m_FilesContainer); + m_ToggleLabel.text = ToggleText(false); + } + else + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ExpandAssets"); + Add(m_FilesContainer); + m_ToggleLabel.text = ToggleText(true); + } + } + + private string ToggleText(bool open) + { + var icon = open ? "\u25bc" : "\u25b6"; + var change = m_ChangesTotal == 1 ? "Change" : "Changes"; + return string.Format("{0} {1} Asset {2}", icon, m_ChangesTotal, change); + } + + private void ShowAllClick() + { + var host = UnityConnect.instance.GetConfigurationURL(CloudConfigUrl.CloudServicesDashboard); + var org = UnityConnect.instance.GetOrganizationId(); + var proj = UnityConnect.instance.GetProjectGUID(); + var url = string.Format("{0}/collab/orgs/{1}/projects/{2}/commits?commit={3}", host, org, proj, m_RevisionId); + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowAllOnDashboard"); + Application.OpenURL(url); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta new file mode 100644 index 0000000..513b66b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a483595b0257945278dc75c5ff7d82ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs new file mode 100644 index 0000000..3ad43f2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs @@ -0,0 +1,53 @@ +using System; +using System.IO; +using System.Linq; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryDropDownItem : VisualElement + { + public CollabHistoryDropDownItem(string path, string action) + { + var fileName = Path.GetFileName(path); + var isFolder = Path.GetFileNameWithoutExtension(path).Equals(fileName); + var fileIcon = GetIconElement(action, fileName, isFolder); + var metaContainer = new VisualElement(); + var fileNameLabel = new Label + { + name = "FileName", + text = fileName + }; + var filePathLabel = new Label + { + name = "FilePath", + text = path + }; + metaContainer.Add(fileNameLabel); + metaContainer.Add(filePathLabel); + Add(fileIcon); + Add(metaContainer); + } + + private Image GetIconElement(string action, string fileName, bool isFolder) + { + var prefix = isFolder ? "Folder" : "File"; + var actionName = action.First().ToString().ToUpper() + action.Substring(1); + // Use the same icon for renamed and moved files + actionName = actionName.Equals("Renamed") ? "Moved" : actionName; + var iconElement = new Image + { + name = "FileIcon", + image = EditorGUIUtility.LoadIcon("Icons/Collab." + prefix + actionName + ".png") + }; + return iconElement; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta new file mode 100644 index 0000000..10bf40e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d912d4873af534bd4a9d44bf1b52f14e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs new file mode 100644 index 0000000..24e5d1d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs @@ -0,0 +1,229 @@ +using System; +using System.Linq; +using System.Security.Cryptography; +using UnityEditor.Connect; +using UnityEditor.Web; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryItem : VisualElement + { + public static RevisionAction s_OnRestore; + public static RevisionAction s_OnGoBack; + public static RevisionAction s_OnUpdate; + public static ShowBuildAction s_OnShowBuild; + public static Action s_OnShowServices; + + private readonly string m_RevisionId; + private readonly string m_FullDescription; + private readonly DateTime m_TimeStamp; + private readonly Button m_Button; + private readonly HistoryProgressSpinner m_ProgressSpinner; + private VisualElement m_ActionsTray; + private VisualElement m_Details; + private Label m_Description; + private Label m_TimeAgo; + private readonly Button m_ExpandCollapseButton; + private bool m_Expanded; + + private const int kMaxDescriptionChars = 500; + + public bool RevisionActionsEnabled + { + set + { + m_Button.SetEnabled(value); + } + } + + public DateTime timeStamp + { + get { return m_TimeStamp; } + } + + public CollabHistoryItem(RevisionData data) + { + m_RevisionId = data.id; + m_TimeStamp = data.timeStamp; + name = "HistoryItem"; + m_ActionsTray = new VisualElement {name = "HistoryItemActionsTray"}; + m_ProgressSpinner = new HistoryProgressSpinner(); + m_Details = new VisualElement {name = "HistoryDetail"}; + var author = new Label(data.authorName) {name = "Author"}; + m_TimeAgo = new Label(TimeAgo.GetString(m_TimeStamp)); + m_FullDescription = data.comment; + var shouldTruncate = ShouldTruncateDescription(m_FullDescription); + if (shouldTruncate) + { + m_Description = new Label(GetTruncatedDescription(m_FullDescription)); + } + else + { + m_Description = new Label(m_FullDescription); + } + m_Description.name = "RevisionDescription"; + var dropdown = new CollabHistoryDropDown(data.changes, data.changesTotal, data.changesTruncated, data.id); + if (data.current) + { + m_Button = new Button(Restore) {name = "ActionButton", text = "Restore"}; + } + else if (data.obtained) + { + m_Button = new Button(GoBackTo) {name = "ActionButton", text = "Go back to..."}; + } + else + { + m_Button = new Button(UpdateTo) {name = "ActionButton", text = "Update"}; + } + m_Button.SetEnabled(data.enabled); + m_ProgressSpinner.ProgressEnabled = data.inProgress; + + m_ActionsTray.Add(m_ProgressSpinner); + m_ActionsTray.Add(m_Button); + + m_Details.Add(author); + m_Details.Add(m_TimeAgo); + m_Details.Add(m_Description); + + if (shouldTruncate) + { + m_ExpandCollapseButton = new Button(ToggleDescription) { name = "ToggleDescription", text = "Show More" }; + m_Details.Add(m_ExpandCollapseButton); + } + + if (data.buildState != BuildState.None) + { + BuildStatusButton buildButton; + if (data.buildState == BuildState.Configure) + buildButton = new BuildStatusButton(ShowServicePage); + else + buildButton = new BuildStatusButton(ShowBuildForCommit, data.buildState, data.buildFailures); + + m_Details.Add(buildButton); + } + + m_Details.Add(m_ActionsTray); + m_Details.Add(dropdown); + + Add(m_Details); + + this.schedule.Execute(UpdateTimeAgo).Every(1000 * 20); + } + + public static void SetUpCallbacks(RevisionAction Restore, RevisionAction GoBack, RevisionAction Update) + { + s_OnRestore = Restore; + s_OnGoBack = GoBack; + s_OnUpdate = Update; + } + + public void SetInProgressStatus(string revisionIdInProgress) + { + if (String.IsNullOrEmpty(revisionIdInProgress)) + { + m_Button.SetEnabled(true); + m_ProgressSpinner.ProgressEnabled = false; + } + else + { + m_Button.SetEnabled(false); + if (m_RevisionId.Equals(revisionIdInProgress)) + { + m_ProgressSpinner.ProgressEnabled = true; + } + } + } + + void ShowBuildForCommit() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowBuild"); + if (s_OnShowBuild != null) + { + s_OnShowBuild(m_RevisionId); + } + } + + void ShowServicePage() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ShowServices"); + if (s_OnShowServices != null) + { + s_OnShowServices(); + } + } + + void Restore() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "Restore"); + if (s_OnRestore != null) + { + s_OnRestore(m_RevisionId, false); + } + } + + void GoBackTo() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "GoBackTo"); + if (s_OnGoBack != null) + { + s_OnGoBack(m_RevisionId, false); + } + } + + void UpdateTo() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "Update"); + if (s_OnUpdate != null) + { + s_OnUpdate(m_RevisionId, true); + } + } + + void UpdateTimeAgo() + { + m_TimeAgo.text = TimeAgo.GetString(m_TimeStamp); + } + + bool ShouldTruncateDescription(string description) + { + return description.Contains(Environment.NewLine) || description.Length > kMaxDescriptionChars; + } + + string GetTruncatedDescription(string description) + { + string result = description.Contains(Environment.NewLine) ? + description.Substring(0, description.IndexOf(Environment.NewLine)) : description; + if (result.Length > kMaxDescriptionChars) + { + result = result.Substring(0, kMaxDescriptionChars) + "..."; + } + return result; + } + + void ToggleDescription() + { + if (m_Expanded) + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "CollapseDescription"); + m_Expanded = false; + m_ExpandCollapseButton.text = "Show More"; + m_Description.text = GetTruncatedDescription(m_FullDescription); + } + else + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "ExpandDescription"); + m_Expanded = true; + m_ExpandCollapseButton.text = "Show Less"; + m_Description.text = m_FullDescription; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta new file mode 100644 index 0000000..290bd28 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4c1445ee948a4124bfa9fb818a17e36 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs new file mode 100644 index 0000000..e7d7aa6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Collaboration; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryItemFactory : ICollabHistoryItemFactory + { + const int k_MaxChangesPerRevision = 10; + + public IEnumerable GenerateElements(IEnumerable revisions, int totalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser) + { + int index = startIndex; + + foreach (var rev in revisions) + { + index++; + var current = rev.revisionID == tipRev; + + // Calculate build status + BuildState buildState = BuildState.None; + int buildFailures = 0; + if (rev.buildStatuses != null && rev.buildStatuses.Length > 0) + { + bool inProgress = false; + foreach (CloudBuildStatus buildStatus in rev.buildStatuses) + { + if (buildStatus.complete) + { + if (!buildStatus.success) + { + buildFailures++; + } + } + else + { + inProgress = true; + break; + } + } + + if (inProgress) + { + buildState = BuildState.InProgress; + } + else if (buildFailures > 0) + { + buildState = BuildState.Failed; + } + else + { + buildState = BuildState.Success; + } + } + else if (current && !buildServiceEnabled) + { + buildState = BuildState.Configure; + } + + // Calculate the number of changes performed on files and folders (not meta files) + var paths = new Dictionary(); + foreach (ChangeAction change in rev.entries) + { + if (change.path.EndsWith(".meta")) + { + var path = change.path.Substring(0, change.path.Length - 5); + // Actions taken on meta files are secondary to any actions taken on the main file + if (!paths.ContainsKey(path)) + paths[path] = new ChangeData() {path = path, action = change.action}; + } + else + { + paths[change.path] = new ChangeData() {path = change.path, action = change.action}; + } + } + + var displayName = (rev.author != currentUser) ? rev.authorName : "You"; + + var item = new RevisionData + { + id = rev.revisionID, + index = totalRevisions - index + 1, + timeStamp = TimeStampToDateTime(rev.timeStamp), + authorName = displayName, + comment = rev.comment, + + obtained = rev.isObtained, + current = current, + inProgress = (rev.revisionID == inProgressRevision), + enabled = revisionActionsEnabled, + + buildState = buildState, + buildFailures = buildFailures, + + changes = paths.Values.Take(k_MaxChangesPerRevision).ToList(), + changesTotal = paths.Values.Count, + changesTruncated = paths.Values.Count > k_MaxChangesPerRevision, + }; + + yield return item; + } + } + + private static DateTime TimeStampToDateTime(double timeStamp) + { + DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime(); + return dateTime; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta new file mode 100644 index 0000000..3250d96 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc46f91ea1e8e4ca2ab693fef9156dbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs new file mode 100644 index 0000000..2b8fe65 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs @@ -0,0 +1,94 @@ +using System; +using UnityEditor; +using UnityEditor.Collaboration; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal class CollabHistoryRevisionLine : VisualElement + { + public CollabHistoryRevisionLine(int number) + { + AddNumber(number); + AddLine("topLine"); + AddLine("bottomLine"); + AddIndicator(); + } + + public CollabHistoryRevisionLine(DateTime date, bool isFullDateObtained) + { + AddLine(isFullDateObtained ? "obtainedDateLine" : "absentDateLine"); + AddHeader(GetFormattedHeader(date)); + AddToClassList("revisionLineHeader"); + } + + private void AddHeader(string content) + { + Add(new Label + { + text = content + }); + } + + private void AddIndicator() + { + Add(new VisualElement + { + name = "RevisionIndicator" + }); + } + + private void AddLine(string className = null) + { + var line = new VisualElement + { + name = "RevisionLine" + }; + if (!String.IsNullOrEmpty(className)) + { + line.AddToClassList(className); + } + Add(line); + } + + private void AddNumber(int number) + { + Add(new Label + { + text = number.ToString(), + name = "RevisionIndex" + }); + } + + private string GetFormattedHeader(DateTime date) + { + string result = "Commits on " + date.ToString("MMM d"); + switch (date.Day) + { + case 1: + case 21: + case 31: + result += "st"; + break; + case 2: + case 22: + result += "nd"; + break; + case 3: + case 23: + result += "rd"; + break; + default: + result += "th"; + break; + } + return result; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta new file mode 100644 index 0000000..2659a3c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c737f7a9d78541d1ab25f28f045dd32 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs new file mode 100644 index 0000000..fad3b82 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs @@ -0,0 +1,69 @@ +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal class HistoryProgressSpinner : Image + { + private readonly Texture2D[] m_StatusWheelTextures; + private bool m_ProgressEnabled; + private IVisualElementScheduledItem m_Animation; + + public bool ProgressEnabled + { + set + { + if (m_ProgressEnabled == value) + return; + + m_ProgressEnabled = value; + visible = value; + + + if (value) + { + if (m_Animation == null) + { + m_Animation = this.schedule.Execute(AnimateProgress).Every(33); + } + else + { + m_Animation.Resume(); + } + } + else + { + if (m_Animation != null) + { + m_Animation.Pause(); + } + } + } + } + + public HistoryProgressSpinner() + { + m_StatusWheelTextures = new Texture2D[12]; + for (int i = 0; i < 12; i++) + { + m_StatusWheelTextures[i] = EditorGUIUtility.LoadIcon("WaitSpin" + i.ToString("00")); + } + image = m_StatusWheelTextures[0]; + style.width = m_StatusWheelTextures[0].width; + style.height = m_StatusWheelTextures[0].height; + visible = false; + } + + private void AnimateProgress(TimerState obj) + { + int frame = (int)Mathf.Repeat(Time.realtimeSinceStartup * 10, 11.99f); + image = m_StatusWheelTextures[frame]; + MarkDirtyRepaint(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta new file mode 100644 index 0000000..0ded4e8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf6aca931950a4a6a886e214e9e649c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs new file mode 100644 index 0000000..03239a3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using UnityEditor.Collaboration; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +#endif + +namespace UnityEditor.Collaboration +{ + internal interface ICollabHistoryItemFactory + { + IEnumerable GenerateElements(IEnumerable revsRevisions, int mTotalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta new file mode 100644 index 0000000..08e9085 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 821f5482c5a3f4389885f4432433f56f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs new file mode 100644 index 0000000..472a70e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +namespace UnityEditor.Collaboration +{ + internal interface IPagerData + { + int curPage { get; } + int totalPages { get; } + PageChangeAction OnPageChanged { get; } + } + + internal class PagerElement : VisualElement + { + IPagerData m_Data; + readonly Label m_PageText; + readonly Button m_DownButton; + readonly Button m_UpButton; + + public PagerElement(IPagerData dataSource) + { + m_Data = dataSource; + + this.style.flexDirection = FlexDirection.Row; + this.style.alignSelf = Align.Center; + + Add(m_DownButton = new Button(OnPageDownClicked) {text = "\u25c5 Newer"}); + m_DownButton.AddToClassList("PagerDown"); + + m_PageText = new Label(); + m_PageText.AddToClassList("PagerLabel"); + Add(m_PageText); + + Add(m_UpButton = new Button(OnPageUpClicked) {text = "Older \u25bb"}); + m_UpButton.AddToClassList("PagerUp"); + + UpdateControls(); + } + + void OnPageDownClicked() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "NewerPage"); + m_Data.OnPageChanged(m_Data.curPage - 1); + } + + void OnPageUpClicked() + { + CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "OlderPage"); + m_Data.OnPageChanged(m_Data.curPage + 1); + } + + public void Refresh() + { + UpdateControls(); + } + + void UpdateControls() + { + var curPage = m_Data.curPage; + var totalPages = m_Data.totalPages; + + m_PageText.text = (curPage + 1) + " / " + totalPages; + m_DownButton.SetEnabled(curPage > 0); + m_UpButton.SetEnabled(curPage < totalPages - 1); + } + } + + internal enum PagerLocation + { + Top, + Bottom, + } + + internal class PagedListView : VisualElement, IPagerData + { + public const int DefaultItemsPerPage = 10; + + readonly VisualElement m_ItemContainer; + readonly PagerElement m_PagerTop, m_PagerBottom; + int m_PageSize = DefaultItemsPerPage; + IEnumerable m_Items; + int m_TotalItems; + int m_CurPage; + + public int pageSize + { + set { m_PageSize = value; } + } + + public IEnumerable items + { + set + { + m_Items = value; + LayoutItems(); + } + } + + public int totalItems + { + set + { + if (m_TotalItems == value) + return; + + m_TotalItems = value; + UpdatePager(); + } + } + + public PageChangeAction OnPageChanged { get; set; } + + public PagedListView() + { + m_PagerTop = new PagerElement(this); + + m_ItemContainer = new VisualElement() + { + name = "PagerItems", + }; + Add(m_ItemContainer); + m_Items = new List(); + + m_PagerBottom = new PagerElement(this); + } + + void LayoutItems() + { + m_ItemContainer.Clear(); + foreach (var item in m_Items) + { + m_ItemContainer.Add(item); + } + } + + void UpdatePager() + { + if (m_PagerTop.parent != this && totalPages > 1 && curPage > 0) + Insert(0, m_PagerTop); + if (m_PagerTop.parent == this && (totalPages <= 1 || curPage == 0)) + Remove(m_PagerTop); + + if (m_PagerBottom.parent != this && totalPages > 1) + Add(m_PagerBottom); + if (m_PagerBottom.parent == this && totalPages <= 1) + Remove(m_PagerBottom); + + m_PagerTop.Refresh(); + m_PagerBottom.Refresh(); + } + + int pageCount + { + get + { + var pages = m_TotalItems / m_PageSize; + if (m_TotalItems % m_PageSize > 0) + pages++; + + return pages; + } + } + + public int curPage + { + get { return m_CurPage; } + set + { + m_CurPage = value; + UpdatePager(); + } + } + + public int totalPages + { + get + { + var extraPage = 0; + if (m_TotalItems % m_PageSize > 0) + extraPage = 1; + return m_TotalItems / m_PageSize + extraPage; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta new file mode 100644 index 0000000..565f7a2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50de529b6a28f4a7093045e08810a5df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs new file mode 100644 index 0000000..9b50e7a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs @@ -0,0 +1,88 @@ +using System; +using UnityEditor; +using UnityEngine; + +#if UNITY_2019_1_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.Experimental.UIElements; +using UnityEngine.Experimental.UIElements.StyleEnums; +#endif + +namespace UnityEditor.Collaboration +{ + internal class StatusView : VisualElement + { + Image m_Image; + Label m_Message; + Button m_Button; + Action m_Callback; + + public Texture icon + { + get { return m_Image.image; } + set + { + m_Image.image = value; + m_Image.visible = value != null; + // Until "display: hidden" is added, this is the only way to hide an element + m_Image.style.height = value != null ? 150 : 0; + } + } + + public string message + { + get { return m_Message.text; } + set + { + m_Message.text = value; + m_Message.visible = value != null; + } + } + + public string buttonText + { + get { return m_Button.text; } + set + { + m_Button.text = value; + UpdateButton(); + } + } + + public Action callback + { + get { return m_Callback; } + set + { + m_Callback = value; + UpdateButton(); + } + } + + public StatusView() + { + name = "StatusView"; + + this.StretchToParentSize(); + + m_Image = new Image() { name = "StatusIcon", visible = false, style = { height = 0f }}; + m_Message = new Label() { name = "StatusMessage", visible = false}; + m_Button = new Button(InternalCallaback) { name = "StatusButton", visible = false}; + + Add(m_Image); + Add(m_Message); + Add(m_Button); + } + + private void UpdateButton() + { + m_Button.visible = m_Button.text != null && m_Callback != null; + } + + private void InternalCallaback() + { + m_Callback(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta new file mode 100644 index 0000000..bb634b1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08e9894bdf0834710b22d3c0aa245ac0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta new file mode 100644 index 0000000..01229c2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6ab6fd2b91214e8a9c8ec2224a528de +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta new file mode 100644 index 0000000..0ff0382 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b1ae1e78552c459d9ce27048ff51c7f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss new file mode 100644 index 0000000..b20f08e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss @@ -0,0 +1,259 @@ +.unity-button { + min-height:0; + -unity-text-align:middle-center; + margin-left:4px; + margin-top:3px; + margin-right:4px; + margin-bottom:3px; + border-left-width:6px; + border-top-width:4px; + border-right-width:6px; + border-bottom-width:4px; + padding-left:6px; + padding-top:2px; + padding-right:6px; + padding-bottom:3px; +} + +.unity-label { + overflow: hidden; + margin-left:4px; + margin-top:2px; + margin-right:4px; + margin-bottom:2px; + padding-left:2px; + padding-top:1px; + min-height: 0; +} + +#HistoryContainer { + flex: 1 0 0; +} + +#HistoryItem { + flex: 1 0 0; + flex-direction: row; +} + +#HistoryDetail { + margin-top: 10px; + margin-left: 10px; + margin-bottom: 10px; + margin-right: 10px; + padding-top: 4px; + flex: 1 0 0; +} + +#Author { + -unity-font-style: bold; + font-size: 12px; +} + +#HistoryDetail > Button { + align-self: flex-end; +} + +CollabHistoryRevisionLine { + width: 40px; +} + +#RevisionLine { + flex: 1 0 0; + margin-left: 35px; + width: 1.5px; +} + +#RevisionLine.topLine { + height: 20px; + flex: 0 0 auto; +} + +#RevisionLine.absentDateLine { + background-color: #797676; +} + +.absentRevision #RevisionLine { + background-color: #797676; +} + +.currentRevision #RevisionLine.topLine { + background-color: #797676; +} + +#RevisionIndex { + position: absolute; + min-width: 23px; + -unity-text-align: middle-right; + top: 15.8px; + font-size: 9px; +} + +#RevisionIndicator { + position: absolute; + background-color: #000; + border-radius: 3px; + width: 8px; + height: 8px; + border-bottom-width: 2px; + border-left-width: 2px; + border-right-width: 2px; + border-top-width: 2px; + top: 20px; + left: 32px; +} + +.revisionLineHeader { + width: 200px; + height: 20px; +} + +.revisionLineHeader > .unity-label { + position: absolute; + margin-left: 47px; + margin-top: 3px; +} + +#PagerItems { + flex-direction: column; +} + +PagerElement > .unity-label { + margin-top: 8px; +} + +.absentRevision #RevisionIndicator { + border-color: #797676; +} + +.absentRevision #RevisionIndex { + color: #797676; +} + +.currentRevision #HistoryDetail { + border-top-width: 2px; +} + +#HistoryItem #RevisionDescription { + white-space: normal; +} + +#HistoryItem #ToggleDescription { + align-self: flex-start; + padding-top: 0; + padding-left: 0; + padding-right: 0; + padding-bottom: 2px; +} + +#HistoryItem #ActionButton { + position: absolute; + right: 0; +} + +#HistoryItem #BuildIcon { + width: 16px; + height: 13px; +} + +#HistoryItemActionsTray { + flex: 1 0 0; + flex-direction: row; + align-items: center; + height: 38px; + margin-left: 10px; + margin-right: 10px; +} + +CollabHistoryDropDown { + border-top-width: 1px; +} + +CollabHistoryDropDown > .unity-label { + padding-top: 10px; + padding-bottom: 10px; +} + +CollabHistoryDropDownItem { + flex-direction: row; + border-top-width: 1px; + overflow: hidden; +} + +#FileIcon { + align-self: center; + width: 26px; + height: 26px; +} + +#FileName { + -unity-font-style: bold; + padding-bottom: 0; + margin-bottom: 0; +} + +#FileIcon { + padding-top: 0; + margin-top: 0; +} + +#ErrorBar { + height: 24px; + background-color: #ff0000; + color: #000; + font-size: 12px; +} + +#ErrorBar > #CloseButton { + position: absolute; + right: 0; + top: 0; + width: 24px; + height: 24px; + color: #000; + font-size: 18px; + -unity-font-style: bold; +} + +#StatusView { + flex-direction: column; + justify-content: center; + align-self: center; + align-items: center; + flex: 1 0 0; +} + +#StatusView > #StatusIcon { + width: 115px; + height: 150px; +} + +#StatusView > #StatusMessage { + font-size: 22px; + width: 230px; + white-space: normal; + -unity-text-align: middle-center; +} + +#StatusView > #StatusButton { + font-size: 12px; + margin-top: 20px; + background-image: none; + width: 108px; + height: 29px; +} + +BuildStatusButton.unity-button { + flex-direction: row; + align-self: flex-end; + align-items: center; + margin-right: 10px; + padding-left:0; + padding-top:0; + padding-right:0; + padding-bottom:0; +} + +BuildStatusButton.unity-button .unity-label { + padding-left: 2px; +} + diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta new file mode 100644 index 0000000..035b662 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3a2d94c8977984b67984caeff9fa666e +ScriptedImporter: + fileIDToRecycleName: + 11400000: stylesheet + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss new file mode 100644 index 0000000..de436f8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss @@ -0,0 +1,86 @@ +#HistoryContainer { + background-color: #292929; +} + +.obtainedRevision #HistoryDetail { + background-color: #333; +} + +.absentRevision #HistoryDetail { + background-color: #595959; +} + +#StatusView { + background-color: #292929; +} + +#StatusView > #StatusMessage { + color: #959995; +} + +BuildStatusButton.unity-button { + color: #B4B4B4; + background-image: resource("Builtin Skins/DarkSkin/Images/btn.png"); +} + +BuildStatusButton.unity-button:hover { + color: #FFF; +} + +BuildStatusButton.unity-button:hover:active { + background-image: resource("Builtin Skins/DarkSkin/Images/btn act.png"); +} + +BuildStatusButton.unity-button:checked { + color: #F0F0F0; + background-image: resource("Builtin Skins/DarkSkin/Images/btn on.png"); +} + +BuildStatusButton.unity-button:hover:checked { + color: #FFF; +} + +BuildStatusButton.unity-button:hover:active:checked { + background-image: resource("Builtin Skins/DarkSkin/Images/btn onact.png"); +} + +BuildStatusButton.unity-button:focus:checked { + background-image: resource("Builtin Skins/DarkSkin/Images/btn on focus.png"); +} + +CollabHistoryDropDown { + border-color: #292929; +} + +CollabHistoryDropDownItem { + border-color: #292929; +} + +#RevisionLine.obtainedDateLine { + background-color: #0cb4cc; +} + +.obtainedRevision #RevisionLine { + background-color: #0cb4cc; +} + +#RevisionIndex { + color: #0cb4cc; +} + +#RevisionIndicator { + border-color: #0cb4cc; +} + +.currentRevision #RevisionIndicator { + background-color: #0cb4cc; +} + +.currentRevision #HistoryDetail { + border-color: #0cb4cc; +} + +#StatusView > #StatusButton { + background-color: #0cb4cc; + border-color: #0cb4cc; +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta new file mode 100644 index 0000000..35a7d09 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 70d4d75a2877243758b0750cbc75b6eb +ScriptedImporter: + fileIDToRecycleName: + 11400000: stylesheet + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss new file mode 100644 index 0000000..3f9b85f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss @@ -0,0 +1,86 @@ +#HistoryContainer { + background-color: #a2a2a2; +} + +.obtainedRevision #HistoryDetail { + background-color: #c2c2c2; +} + +.absentRevision #HistoryDetail { + background-color: #dedede; +} + +#StatusView { + background-color: #a2a2a3; +} + +#StatusView > #StatusMessage { + color: #000; +} + +BuildStatusButton.unity-button { + color: #111; + background-image: resource("Builtin Skins/LightSkin/Images/btn.png"); +} + +BuildStatusButton.unity-button:hover { + color: #000; +} + +BuildStatusButton.unity-button:hover:active { + background-image: resource("Builtin Skins/LightSkin/Images/btn act.png"); +} + +BuildStatusButton.unity-button:checked { + color: #F0F0F0; + background-image: resource("Builtin Skins/LightSkin/Images/btn on.png"); +} + +BuildStatusButton.unity-button:hover:checked { + color: #000; +} + +BuildStatusButton.unity-button:hover:active:checked { + background-image: resource("Builtin Skins/LightSkin/Images/btn onact.png"); +} + +BuildStatusButton.unity-button:focus:checked { + background-image: resource("Builtin Skins/LightSkin/Images/btn on focus.png"); +} + +CollabHistoryDropDown { + border-color: #a2a2a2; +} + +CollabHistoryDropDownItem { + border-color: #a2a2a2; +} + +#RevisionLine.obtainedDateLine { + background-color: #018d98; +} + +.obtainedRevision #RevisionLine { + background-color: #018d98; +} + +#RevisionIndex { + color: #018d98; +} + +#RevisionIndicator { + border-color: #018d98; +} + +.currentRevision #RevisionIndicator { + background-color: #018d98; +} + +.currentRevision #HistoryDetail { + border-color: #018d98; +} + +#StatusView > #StatusButton { + background-color: #018d98; + border-color: #018d98; +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta new file mode 100644 index 0000000..28c860e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b52bde26a83564960bcb90217f72b910 +ScriptedImporter: + fileIDToRecycleName: + 11400000: stylesheet + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef new file mode 100644 index 0000000..66511e1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef @@ -0,0 +1,7 @@ +{ + "name": "Unity.CollabProxy.Editor", + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta new file mode 100644 index 0000000..03ebeca --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 645165c8169474bfbbeb8fb0bcfd26f5 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md new file mode 100644 index 0000000..31bde4e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md @@ -0,0 +1,31 @@ +**Unity Companion Package License v1.0 ("_License_")** + +Copyright © 2017 Unity Technologies ApS ("**_Unity_**") + +Unity hereby grants to you a worldwide, non-exclusive, no-charge, and royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute the software that is made available with this License ("**_Software_**"), subject to the following terms and conditions: + +1. *Unity Companion Use Only*. Exercise of the license granted herein is limited to exercise for the creation, use, and/or distribution of applications, software, or other content pursuant to a valid Unity development engine software license ("**_Engine License_**"). That means while use of the Software is not limited to use in the software licensed under the Engine License, the Software may not be used for any purpose other than the creation, use, and/or distribution of Engine License-dependent applications, software, or other content. No other exercise of the license granted herein is permitted. + +1. *No Modification of Engine License*. Neither this License nor any exercise of the license granted herein modifies the Engine License in any way. + +1. *Ownership & Grant Back to You*. + + 3.1. You own your content. In this License, "derivative works" means derivatives of the Software itself--works derived only from the Software by you under this License (for example, modifying the code of the Software itself to improve its efficacy); “derivative works” of the Software do not include, for example, games, apps, or content that you create using the Software. You keep all right, title, and interest to your own content. + + 3.2. Unity owns its content. While you keep all right, title, and interest to your own content per the above, as between Unity and you, Unity will own all right, title, and interest to all intellectual property rights (including patent, trademark, and copyright) in the Software and derivative works of the Software, and you hereby assign and agree to assign all such rights in those derivative works to Unity. + + 3.3. You have a license to those derivative works. Subject to this License, Unity grants to you the same worldwide, non-exclusive, no-charge, and royalty-free copyright license to derivative works of the Software you create as is granted to you for the Software under this License. + +1. *Trademarks*. You are not granted any right or license under this License to use any trademarks, service marks, trade names, products names, or branding of Unity or its affiliates ("**_Trademarks_**"). Descriptive uses of Trademarks are permitted; see, for example, Unity’s Branding Usage Guidelines at [https://unity3d.com/public-relations/brand](https://unity3d.com/public-relations/brand). + +1. *Notices & Third-Party Rights*. This License, including the copyright notice above, must be provided in all substantial portions of the Software and derivative works thereof (or, if that is impracticable, in any other location where such notices are customarily placed). Further, if the Software is accompanied by a Unity "third-party notices" or similar file, you acknowledge and agree that software identified in that file is governed by those separate license terms. + +1. *DISCLAIMER, LIMITATION OF LIABILITY*. THE SOFTWARE AND ANY DERIVATIVE WORKS THEREOF IS PROVIDED ON AN "AS IS" BASIS, AND IS PROVIDED WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND/OR NONINFRINGEMENT. IN NO EVENT SHALL ANY COPYRIGHT HOLDER OR AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES (WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL, INCLUDING PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, AND BUSINESS INTERRUPTION), OR OTHER LIABILITY WHATSOEVER, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM OR OUT OF, OR IN CONNECTION WITH, THE SOFTWARE OR ANY DERIVATIVE WORKS THEREOF OR THE USE OF OR OTHER DEALINGS IN SAME, EVEN WHERE ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +1. *USE IS ACCEPTANCE and License Versions*. Your receipt and use of the Software constitutes your acceptance of this License and its terms and conditions. Software released by Unity under this License may be modified or updated and the License with it; upon any such modification or update, you will comply with the terms of the updated License for any use of any of the Software under the updated License. + +1. *Use in Compliance with Law and Termination*. Your exercise of the license granted herein will at all times be in compliance with applicable law and will not infringe any proprietary rights (including intellectual property rights); this License will terminate immediately on any breach by you of this License. + +1. *Severability*. If any provision of this License is held to be unenforceable or invalid, that provision will be enforced to the maximum extent possible and the other provisions will remain in full force and effect. + +1. *Governing Law and Venue*. This License is governed by and construed in accordance with the laws of Denmark, except for its conflict of laws rules; the United Nations Convention on Contracts for the International Sale of Goods will not apply. If you reside (or your principal place of business is) within the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the state and federal courts located in San Francisco County, California concerning any dispute arising out of this License ("**_Dispute_**"). If you reside (or your principal place of business is) outside the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the courts located in Copenhagen, Denmark concerning any Dispute. diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta new file mode 100644 index 0000000..30f5c3a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c754112a02f354a6696fa4f2b99e95a5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md new file mode 100644 index 0000000..5cfbd88 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md @@ -0,0 +1,16 @@ +# Collab Proxy UPM Package +This is the packaged version of Collab, currently limited to containing the History and Toolbar windows, along with supporting classes. + +## Development +Check this repository out in your {$PROJECT}/Packages/ folder, under the name com.unity.collab-proxy. The classes will be built by Unity. + +## Testing +In order to run the tests, you will need to add this project to the testables key in your manifest.json - once you have done this, the tests will be picked up by the Unity Test Runner window. + +## Building +You may build this project using msbuild. The commands to do so can be seen under .gitlab-ci.yml. + +## Deploying +Gitlab will automatically build your project when you deploy. You can download the resulting artifact, which will be a dll, and place it in your Editor/bin/ folder. Open the package in Unity to generate the meta files, and then you will be able to publish. + +We're currently looking into a way to avoid this manual process. diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta new file mode 100644 index 0000000..b3ad993 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ac281230df7b14becb40b3c479f1b429 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta new file mode 100644 index 0000000..f43ddd3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1369382d2c5e64dc5b2ec0b6b0a94531 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta new file mode 100644 index 0000000..b80cefd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4506ac79f5b274cb1b249ed7f4abfb9a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs new file mode 100644 index 0000000..ba79a20 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs @@ -0,0 +1,583 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor.Collaboration; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityEditor.Collaboration.Tests +{ + [TestFixture] + internal class HistoryTests + { + private TestHistoryWindow _window; + private TestRevisionsService _service; + private CollabHistoryPresenter _presenter; + + [SetUp] + public void SetUp() + { + _window = new TestHistoryWindow(); + _service = new TestRevisionsService(); + _presenter = new CollabHistoryPresenter(_window, new CollabHistoryItemFactory(), _service); + } + + [TearDown] + public void TearDown() + { + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__PropagatesRevisionResult() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(authorName: "authorName", comment: "comment", revisionID: "revisionID"), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual("revisionID", item.id); + Assert.AreEqual("authorName", item.authorName); + Assert.AreEqual("comment", item.comment); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingIsInOrder() + { + _service.result = new RevisionsResult() + { + RevisionsInRepo = 4, + Revisions = new List() + { + new Revision(revisionID: "0"), + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + } + }; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.AreEqual(4, items[0].index); + Assert.AreEqual(3, items[1].index); + Assert.AreEqual(2, items[2].index); + Assert.AreEqual(1, items[3].index); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__RevisionNumberingChangesForMorePages() + { + _service.result = new RevisionsResult() + { + RevisionsInRepo = 12, + Revisions = new List() + { + new Revision(revisionID: "0"), + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + new Revision(revisionID: "4"), + } + }; + + _presenter.OnUpdatePage(1); + var items = _window.items.ToArray(); + + Assert.AreEqual(12, items[0].index); + Assert.AreEqual(11, items[1].index); + Assert.AreEqual(10, items[2].index); + Assert.AreEqual(9, items[3].index); + Assert.AreEqual(8, items[4].index); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ObtainedIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(isObtained: false), + new Revision(isObtained: true), + } + }; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.IsFalse(items[0].obtained); + Assert.IsTrue(items[1].obtained); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__CurrentIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + } + }; + _service.tipRevision = "2"; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.AreEqual(false, items[0].current); + Assert.AreEqual(true, items[1].current); + Assert.AreEqual(false, items[2].current); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__InProgressIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "1"), + new Revision(revisionID: "2"), + new Revision(revisionID: "3"), + } + }; + _window.inProgressRevision = "2"; + + _presenter.OnUpdatePage(0); + var items = _window.items.ToArray(); + + Assert.IsFalse(items[0].inProgress); + Assert.IsTrue(items[1].inProgress); + Assert.IsFalse(items[2].inProgress); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__EnabledIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _window.revisionActionsEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(true, item.enabled); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__DisabledIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _window.revisionActionsEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(false, item.enabled); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenNotTip() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "1"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.None, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateTipHasNoneWhenEnabled() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.None, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenTip() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Configure, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasConfigureWhenZeroBuildStatus() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = false; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Configure, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasNoneWhenZeroBuildStatuses() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0"), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.None, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasSuccessWhenCompleteAndSucceeded() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[1] + { + new CloudBuildStatus(complete: true, success: true), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Success, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasInProgress() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[1] + { + new CloudBuildStatus(complete: false), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.InProgress, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailure() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[1] + { + new CloudBuildStatus(complete: true, success: false), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Failed, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__BuildStateHasFailureWhenAnyBuildsFail() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + revisionID: "0", + buildStatuses: new CloudBuildStatus[3] + { + new CloudBuildStatus(complete: true, success: false), + new CloudBuildStatus(complete: true, success: false), + new CloudBuildStatus(complete: true, success: true), + } + ), + } + }; + _service.tipRevision = "0"; + _presenter.BuildServiceEnabled = true; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(BuildState.Failed, item.buildState); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ChangesPropagateThrough() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0", entries: GenerateChangeActions(3)), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + var changes = item.changes.ToList(); + + Assert.AreEqual("Path0", changes[0].path); + Assert.AreEqual("Path1", changes[1].path); + Assert.AreEqual("Path2", changes[2].path); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ChangesTotalIsCalculated() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0", entries: GenerateChangeActions(3)), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(3, item.changes.Count); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__ChangesTruncatedIsCalculated() + { + for (var i = 0; i < 20; i++) + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(revisionID: "0", entries: GenerateChangeActions(i)), + } + }; + + _presenter.OnUpdatePage(0); + var item = _window.items.First(); + + Assert.AreEqual(i > 10, item.changesTruncated); + } + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__OnlyKeeps10ChangeActions() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision(authorName: "Test", author: "test", entries: GenerateChangeActions(12)), + } + }; + + _presenter.OnUpdatePage(1); + var item = _window.items.First(); + + Assert.AreEqual(10, item.changes.Count); + Assert.AreEqual(12, item.changesTotal); + Assert.AreEqual(true, item.changesTruncated); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__DeduplicatesMetaFiles() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + authorName: "Test", + author: "test", + revisionID: "", + entries: new ChangeAction[2] + { + new ChangeAction(path: "Path1", action: "Action1"), + new ChangeAction(path: "Path1.meta", action: "Action1"), + } + ), + } + }; + + _presenter.OnUpdatePage(1); + var item = _window.items.First(); + + Assert.AreEqual(1, item.changes.Count); + Assert.AreEqual(1, item.changesTotal); + Assert.AreEqual("Path1", item.changes.First().path); + } + + [Test] + public void CollabHistoryPresenter_OnUpdatePage__FolderMetaFilesAreCounted() + { + _service.result = new RevisionsResult() + { + Revisions = new List() + { + new Revision + ( + authorName: "Test", + author: "test", + entries: new ChangeAction[1] + { + new ChangeAction(path: "Folder1.meta", action: "Action1"), + } + ), + } + }; + + _presenter.OnUpdatePage(1); + var item = _window.items.First(); + + Assert.AreEqual(1, item.changes.Count); + Assert.AreEqual(1, item.changesTotal); + Assert.AreEqual("Folder1", item.changes.First().path); + } + + private static ChangeAction[] GenerateChangeActions(int count) + { + var entries = new ChangeAction[count]; + for (var i = 0; i < count; i++) + entries[i] = new ChangeAction(path: "Path" + i, action: "Action" + i); + return entries; + } + } + + internal class TestRevisionsService : IRevisionsService + { + public RevisionsResult result; + public event RevisionsDelegate FetchRevisionsCallback; + + public string tipRevision { get; set; } + public string currentUser { get; set; } + + public void GetRevisions(int offset, int count) + { + if(FetchRevisionsCallback != null) + { + FetchRevisionsCallback(result); + } + } + } + + internal class TestHistoryWindow : ICollabHistoryWindow + { + public IEnumerable items; + + public bool revisionActionsEnabled { get; set; } + public int itemsPerPage { get; set; } + public string errMessage { get; set; } + public string inProgressRevision { get; set; } + public PageChangeAction OnPageChangeAction { get; set; } + public RevisionAction OnGoBackAction { get; set; } + public RevisionAction OnUpdateAction { get; set; } + public RevisionAction OnRestoreAction { get; set; } + public ShowBuildAction OnShowBuildAction { get; set; } + public Action OnShowServicesAction { get; set; } + + public void UpdateState(HistoryState state, bool force) + { + } + + public void UpdateRevisions(IEnumerable items, string tip, int totalRevisions, int currPage) + { + this.items = items; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta new file mode 100644 index 0000000..d648a7f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23a56a19774ed42b6b65646af08a003c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef new file mode 100644 index 0000000..3467a9e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef @@ -0,0 +1,13 @@ +{ + "name": "Unity.CollabProxy.EditorTests", + "references": [ + "Unity.CollabProxy.Editor" + ], + "optionalUnityReferences": [ + "TestAssemblies" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta new file mode 100644 index 0000000..57db5c7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 782de34c17796430ba8d0ceddb60944e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json new file mode 100644 index 0000000..3402274 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json @@ -0,0 +1,21 @@ +{ + "name": "com.unity.collab-proxy", + "displayName": "Unity Collaborate", + "version": "1.2.16", + "unity": "2018.3", + "description": "Collaborate is a simple way for teams to save, share, and sync their Unity project", + "keywords": [ + "collab", + "collaborate", + "teams", + "team", + "cloud", + "backup" + ], + "dependencies": {}, + "repository": { + "type": "git", + "url": "https://gitlab.cds.internal.unity3d.com/upm-packages/cloud-services/collab-proxy.git", + "revision": "070e173b6a36e1d6097b1d95e09c08840c23f6ca" + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta new file mode 100644 index 0000000..c52d0c6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57b0c806ba25b48aa8a6ecb3345a4a9b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/.gitlab-ci.yml b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/.gitlab-ci.yml new file mode 100644 index 0000000..4c64e22 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/.gitlab-ci.yml @@ -0,0 +1,15 @@ +image: node:6.10.0 + +stages: + - push_to_packman_staging + +push_to_packman_staging: + stage: push_to_packman_staging + only: + - tags + script: + - sed -i "s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g" package.json + - sed -i "s/PLACEHOLDERSHA/$CI_COMMIT_SHA/g" package.json + - sed -i "s/0.0.1-PLACEHOLDERVERSION/$CI_COMMIT_TAG/g" CHANGELOG.md + - curl -u $USER_NAME:$API_KEY https://staging-packages.unity.com/auth > .npmrc + - npm publish diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/CHANGELOG.md b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/CHANGELOG.md new file mode 100644 index 0000000..cb44f2c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog +## [1.0.5] - 2020-11-04 +- Removed pdb files + +## [1.0.4] - 2020-11-03 +- Added the portable-pdb (DSTR-37) + +## [1.0.3] - 2020-10-30 +- Fixed being able to load mdb or portable-pdb symbolsbug (DSTR-37) +- Minimum unity version updated (case 1279253) + +## [1.0.2] - 2019-12-04 + +- Added missed metafiles + +## [0.0.1] - 2019-02-21 + +### This is the first release of *Unity Package com.unity.ext.nunit*. + +- Migrated the custom version of nunit from inside of unity. diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/CHANGELOG.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/CHANGELOG.md.meta new file mode 100644 index 0000000..d91fbde --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f49bbe06ffa5ae24abe32abdab430c24 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/Documentation~/ext.nunit.md b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/Documentation~/ext.nunit.md new file mode 100644 index 0000000..2a38b9d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/Documentation~/ext.nunit.md @@ -0,0 +1,6 @@ +# Custom Nunit build to work with Unity + +This version of nunit works with all platforms, il2cpp and Mono AOT. + +For Nunit Documentation: +https://github.com/nunit/docs/wiki/NUnit-Documentation diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/LICENSE.md b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/LICENSE.md new file mode 100644 index 0000000..ccc1f59 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) 2018 Charlie Poole, Rob Prouse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/LICENSE.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/LICENSE.md.meta new file mode 100644 index 0000000..90df748 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f91a00d2dca52b843b2d50ccf750737d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/README.md b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/README.md new file mode 100644 index 0000000..2a38b9d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/README.md @@ -0,0 +1,6 @@ +# Custom Nunit build to work with Unity + +This version of nunit works with all platforms, il2cpp and Mono AOT. + +For Nunit Documentation: +https://github.com/nunit/docs/wiki/NUnit-Documentation diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/README.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/README.md.meta new file mode 100644 index 0000000..e9a7f9f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5da62a0c1c5218c4aa16b74546a7822d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35.meta new file mode 100644 index 0000000..278a2fa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a36d8b72880a8004f96ac54ce4598ff9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom.meta new file mode 100644 index 0000000..750f82c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2347243c7aa3e224f9282dc94e6fc3b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom/nunit.framework.dll b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom/nunit.framework.dll new file mode 100644 index 0000000..ac346cb Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom/nunit.framework.dll differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom/nunit.framework.dll.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom/nunit.framework.dll.meta new file mode 100644 index 0000000..e5b5fe5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/net35/unity-custom/nunit.framework.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f1605f5534186904fa2c4c42acbfe01e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/package.json b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/package.json new file mode 100644 index 0000000..16e4b88 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/package.json @@ -0,0 +1,24 @@ +{ + "displayName": "Custom NUnit", + "name": "com.unity.ext.nunit", + "version": "1.0.5", + "unity": "2019.2", + "description": "Custom version of the nunit package build to work with Unity. Used by the Unity Test Framework.", + "keywords": [ + "nunit", + "unittest", + "test" + ], + "category": "Libraries", + "repository": { + "url": "https://github.cds.internal.unity3d.com/unity/com.unity.ext.nunit.git", + "type": "git", + "revision": "1b3e542964a65210e966f5bf8751f62b1dcd8d69" + }, + "relatedPackages": { + "com.unity.ext.nunit.tests": "1.0.5" + }, + "upmCi": { + "footprint": "b328f519a06bcacb01a806505afddd34ca2247e2" + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/package.json.meta b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/package.json.meta new file mode 100644 index 0000000..ad88492 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ext.nunit@1.0.5/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8143d3a8390f2c64685e3bc272bd9e90 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig new file mode 100644 index 0000000..aca1979 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig @@ -0,0 +1,6 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md new file mode 100644 index 0000000..c93c873 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md @@ -0,0 +1,74 @@ +# Code Editor Package for Rider + +## [1.1.4] - 2019-11-21 + +fix warning - unreachable code + + +## [1.1.3] - 2019-10-17 + + - Update External Editor, when new toolbox build was installed + - Add xaml to default list of extensions to include in csproj + - Avoid initializing Rider package in secondary Unity process, which does Asset processing + - Reflect multiple csc.rsp arguments to generated csproj files: https://github.com/JetBrains/resharper-unity/issues/1337 + - Setting, which allowed to override LangVersion removed in favor of langversion in csc.rsp + - Environment.NewLine is used in generated project files instead of Windows line separator. + +## [1.1.2] - 2019-09-18 + +performance optimizations: + - avoid multiple evaluations + - avoid reflection in DisableSyncSolutionOnceCallBack + - project generation optimization +fixes: + - avoid compilation error with incompatible `Test Framework` package + +## [1.1.1] - 2019-08-26 + +parse nowarn in csc.rsp +warning, when Unity was started from Rider, but external editor was different +improved unit test support +workaround to avoid Unity internal project-generation (fix #28) + + +## [1.1.0] - 2019-07-02 + +new setting to manage list of extensions to be opened with Rider +avoid breaking everything on any unhandled exception in RiderScriptEditor cctor +hide Rider settings, when different Editor is selected +dynamically load only newer rider plugins +path detection (work on unix symlinks) +speed up for project generation +lots of bug fixing + +## [1.0.8] - 2019-05-20 + +Fix NullReferenceException when External editor was pointing to non-existing Rider everything was broken by null-ref. + +## [1.0.7] - 2019-05-16 + +Initial migration steps from rider plugin to package. +Fix OSX check and opening of files. + +## [1.0.6] - 2019-04-30 + +Ensure asset database is refreshed when generating csproj and solution files. + +## [1.0.5] - 2019-04-27 + +Add support for generating all csproj files. + +## [1.0.4] - 2019-04-18 + +Fix relative package paths. +Fix opening editor on mac. + +## [1.0.3] - 2019-04-12 + +Fixing null reference issue for callbacks to Asset pipeline. + +## [1.0.2] - 2019-01-01 + +### This is the first release of *Unity Package rider_editor*. + +Using the newly created api to integrate Rider with Unity. diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta new file mode 100644 index 0000000..344cac5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8645aa9c3c74fb34ba9499e14fb332b5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md new file mode 100644 index 0000000..576d096 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing + +## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement) +By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions. + +## Once you have a change ready following these ground rules. Simply make a pull request \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta new file mode 100644 index 0000000..81c20c6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5e83f8baac96eaa47bdd9ca781cd2002 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md new file mode 100644 index 0000000..9ddd634 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md @@ -0,0 +1,4 @@ +# Code Editor Package for Rider + +This package is not intended to be modified by users. +Nor does it provide any api intended to be included in user projects. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md new file mode 100644 index 0000000..eb18dfb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Unity Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta new file mode 100644 index 0000000..be2f8e6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5598b14661b5f4c43bed757f34b6d172 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta new file mode 100644 index 0000000..cf6222d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9129183a42052cd43b9c284d6dbd541e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta new file mode 100644 index 0000000..49130a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b393f6b29a9ee84c803af1ab4944b71 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs new file mode 100644 index 0000000..6c04ea3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs @@ -0,0 +1,457 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using JetBrains.Annotations; +using Microsoft.Win32; +using Unity.CodeEditor; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public interface IDiscovery + { + CodeEditor.Installation[] PathCallback(); + } + + public class Discovery : IDiscovery + { + public CodeEditor.Installation[] PathCallback() + { + return RiderPathLocator.GetAllRiderPaths() + .Select(riderInfo => new CodeEditor.Installation + { + Path = riderInfo.Path, + Name = riderInfo.Presentation + }) + .OrderBy(a=>a.Name) + .ToArray(); + } + } + + /// + /// This code is a modified version of the JetBrains resharper-unity plugin listed here: + /// https://github.com/JetBrains/resharper-unity/blob/master/unity/JetBrains.Rider.Unity.Editor/EditorPlugin/RiderPathLocator.cs + /// + public static class RiderPathLocator + { +#if !(UNITY_4_7 || UNITY_5_5) + [UsedImplicitly] // Used in com.unity.ide.rider + public static RiderInfo[] GetAllRiderPaths() + { + try + { + switch (SystemInfo.operatingSystemFamily) + { + case OperatingSystemFamily.Windows: + { + return CollectRiderInfosWindows(); + } + + case OperatingSystemFamily.MacOSX: + { + return CollectRiderInfosMac(); + } + + case OperatingSystemFamily.Linux: + { + return CollectAllRiderPathsLinux(); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + + return new RiderInfo[0]; + } +#endif + +#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider + internal static RiderInfo[] GetAllFoundInfos(OperatingSystemFamilyRider operatingSystemFamily) + { + try + { + switch (operatingSystemFamily) + { + case OperatingSystemFamilyRider.Windows: + { + return CollectRiderInfosWindows(); + } + case OperatingSystemFamilyRider.MacOSX: + { + return CollectRiderInfosMac(); + } + case OperatingSystemFamilyRider.Linux: + { + return CollectAllRiderPathsLinux(); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + + return new RiderInfo[0]; + } + + internal static string[] GetAllFoundPaths(OperatingSystemFamilyRider operatingSystemFamily) + { + return GetAllFoundInfos(operatingSystemFamily).Select(a=>a.Path).ToArray(); + } +#endif + + private static RiderInfo[] CollectAllRiderPathsLinux() + { + var installInfos = new List(); + var home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + { + var toolboxRiderRootPath = GetToolboxBaseDir(); + installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false) + .Select(a => new RiderInfo(a, true)).ToList()); + + //$Home/.local/share/applications/jetbrains-rider.desktop + var shortcut = new FileInfo(Path.Combine(home, @".local/share/applications/jetbrains-rider.desktop")); + + if (shortcut.Exists) + { + var lines = File.ReadAllLines(shortcut.FullName); + foreach (var line in lines) + { + if (!line.StartsWith("Exec=\"")) + continue; + var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault(); + if (string.IsNullOrEmpty(path)) + continue; + + if (installInfos.Any(a => a.Path == path)) // avoid adding similar build as from toolbox + continue; + installInfos.Add(new RiderInfo(path, false)); + } + } + } + + // snap install + var snapInstallPath = "/snap/rider/current/bin/rider.sh"; + if (new FileInfo(snapInstallPath).Exists) + installInfos.Add(new RiderInfo(snapInstallPath, false)); + + return installInfos.ToArray(); + } + + private static RiderInfo[] CollectRiderInfosMac() + { + var installInfos = new List(); + // "/Applications/*Rider*.app" + var folder = new DirectoryInfo("/Applications"); + if (folder.Exists) + { + installInfos.AddRange(folder.GetDirectories("*Rider*.app") + .Select(a => new RiderInfo(a.FullName, false)) + .ToList()); + } + + // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app + var toolboxRiderRootPath = GetToolboxBaseDir(); + var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true) + .Select(a => new RiderInfo(a, true)); + installInfos.AddRange(paths); + + return installInfos.ToArray(); + } + + private static RiderInfo[] CollectRiderInfosWindows() + { + var installInfos = new List(); + var toolboxRiderRootPath = GetToolboxBaseDir(); + var installPathsToolbox = CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider64.exe", false).ToList(); + installInfos.AddRange(installPathsToolbox.Select(a => new RiderInfo(a, true)).ToList()); + + var installPaths = new List(); + const string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; + CollectPathsFromRegistry(registryKey, installPaths); + const string wowRegistryKey = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; + CollectPathsFromRegistry(wowRegistryKey, installPaths); + + installInfos.AddRange(installPaths.Select(a => new RiderInfo(a, false)).ToList()); + + return installInfos.ToArray(); + } + + private static string GetToolboxBaseDir() + { + switch (SystemInfo.operatingSystemFamily) + { + case OperatingSystemFamily.Windows: + { + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + return Path.Combine(localAppData, @"JetBrains\Toolbox\apps\Rider"); + } + + case OperatingSystemFamily.MacOSX: + { + var home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + { + return Path.Combine(home, @"Library/Application Support/JetBrains/Toolbox/apps/Rider"); + } + break; + } + + case OperatingSystemFamily.Linux: + { + var home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + { + return Path.Combine(home, @".local/share/JetBrains/Toolbox/apps/Rider"); + } + break; + } + } + return string.Empty; + } + + internal static string GetBuildNumber(string path) + { + var file = new FileInfo(Path.Combine(path, GetRelativePathToBuildTxt())); + if (!file.Exists) + return string.Empty; + var text = File.ReadAllText(file.FullName); + if (text.Length > 3) + return text.Substring(3); + return string.Empty; + } + + internal static bool IsToolbox(string path) + { + return path.StartsWith(GetToolboxBaseDir()); + } + + private static string GetRelativePathToBuildTxt() + { + switch (SystemInfo.operatingSystemFamily) + { + case OperatingSystemFamily.Windows: + case OperatingSystemFamily.Linux: + return "../../build.txt"; + case OperatingSystemFamily.MacOSX: + return "Contents/Resources/build.txt"; + } + throw new Exception("Unknown OS"); + } + + private static void CollectPathsFromRegistry(string registryKey, List installPaths) + { + using (var key = Registry.LocalMachine.OpenSubKey(registryKey)) + { + if (key == null) return; + foreach (var subkeyName in key.GetSubKeyNames().Where(a => a.Contains("Rider"))) + { + using (var subkey = key.OpenSubKey(subkeyName)) + { + var folderObject = subkey?.GetValue("InstallLocation"); + if (folderObject == null) continue; + var folder = folderObject.ToString(); + var possiblePath = Path.Combine(folder, @"bin\rider64.exe"); + if (File.Exists(possiblePath)) + installPaths.Add(possiblePath); + } + } + } + } + + private static string[] CollectPathsFromToolbox(string toolboxRiderRootPath, string dirName, string searchPattern, + bool isMac) + { + if (!Directory.Exists(toolboxRiderRootPath)) + return new string[0]; + + var channelDirs = Directory.GetDirectories(toolboxRiderRootPath); + var paths = channelDirs.SelectMany(channelDir => + { + try + { + // use history.json - last entry stands for the active build https://jetbrains.slack.com/archives/C07KNP99D/p1547807024066500?thread_ts=1547731708.057700&cid=C07KNP99D + var historyFile = Path.Combine(channelDir, ".history.json"); + if (File.Exists(historyFile)) + { + var json = File.ReadAllText(historyFile); + var build = ToolboxHistory.GetLatestBuildFromJson(json); + if (build != null) + { + var buildDir = Path.Combine(channelDir, build); + var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir); + if (executablePaths.Any()) + return executablePaths; + } + } + + var channelFile = Path.Combine(channelDir, ".channel.settings.json"); + if (File.Exists(channelFile)) + { + var json = File.ReadAllText(channelFile).Replace("active-application", "active_application"); + var build = ToolboxInstallData.GetLatestBuildFromJson(json); + if (build != null) + { + var buildDir = Path.Combine(channelDir, build); + var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir); + if (executablePaths.Any()) + return executablePaths; + } + } + + // changes in toolbox json files format may brake the logic above, so return all found Rider installations + return Directory.GetDirectories(channelDir) + .SelectMany(buildDir => GetExecutablePaths(dirName, searchPattern, isMac, buildDir)); + } + catch (Exception e) + { + // do not write to Debug.Log, just log it. + Logger.Warn($"Failed to get RiderPath from {channelDir}", e); + } + + return new string[0]; + }) + .Where(c => !string.IsNullOrEmpty(c)) + .ToArray(); + return paths; + } + + private static string[] GetExecutablePaths(string dirName, string searchPattern, bool isMac, string buildDir) + { + var folder = new DirectoryInfo(Path.Combine(buildDir, dirName)); + if (!folder.Exists) + return new string[0]; + + if (!isMac) + return new[] {Path.Combine(folder.FullName, searchPattern)}.Where(File.Exists).ToArray(); + return folder.GetDirectories(searchPattern).Select(f => f.FullName) + .Where(Directory.Exists).ToArray(); + } + + // Disable the "field is never assigned" compiler warning. We never assign it, but Unity does. + // Note that Unity disable this warning in the generated C# projects +#pragma warning disable 0649 + + [Serializable] + class ToolboxHistory + { + public List history; + + [CanBeNull] + public static string GetLatestBuildFromJson(string json) + { + try + { +#if UNITY_4_7 || UNITY_5_5 + return JsonConvert.DeserializeObject(json).history.LastOrDefault()?.item.build; +#else + return JsonUtility.FromJson(json).history.LastOrDefault()?.item.build; +#endif + } + catch (Exception) + { + Logger.Warn($"Failed to get latest build from json {json}"); + } + + return null; + } + } + + [Serializable] + class ItemNode + { + public BuildNode item; + } + + [Serializable] + class BuildNode + { + public string build; + } + + // ReSharper disable once ClassNeverInstantiated.Global + [Serializable] + class ToolboxInstallData + { + // ReSharper disable once InconsistentNaming + public ActiveApplication active_application; + + [CanBeNull] + public static string GetLatestBuildFromJson(string json) + { + try + { +#if UNITY_4_7 || UNITY_5_5 + var toolbox = JsonConvert.DeserializeObject(json); +#else + var toolbox = JsonUtility.FromJson(json); +#endif + var builds = toolbox.active_application.builds; + if (builds != null && builds.Any()) + return builds.First(); + } + catch (Exception) + { + Logger.Warn($"Failed to get latest build from json {json}"); + } + + return null; + } + } + + [Serializable] + class ActiveApplication + { + // ReSharper disable once InconsistentNaming + public List builds; + } + +#pragma warning restore 0649 + + public struct RiderInfo + { + public bool IsToolbox; + public string Presentation; + public string BuildVersion; + public string Path; + + public RiderInfo(string path, bool isToolbox) + { + if (path == RiderScriptEditor.CurrentEditor) + { + RiderScriptEditorData.instance.Init(); + BuildVersion = RiderScriptEditorData.instance.currentEditorVersion; + } + else + BuildVersion = GetBuildNumber(path); + Path = new FileInfo(path).FullName; // normalize separators + var presentation = "Rider " + BuildVersion; + if (isToolbox) + presentation += " (JetBrains Toolbox)"; + + Presentation = presentation; + IsToolbox = isToolbox; + } + } + + private static class Logger + { + internal static void Warn(string message, Exception e = null) + { +#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider + Log.GetLog(typeof(RiderPathLocator).Name).Warn(message); + if (e != null) + Log.GetLog(typeof(RiderPathLocator).Name).Warn(e); +#else + Debug.LogError(message); + if (e != null) + Debug.LogException(e); +#endif + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta new file mode 100644 index 0000000..ea4ef85 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dab656c79e1985c40b31faebcda44442 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs new file mode 100644 index 0000000..91e9624 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs @@ -0,0 +1,136 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using Debug = UnityEngine.Debug; + +namespace Packages.Rider.Editor +{ + public static class EditorPluginInterop + { + private static string ourEntryPointTypeName = "JetBrains.Rider.Unity.Editor.PluginEntryPoint"; + + private static Assembly ourEditorPluginAssembly; + + public static Assembly EditorPluginAssembly + { + get + { + if (ourEditorPluginAssembly != null) + return ourEditorPluginAssembly; + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + ourEditorPluginAssembly = assemblies.FirstOrDefault(a => a.GetName().Name.Equals("JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked")); + return ourEditorPluginAssembly; + } + } + + + private static void DisableSyncSolutionOnceCallBack() + { + // RiderScriptableSingleton.Instance.CsprojProcessedOnce = true; + // Otherwise EditorPlugin regenerates all on every AppDomain reload + var assembly = EditorPluginAssembly; + if (assembly == null) return; + var type = assembly.GetType("JetBrains.Rider.Unity.Editor.Utils.RiderScriptableSingleton"); + if (type == null) return; + var baseType = type.BaseType; + if (baseType == null) return; + var instance = baseType.GetProperty("Instance"); + if (instance == null) return; + var instanceVal = instance.GetValue(null); + var member = type.GetProperty("CsprojProcessedOnce"); + if (member==null) return; + member.SetValue(instanceVal, true); + } + + public static string LogPath + { + get + { + try + { + var assembly = EditorPluginAssembly; + if (assembly == null) return null; + var type = assembly.GetType(ourEntryPointTypeName); + if (type == null) return null; + var field = type.GetField("LogPath", BindingFlags.NonPublic | BindingFlags.Static); + if (field == null) return null; + return field.GetValue(null) as string; + } + catch (Exception) + { + Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation."); + } + + return null; + } + } + + public static bool OpenFileDllImplementation(string path, int line, int column) + { + var openResult = false; + // reflection for fast OpenFileLineCol, when Rider is started and protocol connection is established + try + { + var assembly = EditorPluginAssembly; + if (assembly == null) return false; + var type = assembly.GetType(ourEntryPointTypeName); + if (type == null) return false; + var field = type.GetField("OpenAssetHandler", BindingFlags.NonPublic | BindingFlags.Static); + if (field == null) return false; + var handlerInstance = field.GetValue(null); + var method = handlerInstance.GetType() + .GetMethod("OnOpenedAsset", new[] {typeof(string), typeof(int), typeof(int)}); + if (method == null) return false; + var assetFilePath = path; + if (!string.IsNullOrEmpty(path)) + assetFilePath = Path.GetFullPath(path); + + openResult = (bool) method.Invoke(handlerInstance, new object[] {assetFilePath, line, column}); + } + catch (Exception e) + { + Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation."); + Debug.LogException(e); + } + + return openResult; + } + + public static bool EditorPluginIsLoadedFromAssets(Assembly assembly) + { + if (assembly == null) + return false; + var location = assembly.Location; + var currentDir = Directory.GetCurrentDirectory(); + return location.StartsWith(currentDir, StringComparison.InvariantCultureIgnoreCase); + } + + + internal static void InitEntryPoint(Assembly assembly) + { + try + { + if (Version.TryParse(RiderScriptEditorData.instance.currentEditorVersion, out var version)) + { + if (version.Major < 192) + DisableSyncSolutionOnceCallBack(); // is require for Rider prior to 2019.2 + } + else + DisableSyncSolutionOnceCallBack(); + + var type = assembly.GetType("JetBrains.Rider.Unity.Editor.AfterUnity56.EntryPoint"); + if (type == null) + type = assembly.GetType("JetBrains.Rider.Unity.Editor.UnitTesting.EntryPoint"); // oldRider + RuntimeHelpers.RunClassConstructor(type.TypeHandle); + } + catch (TypeInitializationException ex) + { + Debug.LogException(ex); + if (ex.InnerException != null) + Debug.LogException(ex.InnerException); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta new file mode 100644 index 0000000..fda18d3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9bd02a3a916be64c9b47b1305149423 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs new file mode 100644 index 0000000..19ef8ab --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs @@ -0,0 +1,22 @@ +namespace Packages.Rider.Editor +{ + public enum LoggingLevel + { + /// + /// Do not use it in logging. Only in config to disable logging. + /// + OFF, + /// For errors that lead to application failure + FATAL, + /// For errors that must be shown in Exception Browser + ERROR, + /// Suspicious situations but not errors + WARN, + /// Regular level for important events + INFO, + /// Additional info for debbuging + VERBOSE, + /// Methods & callstacks tracing, more than verbose + TRACE, + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta new file mode 100644 index 0000000..c0494f3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71bb46b59a9a7a346bbab1e185c723df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs new file mode 100644 index 0000000..bda3fcb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs @@ -0,0 +1,128 @@ +using Unity.CodeEditor; +using UnityEditor; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public class PluginSettings + { + public static LoggingLevel SelectedLoggingLevel + { + get => (LoggingLevel) EditorPrefs.GetInt("Rider_SelectedLoggingLevel", 0); + set + { + EditorPrefs.SetInt("Rider_SelectedLoggingLevel", (int) value); + } + } + + public static bool LogEventsCollectorEnabled + { + get { return EditorPrefs.GetBool("Rider_LogEventsCollectorEnabled", true); } + private set { EditorPrefs.SetBool("Rider_LogEventsCollectorEnabled", value); } + } + + + private static GUIStyle ourVersionInfoStyle = new GUIStyle() + { + normal = new GUIStyleState() + { + textColor = new Color(0, 0, 0, .6f), + }, + margin = new RectOffset(4, 4, 4, 4), + }; + + /// + /// Preferences menu layout + /// + /// + /// Contains all 3 toggles: Enable/Disable; Debug On/Off; Writing Launch File On/Off + /// + [SettingsProvider] + private static SettingsProvider RiderPreferencesItem() + { + if (!RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor)) + return null; + if (!RiderScriptEditorData.instance.shouldLoadEditorPlugin) + return null; + var provider = new SettingsProvider("Preferences/Rider", SettingsScope.User) + { + label = "Rider", + keywords = new[] { "Rider" }, + guiHandler = (searchContext) => + { + EditorGUIUtility.labelWidth = 200f; + EditorGUILayout.BeginVertical(); + + GUILayout.BeginVertical(); + LogEventsCollectorEnabled = + EditorGUILayout.Toggle(new GUIContent("Pass Console to Rider:"), LogEventsCollectorEnabled); + + GUILayout.EndVertical(); + GUILayout.Label(""); + + if (!string.IsNullOrEmpty(EditorPluginInterop.LogPath)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel("Log file:"); + var previous = GUI.enabled; + GUI.enabled = previous && SelectedLoggingLevel != LoggingLevel.OFF; + var button = GUILayout.Button(new GUIContent("Open log")); + if (button) + { + //UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(PluginEntryPoint.LogPath, 0); + // works much faster than the commented code, when Rider is already started + CodeEditor.CurrentEditor.OpenProject(EditorPluginInterop.LogPath, 0, 0); + } + + GUI.enabled = previous; + GUILayout.EndHorizontal(); + } + + var loggingMsg = + @"Sets the amount of Rider Debug output. If you are about to report an issue, please select Verbose logging level and attach Unity console output to the issue."; + SelectedLoggingLevel = + (LoggingLevel) EditorGUILayout.EnumPopup(new GUIContent("Logging Level:", loggingMsg), + SelectedLoggingLevel); + + + EditorGUILayout.HelpBox(loggingMsg, MessageType.None); + + var githubRepo = "https://github.com/JetBrains/resharper-unity"; + var caption = $"{githubRepo}"; + LinkButton(caption: caption, url: githubRepo); + + GUILayout.FlexibleSpace(); + GUILayout.BeginHorizontal(); + + GUILayout.FlexibleSpace(); + var assembly = EditorPluginInterop.EditorPluginAssembly; + if (assembly != null) + { + var version = assembly.GetName().Version; + GUILayout.Label("Plugin version: " + version, ourVersionInfoStyle); + } + + GUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + } + }; + return provider; + } + + private static void LinkButton(string caption, string url) + { + var style = GUI.skin.label; + style.richText = true; + + var bClicked = GUILayout.Button(caption, style); + + var rect = GUILayoutUtility.GetLastRect(); + rect.width = style.CalcSize(new GUIContent(caption)).x; + EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); + + if (bClicked) + Application.OpenURL(url); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta new file mode 100644 index 0000000..279a4cc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bfe12aa306c0c74db4f4f1a1a0ae5ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta new file mode 100644 index 0000000..40cdc60 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa290bd9a165a0543a4bf85ac73914bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs new file mode 100644 index 0000000..230633f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs @@ -0,0 +1,16 @@ +using Unity.CodeEditor; +using UnityEditor; + +namespace Packages.Rider.Editor.PostProcessors +{ + public class RiderAssetPostprocessor: AssetPostprocessor + { + public static bool OnPreGeneratingCSProjectFiles() + { + var path = RiderScriptEditor.GetEditorRealPath(CodeEditor.CurrentEditorInstallation); + if (RiderScriptEditor.IsRiderInstallation(path)) + return !ProjectGeneration.isRiderProjectGeneration; + return false; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta new file mode 100644 index 0000000..68658cc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45471ad7b8c1f964da5e3c07d57fbf4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta new file mode 100644 index 0000000..37615b9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 313cbe17019f1934397f91069831062c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs new file mode 100644 index 0000000..6ea51dc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using System.Text; + +namespace Packages.Rider.Editor { + class FileIOProvider : IFileIO + { + public bool Exists(string fileName) + { + return File.Exists(fileName); + } + + public string ReadAllText(string fileName) + { + return File.ReadAllText(fileName); + } + + public void WriteAllText(string fileName, string content) + { + File.WriteAllText(fileName, content, Encoding.UTF8); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta new file mode 100644 index 0000000..2763839 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a6ba838b1348d5e46a7eaacd1646c1d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs new file mode 100644 index 0000000..476766e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs @@ -0,0 +1,16 @@ +using System; + +namespace Packages.Rider.Editor { + class GUIDProvider : IGUIDGenerator + { + public string ProjectGuid(string projectName, string assemblyName) + { + return SolutionGuidGenerator.GuidForProject(projectName + assemblyName); + } + + public string SolutionGuid(string projectName, string extension) + { + return SolutionGuidGenerator.GuidForSolution(projectName, extension); // GetExtensionOfSourceFiles(assembly.sourceFiles) + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta new file mode 100644 index 0000000..7b331f2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cfde1a59fb35574189691a9de1df93b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 0000000..d0a2664 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs @@ -0,0 +1,1090 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using Packages.Rider.Editor.Util; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.PackageManager; +using UnityEditorInternal; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public interface IGenerator + { + bool SyncIfNeeded(IEnumerable affectedFiles, IEnumerable reimportedFiles); + void Sync(); + bool HasSolutionBeenGenerated(); + string SolutionFile(); + string ProjectDirectory { get; } + void GenerateAll(bool generateAll); + } + + public interface IFileIO + { + bool Exists(string fileName); + + string ReadAllText(string fileName); + void WriteAllText(string fileName, string content); + } + + public interface IGUIDGenerator + { + string ProjectGuid(string projectName, string assemblyName); + string SolutionGuid(string projectName, string extension); + } + + public interface IAssemblyNameProvider + { + string GetAssemblyNameFromScriptPath(string path); + IEnumerable GetAssemblies(Func shouldFileBePartOfSolution); + IEnumerable GetAllAssetPaths(); + UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath); + ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories); + } + + class AssemblyNameProvider : IAssemblyNameProvider + { + public string GetAssemblyNameFromScriptPath(string path) + { + return CompilationPipeline.GetAssemblyNameFromScriptPath(path); + } + + public IEnumerable GetAssemblies(Func shouldFileBePartOfSolution) + { + return CompilationPipeline.GetAssemblies() + .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution)); + } + + public IEnumerable GetAllAssetPaths() + { + return AssetDatabase.GetAllAssetPaths(); + } + + public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath) + { + return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath); + } + + public ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories) + { + return CompilationPipeline.ParseResponseFile( + responseFilePath, + projectDirectory, + systemReferenceDirectories + ); + } + } + + public class ProjectGeneration : IGenerator + { + enum ScriptingLanguage + { + None, + CSharp + } + + public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003"; + + /// + /// Map source extensions to ScriptingLanguages + /// + static readonly Dictionary k_BuiltinSupportedExtensions = + new Dictionary + { + {"cs", ScriptingLanguage.CSharp}, + {"uxml", ScriptingLanguage.None}, + {"uss", ScriptingLanguage.None}, + {"shader", ScriptingLanguage.None}, + {"compute", ScriptingLanguage.None}, + {"cginc", ScriptingLanguage.None}, + {"hlsl", ScriptingLanguage.None}, + {"glslinc", ScriptingLanguage.None}, + {"template", ScriptingLanguage.None}, + {"raytrace", ScriptingLanguage.None} + }; + + string m_SolutionProjectEntryTemplate = string.Join(Environment.NewLine, + @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""", + @"EndProject").Replace(" ", "\t"); + + string m_SolutionProjectConfigurationTemplate = string.Join(Environment.NewLine, + @" {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU", + @" {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU", + @" {{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU", + @" {{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU").Replace(" ", "\t"); + + static readonly string[] k_ReimportSyncExtensions = {".dll", ".asmdef"}; + + /// + /// Map ScriptingLanguages to project extensions + /// + /*static readonly Dictionary k_ProjectExtensions = new Dictionary + { + { ScriptingLanguage.CSharp, ".csproj" }, + { ScriptingLanguage.None, ".csproj" }, + };*/ + static readonly Regex k_ScriptReferenceExpression = new Regex( + @"^Library.ScriptAssemblies.(?(?.*)\.dll$)", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + string[] m_ProjectSupportedExtensions = new string[0]; + bool m_ShouldGenerateAll; + + public string ProjectDirectory { get; } + + public void GenerateAll(bool generateAll) + { + m_ShouldGenerateAll = generateAll; + } + + readonly string m_ProjectName; + readonly IAssemblyNameProvider m_AssemblyNameProvider; + readonly IFileIO m_FileIOProvider; + readonly IGUIDGenerator m_GUIDGenerator; + internal static bool isRiderProjectGeneration; // workaround to https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/28 + + const string k_ToolsVersion = "4.0"; + const string k_ProductVersion = "10.0.20506"; + const string k_BaseDirectory = "."; + const string k_TargetFrameworkVersion = "v4.7.1"; + const string k_TargetLanguageVersion = "latest"; + + static readonly Regex scriptReferenceExpression = new Regex( + @"^Library.ScriptAssemblies.(?(?.*)\.dll$)", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public ProjectGeneration() : this(Directory.GetParent(Application.dataPath).FullName) + { + } + + public ProjectGeneration(string tempDirectory) : this(tempDirectory, new AssemblyNameProvider(), new FileIOProvider(), new GUIDProvider()) + { + } + + public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIoProvider, IGUIDGenerator guidGenerator) + { + ProjectDirectory = tempDirectory.Replace('\\', '/'); + m_ProjectName = Path.GetFileName(ProjectDirectory); + m_AssemblyNameProvider = assemblyNameProvider; + m_FileIOProvider = fileIoProvider; + m_GUIDGenerator = guidGenerator; + } + + /// + /// Syncs the scripting solution if any affected files are relevant. + /// + /// + /// Whether the solution was synced. + /// + /// + /// A set of files whose status has changed + /// + /// + /// A set of files that got reimported + /// + public bool SyncIfNeeded(IEnumerable affectedFiles, IEnumerable reimportedFiles) + { + SetupProjectSupportedExtensions(); + + if (HasFilesBeenModified(affectedFiles, reimportedFiles)) + { + Sync(); + return true; + } + + return false; + } + + bool HasFilesBeenModified(IEnumerable affectedFiles, IEnumerable reimportedFiles) + { + return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset); + } + + static bool ShouldSyncOnReimportedAsset(string asset) + { + return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension); + } + + public void Sync() + { + SetupProjectSupportedExtensions(); + var types = GetAssetPostprocessorTypes(); + isRiderProjectGeneration = true; + bool externalCodeAlreadyGeneratedProjects = OnPreGeneratingCSProjectFiles(types); + isRiderProjectGeneration = false; + if (!externalCodeAlreadyGeneratedProjects) + { + GenerateAndWriteSolutionAndProjects(types); + } + + OnGeneratedCSProjectFiles(types); + } + + public bool HasSolutionBeenGenerated() + { + return m_FileIOProvider.Exists(SolutionFile()); + } + + void SetupProjectSupportedExtensions() + { + m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions; + } + + bool ShouldFileBePartOfSolution(string file) + { + string extension = Path.GetExtension(file); + + // Exclude files coming from packages except if they are internalized. + if (!m_ShouldGenerateAll && IsInternalizedPackagePath(file)) + { + return false; + } + + // Dll's are not scripts but still need to be included.. + if (extension == ".dll") + return true; + + if (file.ToLower().EndsWith(".asmdef")) + return true; + + return IsSupportedExtension(extension); + } + + bool IsSupportedExtension(string extension) + { + extension = extension.TrimStart('.'); + if (k_BuiltinSupportedExtensions.ContainsKey(extension)) + return true; + if (m_ProjectSupportedExtensions.Contains(extension)) + return true; + return false; + } + + static ScriptingLanguage ScriptingLanguageFor(Assembly island) + { + return ScriptingLanguageFor(GetExtensionOfSourceFiles(island.sourceFiles)); + } + + static string GetExtensionOfSourceFiles(string[] files) + { + return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : "NA"; + } + + static string GetExtensionOfSourceFile(string file) + { + var ext = Path.GetExtension(file).ToLower(); + ext = ext.Substring(1); //strip dot + return ext; + } + + static ScriptingLanguage ScriptingLanguageFor(string extension) + { + return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result) + ? result + : ScriptingLanguage.None; + } + + public void GenerateAndWriteSolutionAndProjects(Type[] types) + { + // Only synchronize islands that have associated source files and ones that we actually want in the project. + // This also filters out DLLs coming from .asmdef files in packages. + var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution); + + var allAssetProjectParts = GenerateAllAssetProjectParts(); + + var monoIslands = assemblies.ToList(); + + SyncSolution(monoIslands, types); + var allProjectIslands = RelevantIslandsForMode(monoIslands).ToList(); + foreach (Assembly assembly in allProjectIslands) + { + var responseFileData = ParseResponseFileData(assembly); + SyncProject(assembly, allAssetProjectParts, responseFileData, allProjectIslands, types); + } + } + + IEnumerable ParseResponseFileData(Assembly assembly) + { + var systemReferenceDirectories = + CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel); + + Dictionary responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary( + x => x, x => m_AssemblyNameProvider.ParseResponseFile( + x, + ProjectDirectory, + systemReferenceDirectories + )); + + Dictionary responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any()) + .ToDictionary(x => x.Key, x => x.Value); + + if (responseFilesWithErrors.Any()) + { + foreach (var error in responseFilesWithErrors) + foreach (var valueError in error.Value.Errors) + { + Debug.LogError($"{error.Key} Parse Error : {valueError}"); + } + } + + return responseFilesData.Select(x => x.Value); + } + + Dictionary GenerateAllAssetProjectParts() + { + Dictionary stringBuilders = new Dictionary(); + + foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths()) + { + // Exclude files coming from packages except if they are internalized. + if (!m_ShouldGenerateAll && IsInternalizedPackagePath(asset)) + { + continue; + } + + string extension = Path.GetExtension(asset); + if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension)) + { + // Find assembly the asset belongs to by adding script extension and using compilation pipeline. + var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset + ".cs"); + + if (string.IsNullOrEmpty(assemblyName)) + { + continue; + } + + assemblyName = FileSystemUtil.FileNameWithoutExtension(assemblyName); + + if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder)) + { + projectBuilder = new StringBuilder(); + stringBuilders[assemblyName] = projectBuilder; + } + + projectBuilder.Append(" ") + .Append(Environment.NewLine); + } + } + + var result = new Dictionary(); + + foreach (var entry in stringBuilders) + result[entry.Key] = entry.Value.ToString(); + + return result; + } + + bool IsInternalizedPackagePath(string file) + { + if (string.IsNullOrWhiteSpace(file)) + { + return false; + } + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(file); + if (packageInfo == null) + { + return false; + } + + var packageSource = packageInfo.source; + return packageSource != PackageSource.Embedded && packageSource != PackageSource.Local; + } + + void SyncProject( + Assembly island, + Dictionary allAssetsProjectParts, + IEnumerable responseFilesData, + List allProjectIslands, + Type[] types) + { + SyncProjectFileIfNotChanged(ProjectFile(island), + ProjectText(island, allAssetsProjectParts, responseFilesData.ToList(), allProjectIslands), types); + } + + void SyncProjectFileIfNotChanged(string path, string newContents, Type[] types) + { + if (Path.GetExtension(path) == ".csproj") + { + newContents = OnGeneratedCSProject(path, newContents, types); + } + + SyncFileIfNotChanged(path, newContents); + } + + void SyncSolutionFileIfNotChanged(string path, string newContents, Type[] types) + { + newContents = OnGeneratedSlnSolution(path, newContents, types); + + SyncFileIfNotChanged(path, newContents); + } + + static List SafeGetTypes(System.Reflection.Assembly a) + { + List ret; + + try + { + ret = a.GetTypes().ToList(); + } + catch (System.Reflection.ReflectionTypeLoadException rtl) + { + ret = rtl.Types.ToList(); + } + catch (Exception) + { + return new List(); + } + + return ret.Where(r => r != null).ToList(); + } + + static void OnGeneratedCSProjectFiles(Type[] types) + { + var args = new object[0]; + foreach (var type in types) + { + var method = type.GetMethod("OnGeneratedCSProjectFiles", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + method.Invoke(null, args); + } + } + + public static Type[] GetAssetPostprocessorTypes() + { + return TypeCache.GetTypesDerivedFrom().ToArray(); // doesn't find types from EditorPlugin, which is fine + } + + static bool OnPreGeneratingCSProjectFiles(Type[] types) + { + bool result = false; + foreach (var type in types) + { + var args = new object[0]; + var method = type.GetMethod("OnPreGeneratingCSProjectFiles", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + var returnValue = method.Invoke(null, args); + if (method.ReturnType == typeof(bool)) + { + result |= (bool) returnValue; + } + } + + return result; + } + + static string OnGeneratedCSProject(string path, string content, Type[] types) + { + foreach (var type in types) + { + var args = new[] {path, content}; + var method = type.GetMethod("OnGeneratedCSProject", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + var returnValue = method.Invoke(null, args); + if (method.ReturnType == typeof(string)) + { + content = (string) returnValue; + } + } + + return content; + } + + static string OnGeneratedSlnSolution(string path, string content, Type[] types) + { + foreach (var type in types) + { + var args = new[] {path, content}; + var method = type.GetMethod("OnGeneratedSlnSolution", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static); + if (method == null) + { + continue; + } + + var returnValue = method.Invoke(null, args); + if (method.ReturnType == typeof(string)) + { + content = (string) returnValue; + } + } + + return content; + } + + void SyncFileIfNotChanged(string filename, string newContents) + { + try + { + if (m_FileIOProvider.Exists(filename) && newContents == m_FileIOProvider.ReadAllText(filename)) + { + return; + } + } + catch (Exception exception) + { + Debug.LogException(exception); + } + + m_FileIOProvider.WriteAllText(filename, newContents); + } + + string ProjectText(Assembly assembly, + Dictionary allAssetsProjectParts, + List responseFilesData, + List allProjectIslands) + { + var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData)); + var references = new List(); + var projectReferences = new List(); + + foreach (string file in assembly.sourceFiles) + { + if (!ShouldFileBePartOfSolution(file)) + continue; + + var extension = Path.GetExtension(file).ToLower(); + var fullFile = EscapedRelativePathFor(file); + if (".dll" != extension) + { + projectBuilder.Append(" ").Append(Environment.NewLine); + } + else + { + references.Add(fullFile); + } + } + + // Append additional non-script files that should be included in project generation. + if (allAssetsProjectParts.TryGetValue(assembly.name, out var additionalAssetsForProject)) + projectBuilder.Append(additionalAssetsForProject); + + var islandRefs = references.Union(assembly.allReferences); + foreach (string reference in islandRefs) + { + if (reference.EndsWith("/UnityEditor.dll", StringComparison.Ordinal) + || reference.EndsWith("/UnityEngine.dll", StringComparison.Ordinal) + || reference.EndsWith("\\UnityEditor.dll", StringComparison.Ordinal) + || reference.EndsWith("\\UnityEngine.dll", StringComparison.Ordinal)) + continue; + + var match = k_ScriptReferenceExpression.Match(reference); + if (match.Success) + { + // assume csharp language + // Add a reference to a project except if it's a reference to a script assembly + // that we are not generating a project for. This will be the case for assemblies + // coming from .assembly.json files in non-internalized packages. + var dllName = match.Groups["dllname"].Value; + if (allProjectIslands.Any(i => Path.GetFileName(i.outputPath) == dllName)) + { + projectReferences.Add(match); + continue; + } + } + + string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference); + + AppendReference(fullReference, projectBuilder); + } + + var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r)); + foreach (var reference in responseRefs) + { + AppendReference(reference, projectBuilder); + } + + if (0 < projectReferences.Count) + { + projectBuilder.AppendLine(" "); + projectBuilder.AppendLine(" "); + foreach (Match reference in projectReferences) + { + var referencedProject = reference.Groups["project"].Value; + + projectBuilder.Append(" ").Append(Environment.NewLine); + projectBuilder + .Append(" {") + .Append(m_GUIDGenerator.ProjectGuid(m_ProjectName, reference.Groups["project"].Value)) + .Append("}") + .Append(Environment.NewLine); + projectBuilder.Append(" ").Append(referencedProject).Append("").Append(Environment.NewLine); + projectBuilder.AppendLine(" "); + } + } + + projectBuilder.Append(ProjectFooter()); + return projectBuilder.ToString(); + } + + static void AppendReference(string fullReference, StringBuilder projectBuilder) + { + //replace \ with / and \\ with / + var escapedFullPath = SecurityElement.Escape(fullReference); + escapedFullPath = escapedFullPath.Replace("\\\\", "/").Replace("\\", "/"); + projectBuilder.Append(" ").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(escapedFullPath).Append("").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(Environment.NewLine); + } + + public string ProjectFile(Assembly assembly) + { + return Path.Combine(ProjectDirectory, $"{assembly.name}.csproj"); + } + + public string SolutionFile() + { + return Path.Combine(ProjectDirectory, $"{m_ProjectName}.sln"); + } + + string ProjectHeader( + Assembly assembly, + List responseFilesData + ) + { + var otherResponseFilesData = GetOtherArgumentsFromResponseFilesData(responseFilesData); + var arguments = new object[] + { + k_ToolsVersion, k_ProductVersion, m_GUIDGenerator.ProjectGuid(m_ProjectName, assembly.name), + InternalEditorUtility.GetEngineAssemblyPath(), + InternalEditorUtility.GetEditorAssemblyPath(), + string.Join(";", + new[] {"DEBUG", "TRACE"}.Concat(EditorUserBuildSettings.activeScriptCompilationDefines).Concat(assembly.defines) + .Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()), + MSBuildNamespaceUri, + assembly.name, + EditorSettings.projectGenerationRootNamespace, + k_TargetFrameworkVersion, + GenerateLangVersion(otherResponseFilesData["langversion"]), + k_BaseDirectory, + assembly.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe), + GenerateNoWarn(otherResponseFilesData["nowarn"].Distinct().ToArray()), + GenerateAnalyserItemGroup(otherResponseFilesData["analyzer"].Concat(otherResponseFilesData["a"]).SelectMany(x=>x.Split(';')).Distinct().ToArray()), + GenerateAnalyserAdditionalFiles(otherResponseFilesData["additionalfile"].SelectMany(x=>x.Split(';')).Distinct().ToArray()), + GenerateAnalyserRuleSet(otherResponseFilesData["ruleset"].Distinct().ToArray()), + GenerateWarningLevel(otherResponseFilesData["warn"].Concat(otherResponseFilesData["w"]).Distinct()), + GenerateWarningAsError(otherResponseFilesData["warnaserror"]), + GenerateDocumentationFile(otherResponseFilesData["doc"]) + }; + + try + { + return string.Format(GetProjectHeaderTemplate(), arguments); + } + catch (Exception) + { + throw new NotSupportedException( + "Failed creating c# project because the c# project header did not have the correct amount of arguments, which is " + + arguments.Length); + } + } + + private string GenerateDocumentationFile(IEnumerable paths) + { + if (!paths.Any()) + return String.Empty; + + + return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" {a}"))}"; + } + + private string GenerateWarningAsError(IEnumerable enumerable) + { + string returnValue = String.Empty; + bool allWarningsAsErrors = false; + List warningIds = new List(); + + foreach (string s in enumerable) + { + if (s == "+") allWarningsAsErrors = true; + else if (s == "-") allWarningsAsErrors = false; + else + { + warningIds.Add(s); + } + } + + returnValue += $@" {allWarningsAsErrors}"; + if (warningIds.Any()) + { + returnValue += $"{Environment.NewLine} {string.Join(";", warningIds)}"; + } + + return $"{Environment.NewLine}{returnValue}"; + } + + private string GenerateWarningLevel(IEnumerable warningLevel) + { + var level = warningLevel.FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(level)) + return level; + + return 4.ToString(); + } + + static string GetSolutionText() + { + return string.Join(Environment.NewLine, + @"", + @"Microsoft Visual Studio Solution File, Format Version {0}", + @"# Visual Studio {1}", + @"{2}", + @"Global", + @" GlobalSection(SolutionConfigurationPlatforms) = preSolution", + @" Debug|Any CPU = Debug|Any CPU", + @" Release|Any CPU = Release|Any CPU", + @" EndGlobalSection", + @" GlobalSection(ProjectConfigurationPlatforms) = postSolution", + @"{3}", + @" EndGlobalSection", + @" GlobalSection(SolutionProperties) = preSolution", + @" HideSolutionNode = FALSE", + @" EndGlobalSection", + @"EndGlobal", + @"").Replace(" ", "\t"); + } + + static string GetProjectFooterTemplate() + { + return string.Join(Environment.NewLine, + @" ", + @" ", + @" ", + @"", + @""); + } + + static string GetProjectHeaderTemplate() + { + var header = new[] + { + @"", + @"", + @" ", + @" {10}", + @" <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package", + @" <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package", + @" true{16}", + @" ", + @" ", + @" Debug", + @" AnyCPU", + @" {1}", + @" 2.0", + @" {8}", + @" {{{2}}}", + @" Library", + @" Properties", + @" {7}", + @" {9}", + @" 512", + @" {11}", + @" ", + @" ", + @" true", + @" full", + @" false", + @" Temp\bin\Debug\", + @" {5}", + @" prompt", + @" {17}", + @" 0169{13}", + @" {12}{18}{19}", + @" ", + @" ", + @" pdbonly", + @" true", + @" Temp\bin\Release\", + @" prompt", + @" {17}", + @" 0169{13}", + @" {12}{18}{19}", + @" " + }; + + var forceExplicitReferences = new[] + { + @" ", + @" true", + @" true", + @" false", + @" false", + @" false", + @" " + }; + + var itemGroupStart = new[] + { + @" " + }; + + var footer = new[] + { + @" ", + @" {3}", + @" ", + @" ", + @" {4}", + @" ", + @" {14}{15}", + @" ", + @"" + }; + + var pieces = header.Concat(forceExplicitReferences).Concat(itemGroupStart).Concat(footer).ToArray(); + return string.Join(Environment.NewLine, pieces); + } + + void SyncSolution(IEnumerable islands, Type[] types) + { + SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands), types); + } + + string SolutionText(IEnumerable islands) + { + var fileversion = "11.00"; + var vsversion = "2010"; + + var relevantIslands = RelevantIslandsForMode(islands); + string projectEntries = GetProjectEntries(relevantIslands); + string projectConfigurations = string.Join(Environment.NewLine, + relevantIslands.Select(i => GetProjectActiveConfigurations(m_GUIDGenerator.ProjectGuid(m_ProjectName, i.name))).ToArray()); + return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations); + } + + private static string GenerateAnalyserItemGroup(string[] paths) + { + // + // + // + // + if (!paths.Any()) + return string.Empty; + + var analyserBuilder = new StringBuilder(); + analyserBuilder.AppendLine(" "); + foreach (var path in paths) + { + analyserBuilder.AppendLine($" "); + } + analyserBuilder.AppendLine(" "); + return analyserBuilder.ToString(); + } + + private static ILookup GetOtherArgumentsFromResponseFilesData(List responseFilesData) + { + var paths = responseFilesData.SelectMany(x => + { + return x.OtherArguments + .Where(a => a.StartsWith("/") || a.StartsWith("-")) + .Select(b => + { + var index = b.IndexOf(":", StringComparison.Ordinal); + if (index > 0 && b.Length > index) + { + var key = b.Substring(1, index - 1); + return new KeyValuePair(key, b.Substring(index + 1)); + } + + const string warnaserror = "warnaserror"; + if (b.Substring(1).StartsWith(warnaserror)) + { + return new KeyValuePair(warnaserror, b.Substring(warnaserror.Length+ 1) ); + } + + return default; + }); + }) + .Distinct() + .ToLookup(o => o.Key, pair => pair.Value); + return paths; + } + + private string GenerateLangVersion(IEnumerable langVersionList) + { + var langVersion = langVersionList.FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(langVersion)) + return langVersion; + return k_TargetLanguageVersion; + } + + private static string GenerateAnalyserRuleSet(string[] paths) + { + //..\path\to\myrules.ruleset + if (!paths.Any()) + return string.Empty; + + return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" {a}"))}"; + } + + private static string GenerateAnalyserAdditionalFiles(string[] paths) + { + if (!paths.Any()) + return string.Empty; + + + var analyserBuilder = new StringBuilder(); + analyserBuilder.AppendLine(" "); + foreach (var path in paths) + { + analyserBuilder.AppendLine($" "); + } + analyserBuilder.AppendLine(" "); + return analyserBuilder.ToString(); + } + + private static string GenerateNoWarn(string[] codes) + { + if (!codes.Any()) + return string.Empty; + + return $",{string.Join(",", codes)}"; + } + + static IEnumerable RelevantIslandsForMode(IEnumerable islands) + { + IEnumerable relevantIslands = islands.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i)); + return relevantIslands; + } + + /// + /// Get a Project("{guid}") = "MyProject", "MyProject.unityproj", "{projectguid}" + /// entry for each relevant language + /// + string GetProjectEntries(IEnumerable islands) + { + var projectEntries = islands.Select(i => string.Format( + m_SolutionProjectEntryTemplate, + m_GUIDGenerator.SolutionGuid(m_ProjectName, GetExtensionOfSourceFiles(i.sourceFiles)), + i.name, + Path.GetFileName(ProjectFile(i)), + m_GUIDGenerator.ProjectGuid(m_ProjectName, i.name) + )); + + return string.Join(Environment.NewLine, projectEntries.ToArray()); + } + + /// + /// Generate the active configuration string for a given project guid + /// + string GetProjectActiveConfigurations(string projectGuid) + { + return string.Format( + m_SolutionProjectConfigurationTemplate, + projectGuid); + } + + string EscapedRelativePathFor(string file) + { + var projectDir = ProjectDirectory.Replace('/', '\\'); + file = file.Replace('/', '\\'); + var path = SkipPathPrefix(file, projectDir); + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\', '/')); + if (packageInfo != null) + { + // We have to normalize the path, because the PackageManagerRemapper assumes + // dir seperators will be os specific. + var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\'); + path = SkipPathPrefix(absolutePath, projectDir); + } + + return SecurityElement.Escape(path); + } + + static string SkipPathPrefix(string path, string prefix) + { + if (path.Replace("\\", "/").StartsWith($"{prefix}/")) + return path.Substring(prefix.Length + 1); + return path; + } + + static string NormalizePath(string path) + { + if (Path.DirectorySeparatorChar == '\\') + return path.Replace('/', Path.DirectorySeparatorChar); + return path.Replace('\\', Path.DirectorySeparatorChar); + } + + static string ProjectFooter() + { + return GetProjectFooterTemplate(); + } + + static string GetProjectExtension() + { + return ".csproj"; + } + } + + public static class SolutionGuidGenerator + { + public static string GuidForProject(string projectName) + { + return ComputeGuidHashFor(projectName + "salt"); + } + + public static string GuidForSolution(string projectName, string sourceFileExtension) + { + if (sourceFileExtension.ToLower() == "cs") + // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs + return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"; + + return ComputeGuidHashFor(projectName); + } + + static string ComputeGuidHashFor(string input) + { + var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input)); + return HashAsGuid(HashToString(hash)); + } + + static string HashAsGuid(string hash) + { + var guid = hash.Substring(0, 8) + "-" + hash.Substring(8, 4) + "-" + hash.Substring(12, 4) + "-" + + hash.Substring(16, 4) + "-" + hash.Substring(20, 12); + return guid.ToUpper(); + } + + static string HashToString(byte[] bs) + { + var sb = new StringBuilder(); + foreach (byte b in bs) + sb.Append(b.ToString("x2")); + return sb.ToString(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 0000000..4a0705c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7078f19173ceac84fb9e29b9f6175201 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs new file mode 100644 index 0000000..d481133 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using UnityEngine; +using Debug = UnityEngine.Debug; + +namespace Packages.Rider.Editor +{ + internal class RiderInitializer + { + public void Initialize(string editorPath) + { + var assembly = EditorPluginInterop.EditorPluginAssembly; + if (EditorPluginInterop.EditorPluginIsLoadedFromAssets(assembly)) + { + Debug.LogError($"Please delete {assembly.Location}. Unity 2019.2+ loads it directly from Rider installation. To disable this, open Rider's settings, search and uncheck 'Automatically install and update Rider's Unity editor plugin'."); + return; + } + + var dllName = "JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked.dll"; + var relPath = "../../plugins/rider-unity/EditorPlugin"; + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + relPath = "Contents/plugins/rider-unity/EditorPlugin"; + var dllFile = new FileInfo(Path.Combine(Path.Combine(editorPath, relPath), dllName)); + + if (dllFile.Exists) + { + var bytes = File.ReadAllBytes(dllFile.FullName); + assembly = AppDomain.CurrentDomain.Load(bytes); // doesn't lock assembly on disk + // assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dllFile.FullName)); // use this for external source debug + EditorPluginInterop.InitEntryPoint(assembly); + } + else + { + Debug.Log($"Unable to find Rider EditorPlugin {dllFile.FullName} for Unity "); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta new file mode 100644 index 0000000..11d46bc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f5a0cc9645f0e2d4fb816156dcf3f4dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs new file mode 100644 index 0000000..debee95 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs @@ -0,0 +1,404 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Packages.Rider.Editor.Util; +using Unity.CodeEditor; +using UnityEditor; +using UnityEngine; +using Debug = UnityEngine.Debug; + +namespace Packages.Rider.Editor +{ + [InitializeOnLoad] + public class RiderScriptEditor : IExternalCodeEditor + { + IDiscovery m_Discoverability; + IGenerator m_ProjectGeneration; + RiderInitializer m_Initiliazer = new RiderInitializer(); + + static RiderScriptEditor() + { + try + { + var projectGeneration = new ProjectGeneration(); + var editor = new RiderScriptEditor(new Discovery(), projectGeneration); + CodeEditor.Register(editor); + var path = GetEditorRealPath(CodeEditor.CurrentEditorInstallation); + + if (IsRiderInstallation(path)) + { + if (!RiderScriptEditorData.instance.InitializedOnce) + { + var installations = editor.Installations; + // is toolbox and outdated - update + if (installations.Any() && RiderPathLocator.IsToolbox(path) && installations.All(a => a.Path != path)) + { + var toolboxInstallations = installations.Where(a => a.Name.Contains("(JetBrains Toolbox)")).ToArray(); + if (toolboxInstallations.Any()) + { + var newEditor = toolboxInstallations.Last().Path; + CodeEditor.SetExternalScriptEditor(newEditor); + path = newEditor; + } + else + { + var newEditor = installations.Last().Path; + CodeEditor.SetExternalScriptEditor(newEditor); + path = newEditor; + } + } + + // exists, is non toolbox and outdated - notify + if (installations.Any() && FileSystemUtil.EditorPathExists(path) && installations.All(a => a.Path != path)) + { + var newEditorName = installations.Last().Name; + Debug.LogWarning($"Consider updating External Editor in Unity to Rider {newEditorName}."); + } + + ShowWarningOnUnexpectedScriptEditor(path); + RiderScriptEditorData.instance.InitializedOnce = true; + } + + if (!FileSystemUtil.EditorPathExists(path)) // previously used rider was removed + { + var installations = editor.Installations; + if (installations.Any()) + { + var newEditor = installations.Last().Path; + CodeEditor.SetExternalScriptEditor(newEditor); + path = newEditor; + } + } + RiderScriptEditorData.instance.Init(); + + editor.CreateSolutionIfDoesntExist(); + if (RiderScriptEditorData.instance.shouldLoadEditorPlugin) + { + editor.m_Initiliazer.Initialize(path); + } + + InitProjectFilesWatcher(); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + private static void ShowWarningOnUnexpectedScriptEditor(string path) + { + // Show warning, when Unity was started from Rider, but external editor is different https://github.com/JetBrains/resharper-unity/issues/1127 + var args = Environment.GetCommandLineArgs(); + var commandlineParser = new CommandLineParser(args); + if (commandlineParser.Options.ContainsKey("-riderPath")) + { + var originRiderPath = commandlineParser.Options["-riderPath"]; + var originRealPath = GetEditorRealPath(originRiderPath); + var originVersion = RiderPathLocator.GetBuildNumber(originRealPath); + var version = RiderPathLocator.GetBuildNumber(path); + if (originVersion != string.Empty && originVersion != version) + { + Debug.LogWarning("Unity was started by a version of Rider that is not the current default external editor. Advanced integration features cannot be enabled."); + Debug.Log($"Unity was started by Rider {originVersion}, but external editor is set to: {path}"); + } + } + } + + private static void InitProjectFilesWatcher() + { + var watcher = new FileSystemWatcher(); + watcher.Path = Directory.GetCurrentDirectory(); + watcher.NotifyFilter = NotifyFilters.LastWrite; //Watch for changes in LastWrite times + watcher.Filter = "*.*"; + + // Add event handlers. + watcher.Changed += OnChanged; + watcher.Created += OnChanged; + + watcher.EnableRaisingEvents = true; // Begin watching. + + AppDomain.CurrentDomain.DomainUnload += (EventHandler) ((_, __) => + { + watcher.Dispose(); + }); + } + + private static void OnChanged(object sender, FileSystemEventArgs e) + { + var extension = Path.GetExtension(e.FullPath); + if (extension == ".sln" || extension == ".csproj") + RiderScriptEditorData.instance.HasChanges = true; + } + + internal static string GetEditorRealPath(string path) + { + if (string.IsNullOrEmpty(path)) + { + return path; + } + + if (!FileSystemUtil.EditorPathExists(path)) + return path; + + if (SystemInfo.operatingSystemFamily != OperatingSystemFamily.Windows) + { + var realPath = FileSystemUtil.GetFinalPathName(path); + + // case of snap installation + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.Linux) + { + if (new FileInfo(path).Name.ToLowerInvariant() == "rider" && + new FileInfo(realPath).Name.ToLowerInvariant() == "snap") + { + var snapInstallPath = "/snap/rider/current/bin/rider.sh"; + if (new FileInfo(snapInstallPath).Exists) + return snapInstallPath; + } + } + + // in case of symlink + return realPath; + } + + return path; + } + + const string unity_generate_all = "unity_generate_all_csproj"; + + public RiderScriptEditor(IDiscovery discovery, IGenerator projectGeneration) + { + m_Discoverability = discovery; + m_ProjectGeneration = projectGeneration; + } + + private static string[] defaultExtensions + { + get + { + var customExtensions = new[] {"json", "asmdef", "log", "xaml"}; + return EditorSettings.projectGenerationBuiltinExtensions.Concat(EditorSettings.projectGenerationUserExtensions) + .Concat(customExtensions).Distinct().ToArray(); + } + } + + private static string[] HandledExtensions + { + get + { + return HandledExtensionsString.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.TrimStart('.', '*')) + .ToArray(); + } + } + + private static string HandledExtensionsString + { + get { return EditorPrefs.GetString("Rider_UserExtensions", string.Join(";", defaultExtensions));} + set { EditorPrefs.SetString("Rider_UserExtensions", value); } + } + + private static bool SupportsExtension(string path) + { + var extension = Path.GetExtension(path); + if (string.IsNullOrEmpty(extension)) + return false; + return HandledExtensions.Contains(extension.TrimStart('.')); + } + + public void OnGUI() + { + var prevGenerate = EditorPrefs.GetBool(unity_generate_all, false); + var generateAll = EditorGUILayout.Toggle("Generate all .csproj files.", prevGenerate); + if (generateAll != prevGenerate) + { + EditorPrefs.SetBool(unity_generate_all, generateAll); + } + + m_ProjectGeneration.GenerateAll(generateAll); + + if (RiderScriptEditorData.instance.shouldLoadEditorPlugin) + { + HandledExtensionsString = EditorGUILayout.TextField(new GUIContent("Extensions handled: "), HandledExtensionsString); + } + } + + public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles, + string[] importedFiles) + { + m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles), + importedFiles); + } + + public void SyncAll() + { + AssetDatabase.Refresh(); + if (RiderScriptEditorData.instance.HasChanges) + { + m_ProjectGeneration.Sync(); + RiderScriptEditorData.instance.HasChanges = false; + } + } + + public void Initialize(string editorInstallationPath) // is called each time ExternalEditor is changed + { + RiderScriptEditorData.instance.Invalidate(editorInstallationPath); + m_ProjectGeneration.Sync(); // regenerate csproj and sln for new editor + } + + public bool OpenProject(string path, int line, int column) + { + if (path != "" && !SupportsExtension(path)) // Assets - Open C# Project passes empty path here + { + return false; + } + + if (path == "" && SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + { + // there is a bug in DllImplementation - use package implementation here instead https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/21 + return OpenOSXApp(path, line, column); + } + + if (!IsUnityScript(path)) + { + var fastOpenResult = EditorPluginInterop.OpenFileDllImplementation(path, line, column); + if (fastOpenResult) + return true; + } + + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + { + return OpenOSXApp(path, line, column); + } + + var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync. + solution = solution == "" ? "" : $"\"{solution}\""; + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = CodeEditor.CurrentEditorInstallation, + Arguments = $"{solution} -l {line} \"{path}\"", + UseShellExecute = true, + } + }; + + process.Start(); + + return true; + } + + private bool OpenOSXApp(string path, int line, int column) + { + var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync. + solution = solution == "" ? "" : $"\"{solution}\""; + var pathArguments = path == "" ? "" : $"-l {line} \"{path}\""; + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "open", + Arguments = $"-n \"{CodeEditor.CurrentEditorInstallation}\" --args {solution} {pathArguments}", + CreateNoWindow = true, + UseShellExecute = true, + } + }; + + process.Start(); + + return true; + } + + private string GetSolutionFile(string path) + { + if (IsUnityScript(path)) + { + return Path.Combine(GetBaseUnityDeveloperFolder(), "Projects/CSharp/Unity.CSharpProjects.gen.sln"); + } + + var solutionFile = m_ProjectGeneration.SolutionFile(); + if (File.Exists(solutionFile)) + { + return solutionFile; + } + + return ""; + } + + static bool IsUnityScript(string path) + { + if (UnityEditor.Unsupported.IsDeveloperBuild()) + { + var baseFolder = GetBaseUnityDeveloperFolder().Replace("\\", "/"); + var lowerPath = path.ToLowerInvariant().Replace("\\", "/"); + + if (lowerPath.Contains((baseFolder + "/Runtime").ToLowerInvariant()) + || lowerPath.Contains((baseFolder + "/Editor").ToLowerInvariant())) + { + return true; + } + } + + return false; + } + + static string GetBaseUnityDeveloperFolder() + { + return Directory.GetParent(EditorApplication.applicationPath).Parent.Parent.FullName; + } + + public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation) + { + if (FileSystemUtil.EditorPathExists(editorPath) && IsRiderInstallation(editorPath)) + { + var info = new RiderPathLocator.RiderInfo(editorPath, false); + installation = new CodeEditor.Installation + { + Name = info.Presentation, + Path = info.Path + }; + return true; + } + + installation = default; + return false; + } + + public static bool IsRiderInstallation(string path) + { + if (IsAssetImportWorkerProcess()) + return false; + + if (string.IsNullOrEmpty(path)) + { + return false; + } + + var fileInfo = new FileInfo(path); + var filename = fileInfo.Name.ToLowerInvariant(); + return filename.StartsWith("rider", StringComparison.Ordinal); + } + + private static bool IsAssetImportWorkerProcess() + { +#if UNITY_2019_3_OR_NEWER + return UnityEditor.Experimental.AssetDatabaseExperimental.IsAssetImportWorkerProcess(); +#else + return false; +#endif + } + + public static string CurrentEditor // works fast, doesn't validate if executable really exists + => EditorPrefs.GetString("kScriptsDefaultApp"); + + public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback(); + + public void CreateSolutionIfDoesntExist() + { + if (!m_ProjectGeneration.HasSolutionBeenGenerated()) + { + m_ProjectGeneration.Sync(); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta new file mode 100644 index 0000000..1676483 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4095d72f77fbb64ea39b8b3ca246622 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs new file mode 100644 index 0000000..f75ed0d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs @@ -0,0 +1,29 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace Packages.Rider.Editor +{ + public class RiderScriptEditorData : ScriptableSingleton + { + [SerializeField] internal bool HasChanges = true; // sln/csproj files were changed + [SerializeField] internal bool shouldLoadEditorPlugin; + [SerializeField] internal bool InitializedOnce; + [SerializeField] internal string currentEditorVersion; + + public void Init() + { + if (string.IsNullOrEmpty(currentEditorVersion)) + Invalidate(RiderScriptEditor.CurrentEditor); + } + + public void Invalidate(string editorInstallationPath) + { + currentEditorVersion = RiderPathLocator.GetBuildNumber(editorInstallationPath); + if (!Version.TryParse(currentEditorVersion, out var version)) + shouldLoadEditorPlugin = false; + + shouldLoadEditorPlugin = version >= new Version("191.7141.156"); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta new file mode 100644 index 0000000..21a5abc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f079e3afd077fb94fa2bda74d6409499 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta new file mode 100644 index 0000000..f6e86c9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a52391bc44c477f40a547ed4ef3b9560 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs new file mode 100644 index 0000000..01573fa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using UnityEditor; + +namespace Packages.Rider.Editor.UnitTesting +{ + public class CallbackData : ScriptableSingleton + { + public bool isRider; + + [UsedImplicitly] public static event EventHandler Changed = (sender, args) => { }; + + internal void RaiseChangedEvent() + { + Changed(null, EventArgs.Empty); + } + + public List events = new List(); + + [UsedImplicitly] + public void Clear() + { + events.Clear(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta new file mode 100644 index 0000000..ce32722 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 010246a07de7cb34185a2a7b1c1fad59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs new file mode 100644 index 0000000..10d528b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs @@ -0,0 +1,18 @@ +#if TEST_FRAMEWORK +using UnityEditor; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace Packages.Rider.Editor.UnitTesting +{ + [InitializeOnLoad] + internal static class CallbackInitializer + { + static CallbackInitializer() + { + if (CallbackData.instance.isRider) + ScriptableObject.CreateInstance().RegisterCallbacks(ScriptableObject.CreateInstance(), 0); + } + } +} +#endif \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta new file mode 100644 index 0000000..d47c38c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa1c6b1a353ab464782fc1e7c051eb02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs new file mode 100644 index 0000000..e08c346 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using UnityEngine; +#if TEST_FRAMEWORK +using UnityEditor; +using UnityEditor.TestTools.TestRunner.Api; +#endif + +namespace Packages.Rider.Editor.UnitTesting +{ + public static class RiderTestRunner + { +#if TEST_FRAMEWORK + private static readonly TestsCallback Callback = ScriptableObject.CreateInstance(); +#endif + [UsedImplicitly] + public static void RunTests(int testMode, string[] assemblyNames, string[] testNames, string[] categoryNames, string[] groupNames, int? buildTarget) + { +#if !TEST_FRAMEWORK + Debug.LogError("Update Test Framework package to v.1.1.1+ to run tests from Rider."); +#else + CallbackData.instance.isRider = true; + + var api = ScriptableObject.CreateInstance(); + var settings = new ExecutionSettings(); + var filter = new Filter + { + assemblyNames = assemblyNames, + testNames = testNames, + categoryNames = categoryNames, + groupNames = groupNames, + targetPlatform = (BuildTarget?) buildTarget + }; + + if (testMode > 0) // for future use - test-framework would allow running both Edit and Play test at once + filter.testMode = (TestMode) testMode; + + settings.filters = new []{ + filter + }; + api.Execute(settings); + + api.UnregisterCallbacks(Callback); // avoid multiple registrations + api.RegisterCallbacks(Callback); // This can be used to receive information about when the test suite and individual tests starts and stops. Provide this with a scriptable object implementing ICallbacks +#endif + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta new file mode 100644 index 0000000..6ef5313 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c3b27069cb3ddf42ba1260eeefcdd1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs new file mode 100644 index 0000000..ce2e1b7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs @@ -0,0 +1,31 @@ +using System; +using NUnit.Framework.Interfaces; + +namespace Packages.Rider.Editor.UnitTesting +{ + [Serializable] + public enum EventType { TestStarted, TestFinished, RunFinished } + + [Serializable] + public class TestEvent + { + public EventType type; + public string id; + public string assemblyName; + public string output; + public TestStatus testStatus; + public double duration; + public string parentId; + + public TestEvent(EventType type, string id, string assemblyName, string output, double duration, TestStatus testStatus, string parentID) + { + this.type = type; + this.id = id; + this.assemblyName = assemblyName; + this.output = output; + this.testStatus = testStatus; + this.duration = duration; + parentId = parentID; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta new file mode 100644 index 0000000..7ec7c71 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9413c47b3a14a64e8810ce76d1a6032 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs new file mode 100644 index 0000000..9995050 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs @@ -0,0 +1,83 @@ +#if TEST_FRAMEWORK +using System; +using System.Text; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace Packages.Rider.Editor.UnitTesting +{ + public class TestsCallback : ScriptableObject, ICallbacks + { + public void RunFinished(ITestResultAdaptor result) + { + CallbackData.instance.isRider = false; + + CallbackData.instance.events.Add( + new TestEvent(EventType.RunFinished, "", "","", 0, ParseTestStatus(result.TestStatus), "")); + CallbackData.instance.RaiseChangedEvent(); + } + + public void TestStarted(ITestAdaptor result) + { + if (result.Method == null) return; + + CallbackData.instance.events.Add( + new TestEvent(EventType.TestStarted, GetUniqueName(result), result.Method.TypeInfo.Assembly.GetName().Name, "", 0, ParseTestStatus(TestStatus.Passed), result.ParentFullName)); + CallbackData.instance.RaiseChangedEvent(); + } + + public void TestFinished(ITestResultAdaptor result) + { + if (result.Test.Method == null) return; + + CallbackData.instance.events.Add( + new TestEvent(EventType.TestFinished, GetUniqueName(result.Test), result.Test.Method.TypeInfo.Assembly.GetName().Name, ExtractOutput(result), result.Duration, ParseTestStatus(result.TestStatus), result.Test.ParentFullName)); + CallbackData.instance.RaiseChangedEvent(); + } + + // todo: reimplement JetBrains.Rider.Unity.Editor.AfterUnity56.UnitTesting.TestEventsSender.GetUniqueName + private static string GetUniqueName(ITestAdaptor test) + { + string str = test.FullName; + return str; + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + private static NUnit.Framework.Interfaces.TestStatus ParseTestStatus(TestStatus testStatus) + { + return (NUnit.Framework.Interfaces.TestStatus)Enum.Parse(typeof(NUnit.Framework.Interfaces.TestStatus), testStatus.ToString()); + } + + private static string ExtractOutput(ITestResultAdaptor testResult) + { + var stringBuilder = new StringBuilder(); + if (testResult.Message != null) + { + stringBuilder.AppendLine("Message: "); + stringBuilder.AppendLine(testResult.Message); + } + + if (!string.IsNullOrEmpty(testResult.Output)) + { + stringBuilder.AppendLine("Output: "); + stringBuilder.AppendLine(testResult.Output); + } + + if (!string.IsNullOrEmpty(testResult.StackTrace)) + { + stringBuilder.AppendLine("Stacktrace: "); + stringBuilder.AppendLine(testResult.StackTrace); + } + + var result = stringBuilder.ToString(); + if (result.Length > 0) + return result; + + return testResult.Output ?? string.Empty; + } + } +} +#endif \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta new file mode 100644 index 0000000..068cba1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58aa570dbe0761f43b25ff6c2265bbe2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta new file mode 100644 index 0000000..d7ba88e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e726086cd652f82087d59d67d2c24cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs new file mode 100644 index 0000000..c41490a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace Packages.Rider.Editor.Util +{ + public class CommandLineParser + { + public Dictionary Options = new Dictionary(); + + public CommandLineParser(string[] args) + { + var i = 0; + while (i < args.Length) + { + var arg = args[i]; + if (!arg.StartsWith("-")) + { + i++; + continue; + } + + string value = null; + if (i + 1 < args.Length && !args[i + 1].StartsWith("-")) + { + value = args[i + 1]; + i++; + } + + if (!(Options.ContainsKey(arg))) + { + Options.Add(arg, value); + } + i++; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta new file mode 100644 index 0000000..536d707 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 154ace4bd16de9f4e84052ac257786d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs new file mode 100644 index 0000000..f558aca --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs @@ -0,0 +1,66 @@ +using System; +using System.ComponentModel; +using System.IO; +using System.Text; +using JetBrains.Annotations; +using UnityEngine; + +namespace Packages.Rider.Editor.Util +{ + public static class FileSystemUtil + { + [NotNull] + public static string GetFinalPathName([NotNull] string path) + { + if (path == null) throw new ArgumentNullException("path"); + + // up to MAX_PATH. MAX_PATH on Linux currently 4096, on Mac OS X 1024 + // doc: http://man7.org/linux/man-pages/man3/realpath.3.html + var sb = new StringBuilder(8192); + var result = LibcNativeInterop.realpath(path, sb); + if (result == IntPtr.Zero) + { + throw new Win32Exception($"{path} was not resolved."); + } + + return new FileInfo(sb.ToString()).FullName; + } + + public static string FileNameWithoutExtension(string path) + { + if (string.IsNullOrEmpty(path)) + { + return ""; + } + + var indexOfDot = -1; + var indexOfSlash = 0; + for (var i = path.Length - 1; i >= 0; i--) + { + if (indexOfDot == -1 && path[i] == '.') + { + indexOfDot = i; + } + + if (indexOfSlash == 0 && path[i] == '/' || path[i] == '\\') + { + indexOfSlash = i + 1; + break; + } + } + + if (indexOfDot == -1) + { + indexOfDot = path.Length; + } + + return path.Substring(indexOfSlash, indexOfDot - indexOfSlash); + } + + public static bool EditorPathExists(string editorPath) + { + return SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX && new DirectoryInfo(editorPath).Exists + || SystemInfo.operatingSystemFamily != OperatingSystemFamily.MacOSX && new FileInfo(editorPath).Exists; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta new file mode 100644 index 0000000..ebc001b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bdbd564a9fdad0b738e76d030cad1204 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs new file mode 100644 index 0000000..a4070f2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs @@ -0,0 +1,12 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Packages.Rider.Editor.Util +{ + internal static class LibcNativeInterop + { + [DllImport("libc", SetLastError = true)] + public static extern IntPtr realpath(string path, StringBuilder resolved_path); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta new file mode 100644 index 0000000..fe70ee0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 071c17858dc6c47ada7b2a1f1ded5402 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs new file mode 100644 index 0000000..63acff6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Packages.Rider.Editor; +using Unity.CodeEditor; + +// Is called via commandline from Rider Notification after checking out from source control. + +// ReSharper disable once CheckNamespace +namespace JetBrains.Rider.Unity.Editor +{ + public static class RiderMenu + { + [UsedImplicitly] + public static void MenuOpenProject() + { + if (RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor)) + { + // Force the project files to be sync + CodeEditor.CurrentEditor.SyncAll(); + + // Load Project + CodeEditor.CurrentEditor.OpenProject(); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta new file mode 100644 index 0000000..b78dfae --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8860c53ca4073d4f92c403e709c12ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs new file mode 100644 index 0000000..03c9922 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs @@ -0,0 +1,20 @@ +using System; +using System.Linq; +using UnityEngine; + +namespace Packages.Rider.Editor.Util +{ + public static class UnityUtils + { + internal static readonly string UnityApplicationVersion = Application.unityVersion; + + public static Version UnityVersion + { + get + { + var ver = UnityApplicationVersion.Split(".".ToCharArray()).Take(2).Aggregate((a, b) => a + "." + b); + return new Version(ver); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta new file mode 100644 index 0000000..9a4e6fe --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ec9edad2de6c4df3a146b543a0fbc4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef new file mode 100644 index 0000000..4caebc4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Unity.Rider.Editor", + "references": [ + "GUID:0acc523941302664db1f4e527237feb3" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.test-framework", + "expression": "1.1.1", + "define": "TEST_FRAMEWORK" + } + ] +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta new file mode 100644 index 0000000..7a89700 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d528c8c98d269ca44a06cd9624a03945 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json new file mode 100644 index 0000000..eb7d7d5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json @@ -0,0 +1,19 @@ +{ + "name": "com.unity.ide.rider", + "displayName": "Rider Editor", + "description": "Code editor integration for supporting Rider as code editor for unity. Adds support for generating csproj files for code completion, auto discovery of installations, etc.", + "version": "1.1.4", + "unity": "2019.2", + "unityRelease": "0a12", + "dependencies": { + "com.unity.test-framework": "1.1.1" + }, + "relatedPackages": { + "com.unity.ide.rider.tests": "1.1.4" + }, + "repository": { + "type": "git", + "url": "git@github.cds.internal.unity3d.com:unity/com.unity.ide.rider.git", + "revision": "d2ef95989104a4ce866cdcb7f94cf3c67476fcc9" + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta new file mode 100644 index 0000000..11bcd7b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 66c95bb3c74257f41bae2622511dc02d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md new file mode 100644 index 0000000..20f4072 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md @@ -0,0 +1,79 @@ +# Code Editor Package for Visual Studio Code + +## [1.2.3] - 2020-10-23 + +Remove workaround for VSCode omnisharp (as of https://github.com/OmniSharp/omnisharp-vscode/issues/4113 we no longer need to disable the referenceoutputassemblies). + + +## [1.2.2] - 2020-09-04 + +VSC-14 - synchronize solution file when adding new assembly + + +## [1.2.1] - 2020-05-15 + +Source filtering adds support for asmref + + +## [1.2.0] - 2020-03-04 + +Do not reference projects that has not been generated (case 1211057) +Only open files that exists (case 1188394) +Add individual toggle buttons for generating csprojects for packages +Add support for Roslyn analyzers in project generation through csc.rsp and compiled assembly references +Remove Release build target from csproj and sln + + +## [1.1.4] - 2020-01-02 + +Delta project generation, only recompute the csproj files whose script modified. + + +## [1.1.3] - 2019-10-22 + +Exe version of vscode will use Normal ProcessWindowStyle while cmd will use Hidden + + +## [1.1.2] - 2019-08-30 + +Fixing OSX open command arguments + + +## [1.1.1] - 2019-08-19 + +Support for Player Project. Generates specific csproj files containing files, reference, defines, +etc. that will show how the assembly will be compiled for a target platform. + + +## [1.1.0] - 2019-08-07 + +Adds support for choosing extensions to be opened with VSCode. This can be done through the GUI in Preferences. +Avoids opening all extensions after the change in core unity. + + +## [1.0.7] - 2019-05-15 + +Fix various OSX specific issues. +Generate project on load if they are not generated. +Fix path recognition. + + +## [1.0.6] - 2019-04-30 + +Ensure asset database is refreshed when generating csproj and solution files. + +## [1.0.5] - 2019-04-27 + +Add support for generating all csproj files. + +## [1.0.4] - 2019-04-18 + +Fix relative package paths. +Fix opening editor on mac. +Add %LOCALAPPDATA%/Programs to the path of install paths. + +## [1.0.3] - 2019-01-01 + +### This is the first release of *Unity Package vscode_editor*. + +Using the newly created api to integrate Visual Studio Code with Unity. diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md.meta new file mode 100644 index 0000000..65aea0b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4ddcdc3816429494a8bea67e973875f7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md new file mode 100644 index 0000000..576d096 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing + +## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement) +By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions. + +## Once you have a change ready following these ground rules. Simply make a pull request \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md.meta new file mode 100644 index 0000000..31e836f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fcb9be00baf924c4183fc0313e6185c5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Documentation~/README.md b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Documentation~/README.md new file mode 100644 index 0000000..d0a565f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Documentation~/README.md @@ -0,0 +1,4 @@ +# Code Editor Package for Visual Studio Code + +This package is not intended to be modified by users. +Nor does it provide any api intended to be included in user projects. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor.meta new file mode 100644 index 0000000..568fa03 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58628227479c34542ac8c5193ccced84 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration.meta new file mode 100644 index 0000000..48ed36c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c779d3735d950f341ba35154e8b3234b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs new file mode 100644 index 0000000..c442d87 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.PackageManager; + +namespace VSCodeEditor +{ + public interface IAssemblyNameProvider + { + string[] ProjectSupportedExtensions { get; } + ProjectGenerationFlag ProjectGenerationFlag { get; } + string GetAssemblyNameFromScriptPath(string path); + IEnumerable GetAssemblies(Func shouldFileBePartOfSolution); + IEnumerable GetAllAssetPaths(); + IEnumerable GetRoslynAnalyzerPaths(); + UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath); + ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories); + bool IsInternalizedPackagePath(string path); + void ToggleProjectGeneration(ProjectGenerationFlag preference); + } + + internal class AssemblyNameProvider : IAssemblyNameProvider + { + ProjectGenerationFlag m_ProjectGenerationFlag = (ProjectGenerationFlag)EditorPrefs.GetInt("unity_project_generation_flag", 0); + + public string[] ProjectSupportedExtensions => EditorSettings.projectGenerationUserExtensions; + + public ProjectGenerationFlag ProjectGenerationFlag + { + get => m_ProjectGenerationFlag; + private set + { + EditorPrefs.SetInt("unity_project_generation_flag", (int)value); + m_ProjectGenerationFlag = value; + } + } + + public string GetAssemblyNameFromScriptPath(string path) + { + return CompilationPipeline.GetAssemblyNameFromScriptPath(path); + } + + public IEnumerable GetAssemblies(Func shouldFileBePartOfSolution) + { + return CompilationPipeline.GetAssemblies() + .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution)); + } + + public IEnumerable GetAllAssetPaths() + { + return AssetDatabase.GetAllAssetPaths(); + } + + public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath) + { + return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath); + } + + public ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories) + { + return CompilationPipeline.ParseResponseFile( + responseFilePath, + projectDirectory, + systemReferenceDirectories + ); + } + + public bool IsInternalizedPackagePath(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + return false; + } + var packageInfo = FindForAssetPath(path); + if (packageInfo == null) + { + return false; + } + var packageSource = packageInfo.source; + switch (packageSource) + { + case PackageSource.Embedded: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.Embedded); + case PackageSource.Registry: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.Registry); + case PackageSource.BuiltIn: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.BuiltIn); + case PackageSource.Unknown: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.Unknown); + case PackageSource.Local: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.Local); + case PackageSource.Git: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.Git); +#if UNITY_2019_3_OR_NEWER + case PackageSource.LocalTarball: + return !ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.LocalTarBall); +#endif + } + + return false; + } + + public void ToggleProjectGeneration(ProjectGenerationFlag preference) + { + if (ProjectGenerationFlag.HasFlag(preference)) + { + ProjectGenerationFlag ^= preference; + } + else + { + ProjectGenerationFlag |= preference; + } + } + + public IEnumerable GetRoslynAnalyzerPaths() + { + return PluginImporter.GetAllImporters() + .Where(i => !i.isNativePlugin && AssetDatabase.GetLabels(i).SingleOrDefault(l => l == "RoslynAnalyzer") != null) + .Select(i => i.assetPath); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta new file mode 100644 index 0000000..a8ae38b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1d93ffb668978f7488211a331977b73b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs new file mode 100644 index 0000000..aeff22e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs @@ -0,0 +1,38 @@ +using System.IO; +using System.Text; + +namespace VSCodeEditor +{ + public interface IFileIO + { + bool Exists(string fileName); + + string ReadAllText(string fileName); + void WriteAllText(string fileName, string content); + + void CreateDirectory(string pathName); + } + + class FileIOProvider : IFileIO + { + public bool Exists(string fileName) + { + return File.Exists(fileName); + } + + public string ReadAllText(string fileName) + { + return File.ReadAllText(fileName); + } + + public void WriteAllText(string fileName, string content) + { + File.WriteAllText(fileName, content, Encoding.UTF8); + } + + public void CreateDirectory(string pathName) + { + Directory.CreateDirectory(pathName); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs.meta new file mode 100644 index 0000000..91d8212 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb221cf55b3544646b0c3b6bc790080f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs new file mode 100644 index 0000000..0654966 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs @@ -0,0 +1,21 @@ +namespace VSCodeEditor +{ + public interface IGUIDGenerator + { + string ProjectGuid(string projectName, string assemblyName); + string SolutionGuid(string projectName, string extension); + } + + class GUIDProvider : IGUIDGenerator + { + public string ProjectGuid(string projectName, string assemblyName) + { + return SolutionGuidGenerator.GuidForProject(projectName + assemblyName); + } + + public string SolutionGuid(string projectName, string extension) + { + return SolutionGuidGenerator.GuidForSolution(projectName, extension); // GetExtensionOfSourceFiles(assembly.sourceFiles) + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta new file mode 100644 index 0000000..9ce342e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e58bd3cca6475e54b93632bb6837aeea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 0000000..4552728 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs @@ -0,0 +1,777 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security; +using System.Security.Cryptography; +using System.Text; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; +using UnityEngine.Profiling; + +namespace VSCodeEditor +{ + public interface IGenerator + { + bool SyncIfNeeded(List affectedFiles, string[] reimportedFiles); + void Sync(); + string SolutionFile(); + string ProjectDirectory { get; } + IAssemblyNameProvider AssemblyNameProvider { get; } + void GenerateAll(bool generateAll); + bool SolutionExists(); + } + + public class ProjectGeneration : IGenerator + { + enum ScriptingLanguage + { + None, + CSharp + } + + public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003"; + + const string k_WindowsNewline = "\r\n"; + + const string k_SettingsJson = @"{ + ""files.exclude"": + { + ""**/.DS_Store"":true, + ""**/.git"":true, + ""**/.gitignore"":true, + ""**/.gitmodules"":true, + ""**/*.booproj"":true, + ""**/*.pidb"":true, + ""**/*.suo"":true, + ""**/*.user"":true, + ""**/*.userprefs"":true, + ""**/*.unityproj"":true, + ""**/*.dll"":true, + ""**/*.exe"":true, + ""**/*.pdf"":true, + ""**/*.mid"":true, + ""**/*.midi"":true, + ""**/*.wav"":true, + ""**/*.gif"":true, + ""**/*.ico"":true, + ""**/*.jpg"":true, + ""**/*.jpeg"":true, + ""**/*.png"":true, + ""**/*.psd"":true, + ""**/*.tga"":true, + ""**/*.tif"":true, + ""**/*.tiff"":true, + ""**/*.3ds"":true, + ""**/*.3DS"":true, + ""**/*.fbx"":true, + ""**/*.FBX"":true, + ""**/*.lxo"":true, + ""**/*.LXO"":true, + ""**/*.ma"":true, + ""**/*.MA"":true, + ""**/*.obj"":true, + ""**/*.OBJ"":true, + ""**/*.asset"":true, + ""**/*.cubemap"":true, + ""**/*.flare"":true, + ""**/*.mat"":true, + ""**/*.meta"":true, + ""**/*.prefab"":true, + ""**/*.unity"":true, + ""build/"":true, + ""Build/"":true, + ""Library/"":true, + ""library/"":true, + ""obj/"":true, + ""Obj/"":true, + ""ProjectSettings/"":true, + ""temp/"":true, + ""Temp/"":true + } +}"; + + /// + /// Map source extensions to ScriptingLanguages + /// + static readonly Dictionary k_BuiltinSupportedExtensions = new Dictionary + { + { "cs", ScriptingLanguage.CSharp }, + { "uxml", ScriptingLanguage.None }, + { "uss", ScriptingLanguage.None }, + { "shader", ScriptingLanguage.None }, + { "compute", ScriptingLanguage.None }, + { "cginc", ScriptingLanguage.None }, + { "hlsl", ScriptingLanguage.None }, + { "glslinc", ScriptingLanguage.None }, + { "template", ScriptingLanguage.None }, + { "raytrace", ScriptingLanguage.None } + }; + + string m_SolutionProjectEntryTemplate = string.Join("\r\n", @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""", @"EndProject").Replace(" ", "\t"); + + string m_SolutionProjectConfigurationTemplate = string.Join("\r\n", @" {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU", @" {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU").Replace(" ", "\t"); + + static readonly string[] k_ReimportSyncExtensions = { ".dll", ".asmdef" }; + + string[] m_ProjectSupportedExtensions = new string[0]; + public string ProjectDirectory { get; } + IAssemblyNameProvider IGenerator.AssemblyNameProvider => m_AssemblyNameProvider; + + public void GenerateAll(bool generateAll) + { + m_AssemblyNameProvider.ToggleProjectGeneration( + ProjectGenerationFlag.BuiltIn + | ProjectGenerationFlag.Embedded + | ProjectGenerationFlag.Git + | ProjectGenerationFlag.Local +#if UNITY_2019_3_OR_NEWER + | ProjectGenerationFlag.LocalTarBall +#endif + | ProjectGenerationFlag.PlayerAssemblies + | ProjectGenerationFlag.Registry + | ProjectGenerationFlag.Unknown); + } + + readonly string m_ProjectName; + readonly IAssemblyNameProvider m_AssemblyNameProvider; + readonly IFileIO m_FileIOProvider; + readonly IGUIDGenerator m_GUIDProvider; + + const string k_ToolsVersion = "4.0"; + const string k_ProductVersion = "10.0.20506"; + const string k_BaseDirectory = "."; + const string k_TargetFrameworkVersion = "v4.7.1"; + const string k_TargetLanguageVersion = "latest"; + + public ProjectGeneration(string tempDirectory) + : this(tempDirectory, new AssemblyNameProvider(), new FileIOProvider(), new GUIDProvider()) { } + + public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIO, IGUIDGenerator guidGenerator) + { + ProjectDirectory = tempDirectory.Replace('\\', '/'); + m_ProjectName = Path.GetFileName(ProjectDirectory); + m_AssemblyNameProvider = assemblyNameProvider; + m_FileIOProvider = fileIO; + m_GUIDProvider = guidGenerator; + } + + /// + /// Syncs the scripting solution if any affected files are relevant. + /// + /// + /// Whether the solution was synced. + /// + /// + /// A set of files whose status has changed + /// + /// + /// A set of files that got reimported + /// + public bool SyncIfNeeded(List affectedFiles, string[] reimportedFiles) + { + Profiler.BeginSample("SolutionSynchronizerSync"); + SetupProjectSupportedExtensions(); + + // Don't sync if we haven't synced before + if (SolutionExists() && HasFilesBeenModified(affectedFiles, reimportedFiles)) + { + var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution); + var allProjectAssemblies = RelevantAssembliesForMode(assemblies).ToList(); + SyncSolution(allProjectAssemblies); + + var allAssetProjectParts = GenerateAllAssetProjectParts(); + + var affectedNames = affectedFiles.Select(asset => m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset)).Where(name => !string.IsNullOrWhiteSpace(name)).Select(name => name.Split(new [] {".dll"}, StringSplitOptions.RemoveEmptyEntries)[0]); + var reimportedNames = reimportedFiles.Select(asset => m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset)).Where(name => !string.IsNullOrWhiteSpace(name)).Select(name => name.Split(new [] {".dll"}, StringSplitOptions.RemoveEmptyEntries)[0]); + var affectedAndReimported = new HashSet(affectedNames.Concat(reimportedNames)); + var assemblyNames = new HashSet(allProjectAssemblies.Select(assembly => Path.GetFileName(assembly.outputPath))); + + foreach (var assembly in allProjectAssemblies) + { + if (!affectedAndReimported.Contains(assembly.name)) + continue; + + SyncProject(assembly, allAssetProjectParts, ParseResponseFileData(assembly), assemblyNames); + } + + Profiler.EndSample(); + return true; + } + + Profiler.EndSample(); + return false; + } + + bool HasFilesBeenModified(List affectedFiles, string[] reimportedFiles) + { + return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset); + } + + static bool ShouldSyncOnReimportedAsset(string asset) + { + return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension); + } + + public void Sync() + { + SetupProjectSupportedExtensions(); + GenerateAndWriteSolutionAndProjects(); + } + + public bool SolutionExists() + { + return m_FileIOProvider.Exists(SolutionFile()); + } + + void SetupProjectSupportedExtensions() + { + m_ProjectSupportedExtensions = m_AssemblyNameProvider.ProjectSupportedExtensions; + } + + bool ShouldFileBePartOfSolution(string file) + { + // Exclude files coming from packages except if they are internalized. + if (m_AssemblyNameProvider.IsInternalizedPackagePath(file)) + { + return false; + } + + return HasValidExtension(file); + } + + bool HasValidExtension(string file) + { + string extension = Path.GetExtension(file); + + // Dll's are not scripts but still need to be included.. + if (extension == ".dll") + return true; + + if (file.ToLower().EndsWith(".asmdef")) + return true; + + return IsSupportedExtension(extension); + } + + bool IsSupportedExtension(string extension) + { + extension = extension.TrimStart('.'); + if (k_BuiltinSupportedExtensions.ContainsKey(extension)) + return true; + if (m_ProjectSupportedExtensions.Contains(extension)) + return true; + return false; + } + + static ScriptingLanguage ScriptingLanguageFor(Assembly assembly) + { + return ScriptingLanguageFor(GetExtensionOfSourceFiles(assembly.sourceFiles)); + } + + static string GetExtensionOfSourceFiles(string[] files) + { + return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : "NA"; + } + + static string GetExtensionOfSourceFile(string file) + { + var ext = Path.GetExtension(file).ToLower(); + ext = ext.Substring(1); //strip dot + return ext; + } + + static ScriptingLanguage ScriptingLanguageFor(string extension) + { + return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result) + ? result + : ScriptingLanguage.None; + } + + public void GenerateAndWriteSolutionAndProjects() + { + // Only synchronize assemblies that have associated source files and ones that we actually want in the project. + // This also filters out DLLs coming from .asmdef files in packages. + var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution); + + var allAssetProjectParts = GenerateAllAssetProjectParts(); + + SyncSolution(assemblies); + var allProjectAssemblies = RelevantAssembliesForMode(assemblies).ToList(); + var assemblyNames = new HashSet(allProjectAssemblies.Select(assembly => Path.GetFileName(assembly.outputPath))); + foreach (Assembly assembly in allProjectAssemblies) + { + var responseFileData = ParseResponseFileData(assembly); + SyncProject(assembly, allAssetProjectParts, responseFileData, assemblyNames); + } + + WriteVSCodeSettingsFiles(); + } + + List ParseResponseFileData(Assembly assembly) + { + var systemReferenceDirectories = CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel); + + Dictionary responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary(x => x, x => m_AssemblyNameProvider.ParseResponseFile( + x, + ProjectDirectory, + systemReferenceDirectories + )); + + Dictionary responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any()) + .ToDictionary(x => x.Key, x => x.Value); + + if (responseFilesWithErrors.Any()) + { + foreach (var error in responseFilesWithErrors) + foreach (var valueError in error.Value.Errors) + { + Debug.LogError($"{error.Key} Parse Error : {valueError}"); + } + } + + return responseFilesData.Select(x => x.Value).ToList(); + } + + Dictionary GenerateAllAssetProjectParts() + { + Dictionary stringBuilders = new Dictionary(); + + foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths()) + { + // Exclude files coming from packages except if they are internalized. + // TODO: We need assets from the assembly API + if (m_AssemblyNameProvider.IsInternalizedPackagePath(asset)) + { + continue; + } + + string extension = Path.GetExtension(asset); + if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension)) + { + // Find assembly the asset belongs to by adding script extension and using compilation pipeline. + var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset); + + if (string.IsNullOrEmpty(assemblyName)) + { + continue; + } + + assemblyName = Path.GetFileNameWithoutExtension(assemblyName); + + if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder)) + { + projectBuilder = new StringBuilder(); + stringBuilders[assemblyName] = projectBuilder; + } + + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + } + + var result = new Dictionary(); + + foreach (var entry in stringBuilders) + result[entry.Key] = entry.Value.ToString(); + + return result; + } + + void SyncProject( + Assembly assembly, + Dictionary allAssetsProjectParts, + List responseFilesData, + HashSet assemblyNames) + { + SyncProjectFileIfNotChanged(ProjectFile(assembly), ProjectText(assembly, allAssetsProjectParts, responseFilesData, assemblyNames, GetAllRoslynAnalyzerPaths().ToArray())); + } + + private IEnumerable GetAllRoslynAnalyzerPaths() + { + return m_AssemblyNameProvider.GetRoslynAnalyzerPaths(); + } + + void SyncProjectFileIfNotChanged(string path, string newContents) + { + SyncFileIfNotChanged(path, newContents); + } + + void SyncSolutionFileIfNotChanged(string path, string newContents) + { + SyncFileIfNotChanged(path, newContents); + } + + void SyncFileIfNotChanged(string filename, string newContents) + { + if (m_FileIOProvider.Exists(filename)) + { + var currentContents = m_FileIOProvider.ReadAllText(filename); + + if (currentContents == newContents) + { + return; + } + } + + m_FileIOProvider.WriteAllText(filename, newContents); + } + + string ProjectText( + Assembly assembly, + Dictionary allAssetsProjectParts, + List responseFilesData, + HashSet assemblyNames, + string[] roslynAnalyzerDllPaths) + { + var projectBuilder = new StringBuilder(); + ProjectHeader(assembly, responseFilesData, roslynAnalyzerDllPaths, projectBuilder); + var references = new List(); + + foreach (string file in assembly.sourceFiles) + { + if (!HasValidExtension(file)) + continue; + + var extension = Path.GetExtension(file).ToLower(); + var fullFile = EscapedRelativePathFor(file); + if (".dll" != extension) + { + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + else + { + references.Add(fullFile); + } + } + + // Append additional non-script files that should be included in project generation. + if (allAssetsProjectParts.TryGetValue(assembly.name, out var additionalAssetsForProject)) + projectBuilder.Append(additionalAssetsForProject); + + var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r)); + var internalAssemblyReferences = assembly.assemblyReferences + .Where(i => !i.sourceFiles.Any(ShouldFileBePartOfSolution)).Select(i => i.outputPath); + var allReferences = + assembly.compiledAssemblyReferences + .Union(responseRefs) + .Union(references) + .Union(internalAssemblyReferences) + .Except(roslynAnalyzerDllPaths); + + foreach (var reference in allReferences) + { + string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference); + AppendReference(fullReference, projectBuilder); + } + + if (0 < assembly.assemblyReferences.Length) + { + projectBuilder.Append(" ").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(k_WindowsNewline); + foreach (Assembly reference in assembly.assemblyReferences.Where(i => i.sourceFiles.Any(ShouldFileBePartOfSolution))) + { + var referencedProject = reference.outputPath; + + projectBuilder.Append(" ").Append(k_WindowsNewline); + projectBuilder.Append(" {").Append(ProjectGuid(reference.name)).Append("}").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(reference.name).Append("").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + } + + projectBuilder.Append(ProjectFooter()); + return projectBuilder.ToString(); + } + + static void AppendReference(string fullReference, StringBuilder projectBuilder) + { + //replace \ with / and \\ with / + var escapedFullPath = SecurityElement.Escape(fullReference); + escapedFullPath = escapedFullPath.Replace("\\\\", "/"); + escapedFullPath = escapedFullPath.Replace("\\", "/"); + projectBuilder.Append(" ").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(escapedFullPath).Append("").Append(k_WindowsNewline); + projectBuilder.Append(" ").Append(k_WindowsNewline); + } + + public string ProjectFile(Assembly assembly) + { + var fileBuilder = new StringBuilder(assembly.name); + fileBuilder.Append(".csproj"); + return Path.Combine(ProjectDirectory, fileBuilder.ToString()); + } + + public string SolutionFile() + { + return Path.Combine(ProjectDirectory, $"{m_ProjectName}.sln"); + } + + void ProjectHeader( + Assembly assembly, + List responseFilesData, + string[] roslynAnalyzerDllPaths, + StringBuilder builder + ) + { + var otherArguments = GetOtherArgumentsFromResponseFilesData(responseFilesData); + GetProjectHeaderTemplate( + builder, + ProjectGuid(assembly.name), + assembly.name, + string.Join(";", new[] { "DEBUG", "TRACE" }.Concat(assembly.defines).Concat(responseFilesData.SelectMany(x => x.Defines)).Concat(EditorUserBuildSettings.activeScriptCompilationDefines).Distinct().ToArray()), + assembly.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe), + GenerateAnalyserItemGroup(otherArguments["analyzer"].Concat(otherArguments["a"]) + .SelectMany(x => x.Split(';')) + .Concat(roslynAnalyzerDllPaths) + .Distinct() + .ToArray())); + } + + private static ILookup GetOtherArgumentsFromResponseFilesData(List responseFilesData) + { + var paths = responseFilesData.SelectMany(x => + { + return x.OtherArguments.Where(a => a.StartsWith("/") || a.StartsWith("-")) + .Select(b => + { + var index = b.IndexOf(":", StringComparison.Ordinal); + if (index > 0 && b.Length > index) + { + var key = b.Substring(1, index - 1); + return new KeyValuePair(key, b.Substring(index + 1)); + } + + const string warnaserror = "warnaserror"; + if (b.Substring(1).StartsWith(warnaserror)) + { + return new KeyValuePair(warnaserror, b.Substring(warnaserror.Length + 1)); + } + + return default; + }); + }) + .Distinct() + .ToLookup(o => o.Key, pair => pair.Value); + return paths; + } + + private static string GenerateAnalyserItemGroup(string[] paths) + { + // + // + // + // + if (!paths.Any()) + return string.Empty; + + var analyserBuilder = new StringBuilder(); + analyserBuilder.Append(" ").Append(k_WindowsNewline); + foreach (var path in paths) + { + analyserBuilder.Append($" ").Append(k_WindowsNewline); + } + analyserBuilder.Append(" ").Append(k_WindowsNewline); + return analyserBuilder.ToString(); + } + + static string GetSolutionText() + { + return string.Join("\r\n", @"", @"Microsoft Visual Studio Solution File, Format Version {0}", @"# Visual Studio {1}", @"{2}", @"Global", @" GlobalSection(SolutionConfigurationPlatforms) = preSolution", @" Debug|Any CPU = Debug|Any CPU", @" EndGlobalSection", @" GlobalSection(ProjectConfigurationPlatforms) = postSolution", @"{3}", @" EndGlobalSection", @" GlobalSection(SolutionProperties) = preSolution", @" HideSolutionNode = FALSE", @" EndGlobalSection", @"EndGlobal", @"").Replace(" ", "\t"); + } + + static string GetProjectFooterTemplate() + { + return string.Join("\r\n", @" ", @" ", @" ", @"", @""); + } + + static void GetProjectHeaderTemplate( + StringBuilder builder, + string assemblyGUID, + string assemblyName, + string defines, + bool allowUnsafe, + string analyzerBlock + ) + { + builder.Append(@"").Append(k_WindowsNewline); + builder.Append(@"").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_TargetLanguageVersion).Append("").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" Debug").Append(k_WindowsNewline); + builder.Append(@" AnyCPU").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_ProductVersion).Append("").Append(k_WindowsNewline); + builder.Append(@" 2.0").Append(k_WindowsNewline); + builder.Append(@" ").Append(EditorSettings.projectGenerationRootNamespace).Append("").Append(k_WindowsNewline); + builder.Append(@" {").Append(assemblyGUID).Append("}").Append(k_WindowsNewline); + builder.Append(@" Library").Append(k_WindowsNewline); + builder.Append(@" Properties").Append(k_WindowsNewline); + builder.Append(@" ").Append(assemblyName).Append("").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_TargetFrameworkVersion).Append("").Append(k_WindowsNewline); + builder.Append(@" 512").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_BaseDirectory).Append("").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" true").Append(k_WindowsNewline); + builder.Append(@" full").Append(k_WindowsNewline); + builder.Append(@" false").Append(k_WindowsNewline); + builder.Append(@" Temp\bin\Debug\").Append(k_WindowsNewline); + builder.Append(@" ").Append(defines).Append("").Append(k_WindowsNewline); + builder.Append(@" prompt").Append(k_WindowsNewline); + builder.Append(@" 4").Append(k_WindowsNewline); + builder.Append(@" 0169").Append(k_WindowsNewline); + builder.Append(@" ").Append(allowUnsafe).Append("").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(@" true").Append(k_WindowsNewline); + builder.Append(@" true").Append(k_WindowsNewline); + builder.Append(@" false").Append(k_WindowsNewline); + builder.Append(@" false").Append(k_WindowsNewline); + builder.Append(@" false").Append(k_WindowsNewline); + builder.Append(@" ").Append(k_WindowsNewline); + builder.Append(analyzerBlock); + builder.Append(@" ").Append(k_WindowsNewline); + } + + void SyncSolution(IEnumerable assemblies) + { + SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(assemblies)); + } + + string SolutionText(IEnumerable assemblies) + { + var fileversion = "11.00"; + var vsversion = "2010"; + + var relevantAssemblies = RelevantAssembliesForMode(assemblies); + string projectEntries = GetProjectEntries(relevantAssemblies); + string projectConfigurations = string.Join(k_WindowsNewline, relevantAssemblies.Select(i => GetProjectActiveConfigurations(ProjectGuid(i.name))).ToArray()); + return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations); + } + + static IEnumerable RelevantAssembliesForMode(IEnumerable assemblies) + { + return assemblies.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i)); + } + + /// + /// Get a Project("{guid}") = "MyProject", "MyProject.csproj", "{projectguid}" + /// entry for each relevant language + /// + string GetProjectEntries(IEnumerable assemblies) + { + var projectEntries = assemblies.Select(i => string.Format( + m_SolutionProjectEntryTemplate, + SolutionGuid(i), + i.name, + Path.GetFileName(ProjectFile(i)), + ProjectGuid(i.name) + )); + + return string.Join(k_WindowsNewline, projectEntries.ToArray()); + } + + /// + /// Generate the active configuration string for a given project guid + /// + string GetProjectActiveConfigurations(string projectGuid) + { + return string.Format( + m_SolutionProjectConfigurationTemplate, + projectGuid); + } + + string EscapedRelativePathFor(string file) + { + var projectDir = ProjectDirectory.Replace('/', '\\'); + file = file.Replace('/', '\\'); + var path = SkipPathPrefix(file, projectDir); + + var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\', '/')); + if (packageInfo != null) + { + // We have to normalize the path, because the PackageManagerRemapper assumes + // dir seperators will be os specific. + var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\'); + path = SkipPathPrefix(absolutePath, projectDir); + } + + return SecurityElement.Escape(path); + } + + static string SkipPathPrefix(string path, string prefix) + { + if (path.StartsWith($@"{prefix}\")) + return path.Substring(prefix.Length + 1); + return path; + } + + static string NormalizePath(string path) + { + if (Path.DirectorySeparatorChar == '\\') + return path.Replace('/', Path.DirectorySeparatorChar); + return path.Replace('\\', Path.DirectorySeparatorChar); + } + + string ProjectGuid(string assembly) + { + return m_GUIDProvider.ProjectGuid(m_ProjectName, assembly); + } + + string SolutionGuid(Assembly assembly) + { + return m_GUIDProvider.SolutionGuid(m_ProjectName, GetExtensionOfSourceFiles(assembly.sourceFiles)); + } + + static string ProjectFooter() + { + return GetProjectFooterTemplate(); + } + + static string GetProjectExtension() + { + return ".csproj"; + } + + void WriteVSCodeSettingsFiles() + { + var vsCodeDirectory = Path.Combine(ProjectDirectory, ".vscode"); + + if (!m_FileIOProvider.Exists(vsCodeDirectory)) + m_FileIOProvider.CreateDirectory(vsCodeDirectory); + + var vsCodeSettingsJson = Path.Combine(vsCodeDirectory, "settings.json"); + + if (!m_FileIOProvider.Exists(vsCodeSettingsJson)) + m_FileIOProvider.WriteAllText(vsCodeSettingsJson, k_SettingsJson); + } + } + + public static class SolutionGuidGenerator + { + static MD5 mD5 = MD5CryptoServiceProvider.Create(); + + public static string GuidForProject(string projectName) + { + return ComputeGuidHashFor(projectName + "salt"); + } + + public static string GuidForSolution(string projectName, string sourceFileExtension) + { + if (sourceFileExtension.ToLower() == "cs") + + // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs + return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"; + + return ComputeGuidHashFor(projectName); + } + + static string ComputeGuidHashFor(string input) + { + var hash = mD5.ComputeHash(Encoding.Default.GetBytes(input)); + return new Guid(hash).ToString(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 0000000..5039705 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97d6c87381e3e51488b49f5891490b70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs new file mode 100644 index 0000000..e51dd43 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs @@ -0,0 +1,18 @@ +using System; + +namespace VSCodeEditor +{ + [Flags] + public enum ProjectGenerationFlag + { + None = 0, + Embedded = 1, + Local = 2, + Registry = 4, + Git = 8, + BuiltIn = 16, + Unknown = 32, + PlayerAssemblies = 64, + LocalTarBall = 128, + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta new file mode 100644 index 0000000..35bf027 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f239f506223a98f4e9b5dd3a9f80edea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef new file mode 100644 index 0000000..032da7c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef @@ -0,0 +1,9 @@ +{ + "name": "Unity.VSCode.Editor", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta new file mode 100644 index 0000000..4c94f56 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8b845b123ab418448a8be2935fa804e0 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs new file mode 100644 index 0000000..609d2cd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Unity.CodeEditor; + +namespace VSCodeEditor +{ + public interface IDiscovery + { + CodeEditor.Installation[] PathCallback(); + } + + public class VSCodeDiscovery : IDiscovery + { + List m_Installations; + + public CodeEditor.Installation[] PathCallback() + { + if (m_Installations == null) + { + m_Installations = new List(); + FindInstallationPaths(); + } + + return m_Installations.ToArray(); + } + + void FindInstallationPaths() + { + string[] possiblePaths = +#if UNITY_EDITOR_OSX + { + "/Applications/Visual Studio Code.app", + "/Applications/Visual Studio Code - Insiders.app" + }; +#elif UNITY_EDITOR_WIN + { + GetProgramFiles() + @"/Microsoft VS Code/bin/code.cmd", + GetProgramFiles() + @"/Microsoft VS Code/Code.exe", + GetProgramFiles() + @"/Microsoft VS Code Insiders/bin/code-insiders.cmd", + GetProgramFiles() + @"/Microsoft VS Code Insiders/Code.exe", + GetLocalAppData() + @"/Programs/Microsoft VS Code/bin/code.cmd", + GetLocalAppData() + @"/Programs/Microsoft VS Code/Code.exe", + GetLocalAppData() + @"/Programs/Microsoft VS Code Insiders/bin/code-insiders.cmd", + GetLocalAppData() + @"/Programs/Microsoft VS Code Insiders/Code.exe", + }; +#else + { + "/usr/bin/code", + "/bin/code", + "/usr/local/bin/code", + "/var/lib/flatpak/exports/bin/com.visualstudio.code", + "/snap/current/bin/code" + }; +#endif + var existingPaths = possiblePaths.Where(VSCodeExists).ToList(); + if (!existingPaths.Any()) + { + return; + } + + var lcp = GetLongestCommonPrefix(existingPaths); + switch (existingPaths.Count) + { + case 1: + { + var path = existingPaths.First(); + m_Installations = new List + { + new CodeEditor.Installation + { + Path = path, + Name = path.Contains("Insiders") + ? "Visual Studio Code Insiders" + : "Visual Studio Code" + } + }; + break; + } + case 2 when existingPaths.Any(path => !(path.Substring(lcp.Length).Contains("/") || path.Substring(lcp.Length).Contains("\\"))): + { + goto case 1; + } + default: + { + m_Installations = existingPaths.Select(path => new CodeEditor.Installation + { + Name = $"Visual Studio Code Insiders ({path.Substring(lcp.Length)})", + Path = path + }).ToList(); + + break; + } + } + } + +#if UNITY_EDITOR_WIN + static string GetProgramFiles() + { + return Environment.GetEnvironmentVariable("ProgramFiles")?.Replace("\\", "/"); + } + + static string GetLocalAppData() + { + return Environment.GetEnvironmentVariable("LOCALAPPDATA")?.Replace("\\", "/"); + } +#endif + + static string GetLongestCommonPrefix(List paths) + { + var baseLength = paths.First().Length; + for (var pathIndex = 1; pathIndex < paths.Count; pathIndex++) + { + baseLength = Math.Min(baseLength, paths[pathIndex].Length); + for (var i = 0; i < baseLength; i++) + { + if (paths[pathIndex][i] == paths[0][i]) continue; + + baseLength = i; + break; + } + } + + return paths[0].Substring(0, baseLength); + } + + static bool VSCodeExists(string path) + { +#if UNITY_EDITOR_OSX + return System.IO.Directory.Exists(path); +#else + return new FileInfo(path).Exists; +#endif + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs.meta new file mode 100644 index 0000000..cbeca1b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 380f7372e785c7d408552e2c760d269d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs new file mode 100644 index 0000000..7efc69f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs @@ -0,0 +1,280 @@ +using System; +using System.IO; +using System.Linq; +using System.Diagnostics; +using UnityEditor; +using UnityEngine; +using Unity.CodeEditor; + +namespace VSCodeEditor +{ + [InitializeOnLoad] + public class VSCodeScriptEditor : IExternalCodeEditor + { + const string vscode_argument = "vscode_arguments"; + const string vscode_extension = "vscode_userExtensions"; + static readonly GUIContent k_ResetArguments = EditorGUIUtility.TrTextContent("Reset argument"); + string m_Arguments; + + IDiscovery m_Discoverability; + IGenerator m_ProjectGeneration; + + static readonly string[] k_SupportedFileNames = { "code.exe", "visualstudiocode.app", "visualstudiocode-insiders.app", "vscode.app", "code.app", "code.cmd", "code-insiders.cmd", "code", "com.visualstudio.code" }; + + static bool IsOSX => Application.platform == RuntimePlatform.OSXEditor; + + static string DefaultApp => EditorPrefs.GetString("kScriptsDefaultApp"); + + static string DefaultArgument { get; } = "\"$(ProjectPath)\" -g \"$(File)\":$(Line):$(Column)"; + + string Arguments + { + get => m_Arguments ?? (m_Arguments = EditorPrefs.GetString(vscode_argument, DefaultArgument)); + set + { + m_Arguments = value; + EditorPrefs.SetString(vscode_argument, value); + } + } + + static string[] defaultExtensions + { + get + { + var customExtensions = new[] { "json", "asmdef", "log" }; + return EditorSettings.projectGenerationBuiltinExtensions + .Concat(EditorSettings.projectGenerationUserExtensions) + .Concat(customExtensions) + .Distinct().ToArray(); + } + } + + static string[] HandledExtensions + { + get + { + return HandledExtensionsString + .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) + .Select(s => s.TrimStart('.', '*')) + .ToArray(); + } + } + + static string HandledExtensionsString + { + get => EditorPrefs.GetString(vscode_extension, string.Join(";", defaultExtensions)); + set => EditorPrefs.SetString(vscode_extension, value); + } + + public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation) + { + var lowerCasePath = editorPath.ToLower(); + var filename = Path.GetFileName(lowerCasePath).Replace(" ", ""); + var installations = Installations; + if (!k_SupportedFileNames.Contains(filename)) + { + installation = default; + return false; + } + + if (!installations.Any()) + { + installation = new CodeEditor.Installation + { + Name = "Visual Studio Code", + Path = editorPath + }; + } + else + { + try + { + installation = installations.First(inst => inst.Path == editorPath); + } + catch (InvalidOperationException) + { + installation = new CodeEditor.Installation + { + Name = "Visual Studio Code", + Path = editorPath + }; + } + } + + return true; + } + + public void OnGUI() + { + Arguments = EditorGUILayout.TextField("External Script Editor Args", Arguments); + if (GUILayout.Button(k_ResetArguments, GUILayout.Width(120))) + { + Arguments = DefaultArgument; + } + + EditorGUILayout.LabelField("Generate .csproj files for:"); + EditorGUI.indentLevel++; + SettingsButton(ProjectGenerationFlag.Embedded, "Embedded packages", ""); + SettingsButton(ProjectGenerationFlag.Local, "Local packages", ""); + SettingsButton(ProjectGenerationFlag.Registry, "Registry packages", ""); + SettingsButton(ProjectGenerationFlag.Git, "Git packages", ""); + SettingsButton(ProjectGenerationFlag.BuiltIn, "Built-in packages", ""); +#if UNITY_2019_3_OR_NEWER + SettingsButton(ProjectGenerationFlag.LocalTarBall, "Local tarball", ""); +#endif + SettingsButton(ProjectGenerationFlag.Unknown, "Packages from unknown sources", ""); + RegenerateProjectFiles(); + EditorGUI.indentLevel--; + + HandledExtensionsString = EditorGUILayout.TextField(new GUIContent("Extensions handled: "), HandledExtensionsString); + } + + void RegenerateProjectFiles() + { + var rect = EditorGUI.IndentedRect(EditorGUILayout.GetControlRect(new GUILayoutOption[] { })); + rect.width = 252; + if (GUI.Button(rect, "Regenerate project files")) + { + m_ProjectGeneration.Sync(); + } + } + + void SettingsButton(ProjectGenerationFlag preference, string guiMessage, string toolTip) + { + var prevValue = m_ProjectGeneration.AssemblyNameProvider.ProjectGenerationFlag.HasFlag(preference); + var newValue = EditorGUILayout.Toggle(new GUIContent(guiMessage, toolTip), prevValue); + if (newValue != prevValue) + { + m_ProjectGeneration.AssemblyNameProvider.ToggleProjectGeneration(preference); + } + } + + public void CreateIfDoesntExist() + { + if (!m_ProjectGeneration.SolutionExists()) + { + m_ProjectGeneration.Sync(); + } + } + + public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles, string[] importedFiles) + { + m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles).ToList(), importedFiles); + } + + public void SyncAll() + { + AssetDatabase.Refresh(); + m_ProjectGeneration.Sync(); + } + + public bool OpenProject(string path, int line, int column) + { + if (path != "" && (!SupportsExtension(path) || !File.Exists(path))) // Assets - Open C# Project passes empty path here + { + return false; + } + + if (line == -1) + line = 1; + if (column == -1) + column = 0; + + string arguments; + if (Arguments != DefaultArgument) + { + arguments = m_ProjectGeneration.ProjectDirectory != path + ? CodeEditor.ParseArgument(Arguments, path, line, column) + : m_ProjectGeneration.ProjectDirectory; + } + else + { + arguments = $@"""{m_ProjectGeneration.ProjectDirectory}"""; + if (m_ProjectGeneration.ProjectDirectory != path && path.Length != 0) + { + arguments += $@" -g ""{path}"":{line}:{column}"; + } + } + + if (IsOSX) + { + return OpenOSX(arguments); + } + + var app = DefaultApp; + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = app, + Arguments = arguments, + WindowStyle = app.EndsWith(".cmd", StringComparison.OrdinalIgnoreCase) ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal, + CreateNoWindow = true, + UseShellExecute = true, + } + }; + + process.Start(); + return true; + } + + static bool OpenOSX(string arguments) + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "open", + Arguments = $"-n \"{DefaultApp}\" --args {arguments}", + UseShellExecute = true, + } + }; + + process.Start(); + return true; + } + + static bool SupportsExtension(string path) + { + var extension = Path.GetExtension(path); + if (string.IsNullOrEmpty(extension)) + return false; + return HandledExtensions.Contains(extension.TrimStart('.')); + } + + public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback(); + + public VSCodeScriptEditor(IDiscovery discovery, IGenerator projectGeneration) + { + m_Discoverability = discovery; + m_ProjectGeneration = projectGeneration; + } + + static VSCodeScriptEditor() + { + var editor = new VSCodeScriptEditor(new VSCodeDiscovery(), new ProjectGeneration(Directory.GetParent(Application.dataPath).FullName)); + CodeEditor.Register(editor); + + if (IsVSCodeInstallation(CodeEditor.CurrentEditorInstallation)) + { + editor.CreateIfDoesntExist(); + } + } + + static bool IsVSCodeInstallation(string path) + { + if (string.IsNullOrEmpty(path)) + { + return false; + } + + var lowerCasePath = path.ToLower(); + var filename = Path + .GetFileName(lowerCasePath.Replace('\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar)) + .Replace(" ", ""); + return k_SupportedFileNames.Contains(filename); + } + + public void Initialize(string editorInstallationPath) { } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs.meta new file mode 100644 index 0000000..a0aa5a4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac3f13489022aa34d861a0320a6917b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md new file mode 100644 index 0000000..eb18dfb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Unity Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md.meta new file mode 100644 index 0000000..20c91bd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c9aabac5924106d4790d7b3a924ca34d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json new file mode 100644 index 0000000..6f6f1c1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json @@ -0,0 +1,19 @@ +{ + "name": "com.unity.ide.vscode", + "displayName": "Visual Studio Code Editor", + "description": "Code editor integration for supporting Visual Studio Code as code editor for unity. Adds support for generating csproj files for intellisense purposes, auto discovery of installations, etc.", + "version": "1.2.3", + "unity": "2019.2", + "unityRelease": "0a12", + "relatedPackages": { + "com.unity.ide.vscode.tests": "1.2.3" + }, + "upmCi": { + "footprint": "ab99793db10bad3c377fc6971b0b21989002c495" + }, + "repository": { + "url": "https://github.cds.internal.unity3d.com/unity/com.unity.ide.vscode.git", + "type": "git", + "revision": "547f63839bdc87e0aed2c9e0d84f8f6336a83ea3" + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json.meta b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json.meta new file mode 100644 index 0000000..e559711 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ffc6271f08270b64ca0aae9c49235d81 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CHANGELOG.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CHANGELOG.md new file mode 100644 index 0000000..0689661 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CHANGELOG.md @@ -0,0 +1,160 @@ +# Changelog +## [1.1.19] - 2020-11-17 +- Command line runs with an inconclusive test result now exit with exit code 2 (case DS-951). +- Fixed timeout during UnitySetUp which caoused test to pass instead of failing due to wrong time format. +- Timeout exeption thrown when timeout time is exeded in the UnitySetup when using `WaitForSeconds(n)`. +- Method marked with UnityTest that are not returning IEnumerator is now giving a proper error (DS-1059). +- Updating `com.unity.ext.nunit` version. + +## [1.1.18] - 2020-10-07 +- Fixed issue of timeout during UnitySetUp which wasn't detected and allowed the test to pass instead of failing (case DSTR-21) + +## [1.1.17] - 2020-10-05 +- Fixed an issue where the WaitForDomainReload yield instruction would sometimes let the test continue for one frame before the domain reload. +- Added support for negation in filters using !. E.g. !CategoryToExclude. +- Fixed an issue where if the first test enters PlayMode from UnitySetup then the test body will not run on consecutive runs (case 1260901). +- Clear Results button clears the test results in the GUI (DSTR-16) +- Improved UI in Test Runner window, added new options: + - Run Selected Tests in player + - Build/Export project with all tests in player + - Build/Export project with selected tests in player +- Fixed issue on loading EditMode or Playmode test tree in the wrong tab when switching between tabs when TestRunner is loading (DS-865) + +## [1.1.16] - 2020-07-09 +- Follow up on fix when UTF picks up on outdated compilation errors + +## [1.1.15] - 2020-07-02 +- Fixed an issue where an exception is thrown on getting the enumerator of a UnityTest would result in stopping the test run instead of failing it (case 1212000). +- Including a trailing semi-colon in a testName filter no longer results in all tests being run (case 1171200). +- Fixed and issue when Unity Test Framework exits editor on an outdated script compilation error (during api updates) + +## [1.1.14] - 2020-04-03 +- Added the 'assemblyNames' command line argument for filtering on the assembly level. +- The dll and project level of the tree view should now correctly show the results when running tests in a player (case 1197026). +- Optimize usage of player connection when transfering test results (case 1229200). +- Ignore internal test framework tests assertions (case 1206961). + +## [1.1.13] - 2020-03-16 +- Fixed an issue where a combination of Entering / Exiting playmode and recompiling scripts would result in the test run repeating (case 1213958). +- Fixed a regression from 1.1.12 where prefabs left in the scene would be cleaned up to aggressively. +- Fixed Test execution timed out. No activity received from the player in 600 seconds error when player is not supposed to start (case 1225147) + +## [1.1.12] - 2020-03-02 +- Now 'Open error line' for a failed UTF test does not throw exceptions for corrupted testable pdb in Editor release mode (case 1118259) +- Fixed an issue where running a test fixture would also run other fixtures with the same full name (namespace plus classname) in other assemblies (case 1197385). +- Running tests with the same full name, with a domain reload inbetween, will no longer fail to initialize the fixture of the second class (case 1205240). +- Running a playmode tests with "Maximize on Play" will now correctly show the result of the tests in the test runner window (case 1014908). +- Fixed an issue where leaving a game object in a scene with a DontSaveInEditor hideFlags would result in an error on cleanup (case 1136883). +- Now ITestPlayerBuildModifier.ModifyOptions is called as expected when running tests on a device (case 1213845) + +## [1.1.11] - 2020-01-16 +- Fixed test runner dlls got included into player build (case 1211624) +- Passing a non-full-path of XML file for -testResults in Unity Batchmode issue resolved, now passing "result.xml" creates the result file in the project file directory (case 959078) +- Respect Script Debugging build setting when running tests + +## [1.1.10] - 2019-12-19 +- Introduced PostSuccessfulLaunchAction callback +- Fixed an issue where canceling a UnityTest while it was running would incorrectly mark it as passed instead of canceled. +- Added command line argument for running tests synchronously. +- The test search bar now handles null values correctly. +- The test output pane now retains its size on domain reloads. + +## [1.1.9] - 2019-12-12 +- Rolled back refactoring to the test run system, as it caused issues in some corner cases. + +## [1.1.8] - 2019-11-15 +- Ensured that a resumed test run is continued instantly. + +## [1.1.7] - 2019-11-14 +- Fixed an issue with test runs after domain reload. + +## [1.1.6] - 2019-11-12 +- Building a player for test will no longer look in unrelated assemblies for relevant attributes. + +## [1.1.5] - 2019-10-23 +- Fixed a regression to synchronous runs introduced in 1.1.4. + +## [1.1.4] - 2019-10-15 +- Running tests in batch mode now correctly returns error code 3 (RunError) when a timeout or a build error occurs. +- Fixed an issue where a test run in a player would time out, if the player takes longer than 10 minutes to run. +- Added command line argument and api setting for specifying custom heartbeat timeout for running on players. + +## [1.1.3] - 2019-09-23 +- Fixed a regression where tests in a player would report a timeout after a test run is finished. +- Made it possible for the ui to change its test items when the test tree changes without script compilation. +- Added synchronous runs as an option to the TestRunnerApi. + +## [1.1.2] - 2019-09-11 +- Fixed an issue where Run Selected would run all tests in the category, if a category filter was selected, regardless of what tests were selected. +- Unsupported attributes used in UnityTests now give an explicit error. +- Added support for the Repeat and Retry attributes in UnityTests (case 1131940). +- Tests with a explicit timeout higher than 10 minutes, no longer times out after running longer than 10 minutes when running from command line (case 1125991). +- Fixed a performance regression in the test runner api result reporting, introduced in 2018.3 (case 1109865). +- Fixed an issue where parameterized test fixtures would not run if selected in the test tree (case 1092244). +- Pressing Clear Results now also correctly clears the counters on the test list (case 1181763). +- Prebuild setup now handles errors logged with Debug.LogError and stops the run if any is logged (case 1115240). It now also supports LogAssert.Expect. + +## [1.1.1] - 2019-08-07 +- Tests retrieved as a test list with the test runner api incorrectly showed both mode as their TestMode. +- Fixed a compatibility issue with running tests from rider. + +## [1.1.0] - 2019-07-30 +- Introduced the TestRunnerApi for running tests programmatically from elsewhere inside the Editor. +- Introduced yield instructions for recompiling scripts and awaiting a domain reload in Edit Mode tests. +- Added a button to the Test Runner UI for clearing the results. + +## [1.0.18] - 2019-07-15 +- Included new full documentation of the test framework. + +## [1.0.17] - 2019-07-11 +- Fixed an issue where the Test Runner window wouldn’t frame selected items after search filter is cleared. +- Fixed a regression where playmode test application on the IOS platform would not quit after the tests are done. + +## [1.0.16] - 2019-06-20 +- Fixed an issue where the Test Runner window popped out if it was docked, or if something else was docked next to it, when re-opened (case 1158961) +- Fixed a regression where the running standalone playmode tests from the ui would result in an error. + +## [1.0.15] - 2019-06-18 +- Added new `[TestMustExpectAllLogs]` attribute, which automatically does `LogAssert.NoUnexpectedReceived()` at the end of affected tests. See docs for this attribute for more info on usage. +- Fixed a regression where no tests would be run if multiple filters are specified. E.g. selecting both a whole assembly and an individual test in the ui. +- Fixed an issue where performing `Run Selected` on a selected assembly would run all assemblies. +- Introduced the capability to do a split build and run, when running playmode tests on standalone devices. +- Fixed an error in ConditionalIgnore, if the condition were not set. + +## [1.0.14] - 2019-05-27 +- Fixed issue preventing scene creation in IPrebuildSetup.Setup callback when running standalone playmode tests. +- Fixed an issue where test assemblies would sometimes not be ordered alphabetically. +- Added module references to the package for the required modules: imgui and jsonserialize. +- Added a ConditionalIgnore attribute to help ignoring tests only under specific conditions. +- Fixed a typo in the player test window (case 1148671). + +## [1.0.13] - 2019-05-07 +- Fixed a regression where results from the player would no longer update correctly in the UI (case 1151147). + +## [1.0.12] - 2019-04-16 +- Added specific unity release to the package information. + +## [1.0.11] - 2019-04-10 +- Fixed a regression from 1.0.10 where test-started events were triggered multiple times after a domain reload. + +## [1.0.10] - 2019-04-08 +- Fixed an issue where test-started events would not be fired correctly after a test performing a domain reload (case 1141530). +- The UI should correctly run tests inside a nested class, when that class is selected. +- All actions should now correctly display a prefix when reporting test result. E.g. "TearDown :". +- Errors logged with Debug.LogError in TearDowns now append the error, rather than overwriting the existing result (case 1114306). +- Incorrect implementations of IWrapTestMethod and IWrapSetUpTearDown now gives a meaningful error. +- Fixed a regression where the Test Framework would run TearDown in a base class before the inheriting class (case 1142553). +- Fixed a regression introduced in 1.0.9 where tests with the Explicit attribute could no longer be executed. + +## [1.0.9] - 2019-03-27 +- Fixed an issue where a corrupt instance of the test runner window would block for a new being opened. +- Added the required modules to the list of package requirements. +- Fixed an issue where errors would happen if the test filter ui was clicked before the ui is done loading. +- Fix selecting items with duplicate names in test hierarchy of Test Runner window (case 987587). +- Fixed RecompileScripts instruction which we use in tests (case 1128994). +- Fixed an issue where using multiple filters on tests would sometimes give an incorrect result. + +## [1.0.7] - 2019-03-12 +### This is the first release of *Unity Package com.unity.test-framework*. + +- Migrated the test-framework from the current extension in unity. diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CHANGELOG.md.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CHANGELOG.md.meta new file mode 100644 index 0000000..4fca79e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d691174143fd3774ba63d7c493633b99 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CONTRIBUTING.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CONTRIBUTING.md new file mode 100644 index 0000000..9f299b1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Contributing + +## If you are interested in contributing, here are some ground rules: +* ... Define guidelines & rules for what contributors need to know to successfully make Pull requests against your repo ... + +## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement) +By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions. + +## Once you have a change ready following these ground rules. Simply make a pull request diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CONTRIBUTING.md.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CONTRIBUTING.md.meta new file mode 100644 index 0000000..39e850a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57d2ac5c7d5786e499d4794973fe0d4e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/TableOfContents.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/TableOfContents.md new file mode 100644 index 0000000..3155c1f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/TableOfContents.md @@ -0,0 +1,66 @@ +* [Unity Test Framework overview](./index.md) +* [Edit Mode vs. Play Mode tests](./edit-mode-vs-play-mode-tests.md) +* [Getting started with UTF](./getting-started.md) + * [How to create a new test assembly](./workflow-create-test-assembly.md) + * [How to create a test](./workflow-create-test.md) + * [How to run a test](./workflow-run-test.md) + * [How to create a Play Mode test](./workflow-create-playmode-test.md) + * [How to run a Play Mode test as standalone](./workflow-run-playmode-test-standalone.md) +* [Resources](./resources.md) +* [Extending UTF](./extending.md) + * [How to split the build and run process for standalone Play Mode tests](./reference-attribute-testplayerbuildmodifier.md#split-build-and-run-for-player-mode-tests) + * [How to run tests programmatically](./extension-run-tests.md) + * [How to get test results](./extension-get-test-results.md) + * [How to retrieve the list of tests](./extension-retrieve-test-list.md) +* [Reference](./manual.md#reference) + * [Running tests from the command-line](./reference-command-line.md) + * [UnityTest attribute](./reference-attribute-unitytest.md) + * [Setup and cleanup at build time](./reference-setup-and-cleanup.md) + * [IPrebuildSetup](./reference-setup-and-cleanup.md#iprebuildsetup) + * [IPostBuildCleanup](./reference-setup-and-cleanup.md#ipostbuildcleanup) + * [Actions outside of tests](./reference-actions-outside-tests.md) + * [Action execution order](./reference-actions-outside-tests.md#action-execution-order) + * [UnitySetUp and UnityTearDown](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [OuterUnityTestAction](./reference-actions-outside-tests.md#outerunitytestaction) + * [Domain Reloads](./reference-actions-outside-tests.md#domain-reloads) + * [Custom attributes](./reference-custom-attributes.md) + * [ConditionalIgnore attribute](./reference-attribute-conditionalignore.md) + * [PostBuildCleanup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [PrebuildSetup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [TestMustExpectAllLogs attribute](./reference-attribute-testmustexpectalllogs.md) + * [TestPlayerBuildModifier attribute](./reference-attribute-testplayerbuildmodifier.md) + * [TestRunCallback attribute](./reference-attribute-testruncallback.md) + * [UnityPlatform attribute](./reference-attribute-unityplatform.md) + * [UnitySetUp attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTearDown attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTest attribute](./reference-attribute-unitytest.md) + * [Custom equality comparers](./reference-custom-equality-comparers.md) + * [ColorEqualityComparer](./reference-comparer-color.md) + * [FloatEqualityComparer](./reference-comparer-float.md) + * [QuaternionEqualityComparer](./reference-comparer-quaternion.md) + * [Vector2EqualityComparer](./reference-comparer-vector2.md) + * [Vector3EqualityComparer](./reference-comparer-vector3.md) + * [Vector4EqualityComparer](./reference-comparer-vector4.md) + * [Custom equality comparers with equals operator](./reference-comparer-equals.md) + * [Test Utils](./reference-test-utils.md) + * [Custom yield instructions](./reference-custom-yield-instructions.md) + * [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md#IEditModeTestYieldInstruction) + * [EnterPlayMode](./reference-custom-yield-instructions.md#enterplaymode) + * [ExitPlayMode](./reference-custom-yield-instructions.md#exitplaymode) + * [RecompileScripts](./reference-recompile-scripts.md) + * [WaitForDomainReload](./reference-wait-for-domain-reload.md) + * [Custom assertion](./reference-custom-assertion.md) + * [LogAssert](./reference-custom-assertion.md#logassert) + * [Custom constraints](./reference-custom-constraints.md) + * [Is](./reference-custom-constraints.md#is) + * [Parameterized tests](./reference-tests-parameterized.md) + * [MonoBehaviour tests](./reference-tests-monobehaviour.md) + * [MonoBehaviourTest<T>](./reference-tests-monobehaviour.md#monobehaviourtestt) + * [IMonoBehaviourTest](./reference-tests-monobehaviour.md#imonobehaviourtest) + * [TestRunnerApi](./reference-test-runner-api.md) + * [ExecutionSettings](./reference-execution-settings.md) + * [Filter](./reference-filter.md) + * [ITestRunSettings](./reference-itest-run-settings.md) + * [ICallbacks](./reference-icallbacks.md) + * [IErrorCallbacks](./reference-ierror-callbacks.md) + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/edit-mode-vs-play-mode-tests.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/edit-mode-vs-play-mode-tests.md new file mode 100644 index 0000000..5459639 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/edit-mode-vs-play-mode-tests.md @@ -0,0 +1,53 @@ +# Edit Mode vs. Play Mode tests + +Let’s clarify a bit what Play Mode and Edit Mode test means from the Unity Test Framework perspective: + +## Edit Mode tests + +**Edit Mode** tests (also known as Editor tests) are only run in the Unity Editor and have access to the Editor code in addition to the game code. + +With Edit Mode tests it is possible to test any of your [Editor extensions](https://docs.unity3d.com/Manual/ExtendingTheEditor.html) using the [UnityTest](./reference-attribute-unitytest.md) attribute. For Edit Mode tests, your test code runs in the [EditorApplication.update](https://docs.unity3d.com/ScriptReference/EditorApplication-update.html) callback loop. + +> **Note**: You can also control entering and exiting Play Mode from your Edit Mode test. This allow your test to make changes before entering Play Mode. + +Edit Mode tests should meet one of the following conditions: + +* They should have an [assembly definition](./workflow-create-test-assembly.md) with reference to *nunit.framework.dll* and has only the Editor as a target platform: + +```assembly + "includePlatforms": [ + "Editor" + ], +``` + +* Legacy condition: put tests in the project’s [Editor](https://docs.unity3d.com/Manual/SpecialFolders.html) folder. + +## Play Mode tests + +You can run **Play Mode** tests as a [standalone in a Player](./workflow-run-playmode-test-standalone.md) or inside the Editor. Play Mode tests allow you to exercise your game code, as the tests run as [coroutines](https://docs.unity3d.com/ScriptReference/Coroutine.html) if marked with the `UnityTest` attribute. + +Play Mode tests should correspond to the following conditions: + +* Have an [assembly definition](./workflow-create-test-assembly.md) with reference to *nunit.framework.dll*. +* Have the test scripts located in a folder with the .asmdef file. +* The test assembly should reference an assembly within the code that you need to test. + +```assembly + "references": [ + "NewAssembly" + ], + "optionalUnityReferences": [ + "TestAssemblies" + ], + "includePlatforms": [], +``` + +## Recommendations + +### Attributes + +Use the [NUnit](http://www.nunit.org/) `Test` attribute instead of the `UnityTest` attribute, unless you need to [yield special instructions](./reference-custom-yield-instructions.md), in Edit Mode, or if you need to skip a frame or wait for a certain amount of time in Play Mode. + +### References + +It is possible for your Test Assemblies to reference the test tools in `UnityEngine.TestRunner` and `UnityEditor.TestRunner`. The latter is only available in Edit Mode. You can specify these references in the `Assembly Definition References` on the Assembly Definition. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extending.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extending.md new file mode 100644 index 0000000..045c94a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extending.md @@ -0,0 +1,10 @@ +# Extending Unity Test Framework +It is possible to extend the Unity Test Framework (UTF) in many ways, for custom workflows for your projects and for other packages to build on top of UTF. + +These extensions are a supplement to the ones already offered by [NUnit](https://github.com/nunit/docs/wiki/Framework-Extensibility). + +Some workflows for extending UTF include: +* [How to split the build and run process for standalone Play Mode tests](./reference-attribute-testplayerbuildmodifier.md#split-build-and-run-for-player-mode-tests) +* [How to run tests programmatically](./extension-run-tests.md) +* [How to get test results](./extension-get-test-results.md) +* [How to retrieve the list of tests](./extension-retrieve-test-list.md)  \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-get-test-results.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-get-test-results.md new file mode 100644 index 0000000..8b71d7e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-get-test-results.md @@ -0,0 +1,45 @@ +# How to get test results +You can receive callbacks when the active test run, or individual tests, starts and finishes. You can register callbacks by invoking `RegisterCallbacks` on the [TestRunnerApi](./reference-test-runner-api.md) with an instance of a class that implements [ICallbacks](./reference-icallbacks.md). There are four `ICallbacks` methods for the start and finish of both the whole run and each level of the test tree. + +## Example +An example of how listeners can be set up: + +> **Note**: Listeners receive callbacks from all test runs, regardless of the registered `TestRunnerApi` for that instance. + +``` C# +public void SetupListeners() +{ + var api = ScriptableObject.CreateInstance(); + api.RegisterCallbacks(new MyCallbacks()); +} + +private class MyCallbacks : ICallbacks +{ + public void RunStarted(ITestAdaptor testsToRun) + { + + } + + public void RunFinished(ITestResultAdaptor result) + { + + } + + public void TestStarted(ITestAdaptor test) + { + + } + + public void TestFinished(ITestResultAdaptor result) + { + if (!result.HasChildren && result.ResultState != "Success") + { + Debug.Log(string.Format("Test {0} {1}", result.Test.Name, result.ResultState)); + } + } +} +``` + +> **Note**: The registered callbacks are not persisted on domain reloads. So it is necessary to re-register the callback after a domain reloads, usually with [InitializeOnLoad](https://docs.unity3d.com/Manual/RunningEditorCodeOnLaunch.html). + +It is possible to provide a `priority` as an integer as the second argument when registering a callback. This influences the invocation order of different callbacks. The default value is zero. It is also possible to provide `RegisterCallbacks` with a class instance that implements [IErrorCallbacks](./reference-ierror-callbacks.md) that is an extended version of `ICallbacks`. `IErrorCallbacks` also has a callback method for `OnError` that invokes if the run fails to start, for example, due to compilation errors or if an [IPrebuildSetup](./reference-setup-and-cleanup.md) throws an exception. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-retrieve-test-list.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-retrieve-test-list.md new file mode 100644 index 0000000..dedc7fa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-retrieve-test-list.md @@ -0,0 +1,13 @@ +# How to retrieve the list of tests +It is possible to use the [TestRunnerApi](./reference-test-runner-api.md) to retrieve the test tree for a given test mode (**Edit Mode** or **Play Mode**). You can retrieve the test tree by invoking `RetrieveTestList` with the desired `TestMode` and a callback action, with an [ITestAdaptor](./reference-itest-adaptor.md) representing the test tree. + +## Example +The following example retrieves the test tree for Edit Mode tests and prints the number of total test cases: +``` C# +var api = ScriptableObject.CreateInstance(); +api.RetrieveTestList(TestMode.EditMode, (testRoot) => +{ + Debug.Log(string.Format("Tree contains {0} tests.", testRoot.TestCaseCount)); +}); +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-run-tests.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-run-tests.md new file mode 100644 index 0000000..60ff3dc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/extension-run-tests.md @@ -0,0 +1,72 @@ +# How to run tests programmatically +## Filters + +Run tests by calling `Execute` on the [TestRunnerApi](./reference-test-runner-api.md), and provide some execution settings that consists of a [Filter](./reference-filter.md). The `Filter` specifies what tests to run. + +### Example + +The following is an example of how to run all **Play Mode** tests in a project: + +``` C# +var testRunnerApi = ScriptableObject.CreateInstance(); +var filter = new Filter() +{ + testMode = TestMode.PlayMode +}; +testRunnerApi.Execute(new ExecutionSettings(filter)); +``` +## Multiple filter values + +It is possible to specify a more specific filter by filling out the fields on the `Filter` class in more detail. + +Many of the fields allow for multiple values. The runner tries to match tests against at least one of the values provided and then runs any tests that match. + +### Example + +In this example, the API runs tests with full names that fit either of the two names provided: + +``` C# +var api = ScriptableObject.CreateInstance(); +api.Execute(new ExecutionSettings(new Filter() +{ + testNames = new[] {"MyTestClass.NameOfMyTest", "SpecificTestFixture.NameOfAnotherTest"} +})); +``` +## Multiple filter fields + +If using multiple different fields on the filter, then it matches against tests that fulfill all the different fields. + +### Example + +In this example, it runs any test that fits either of the two test names, and that also belongs to a test assembly that fits the given name. + +``` C# +var api = ScriptableObject.CreateInstance(); +api.Execute(new ExecutionSettings(new Filter() +{ + assemblyNames = new [] {"MyTestAssembly"}, + testNames = new [] {"MyTestClass.NameOfMyTest", "MyTestClass.AnotherNameOfATest"} +})); +``` +## Multiple constructor filters + +The execution settings take one or more filters in its constructor. If there is no filter provided, then it runs all **Edit Mode** tests by default. If there are multiple filters provided, then a test runs if it matches any of the filters. + +### Example + +In this example, it runs any tests that are either in the assembly named `MyTestAssembly` or if the full name of the test matches either of the two provided test names: + +``` C# +var api = ScriptableObject.CreateInstance(); +api.Execute(new ExecutionSettings( + new Filter() + { + assemblyNames = new[] {"MyTestAssembly"}, + }, + new Filter() + { + testNames = new[] {"MyTestClass.NameOfMyTest", "MyTestClass.AnotherNameOfATest"} + } +)); +``` +> **Note**: Specifying different test modes or platforms in each `Filter` is not currently supported. The test mode and platform is from the first `Filter` only and defaults to Edit Mode, if not supplied. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/getting-started.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/getting-started.md new file mode 100644 index 0000000..a8051f2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/getting-started.md @@ -0,0 +1,18 @@ +# Getting started with Unity Test Framework + +To access the Unity Test Framework (UTF) in the Unity Editor, open the **Test Runner** window; go to **Window** > **General** > **Test Runner**. + +![Unity Test Runner window](./images/test-runner-window.png) + +To get started with UTF, follow the workflows below: + +* [How to create a new test assembly](./workflow-create-test-assembly.md) +* [How to create a test](./workflow-create-test.md) +* [How to run a test](./workflow-run-test.md) +* [How to create a Play Mode test](./workflow-create-playmode-test.md) +* [How to run a Play Mode test as standalone](./workflow-run-playmode-test-standalone.md) + + + +For further information, see the [resources](./resources.md) and [reference](./manual.md#reference) sections. + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-create-test-script.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-create-test-script.png new file mode 100644 index 0000000..fc9af55 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-create-test-script.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-run-test.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-run-test.png new file mode 100644 index 0000000..df1b53c Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-run-test.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-run-tests.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-run-tests.png new file mode 100644 index 0000000..c890d81 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-run-tests.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-tab.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-tab.png new file mode 100644 index 0000000..e1b00d7 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/editmode-tab.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/import-settings.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/import-settings.png new file mode 100644 index 0000000..6a34e92 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/import-settings.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/new-test-script.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/new-test-script.png new file mode 100644 index 0000000..21de081 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/new-test-script.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-enable-all.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-enable-all.png new file mode 100644 index 0000000..961991a Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-enable-all.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-results-standalone.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-results-standalone.png new file mode 100644 index 0000000..de40c03 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-results-standalone.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-run-standalone.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-run-standalone.png new file mode 100644 index 0000000..ded5792 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-run-standalone.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-tab.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-tab.png new file mode 100644 index 0000000..9d315cb Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/playmode-tab.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/test-runner-window.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/test-runner-window.png new file mode 100644 index 0000000..f3023fb Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/test-runner-window.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/test-templates.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/test-templates.png new file mode 100644 index 0000000..753a155 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/test-templates.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/tests-folder-assembly.png b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/tests-folder-assembly.png new file mode 100644 index 0000000..4e63751 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/images/tests-folder-assembly.png differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/index.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/index.md new file mode 100644 index 0000000..604a916 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/index.md @@ -0,0 +1,54 @@ +# About Unity Test Framework + +The Unity Test Framework (UTF) enables Unity users to test their code in both **Edit Mode** and **Play Mode**, and also on target platforms such as [Standalone](https://docs.unity3d.com/Manual/Standalone.html), Android, iOS, etc. + +This package provides a standard test framework for users of Unity and developers at Unity so that both benefit from the same features and can write tests the same way. + +UTF uses a Unity integration of NUnit library, which is an open-source unit testing library for .Net languages. For more information about NUnit, see the [official NUnit website](http://www.nunit.org/) and the [NUnit documentation on GitHub](https://github.com/nunit/docs/wiki/NUnit-Documentation). + +> **Note**: UTF is not a new concept or toolset; it is an adjusted and more descriptive naming for the toolset otherwise known as Unity Test Runner, which is now available as this package. + +# Installing Unity Test Framework + +To install this package, follow the instructions in the [Package Manager documentation](https://docs.unity3d.com/Packages/com.unity.package-manager-ui@latest/index.html). + +> **Note**: Search for the Test Framework package. In Unity 2019.2 and higher, you may need to enable the package before use. + +# Using Unity Test Framework + +To learn how to use the Unity Test Framework package in your project, read the [manual](./manual.md). + +# Technical details + +## Requirements + +This version of the Unity Test Framework is compatible with the following versions of the Unity Editor: + +* 2019.2 and later. + +## Known limitations + +Unity Test Framework version 1.0.18 includes the following known limitations: + +* The `UnityTest` attribute does not support WebGL and WSA platforms. +* The `UnityTest` attribute does not support [Parameterized tests](https://github.com/nunit/docs/wiki/Parameterized-Tests) (except for `ValueSource`). +* The `UnityTest` attribute does not support the `NUnit` [Repeat](https://github.com/nunit/docs/wiki/Repeat-Attribute) attribute. +* Nested test fixture cannot run from the Editor UI. +* When using the `NUnit` [Retry](https://github.com/nunit/docs/wiki/Retry-Attribute) attribute in PlayMode tests, it throws `InvalidCastException`. + +## Package contents + +The following table indicates the root folders in the package where you can find useful resources: + +| Location | Description | +| :----------------------------------------- | :------------------------------------------ | +| _/com.unity.test-framework/Documentation~_ | Contains the documentation for the package. | + +## Document revision history + +| Date | Reason | +| :----------- | :---------------------------------------------------- | +| August 23, 2019 | Applied feedback to the documentation | +| July 25, 2019 | Documentation updated to include features in version 1.1.0 | +| July 11, 2019 | Documentation updated. Matches package version 1.0.18 | +| May 27, 2019 | Documentation created. Matches package version 1.0.14 | diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/manual.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/manual.md new file mode 100644 index 0000000..e50f7ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/manual.md @@ -0,0 +1,80 @@ +# Unity Test Framework manual + +This is the manual for the Unity Test Framework (UTF): + +## **Introduction** + +* [Unity Test Framework overview](./index.md) +* [Edit Mode vs. Play Mode tests](edit-mode-vs-play-mode-tests.md) + +## **Getting started** + +* [Getting started with UTF](./getting-started.md) + * Workflows: + * [How to create a new test assembly](./workflow-create-test-assembly.md) + * [How to create a test](./workflow-create-test.md) + * [How to run a test](workflow-run-test.md) + * [How to create a Play Mode test](./workflow-create-playmode-test.md) + * [How to run a Play Mode test in player](./workflow-run-playmode-test-standalone.md) +* [Resources](./resources.md) + +## Extending UTF + +* [Extending UTF](./extending.md) + * Workflows: + * [How to split the build and run process for standalone Play Mode tests](./reference-attribute-testplayerbuildmodifier.md#split-build-and-run) + * [How to run tests programmatically](./extension-run-tests.md) + * [How to get test results](./extension-get-test-results.md) + * [How to retrieve the list of tests](./extension-retrieve-test-list.md) + +## Reference + +* [Running tests from the command-line](./reference-command-line.md) +* [UnityTest attribute](./reference-attribute-unitytest.md) +* [Setup and cleanup at build time](./reference-setup-and-cleanup.md) + * [IPrebuildSetup](./reference-setup-and-cleanup.md#iprebuildsetup) + * [IPostBuildCleanup](./reference-setup-and-cleanup.md#ipostbuildcleanup) +* [Actions outside of tests](./reference-actions-outside-tests.md) + * [Action execution order](./reference-actions-outside-tests.md#action-execution-order) + * [UnitySetUp and UnityTearDown](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [OuterUnityTestAction](./reference-actions-outside-tests.md#outerunitytestaction) + * [Domain Reloads](./reference-actions-outside-tests.md#domain-reloads) +* [Custom attributes](./reference-custom-attributes.md) + * [ConditionalIgnore attribute](./reference-attribute-conditionalignore.md) + * [PostBuildCleanup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [PrebuildSetup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) + * [TestMustExpectAllLogs attribute](./reference-attribute-testmustexpectalllogs.md) + * [TestPlayerBuildModifier attribute](./reference-attribute-testplayerbuildmodifier.md) + * [TestRunCallback attribute](./reference-attribute-testruncallback.md) + * [UnityPlatform attribute](./reference-attribute-unityplatform.md) + * [UnitySetUp attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTearDown attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) + * [UnityTest attribute](./reference-attribute-unitytest.md) +* [Custom equality comparers](./reference-custom-equality-comparers.md) + * [ColorEqualityComparer](./reference-comparer-color.md) + * [FloatEqualityComparer](./reference-comparer-float.md) + * [QuaternionEqualityComparer](./reference-comparer-quaternion.md) + * [Vector2EqualityComparer](./reference-comparer-vector2.md) + * [Vector3EqualityComparer](./reference-comparer-vector3.md) + * [Vector4EqualityComparer](./reference-comparer-vector4.md) + * [Custom equality comparers with equals operator](./reference-comparer-equals.md) + * [Test Utils](./reference-test-utils.md) +* [Custom yield instructions](./reference-custom-yield-instructions.md) + * [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md#IEditModeTestYieldInstruction) + * [EnterPlayMode](./reference-custom-yield-instructions.md#enterplaymode) + * [ExitPlayMode](./reference-custom-yield-instructions.md#exitplaymode) +* [Custom assertion](./reference-custom-assertion.md) + * [LogAssert](./reference-custom-assertion.md#logassert) +* [Custom constraints](./reference-custom-constraints.md) + * [Is](./reference-custom-constraints.md#is) +* [Parameterized tests](./reference-tests-parameterized.md) +* [MonoBehaviour tests](./reference-tests-monobehaviour.md) + * [MonoBehaviourTest](./reference-tests-monobehaviour.md#monobehaviourtestt) + * [IMonoBehaviourTest](./reference-tests-monobehaviour.md#imonobehaviourtest) + +* [TestRunnerApi](./reference-test-runner-api.md) + * [ExecutionSettings](./reference-execution-settings.md) + * [Filter](./reference-filter.md) + * [ITestRunSettings](./reference-itest-run-settings.md) + * [ICallbacks](./reference-icallbacks.md) + * [IErrorCallbacks](./reference-ierror-callbacks.md) \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-actions-outside-tests.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-actions-outside-tests.md new file mode 100644 index 0000000..0c8a437 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-actions-outside-tests.md @@ -0,0 +1,98 @@ +# Actions outside of tests + +When writing tests, it is possible to avoid duplication of code by using the [SetUp and TearDown](https://github.com/nunit/docs/wiki/SetUp-and-TearDown) methods built into [NUnit](http://www.nunit.org/). The Unity Test Framework has extended these methods with extra functionality, which can yield commands and skip frames, in the same way as [UnityTest](./reference-attribute-unitytest.md). + +## Action execution order + +The actions related to a test run in the following order: + +* Attributes implementing [IApplyToContext](https://github.com/nunit/docs/wiki/IApplyToContext-Interface) +* Any attribute implementing [OuterUnityTestAction](#outerunitytestaction) has its `BeforeTest` invoked +* Tests with [UnitySetUp](#unitysetup-and-unityteardown) methods in their test class. +* Attributes implementing [IWrapSetUpTearDown](https://github.com/nunit/docs/wiki/ICommandWrapper-Interface) +* Any [SetUp](https://github.com/nunit/docs/wiki/SetUp-and-TearDown) attributes +* [Action attributes](https://nunit.org/docs/2.6/actionAttributes.html) have their `BeforeTest` method invoked +* Attributes implementing of [IWrapTestMethod](https://github.com/nunit/docs/wiki/ICommandWrapper-Interface) +* **The test itself runs** +* [Action attributes](https://nunit.org/docs/2.6/actionAttributes.html) have their `AfterTest` method invoked +* Any method with the [TearDown](https://github.com/nunit/docs/wiki/SetUp-and-TearDown) attribute +* Tests with [UnityTearDown](#unitysetup-and-unityteardown) methods in their test class +* Any [OuterUnityTestAction](#outerunitytestaction) has its `AfterTest` invoked + +The list of actions is the same for both `Test` and `UnityTest`. + +## UnitySetUp and UnityTearDown + +The `UnitySetUp` and `UnityTearDown` attributes are identical to the standard `SetUp` and `TearDown` attributes, with the exception that they allow for [yielding instructions](reference-custom-yield-instructions.md). The `UnitySetUp` and `UnityTearDown` attributes expect a return type of [IEnumerator](https://docs.microsoft.com/en-us/dotnet/api/system.collections.ienumerator?view=netframework-4.8). + +### Example + +```c# +public class SetUpTearDownExample +{ + [UnitySetUp] + public IEnumerator SetUp() + { + yield return new EnterPlayMode(); + } + + [Test] + public void MyTest() + { + Debug.Log("This runs inside playmode"); + } + + [UnitySetUp] + public IEnumerator TearDown() + { + + yield return new ExitPlayMode(); + } +} +``` + + + +## OuterUnityTestAction + +`OuterUnityTestAction` is a wrapper outside of the tests, which allows for any tests with this attribute to run code before and after the tests. This method allows for yielding commands in the same way as `UnityTest`. The attribute must inherit the `NUnit` attribute and implement `IOuterUnityTestAction`. + +### Example + +```c# +using System.Collections; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; + +public class MyTestClass +{ + [UnityTest, MyOuterActionAttribute] + public IEnumerator MyTestInsidePlaymode() + { + Assert.IsTrue(Application.isPlaying); + yield return null; + } +} + +public class MyOuterActionAttribute : NUnitAttribute, IOuterUnityTestAction +{ + public IEnumerator BeforeTest(ITest test) + { + yield return new EnterPlayMode(); + } + + public IEnumerator AfterTest(ITest test) + { + yield return new ExitPlayMode(); + } +} + +``` + + + +## Domain Reloads + +In **Edit Mode** tests it is possible to yield instructions that can result in a domain reload, such as entering or exiting **Play Mode** (see [Custom yield instructions](./reference-custom-yield-instructions.md)). When a domain reload happens, all non-Unity actions (such as `OneTimeSetup` and `Setup`) are rerun before the code, which initiated the domain reload, continues. Unity actions (such as `UnitySetup`) are not rerun. If the Unity action is the code that initiated the domain reload, then the rest of the code in the `UnitySetup` method runs after the domain reload. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-conditionalignore.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-conditionalignore.md new file mode 100644 index 0000000..c051e01 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-conditionalignore.md @@ -0,0 +1,39 @@ +# ConditionalIgnore attribute + +This attribute is an alternative to the standard `Ignore` attribute in [NUnit](http://www.nunit.org/). It allows for ignoring tests only under a specified condition. The condition evaluates during `OnLoad`, referenced by ID. + +## Example + +The following example shows a method to use the `ConditionalIgnore` attribute to ignore a test if the Unity Editor is running macOS: + +```C# +using UnityEditor; +using NUnit.Framework; +using UnityEngine.TestTools; + +[InitializeOnLoad] +public class OnLoad +{ + static OnLoad() + { + var editorIsOSX = false; + #if UNITY_EDITOR_OSX + editorIsOSX = true; + #endif + + ConditionalIgnoreAttribute.AddConditionalIgnoreMapping("IgnoreInMacEditor", editorIsOSX); + } +} + +public class MyTestClass +{ + [Test, ConditionalIgnore("IgnoreInMacEditor", "Ignored on Mac editor.")] + public void TestNeverRunningInMacEditor() + { + Assert.Pass(); + } +} + +``` + +> **Note**: You can only use `InitializeOnLoad` in **Edit Mode** tests. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testmustexpectalllogs.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testmustexpectalllogs.md new file mode 100644 index 0000000..f0c4665 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testmustexpectalllogs.md @@ -0,0 +1,11 @@ +# TestMustExpectAllLogs attribute + +The presence of this attribute causes the **Test Runner** to expect every single log. By default, the Test Runner only fails on error logs, but `TestMustExpectAllLogs` fails on warnings and info level messages as well. It is the same as calling the method [LogAssert.NoUnexpectedReceived](./reference-custom-assertion.md#static-methods) at the bottom of every affected test. + +## Assembly-wide usage + +You can apply this attribute to test assemblies (that affects every test in the assembly), fixtures (affects every test in the fixture), or on individual test methods. It is also inherited from base fixtures. + +The `MustExpect` property (`true` by default) lets you enable or disable the higher level value. + +For example when migrating an assembly to this more strict checking method, you might attach `[assembly:TestMustExpectAllLogs]` to the assembly itself, but then whitelist failing fixtures and test methods with `[TestMustExpectAllLogs(MustExpect=false)]` until you have migrated them. This also means new tests in that assembly would have the more strict checking. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testplayerbuildmodifier.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testplayerbuildmodifier.md new file mode 100644 index 0000000..4ab7ccb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testplayerbuildmodifier.md @@ -0,0 +1,105 @@ +# TestPlayerBuildModifier attribute + +You can use the `TestPlayerBuildModifier` attribute to accomplish a couple of different scenarios: + +## Modify the Player build options for Play Mode tests + +It is possible to change the [BuildPlayerOptions](https://docs.unity3d.com/ScriptReference/BuildPlayerOptions.html) for the test **Player**, to achieve custom behavior when running **Play Mode** tests. Modifying the build options allows for changing the target location of the build as well as changing [BuildOptions](https://docs.unity3d.com/ScriptReference/BuildOptions.html). + +To modify the `BuildPlayerOptions`, do the following: + +* Implement the `ITestPlayerBuildModifier` +* Reference the implementation type in a `TestPlayerBuildModifier` attribute on an assembly level. + +### Example + +```c# +using UnityEditor; +using UnityEditor.TestTools; + +[assembly:TestPlayerBuildModifier(typeof(BuildModifier))] +public class BuildModifier : ITestPlayerBuildModifier +{ + public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions) + { + if (playerOptions.target == BuildTarget.iOS) + { + playerOptions.options |= BuildOptions.SymlinkLibraries; // Enable symlink libraries when running on iOS + } + + playerOptions.options |= BuildOptions.AllowDebugging; // Enable allow Debugging flag on the test Player. + return playerOptions; + } +} +``` + +> **Note:** When building the Player, it includes all `TestPlayerBuildModifier` attributes across all loaded assemblies, independent of the currently used test filter. As the implementation references the `UnityEditor` namespace, the code is typically implemented in an Editor only assembly, as the `UnityEditor` namespace is not available otherwise. + +## Split build and run + +It is possible to use the Unity Editor for building the Player with tests, without [running the tests](./workflow-run-playmode-test-standalone.md). This allows for running the Player on e.g. another machine. In this case, it is necessary to modify the Player to build and implement a custom handling of the test result. + +By using `TestPlayerBuildModifier`, you can alter the `BuildOptions` to not start the Player after the build as well as build the Player at a specific location. Combined with [PostBuildCleanup](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup), you can automatically exit the Editor on completion of the build. + +### Example + +```c# +using System; +using System.IO; +using System.Linq; +using Tests; +using UnityEditor; +using UnityEditor.TestTools; +using UnityEngine; +using UnityEngine.TestTools; + +[assembly:TestPlayerBuildModifier(typeof(HeadlessPlayModeSetup))] +[assembly:PostBuildCleanup(typeof(HeadlessPlayModeSetup))] + +namespace Tests +{ + public class HeadlessPlayModeSetup : ITestPlayerBuildModifier, IPostBuildCleanup + { + private static bool s_RunningPlayerTests; + public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions) + { + // Do not launch the player after the build completes. + playerOptions.options &= ~BuildOptions.AutoRunPlayer; + + // Set the headlessBuildLocation to the output directory you desire. It does not need to be inside the project. + var headlessBuildLocation = Path.GetFullPath(Path.Combine(Application.dataPath, ".//..//PlayModeTestPlayer")); + var fileName = Path.GetFileName(playerOptions.locationPathName); + if (!string.IsNullOrEmpty(fileName)) + { + headlessBuildLocation = Path.Combine(headlessBuildLocation, fileName); + } + playerOptions.locationPathName = headlessBuildLocation; + + // Instruct the cleanup to exit the Editor if the run came from the command line. + // The variable is static because the cleanup is being invoked in a new instance of the class. + s_RunningPlayerTests = true; + return playerOptions; + } + + public void Cleanup() + { + if (s_RunningPlayerTests && IsRunningTestsFromCommandLine()) + { + // Exit the Editor on the next update, allowing for other PostBuildCleanup steps to run. + EditorApplication.update += () => { EditorApplication.Exit(0); }; + } + } + + private static bool IsRunningTestsFromCommandLine() + { + var commandLineArgs = Environment.GetCommandLineArgs(); + return commandLineArgs.Any(value => value == "-runTests"); + } + } +} +``` + +If the Editor is still running after the Play Mode tests have run, the Player tries to report the results back, using [PlayerConnection](https://docs.unity3d.com/ScriptReference/Networking.PlayerConnection.PlayerConnection.html), which has a reference to the IP address of the Editor machine, when built. + +To implement a custom way of reporting the results of the test run, let one of the assemblies in the Player include a [TestRunCallback](./reference-attribute-testruncallback.md). At `RunFinished`, it is possible to get the full test report as XML from the [NUnit](http://www.nunit.org/) test result by calling `result.ToXml(true)`. You can save the result and then save it on the device or send it to another machine as needed. + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testruncallback.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testruncallback.md new file mode 100644 index 0000000..dad865a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-testruncallback.md @@ -0,0 +1,46 @@ +# TestRunCallback attribute + +It is possible for the test framework to invoke callbacks as the current test run progresses. To do this, there is a `TestRunCallback` attribute which takes the type of `ITestRunCallback` implementation. You can invoke the callbacks with [NUnit](http://www.nunit.org/) `ITest` and `ITestResult` classes. + +At the `RunStarted` and `RunFinished` methods, the test and test results are for the whole test tree. These methods invoke at each node in the test tree; first with the whole test assembly, then with the test class, and last with the test method. + +From these callbacks, it is possible to read the partial or the full results, and it is furthermore possible to save the XML version of the result for further processing or continuous integration. + +## Example + +```C# +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestRunner; + +[assembly:TestRunCallback(typeof(MyTestRunCallback))] + +public class MyTestRunCallback : ITestRunCallback +{ + public void RunStarted(ITest testsToRun) + { + + } + + public void RunFinished(ITestResult testResults) + { + + } + + public void TestStarted(ITest test) + { + + } + + public void TestFinished(ITestResult result) + { + if (!result.Test.IsSuite) + { + Debug.Log($"Result of {result.Name}: {result.ResultState.Status}"); + } + } +} + +``` + +> **Note:** The `TestRunCallback` does not need any references to the `UnityEditor` namespace and is thus able to run in standalone Players, on the **Player** side. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-unityplatform.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-unityplatform.md new file mode 100644 index 0000000..931ab87 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-unityplatform.md @@ -0,0 +1,35 @@ +# UnityPlatform attribute + +Use this attribute to define a specific set of platforms you want or do not want your test(s) to run on. + +You can use this attribute on the test method, test class, or test assembly level. Use the supported [RuntimePlatform](https://docs.unity3d.com/ScriptReference/RuntimePlatform.html) enumeration values to specify the platforms. You can also specify which platforms to test by passing one or more `RuntimePlatform` values along with or without the include or exclude properties as parameters to the [Platform](https://github.com/nunit/docs/wiki/Platform-Attribute) attribute constructor. + +The test(s) skips if the current target platform is: + +- Not explicitly specified in the included platforms list +- In the excluded platforms list + +```c# +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +[TestFixture] +public class TestClass +{ + [Test] + [UnityPlatform(RuntimePlatform.WindowsPlayer)] + public void TestMethod() + { + Assert.AreEqual(Application.platform, RuntimePlatform.WindowsPlayer); + } +} +``` + +## Properties + +| Syntax | Description | +| --------------------------- | ------------------------------------------------------------ | +| `RuntimePlatform[] exclude` | List the platforms you do not want to have your tests run on. | +| `RuntimePlatform[] include` | A subset of platforms you need to have your tests run on. | + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-unitytest.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-unitytest.md new file mode 100644 index 0000000..dd002b2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-attribute-unitytest.md @@ -0,0 +1,51 @@ +# UnityTest attribute + +`UnityTest` attribute is the main addition to the standard [NUnit](http://www.nunit.org/) library for the Unity Test Framework. This type of unit test allows you to skip a frame from within a test (so background tasks can finish) or give certain commands to the Unity **Editor**, such as performing a domain reload or entering **Play Mode** from an **Edit Mode** test. + +In Play Mode, the `UnityTest` attribute runs as a [coroutine](https://docs.unity3d.com/Manual/Coroutines.html). Whereas Edit Mode tests run in the [EditorApplication.update](https://docs.unity3d.com/ScriptReference/EditorApplication-update.html) callback loop. + +The `UnityTest` attribute is, in fact, an alternative to the `NUnit` [Test attribute](https://github.com/nunit/docs/wiki/Test-Attribute), which allows yielding instructions back to the framework. Once the instruction is complete, the test run continues. If you `yield return null`, you skip a frame. That might be necessary to ensure that some changes do happen on the next iteration of either the `EditorApplication.update` loop or the [game loop](https://docs.unity3d.com/Manual/ExecutionOrder.html). + +## Edit Mode example + +The most simple example of an Edit Mode test could be the one that yields `null` to skip the current frame and then continues to run: + +```C# +[UnityTest] +public IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess() +{ + var utility = RunEditorUtilityInTheBackgroud(); + + while (utility.isRunning) + { + yield return null; + } + + Assert.IsTrue(utility.isSuccess); +} +``` + +## Play Mode example + +In Play Mode, a test runs as a coroutine attached to a [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html). So all the yield instructions available in coroutines, are also available in your test. + +From a Play Mode test you can use one of Unity’s [Yield Instructions](https://docs.unity3d.com/ScriptReference/YieldInstruction.html): + +- [WaitForFixedUpdate](https://docs.unity3d.com/ScriptReference/WaitForFixedUpdate.html): to ensure changes expected within the next cycle of physics calculations. +- [WaitForSeconds](https://docs.unity3d.com/ScriptReference/WaitForSeconds.html): if you want to pause your test coroutine for a fixed amount of time. Be careful about creating long-running tests. + +The simplest example is to yield to `WaitForFixedUpdate`: + +```c# +[UnityTest] +public IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics() +{ + var go = new GameObject(); + go.AddComponent(); + var originalPosition = go.transform.position.y; + + yield return new WaitForFixedUpdate(); + + Assert.AreNotEqual(originalPosition, go.transform.position.y); +} +``` diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-command-line.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-command-line.md new file mode 100644 index 0000000..8a95061 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-command-line.md @@ -0,0 +1,120 @@ +# Running tests from the command line + +It’s pretty simple to run a test project from the command line. Here is an example in Windows: + +```bash +Unity.exe -runTests -batchmode -projectPath PATH_TO_YOUR_PROJECT -testResults C:\temp\results.xml -testPlatform PS4 +``` + +For more information, see [Command line arguments](https://docs.unity3d.com/Manual/CommandLineArguments.html). + +## Commands + +### batchmode + +Runs Unity in batch mode and ensures no pop-up windows appear to eliminate the need for any human intervention. + +### forgetProjectPath + +Don't save your current **Project** into the Unity launcher/hub history. + +### runTests + +Runs tests in the Project. + +### testCategory + +A semicolon-separated list of test categories to include in the run. If using both `testFilter` and `testCategory`, then tests only run that matches both. This argument supports negation using '!'. If using '!MyCategory' then no tests with the 'MyCategory' category will be included in the run. + +### testFilter + +A semicolon-separated list of test names to run, or a regular expression pattern to match tests by their full name. This argument supports negation using '!'. If using the test filter '!MyNamespace.Something.MyTest', then all tests except that test will be run. + +### testPlatform + +The platform you want to run tests on. Available platforms are **EditMode** and **PlayMode**. + +> **Note**: If unspecified, tests run in Edit Mode by default. + +Platform/Type convention is from the [BuildTarget](https://docs.unity3d.com/ScriptReference/BuildTarget.html) enum. Supported platforms are: + +* StandaloneWindows +* StandaloneWindows64 +* StandaloneLinux64 +* StandaloneOSX +* iOS +* Android +* PS4 +* XboxOne + +### assemblyNames + +A semicolon-separated list of test assemblies to include in the run. + +### testResults + +The path where Unity should save the result file. By default, Unity saves it in the Project’s root folder. + +### playerHeartbeatTimeout + +The time, in seconds, the editor should wait for heartbeats after starting a test run on a player. This defaults to 10 minutes. + +### runSynchronously + +If included, the test run will run tests synchronously, guaranteeing that all tests runs in one editor update call. Note that this is only supported for EditMode tests, and that tests which take multiple frames (i.e. `[UnityTest]` tests, or tests with `[UnitySetUp]` or `[UnityTearDown]` scaffolding) will be filtered out. + +### testSettingsFile + +Path to a *TestSettings.json* file that allows you to set up extra options for your test run. An example of the *TestSettings.json* file could look like this: + +```json +{ + "scriptingBackend":2, + "Architecture":null, + "apiProfile":0 +} +``` + +#### apiProfile + +The .Net compatibility level. Set to one of the following values: + +- 1 - .Net 2.0 +- 2 - .Net 2.0 Subset +- 3 - .Net 4.6 +- 5 - .Net micro profile (used by Mono scripting backend if **Stripping Level** is set to **Use micro mscorlib**) +- 6 - .Net Standard 2.0 + +#### appleEnableAutomaticSigning + +Sets option for automatic signing of Apple devices. + +#### appleDeveloperTeamID + +Sets the team ID for the apple developer account. + +#### architecture + +Target architecture for Android. Set to one of the following values: + +* None = 0 +* ARMv7 = 1 +* ARM64 = 2 +* X86 = 4 +* All = 4294967295 + +#### iOSManualProvisioningProfileType + +Set to one of the following values: + +* 0 - Automatic +* 1 - Development +* 2 - Distribution iOSManualProvisioningProfileID + +#### scriptingBackend + + Set to one of the following values: + +- Mono2x = 0 +- IL2CPP = 1 +- WinRT DotNET = 2 \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-color.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-color.md new file mode 100644 index 0000000..f4ae57e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-color.md @@ -0,0 +1,47 @@ +# ColorEqualityComparer + +Use this class to compare two `Color` objects. `ColorEqualityComparer.Instance` has default calculation error value set to 0.01f. To set a test specific error value instantiate a comparer instance using the [one argument constructor](#constructors). + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A singleton instance of the comparer with a default error value set to 0.01f. | + +## Constructors + +| Syntax | Description | +| ------------------------------------ | ------------------------------------------------------------ | +| `ColorEqualityComparer(float error)` | Creates an instance of the comparer with a custom error value. | + +## Public methods + +| Syntax | Description | +| -------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(Color expected, Color actual);` | Compares the actual and expected `Color` objects for equality using `Utils.AreFloatsEqualAbsoluteError` to compare the `RGB` and `Alpha` attributes of `Color`. Returns `true` if expected and actual objects are equal otherwise, it returns `false`. | + +## Example + +```c# +[TestFixture] +public class ColorEqualityTest +{ + [Test] + public void GivenColorsAreEqual_WithAllowedCalculationError() + { + // Using default error + var firstColor = new Color(0f, 0f, 0f, 0f); + var secondColor = new Color(0f, 0f, 0f, 0f); + + Assert.That(firstColor, Is.EqualTo(secondColor).Using(ColorEqualityComparer.Instance)); + + // Allowed error 10e-5f + var comparer = new ColorEqualityComparer(10e-5f); + firstColor = new Color(0f, 0f, 0f, 1f); + secondColor = new Color(10e-6f, 0f, 0f, 1f); + + Assert.That(firstColor, Is.EqualTo(secondColor).Using(comparer)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-equals.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-equals.md new file mode 100644 index 0000000..cc5d4d6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-equals.md @@ -0,0 +1,27 @@ +# Custom equality comparers with equals operator + +If you need to compare Vectors using the overloaded operator == (see [Vector2.operator ==](https://docs.unity3d.com/ScriptReference/Vector2-operator_eq.html), [Vector3.operator ==](https://docs.unity3d.com/ScriptReference/Vector3-operator_eq.html), and [Vector4.operator ==](https://docs.unity3d.com/ScriptReference/Vector4-operator_eq.html)) you should use the respective comparer implementations: + +- Vector2ComparerWithEqualsOperator +- Vector3ComparerWithEqualsOperator +- Vector4ComparerWithEqualsOperator + +The interface is the same as for other [equality comparers](./reference-custom-equality-comparers.md) except the public [constructor](./reference-custom-equality-comparers.md#constructors) `error` parameter is inapplicable in this case. + +## Example + +```c# +[TestFixture] +public class Vector3Test +{ + [Test] + public void VerifyThat_TwoVector3ObjectsAreEqual() + { + var actual = new Vector3(10e-7f, 10e-7f, 10e-7f); + var expected = new Vector3(0f, 0f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector3ComparerWithEqualsOperator.Instance)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-float.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-float.md new file mode 100644 index 0000000..188d207 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-float.md @@ -0,0 +1,46 @@ +# FloatEqualityComparer + +Use this class to compare two float values for equality with [NUnit](http://www.nunit.org/) constraints. Use `FloatEqualityComparer.Instance` comparer to have the default error value set to 0.0001f. For any other error, use the [one argument constructor](#constructors) to create a comparer. + +## Static Properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A singleton instance of the comparer with a default error value set to 0.0001f. | + +## Constructors + +| Syntax | Description | +| ------------------------------------------- | ------------------------------------------------------------ | +| `FloatEqualityComparer(float allowedError)` | Creates an instance of the comparer with a custom error value. | + +## Public methods + +| Syntax | Description | +| -------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(float expected, float actual);` | Compares the `actual` and `expected` float values for equality using `Utils.AreFloatsEqual`. | + +## Example + +```c# +[TestFixture] +public class FloatsTest +{ + [Test] + public void VerifyThat_TwoFloatsAreEqual() + { + var comparer = new FloatEqualityComparer(10e-6f); + var actual = -0.00009f; + var expected = 0.00009f; + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + // Default relative error 0.0001f + actual = 10e-8f; + expected = 0f; + + Assert.That(actual, Is.EqualTo(expected).Using(FloatEqualityComparer.Instance)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-quaternion.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-quaternion.md new file mode 100644 index 0000000..5d7abc8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-quaternion.md @@ -0,0 +1,46 @@ +# QuaternionEqualityComparer + +Use this utility to compare two [Quaternion](https://docs.unity3d.com/ScriptReference/Quaternion.html) objects for equality with [NUnit](http://www.nunit.org/) assertion constraints. Use the static instance `QuaternionEqualityComparer.Instance` to have the default calculation error value set to 0.00001f. For any other custom error value, use the [one argument constructor](#constructors). + +## Static properties + +| Syntax | Description | +| ---------- | ---------------------------------------------------------- | +| `Instance` | A comparer instance with the default error value 0.00001f. | + +## Constructors + +| Syntax | Description | +| ------------------------------------------------ | ------------------------------------------------------------ | +| `QuaternionEqualityComparer(float allowedError)` | Creates an instance of the comparer with a custom allowed error value. | + +## Public methods + +| Syntax | Description | +| ----------------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(Quaternion expected, Quaternion actual)` | Compares the `actual` and `expected` `Quaternion` objects for equality using the [Quaternion.Dot](https://docs.unity3d.com/ScriptReference/Quaternion.Dot.html) method. | + +## Example + +```c# +[TestFixture] +public class QuaternionTest +{ + [Test] + public void VerifyThat_TwoQuaternionsAreEqual() + { + var actual = new Quaternion(10f, 0f, 0f, 0f); + var expected = new Quaternion(1f, 10f, 0f, 0f); + var comparer = new QuaternionEqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + //Using default error 0.00001f + actual = new Quaternion(10f, 0f, 0.1f, 0f); + expected = new Quaternion(1f, 10f, 0.1f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(QuaternionEqualityComparer.Instance)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector2.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector2.md new file mode 100644 index 0000000..977879e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector2.md @@ -0,0 +1,47 @@ +# Vector2EqualityComparer + +Use this class to compare two [Vector2](https://docs.unity3d.com/ScriptReference/Vector2.html) objects for equality with [NUnit](http://www.nunit.org/) constraints. Use the static `Vector2EqualityComparer.Instance` to have the calculation error value set to default 0.0001f. For any other error value, instantiate a new comparer object with the [one argument constructor](#constructors). + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A comparer instance with the default error value set to 0.0001f. | + +## Constructors + +| Syntax | Description | +| -------------------------------------- | ---------------------------------------------- | +| `Vector2EqualityComparer(float error)` | Creates an instance with a custom error value. | + +## Public methods + +| Syntax | Description | +| ------------------------------------------ | ------------------------------------------------------------ | +| `Equals(Vector2 expected, Vector2 actual)` | Compares the `actual` and `expected` `Vector2` objects for equality using the [Utils.AreFloatsEqual](./reference-test-utils.md) method. | + +## Example + +```c# +[TestFixture] +public class Vector2Test +{ + [Test] + public void VerifyThat_TwoVector2ObjectsAreEqual() + { + // Custom calculation error + var actual = new Vector2(10e-7f, 10e-7f); + var expected = new Vector2(0f, 0f); + var comparer = new Vector2EqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + //Default error 0.0001f + actual = new Vector2(0.01f, 0.01f); + expected = new Vector2(0.01f, 0.01f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector2EqualityComparer.Instance)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector3.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector3.md new file mode 100644 index 0000000..6fe1122 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector3.md @@ -0,0 +1,47 @@ +# Vector3EqualityComparer + +Use this class to compare two [Vector3](https://docs.unity3d.com/ScriptReference/Vector3.html) objects for equality with `NUnit` constraints. Call `Vector3EqualityComparer.Instance` comparer to perform a comparison with the default calculation error value 0.0001f. To specify a different error value, use the [one argument constructor](#constructors) to instantiate a new comparer. + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A comparer instance with the default calculation error value equal to 0.0001f. | + +## Constructors + +| Syntax | Description | +| --------------------------------------------- | ---------------------------------------------- | +| `Vector3EqualityComparer(float allowedError)` | Creates an instance with a custom error value. | + +## Public methods + +| Syntax | Description | +| ----------------------------------------------- | ------------------------------------------------------------ | +| `bool Equals(Vector3 expected, Vector3 actual)` | Compares the `actual` and `expected` `Vector3` objects for equality using [Utils.AreFloatsEqual](http://todo) to compare the `x`, `y`, and `z` attributes of `Vector3`. | + +## Example + +```c# +[TestFixture] +public class Vector3Test +{ + [Test] + public void VerifyThat_TwoVector3ObjectsAreEqual() + { + // Custom error 10e-6f + var actual = new Vector3(10e-8f, 10e-8f, 10e-8f); + var expected = new Vector3(0f, 0f, 0f); + var comparer = new Vector3EqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + //Default error 0.0001f + actual = new Vector3(0.01f, 0.01f, 0f); + expected = new Vector3(0.01f, 0.01f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector3EqualityComparer.Instance)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector4.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector4.md new file mode 100644 index 0000000..915cd65 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-comparer-vector4.md @@ -0,0 +1,47 @@ +# Vector4EqualityComparer + +Use this class to compare two [Vector4](https://docs.unity3d.com/ScriptReference/Vector4.html) objects for equality with [NUnit](http://www.nunit.org/) constraints. Call `Vector4EqualityComparer.Instance` to perform comparisons using default calculation error value 0.0001f. To set a custom test value, instantiate a new comparer using the [one argument constructor](#constructor). + +## Static Properties + +| Syntax | Description | +| ---------------------------------- | ------------------------------------------------------------ | +| `Vector4EqualityComparer Instance` | A comparer instance with the default calculation error value set to 0.0001f. | + +## Constructors + +| Syntax | Description | +| --------------------------------------------- | ---------------------------------------------- | +| `Vector4EqualityComparer(float allowedError)` | Creates an instance with a custom error value. | + +## Public methods + +| Syntax | Description | +| ------------------------------------------------ | ------------------------------------------------------------ | +| `bool Equals(Vector4 expected, Vector4 actual);` | Compares the `actual` and `expected` `Vector4` objects for equality using [Utils.AreFloatsEqual](http://todo) to compare the `x`, `y`, `z`, and `w` attributes of `Vector4`. | + +## Example + +```c# +[TestFixture] +public class Vector4Test +{ + [Test] + public void VerifyThat_TwoVector4ObjectsAreEqual() + { + // Custom error 10e-6f + var actual = new Vector4(0, 0, 1e-6f, 1e-6f); + var expected = new Vector4(1e-6f, 0f, 0f, 0f); + var comparer = new Vector4EqualityComparer(10e-6f); + + Assert.That(actual, Is.EqualTo(expected).Using(comparer)); + + // Default error 0.0001f + actual = new Vector4(0.01f, 0.01f, 0f, 0f); + expected = new Vector4(0.01f, 0.01f, 0f, 0f); + + Assert.That(actual, Is.EqualTo(expected).Using(Vector4EqualityComparer.Instance)); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-assertion.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-assertion.md new file mode 100644 index 0000000..665597b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-assertion.md @@ -0,0 +1,66 @@ +# Custom assertion + +A test fails if Unity logs a message other than a regular log or warning message. Use [LogAssert](#logassert) to check for an expected message in the log so that the test does not fail when Unity logs the message. + +Use `LogAssert.Expect` before running the code under test, as the check for expected logs runs at the end of each frame. + +A test also reports a failure, if an expected message does not appear, or if Unity does not log any regular log or warning messages. + +## Example + +```c# +[Test] +public void LogAssertExample() +{ + // Expect a regular log message + LogAssert.Expect(LogType.Log, "Log message"); + + // The test fails without the following expected log message + Debug.Log("Log message"); + + // An error log + Debug.LogError("Error message"); + + // Without expecting an error log, the test would fail + LogAssert.Expect(LogType.Error, "Error message"); +} +``` + +## LogAssert + +`LogAssert` lets you expect Unity log messages that would otherwise cause the test to fail. + +### Static properties + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `bool ignoreFailingMessages` | Set this property to `true` to prevent unexpected error log messages from triggering an assertion. By default, it is `false`. | + +### Static Methods + +| Syntax | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| `void Expect(LogType type, string message);` `void Expect(LogType type, Regex message);` | Verifies that a log message of a specified type appears in the log. A test won’t fail from an expected error, assertion, or exception log message. It does fail if an expected message does not appear in the log. | +| `void NoUnexpectedReceived();` | Triggers an assertion when receiving any log messages and fails the test if some are unexpected messages. If multiple tests need to check for no received unexpected logs, consider using the [TestMustExpectAllLogs](./reference-attribute-testmustexpectalllogs.md) attribute instead. | + +### Expect string message + +`void Expect(LogType type, string message);` + +#### Parameters + +| Syntax | Description | +| ---------------- | ------------------------------------------------------------ | +| `LogType type` | A type of log to expect. It can take one of the [LogType enum](https://docs.unity3d.com/ScriptReference/LogType.html) values. | +| `string message` | A string value that should equate to the expected message. | + +### Expect Regex message + +`void Expect(LogType type, Regex message);` + +#### Parameters + +| Syntax | Description | +| --------------- | ------------------------------------------------------------ | +| `LogType type` | A type of log to expect. It can take one of the [LogType enum](https://docs.unity3d.com/ScriptReference/LogType.html) values. | +| `Regex message` | A regular expression pattern to match the expected message. | \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-attributes.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-attributes.md new file mode 100644 index 0000000..115e4cb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-attributes.md @@ -0,0 +1,15 @@ +# Custom attributes + +As a part of UTF’s public API we provide the following attributes: + +* [ConditionalIgnore attribute](./reference-attribute-conditionalignore.md) +* [PostBuildCleanup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) +* [PrebuildSetup attribute](./reference-setup-and-cleanup.md#prebuildsetup-and-postbuildcleanup) +* [TestMustExpectAllLogs attribute](./reference-attribute-testmustexpectalllogs.md) +* [TestPlayerBuildModifier attribute](./reference-attribute-testplayerbuildmodifier.md) +* [TestRunCallback attribute](./reference-attribute-testruncallback.md) +* [UnityPlatform attribute](./reference-attribute-unityplatform.md) +* [UnitySetUp attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) +* [UnityTearDown attribute](./reference-actions-outside-tests.md#unitysetup-and-unityteardown) +* [UnityTest attribute](./reference-attribute-unitytest.md) + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-constraints.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-constraints.md new file mode 100644 index 0000000..10b205b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-constraints.md @@ -0,0 +1,31 @@ +# Custom constraints + +`NUnit` allows you to write test assertions in a more descriptive and human readable way using the [Assert.That](https://github.com/nunit/docs/wiki/Assertions) mechanism, where the first parameter is an object under test and the second parameter describes conditions that the object has to meet. + +## Is + +We’ve extended `NUnit` API with a custom constraint type and declared an overlay `Is` class. To resolve ambiguity between the original implementation and the custom one you must explicitly declare it with a using statement or via addressing through the full type name `UnityEngine.TestTools.Constraints.Is`. + +### Static Methods + +| Syntax | Description | +| -------------------- | ------------------------------------------------------------ | +| `AllocatingGCMemory` | A constraint type that invokes the delegate you provide as the parameter of `Assert.That` and checks whether it causes any GC memory allocations. It passes if any GC memory is allocated and fails if not. | + +## Example + +```c# +using Is = UnityEngine.TestTools.Constraints.Is; + +class MyTestClass +{ + [Test] + public void MyTest() + { + Assert.That(() => { + var i = new int[500]; + }, Is.AllocatingGCMemory()); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-equality-comparers.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-equality-comparers.md new file mode 100644 index 0000000..8203a32 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-equality-comparers.md @@ -0,0 +1,32 @@ +# Custom equality comparers + +To enable easier verification of custom Unity type values in your tests we provide you with some custom equality comparers: + +* [ColorEqualityComparer](./reference-comparer-color.md) +* [FloatEqualityComparer](./reference-comparer-float.md) +* [QuaternionEqualityComparer](./reference-comparer-quaternion.md) +* [Vector2EqualityComparer](./reference-comparer-vector2.md) +* [Vector3EqualityComparer](./reference-comparer-vector3.md) +* [Vector4EqualityComparer](./reference-comparer-vector4.md) + +Use these classes to compare two objects of the same type for equality within the range of a given tolerance using [NUnit ](https://github.com/nunit/docs/wiki/Constraints)or [custom constraints](./reference-custom-constraints.md) . Call Instance to apply the default calculation error value to the comparison. To set a specific error value, instantiate a new comparer object using a one argument constructor `ctor(float error)`. + +## Static properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `Instance` | A singleton instance of the comparer with a predefined default error value. | + +## Constructors + +| Syntax | Description | +| ------------------- | ------------------------------------------------------------ | +| `ctor(float error)` | Creates an instance of comparer with a custom error `value.allowedError`. The relative error to be considered while comparing two values. | + +## Public methods + +| Syntax | Description | +| ------------------------------------ | ------------------------------------------------------------ | +| `bool Equals(T expected, T actual);` | Compares the actual and expected objects for equality using a custom comparison mechanism. Returns `true` if expected and actual objects are equal, otherwise it returns `false`. | + + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-yield-instructions.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-yield-instructions.md new file mode 100644 index 0000000..9814ca3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-custom-yield-instructions.md @@ -0,0 +1,60 @@ +# Custom yield instructions + +By implementing this interface below, you can define custom yield instructions in **Edit Mode** tests. + +## IEditModeTestYieldInstruction + +In an Edit Mode test, you can use `IEditModeTestYieldInstruction` interface to implement your own instruction. There are also a couple of commonly used implementations available: + +- [EnterPlayMode](#enterplaymode) +- [ExitPlayMode](#exitplaymode) +- [RecompileScripts](./reference-recompile-scripts.md) +- [WaitForDomainReload](./reference-wait-for-domain-reload.md) + +## Example + +```c# +[UnityTest] + +public IEnumerator PlayOnAwakeDisabled_DoesntPlayWhenEnteringPlayMode() + +{ + var videoPlayer = PrefabUtility.InstantiatePrefab(m_VideoPlayerPrefab.GetComponent()) as VideoPlayer; + + videoPlayer.playOnAwake = false; + + yield return new EnterPlayMode(); + + var videoPlayerGO = GameObject.Find(m_VideoPlayerPrefab.name); + + Assert.IsFalse(videoPlayerGO.GetComponent().isPlaying); + + yield return new ExitPlayMode(); + + Object.DestroyImmediate(GameObject.Find(m_VideoPlayerPrefab.name)); +} +``` + +## Properties + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `bool ExpectDomainReload` | Returns `true` if the instruction expects a domain reload to occur. | +| `bool ExpectedPlaymodeState` | Returns `true` if the instruction expects the Unity Editor to be in **Play Mode**. | + +## Methods + +| Syntax | Description | +| ----------------------- | ------------------------------------------------------------ | +| `IEnumerator Perform()` | Used to define multi-frame operations performed when instantiating a yield instruction. | + +## EnterPlayMode + +* Implements `IEditModeTestYieldInstruction`. Creates a yield instruction to enter Play Mode. +* When creating an Editor test that uses the `UnityTest` attribute, use this to trigger the Editor to enter Play Mode. +* Throws an exception if the Editor is already in Play Mode or if there is a [script compilation error](https://support.unity3d.com/hc/en-us/articles/205930539-How-do-I-interpret-a-compiler-error-). + +## ExitPlayMode + +* Implements `IEditModeTestYieldInstruction`. A new instance of the class is a yield instruction to exit Play Mode. +* Throws an exception if the Editor is not in Play Mode. diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-execution-settings.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-execution-settings.md new file mode 100644 index 0000000..e40a333 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-execution-settings.md @@ -0,0 +1,17 @@ +# ExecutionSettings +The `ExecutionSettings` is a set of filters and other settings provided when running a set of tests from the [TestRunnerApi](./reference-test-runner-api.md). + +## Constructors + +| Syntax | Description | +| ----------------------------------------------------- | -------------------------------------------------------- | +| `ExecutionSettings(params Filter[] filtersToExecute)` | Creates an instance with a given set of filters, if any. | + +## Fields + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `Filter[] filters` | A collection of [Filters](./reference-filter.md) to execute tests on. | +| `ITestRunSettings overloadTestRunSettings` | An instance of [ITestRunSettings](./reference-itest-run-settings.md) to set up before running tests on a Player. | +| `bool runSynchronously` | If true, the call to `Execute()` will run tests synchronously, guaranteeing that all tests have finished running by the time the call returns. Note that this is only supported for EditMode tests, and that tests which take multiple frames (i.e. `[UnityTest]` tests, or tests with `[UnitySetUp]` or `[UnityTearDown]` scaffolding) will be filtered out. | +| 'int playerHeartbeatTimeout' | The time, in seconds, the editor should wait for heartbeats after starting a test run on a player. This defaults to 10 minutes. | \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-filter.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-filter.md new file mode 100644 index 0000000..8cfa910 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-filter.md @@ -0,0 +1,15 @@ +# Filter +The filter class provides the [TestRunnerApi](./reference-test-runner-api.md) with a specification of what tests to run when [running tests programmatically](./extension-run-tests.md). + +## Fields + +| Syntax | Description | +| ----------------------------- | ------------------------------------------------------------ | +| `TestMode testMode` | An enum flag that specifies if **Edit Mode** or **Play Mode** tests should run. Applying both Edit Mode and Play Mode is currently not supported when running tests from the API. | +| `string[] testNames` | The full name of the tests to match the filter. This is usually in the format `FixtureName.TestName`. If the test has test arguments, then include them in parenthesis. E.g. `MyTestClass2.MyTestWithMultipleValues(1)`. | +| `string[] groupNames` | The same as `testNames`, except that it allows for Regex. This is useful for running specific fixtures or namespaces. E.g. `"^MyNamespace\\."` Runs any tests where the top namespace is `MyNamespace`. | +| `string[] categoryNames` | The name of a [Category](https://nunit.org/docs/2.2.7/category.html) to include in the run. Any test or fixtures runs that have a `Category` matching the string. | +| `string[] assemblyNames` | The name of assemblies included in the run. That is the assembly name, without the .dll file extension. E.g., `MyTestAssembly`. | +| `BuildTarget? targetPlatform` | The [BuildTarget](https://docs.unity3d.com/ScriptReference/BuildTarget.html) platform to run the test on. If set to `null`, then the Editor is the target for the tests. | + + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-icallbacks.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-icallbacks.md new file mode 100644 index 0000000..b04e7e8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-icallbacks.md @@ -0,0 +1,48 @@ +# ICallbacks +An interface for receiving callbacks when running tests. All test runs invoke the callbacks until the next domain reload. + +The `RunStarted` method runs when the whole test run starts. Then the `TestStarted` method runs with information about the tests it is about to run on an assembly level. Afterward, it runs on a test fixture level and then on the individual test. If the test is a [parameterized test](./https://github.com/nunit/docs/wiki/Parameterized-Tests), then it is also invoked for each parameter combination. After each part of the test tree have completed running, the corresponding `TestFinished` method runs with the test result. At the end of the run, the `RunFinished` event runs with the test result. + +An extended version of the callback, [IErrorCallbacks](./reference-ierror-callbacks.md), extends this `ICallbacks` to receive calls when a run fails due to a build error. + +## Public methods + +| Syntax | Description | +| ---------------------------------------------- | ------------------------------------------------------------ | +| `void RunStarted(ITestAdaptor testsToRun)` | Invoked when the test run starts. The [ITestAdaptor](./reference-itest-adaptor.md) represents the tree of tests to run. | +| `void RunFinished(ITestResultAdaptor result)` | Invoked when the test run finishes. The [ITestResultAdaptor](./reference-itest-result-adaptor.md) represents the results of the set of tests that have run. | +| `void TestStarted(ITestAdaptor test)` | Invoked on each node of the test tree, as that part of the tree starts to run. | +| `void TestFinished(ITestResultAdaptor result)` | Invoked on each node of the test tree once that part of the test tree has finished running. The [ITestResultAdaptor](./reference-itest-result-adaptor.md) represents the results of the current node of the test tree. | + +## Example +An example that sets up a listener on the API. The listener prints the number of failed tests after the run has finished: +``` C# +public void SetupListeners() +{ + var api = ScriptableObject.CreateInstance(); + api.RegisterCallbacks(new MyCallbacks()); +} + +private class MyCallbacks : ICallbacks +{ + public void RunStarted(ITestAdaptor testsToRun) + { + + } + + public void RunFinished(ITestResultAdaptor result) + { + Debug.Log(string.Format("Run finished {0} test(s) failed.", result.FailCount)); + } + + public void TestStarted(ITestAdaptor test) + { + + } + + public void TestFinished(ITestResultAdaptor result) + { + + } +} +``` \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-ierror-callbacks.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-ierror-callbacks.md new file mode 100644 index 0000000..bf83309 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-ierror-callbacks.md @@ -0,0 +1,9 @@ +# IErrorCallbacks +An extended version of the [ICallbacks](./reference-icallbacks.md), which get invoked if the test run fails due to a build error or if any [IPrebuildSetup](./reference-setup-and-cleanup.md) has a failure. + +## Public methods + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------------- | +| void OnError(string message) | The error message detailing the reason for the run to fail. | + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-adaptor.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-adaptor.md new file mode 100644 index 0000000..04e72f6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-adaptor.md @@ -0,0 +1,31 @@ +# ITestAdaptor +`ITestAdaptor` is a representation of a node in the test tree implemented as a wrapper around the [NUnit](http://www.nunit.org/) [ITest](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/ITest.cs) interface. + +## Properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `string Id` | The ID of the test tree node. The ID can change if you add new tests to the suite. Use `UniqueName`, if you want to have a more permanent point of reference. | +| `string Name` | The name of the test. E.g., `MyTest`. | +| `string FullName` | The full name of the test. E.g., `MyNamespace.MyTestClass.MyTest`. | +| `int TestCaseCount` | The total number of test cases in the node and all sub-nodes. | +| `bool HasChildren` | Whether the node has any children. | +| `bool IsSuite` | Whether the node is a test suite/fixture. | +| `IEnumerable Children` | The child nodes. | +| `ITestAdaptor Parent` | The parent node, if any. | +| `int TestCaseTimeout` | The test case timeout in milliseconds. Note that this value is only available on TestFinished. | +| `ITypeInfo TypeInfo` | The type of test class as an `NUnit` [ITypeInfo](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/ITypeInfo.cs). If the node is not a test class, then the value is `null`. | +| `IMethodInfo Method` | The [Nunit IMethodInfo](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/IMethodInfo.cs) of the test method. If the node is not a test method, then the value is `null`. | +| `string[] Categories` | An array of the categories applied to the test or fixture. | +| `bool IsTestAssembly` | Whether the node represents a test assembly. | +| `RunState RunState` | The run state of the test node. Either `NotRunnable`, `Runnable`, `Explicit`, `Skipped`, or `Ignored`. | +| `string Description` | The description of the test. | +| `string SkipReason` | The skip reason. E.g., if ignoring the test. | +| `string ParentId` | The ID of the parent node. | +| `string ParentFullName` | The full name of the parent node. | +| `string UniqueName` | A unique generated name for the test node. E.g., `Tests.dll/MyNamespace/MyTestClass/[Tests][MyNamespace.MyTestClass.MyTest]`. | +| `string ParentUniqueName` | A unique name of the parent node. E.g., `Tests.dll/MyNamespace/[Tests][MyNamespace.MyTestClass][suite]`. | +| `int ChildIndex` | The child index of the node in its parent. | +| `TestMode TestMode` | The mode of the test. Either **Edit Mode** or **Play Mode**. | + +> **Note**: Some properties are not available when receiving the test tree as a part of a test result coming from a standalone Player, such as `TypeInfo` and `Method`. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-result-adaptor.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-result-adaptor.md new file mode 100644 index 0000000..63280f6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-result-adaptor.md @@ -0,0 +1,25 @@ +# ITestResultAdaptor +The `ITestResultAdaptor` is the representation of the test results for a node in the test tree implemented as a wrapper around the [NUnit](http://www.nunit.org/) [ITest](https://github.com/nunit/nunit/blob/master/src/NUnitFramework/framework/Interfaces/ITestResults.cs) interface. +## Properties + +| Syntax | Description | +| ---------- | ------------------------------------------------------------ | +| `ITestAdaptor Test` | The test details of the test result tree node as a [TestAdaptor](./reference-itest-adaptor.md). | +| `string Name` | The name of the test node. | +| `string FullName` | Gets the full name of the test result | +| `string ResultState` | The state of the result as a string. E.g., `Success`, `Skipped`, `Failure`, `Explicit`, `Cancelled`. | +| `TestStatus TestStatus` | The status of the test as an enum. Either `Inconclusive`, `Skipped`, `Passed`, or `Failed`. | +| `double Duration` | Gets the elapsed time for running the test in seconds. | +| `DateTime StartTime` | Gets or sets the time the test started running. | +| `DateTime EndTime` | Gets or sets the time the test finished running. | +| `string Message` | Gets the message associated with a test failure or with not running the test | +| `string StackTrace` | Gets any stack trace associated with an error or failure. Not available in the [Compact Framework](https://en.wikipedia.org/wiki/.NET_Compact_Framework) 1.0. | +| `int AssertCount` | Gets the number of asserts that ran during the test and all its children. | +| `int FailCount` | Gets the number of test cases that failed when running the test and all its children. | +| `int PassCount` | Gets the number of test cases that passed when running the test and all its children. | +| `int SkipCount` | Gets the number of test cases skipped when running the test and all its children. | +| `int InconclusiveCount` | Gets the number of test cases that were inconclusive when running the test and all its children. | +| `bool HasChildren` | Indicates whether this result has any child results. Accessing HasChildren should not force the creation of the Children collection in classes implementing this interface. | +| `IEnumerable Children` | Gets the collection of child results. | +| `string Output` | Gets any text output written to this result. | +| `TNode ToXml` | Gets the test results as an `NUnit` XML node. Use this to save the results to an XML file. | diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-run-settings.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-run-settings.md new file mode 100644 index 0000000..79c344b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-itest-run-settings.md @@ -0,0 +1,29 @@ +# ITestRunSettings +`ITestRunSettings` lets you set any of the global settings right before building a Player for a test run and then reverts the settings afterward. +`ITestRunSettings` implements [IDisposable](https://docs.microsoft.com/en-us/dotnet/api/system.idisposable), and runs after building the Player with tests. + +## Public methods + +| Syntax | Description | +| ---------------- | ------------------------------------------------------------ | +| `void Apply()` | A method called before building the Player. | +| `void Dispose()` | A method called after building the Player or if the build failed. | + +## Example +The following example sets the iOS SDK version to be the simulator SDK and resets it to the original value after the run. +``` C# +public class MyTestSettings : ITestRunSettings +{ + private iOSSdkVersion originalSdkVersion; + public void Apply() + { + originalSdkVersion = PlayerSettings.iOS.sdkVersion; + PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK; + } + + public void Dispose() + { + PlayerSettings.iOS.sdkVersion = originalSdkVersion; + } +} +``` \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-recompile-scripts.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-recompile-scripts.md new file mode 100644 index 0000000..0fb8644 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-recompile-scripts.md @@ -0,0 +1,22 @@ +# RecompileScripts +`RecompileScripts` is an [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md) that you can yield in Edit Mode tests. It lets you trigger a recompilation of scripts in the Unity Editor. + +## Constructors + +| Syntax | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| `RecompileScripts(bool expectScriptCompilation = true, bool expectScriptCompilationSuccess = true)` | Creates a new instance of the `RecompileScripts` yield instruction. The parameter `expectScriptCompilation` indicates if you expect a script compilation to start (defaults to true). If a script compilation does not start and `expectScriptCompilation` is `true`, then it throws an exception. | + +## Example +``` C@ +[UnitySetUp] +public IEnumerator SetUp() +{ + using (var file = File.CreateText("Assets/temp/myScript.cs")) + { + file.Write("public class ATempClass { }"); + } + AssetDatabase.Refresh(); + yield return new RecompileScripts(); +} +``` \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-setup-and-cleanup.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-setup-and-cleanup.md new file mode 100644 index 0000000..93e77a5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-setup-and-cleanup.md @@ -0,0 +1,91 @@ +# Setup and cleanup at build time + +In some cases, it is relevant to perform changes to Unity or the file system before building the tests. In the same way, it may be necessary to clean up such changes after the test run. In response to such needs, you can incorporate the pre-build setup and post-build cleanup concepts into your tests in one of the following ways: + +1. Via implementation of `IPrebuildSetup` and `IPostBuildCleanup` interfaces by a test class. +2. Via applying the `PrebuildSetup` attribute and `PostBuildCleanup` attribute on your test class, one of the tests or the test assembly, providing a class name that implements the corresponding interface as an argument (fx `[PrebuildSetup("MyTestSceneSetup")]`). + +## Execution order + +All setups run in a deterministic order one after another. The first to run are the setups defined with attributes. Then any test class implementing the interface runs, in alphabetical order inside their namespace, which is the same order as the tests run. + +> **Note**: Cleanup runs right away for a standalone test run, but only after related tests run in the Unity Editor. + +## PrebuildSetup and PostBuildCleanup + +Both `PrebuildSetup` and `PostBuildCleanup` attributes run if the respective test or test class is in the current test run. The test is included either by running all tests or setting a [filter](./workflow-create-test.md#filters) that includes the test. If multiple tests reference the same pre-built setup or post-build cleanup, then it only runs once. + +## IPrebuildSetup + +Implement this interface if you want to define a set of actions to run as a pre-build step. + +### Public methods + +| Syntax | Description | +| -------------- | ------------------------------------------------------------ | +| `void Setup()` | Implement this method to call actions automatically before the build process. | + +## IPostBuildCleanup + +Implement this interface if you want to define a set of actions to execute as a post-build step. Cleanup runs right away for a standalone test run, but only after all the tests run within the Editor. + +### Public methods + +| Syntax | Description | +| ---------------- | ------------------------------------------------------------ | +| `void Cleanup()` | Implement this method to specify actions that should run as a post-build cleanup step. | + +## Example + +```c# +[TestFixture] +public class CreateSpriteTest : IPrebuildSetup +{ + Texture2D m_Texture; + Sprite m_Sprite; + + public void Setup() + { + +#if UNITY_EDITOR + + var spritePath = "Assets/Resources/Circle.png"; + + var ti = UnityEditor.AssetImporter.GetAtPath(spritePath) as UnityEditor.TextureImporter; + + ti.textureCompression = UnityEditor.TextureImporterCompression.Uncompressed; + + ti.SaveAndReimport(); + +#endif + } + + [SetUp] + public void SetUpTest() + { + m_Texture = Resources.Load("Circle"); + } + + [Test] + public void WhenNullTextureIsPassed_CreateShouldReturnNullSprite() + { + + // Check with Valid Texture. + + LogAssert.Expect(LogType.Log, "Circle Sprite Created"); + + Sprite.Create(m_Texture, new Rect(0, 0, m_Texture.width, m_Texture.height), new Vector2(0.5f, 0.5f)); + + Debug.Log("Circle Sprite Created"); + + // Check with NULL Texture. Should return NULL Sprite. + + m_Sprite = Sprite.Create(null, new Rect(0, 0, m_Texture.width, m_Texture.heig`t), new Vector2(0.5f, 0.5f)); + + Assert.That(m_Sprite, Is.Null, "Sprite created with null texture should be null"); + + } +} +``` + +> **Tip**: Use `#if UNITY_EDITOR` if you want to access Editor only APIs, but the setup/cleanup is inside a **Play Mode** assembly. diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-test-runner-api.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-test-runner-api.md new file mode 100644 index 0000000..b594f7e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-test-runner-api.md @@ -0,0 +1,23 @@ +# TestRunnerApi +The `TestRunnerApi` retrieves and runs tests programmatically from code inside the project, or inside other packages. `TestRunnerApi` is a [ScriptableObject](https://docs.unity3d.com/ScriptReference/ScriptableObject.html). + +You can initialize the API like this: + +```c# +var testRunnerApi = ScriptableObject.CreateInstance(); +``` +> **Note**: You can subscribe and receive test results in one instance of the API, even if the run starts from another instance. + +The `TestRunnerApi` supports the following workflows: +* [How to run tests programmatically](./extension-run-tests.md) +* [How to get test results](./extension-get-test-results.md) +* [How to retrieve the list of tests](./extension-retrieve-test-list.md) + +## Public methods + +| Syntax | Description | +| ------------------------------------------ | ------------------------------------------------------------ | +| `void Execute(ExecutionSettings executionSettings)` | Starts a test run with a given set of [ExecutionSettings](./reference-execution-settings.md). | +| `void RegisterCallbacks(ICallbacks testCallbacks, int priority = 0)` | Sets up a given instance of [ICallbacks](./reference-icallbacks.md) to be invoked on test runs. | +| `void UnregisterCallbacks(ICallbacks testCallbacks)` | Unregisters an instance of ICallbacks to no longer receive callbacks from test runs. | +| `void RetrieveTestList(TestMode testMode, Action callback)` | Retrieve the full test tree as [ITestAdaptor](./reference-itest-adaptor.md) for a given test mode. | \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-test-utils.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-test-utils.md new file mode 100644 index 0000000..dae8dae --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-test-utils.md @@ -0,0 +1,40 @@ +# Test Utils + +This contains test utility functions for float value comparison and creating primitives. + +## Static Methods + +| Syntax | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| `bool AreFloatsEqual(float expected, float actual, float allowedRelativeError)` | Relative epsilon comparison of two float values for equality. `allowedRelativeError` is the relative error to be used in relative epsilon comparison. The relative error is the absolute error divided by the magnitude of the exact value. Returns `true` if the actual value is equivalent to the expected value. | +| `bool AreFloatsEqualAbsoluteError(float expected, float actual, float allowedAbsoluteError)` | Compares two floating point numbers for equality under the given absolute tolerance. `allowedAbsoluteError` is the permitted error tolerance. Returns `true` if the actual value is equivalent to the expected value under the given tolerance. | +| `GameObject CreatePrimitive( type)` | Creates a [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html) with a primitive [MeshRenderer](https://docs.unity3d.com/ScriptReference/MeshRenderer.html). This is an analogue to the [GameObject.CreatePrimitive](https://docs.unity3d.com/ScriptReference/GameObject.CreatePrimitive.html), but creates a primitive `MeshRenderer` with a fast [Shader](https://docs.unity3d.com/ScriptReference/Shader.html) instead of the default built-in `Shader`, optimized for testing performance. `type` is the [primitive type](https://docs.unity3d.com/ScriptReference/PrimitiveType.html) of the required `GameObject`. Returns a `GameObject` with primitive `MeshRenderer` and [Collider](https://docs.unity3d.com/ScriptReference/Collider.html). | + +## Example + +```c# +[TestFixture] +class UtilsTests +{ + [Test] + public void ChechThat_FloatsAreEqual() + { + float expected = 10e-8f; + float actual = 0f; + float allowedRelativeError = 10e-6f; + + Assert.That(Utils.AreFloatsEqual(expected, actual, allowedRelativeError), Is.True); + } + + [Test] + public void ChechThat_FloatsAreAbsoluteEqual() + { + float expected = 0f; + float actual = 10e-6f; + float error = 10e-5f; + + Assert.That(Utils.AreFloatsEqualAbsoluteError(expected, actual, error), Is.True); + } +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-tests-monobehaviour.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-tests-monobehaviour.md new file mode 100644 index 0000000..6409333 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-tests-monobehaviour.md @@ -0,0 +1,51 @@ +# MonoBehaviour tests + +`MonoBehaviourTest` is a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html) and a helper for writing [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html) tests. + +Yield a `MonoBehaviourTest` when using the `UnityTest` attribute to instantiate the `MonoBehaviour` you wish to test and wait for it to finish running. Implement the `IMonoBehaviourTest` interface on the `MonoBehaviour` to state when the test completes. + +## Example + +```c# +[UnityTest] +public IEnumerator MonoBehaviourTest_Works() +{ + yield return new MonoBehaviourTest(); +} + +public class MyMonoBehaviourTest : MonoBehaviour, IMonoBehaviourTest +{ + private int frameCount; + public bool IsTestFinished + { + get { return frameCount > 10; } + } + + void Update() + { + frameCount++; + } +} +``` + +## MonoBehaviourTest<T> + +This is a wrapper that allows running tests on `MonoBehaviour` scripts. Inherits from [CustomYieldInstruction](https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html). + +### Properties + +| Syntax | Description | +| ----------------------- | ------------------------------------------------------------ | +| `T component` | A `MonoBehaviour` component created for the test and attached to the test’s [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html). | +| `GameObject gameObject` | A `GameObject` created as a container for the test component. | +| `bool keepWaiting` | (Inherited) Returns `true` if the test is not finished yet, which keeps the coroutine suspended. | + +## IMonoBehaviourTest + +An interface implemented by a `MonoBehaviour` test. + +### Properties + +| Syntax | Description | +| --------------------- | ----------------------------------------------- | +| `bool IsTestFinished` | Indicates when the test is considered finished. | \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-tests-parameterized.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-tests-parameterized.md new file mode 100644 index 0000000..6182bad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-tests-parameterized.md @@ -0,0 +1,18 @@ +# Parameterized tests + +For data-driven testing, you may want to have your tests parameterized. You may use both the [NUnit](http://www.nunit.org/) attributes [TestCase](https://github.com/nunit/docs/wiki/TestCase-Attribute) and [ValueSource](https://github.com/nunit/docs/wiki/ValueSource-Attribute) with a unit test. + +> **Note**: With `UnityTest` it is recommended to use `ValueSource` since `TestCase` is not supported. + +## Example + +```c# +static int[] values = new int[] { 1, 5, 6 }; + +[UnityTest] +public IEnumerator MyTestWithMultipleValues([ValueSource("values")] int value) +{ + yield return null; +} +``` + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-wait-for-domain-reload.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-wait-for-domain-reload.md new file mode 100644 index 0000000..8d42e70 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/reference-wait-for-domain-reload.md @@ -0,0 +1,19 @@ +# WaitForDomainReload +`WaitForDomainReload` is an [IEditModeTestYieldInstruction](./reference-custom-yield-instructions.md) that you can yield in Edit Mode tests. It delays the execution of scripts until after an incoming domain reload. If the domain reload results in a script compilation failure, then it throws an exception. + +## Constructors + +| Syntax | Description | +| ---------------------------- | ------------------------------------------------------------ | +| `WaitForDomainReload()` | Create a new instance of the `WaitForDomainReload` yield instruction. | + +## Example +``` C@ +[UnitySetUp] +public IEnumerator SetUp() +{ + File.Copy("Resources/MyDll.dll", @"Assets/MyDll.dll", true); // Trigger a domain reload. + AssetDatabase.Refresh(); + yield return new WaitForDomainReload(); +} +``` \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/resources.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/resources.md new file mode 100644 index 0000000..ce261e9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/resources.md @@ -0,0 +1,6 @@ +# Resources + +Here you can find other related resources to the Unity Test Framework: + +* [Performance Benchmarking in Unity: How to Get Started](https://blogs.unity3d.com/2018/09/25/performance-benchmarking-in-unity-how-to-get-started/) [Blog] +* [Testing Test-Driven Development with the Unity Test Runner](https://blogs.unity3d.com/2018/11/02/testing-test-driven-development-with-the-unity-test-runner/) [Blog] \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-playmode-test.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-playmode-test.md new file mode 100644 index 0000000..a21b619 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-playmode-test.md @@ -0,0 +1,28 @@ +# Workflow: How to create a Play Mode test + +To create a **Play Mode** test, you can follow a similar process as when you want to create an **Edit Mode** test. + +1. Start with switching to the **PlayMode** tab in the **Test Runner** window. +2. Create a test assembly folder (see [How to create a new test assembly)](./workflow-create-test-assembly.md). The folder name is *Tests* by default (or *Tests 1*, *Tests 2*, etc. if the preceding name is already in use). + +![PlayMode tab](./images/playmode-tab.png) + +> **Note**: If you don’t see the **Create Play Mode Test Assembly Folder** button enabled, make sure that in the Project window you navigate out of a folder with another .asmdef (such as one for Edit Mode tests). + +3. When you have your Play Mode test assembly folder ready, then [create your Play Mode test](./workflow-create-test.md). + +> **Note**: [Pre-defined Unity assemblies](https://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html) (such as _Assembly-CSharp.dll_) do not reference your new assembly. + +## References and builds + +Unity Test Framework adds a reference to `TestAssemblies` in the [Assembly Definition](https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html) file, but it won't include any other references (e.g., to other scripting assemblies within the Unity project). So you need to add other assemblies yourself if you want to test them too. + +Unity does not include `TestAssemblies` in Player builds, but in the Test Runner window, we have such an option. If you need to test code in pre-defined assemblies, you can reference `TestAssemblies` from other assemblies. You must remove these tests after the test run so that Unity does not add them to the final Player build. + +To do this, in the Test Runner window choose **Enable playmode tests for all assemblies** option from the drop-down menu (to expand, click on the small list item in the top right corner). In the dialog box, click **OK** to manually restart the Editor. + +![Enable Play Mode tests for all assemblies](./images/playmode-enable-all.png) + +> **Note**: **Enabling Play Mode tests for all assemblies** includes additional assemblies in your project build, which can increase the project’s size as well as the build time. + +For more information, see [Edit Mode vs. Play Mode tests](./edit-mode-vs-play-mode-tests.md). \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-test-assembly.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-test-assembly.md new file mode 100644 index 0000000..eb35896 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-test-assembly.md @@ -0,0 +1,17 @@ +# Workflow: **How to create a new test assembly** + +Unity Test Framework looks for a test inside any assembly that references [NUnit](http://www.nunit.org/). We refer to such assemblies as `TestAssemblies`. The [Test Runner](./getting-started.md) UI can help you set up `TestAssemblies`. **Play Mode** and **Edit Mode** tests need to be in separate assemblies. + +In the **Test Runner** window, you will see an **EditMode** tab enabled by default, as well as a **Create EditMode Test Assembly Folder** button. + +![Test Runner window EditMode tab](./images/editmode-tab.png) + +Click the button to create a *Tests* folder with a respective .asmdef file by default. Change the name of the new [Assembly Definition](https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html), if necessary, and press Enter to accept it. + +![New Test folder and assembly file](./images/tests-folder-assembly.png) + +In the Inspector window, it should have references to **nunit.framework.dll***,* **UnityEngine.TestRunner,** and **UnityEditor.TestRunner** assemblies, as well as **Editor** preselected as a target platform. + +> **Note**: The **UnityEditor.TestRunner** reference is only available for [Edit Mode tests](./edit-mode-vs-play-mode-tests.md#edit-mode-tests). + +![Assembly definition import settings](./images/import-settings.png) diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-test.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-test.md new file mode 100644 index 0000000..612106e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-create-test.md @@ -0,0 +1,36 @@ +# Workflow: How to create a test + +To create a test, do the following: + +1. Create your *Test* [assembly folder](./workflow-create-test-assembly.md) and select it in the **Project** window. +2. Click the button **Create Test Script in current folder** option in the **Test Runner** window. + +![EditMode create test script](./images/editmode-create-test-script.png) + +3. It creates a *NewTestScript.cs* file in the *Tests* folder. Change the name of the script, if necessary, and press Enter to accept it. + +![NewTestScript.cs](./images/new-test-script.png) + +Now you’ll see two sample tests in the Test Runner window: + +![Test templates](./images/test-templates.png) + +Now you can open the tests in your favorite script editor. + +You can also create test scripts by navigating to **Assets** > **Create > Testing** > **C# Test Script**, unless adding a test script would result in a compilation error. + +> **Note**: Unity does not include `TestAssemblies` ([NUnit](http://www.nunit.org/), Unity Test Framework, and user script assemblies) when using the normal build pipeline, but does include them when using **Run on <Platform>** in the Test Runner window. + +## Filters + +If you have a lot of tests, and you only want to view/run a sub-set of them, you can filter them in three ways (see image above): + +* Type in the search box in the top left + +* Click a test class or fixture (such as **NewTestScript** in the image above) + +* Click one of the test result icon buttons in the top right + + + +For more information, see [Edit Mode vs. Play Mode tests](./edit-mode-vs-play-mode-tests.md). diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-run-playmode-test-standalone.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-run-playmode-test-standalone.md new file mode 100644 index 0000000..0a2fa81 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-run-playmode-test-standalone.md @@ -0,0 +1,21 @@ +# Workflow: How to run a Play Mode test in player + +If you run a **Play Mode** test in the same way as an [Editor test](./workflow-run-test.md), it runs inside the Unity Editor. You can also run Play Mode tests on specific platforms. Click **Run all in the player** to build and run your tests on the currently active target platform. + +![Run PlayMode test in player](./images/playmode-run-standalone.png) + +> **Note**: Your current platform displays in brackets on the button. For example, in the image above, the button reads **Run all in player (StandaloneWindows)**, because the current platform is Windows. The target platform is always the current Platform selected in [Build Settings](https://docs.unity3d.com/Manual/BuildSettings.html) (menu: **File** > **Build Settings**). + +The test result displays in the build once the test completes: + +![Results of PlayMode in player test run](./images/playmode-results-standalone.png) + +The application running on the platform reports back the test results to the Editor UI then displays the executed tests and shuts down. To make sure you receive the test results from the Player on your target platform back into the Editor that’s running the test, both should be on the same network. + +> **Note:** Some platforms do not support shutting down the application with `Application.Quit`, so it will continue running after reporting the test results. + +If Unity cannot instantiate the connection, you can see the tests succeed in the running application. Running tests on platforms with arguments, in this state, does not provide XML test results. + + + +For more information, see [Edit Mode vs Play Mode tests](./edit-mode-vs-play-mode-tests.md). \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-run-test.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-run-test.md new file mode 100644 index 0000000..506194b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/Documentation~/workflow-run-test.md @@ -0,0 +1,19 @@ +# Workflow: How to run a test + +To run a test, you need to double-click on the test or test fixture name in the **Test Runner** window. + +You can also use one of the buttons on the top bar, **Run All** or **Run Selected**. As a result, you’ll see the test status icon changed and a counter in the top right corner updated: + +![EditMode Run Test](./images/editmode-run-test.png) + +You may also use a context menu option **Run**, right-click on any item in the test tree to have it (with all its children if any) run. + +![EditMode Run Tests](./images/editmode-run-tests.png) + + + +## Run tests within Rider + +It is possible to run unit tests in the Unity Test Framework directly from [JetBrains Rider](https://www.jetbrains.com/rider/). + +For more information, see the [JetBrains official documentation](https://www.jetbrains.com/help/rider/Running_and_Debugging_Unity_Tests.html) and their blog post [Run Unity tests in Rider 2018.1](https://blog.jetbrains.com/dotnet/2018/04/18/run-unity-tests-rider-2018-1/). \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/LICENSE.md b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/LICENSE.md new file mode 100644 index 0000000..e6a38bf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/LICENSE.md @@ -0,0 +1,5 @@ +Test Framework copyright © 2020 Unity Technologies ApS + +Licensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). + +Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/LICENSE.md.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/LICENSE.md.meta new file mode 100644 index 0000000..f6a2ca2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ec7596410385054a9e0bc90377fbe63 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner.meta new file mode 100644 index 0000000..d1eb573 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95cdf27b47eb82747ba9e51f41e72a35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api.meta new file mode 100644 index 0000000..2ffb8f9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa423365b1ce06a4dbdc6fb4a8597bfa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegator.cs new file mode 100644 index 0000000..91f2d4c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegator.cs @@ -0,0 +1,136 @@ +using System; +using System.Linq; +using System.Text; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class CallbacksDelegator : ICallbacksDelegator + { + private static CallbacksDelegator s_instance; + public static CallbacksDelegator instance + { + get + { + if (s_instance == null) + { + s_instance = new CallbacksDelegator(CallbacksHolder.instance.GetAll, new TestAdaptorFactory()); + } + return s_instance; + } + } + + private readonly Func m_CallbacksProvider; + private readonly ITestAdaptorFactory m_AdaptorFactory; + + public CallbacksDelegator(Func callbacksProvider, ITestAdaptorFactory adaptorFactory) + { + m_CallbacksProvider = callbacksProvider; + m_AdaptorFactory = adaptorFactory; + } + + public void RunStarted(ITest testsToRun) + { + m_AdaptorFactory.ClearResultsCache(); + var testRunnerTestsToRun = m_AdaptorFactory.Create(testsToRun); + TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testRunnerTestsToRun)); + } + + public void RunStartedRemotely(byte[] testsToRunData) + { + var testData = Deserialize(testsToRunData); + var testsToRun = m_AdaptorFactory.BuildTree(testData); + TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testsToRun)); + } + + public void RunFinished(ITestResult testResults) + { + var testResult = m_AdaptorFactory.Create(testResults); + TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult)); + } + + public void RunFinishedRemotely(byte[] testResultsData) + { + var remoteTestResult = Deserialize(testResultsData); + var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult); + TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult)); + } + + public void RunFailed(string failureMessage) + { + Debug.LogError(failureMessage); + TryInvokeAllCallbacks(callbacks => + { + var errorCallback = callbacks as IErrorCallbacks; + if (errorCallback != null) + { + errorCallback.OnError(failureMessage); + } + }); + } + + public void TestStarted(ITest test) + { + var testRunnerTest = m_AdaptorFactory.Create(test); + TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testRunnerTest)); + } + + public void TestStartedRemotely(byte[] testStartedData) + { + var testData = Deserialize(testStartedData); + var testsToRun = m_AdaptorFactory.BuildTree(testData); + + TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testsToRun)); + } + + public void TestFinished(ITestResult result) + { + var testResult = m_AdaptorFactory.Create(result); + TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult)); + } + + public void TestFinishedRemotely(byte[] testResultsData) + { + var remoteTestResult = Deserialize(testResultsData); + var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult); + TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult)); + } + + public void TestTreeRebuild(ITest test) + { + m_AdaptorFactory.ClearTestsCache(); + var testAdaptor = m_AdaptorFactory.Create(test); + TryInvokeAllCallbacks(callbacks => + { + var rebuildCallbacks = callbacks as ITestTreeRebuildCallbacks; + if (rebuildCallbacks != null) + { + rebuildCallbacks.TestTreeRebuild(testAdaptor); + } + }); + } + + private void TryInvokeAllCallbacks(Action callbackAction) + { + foreach (var testRunnerApiCallback in m_CallbacksProvider()) + { + try + { + callbackAction(testRunnerApiCallback); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + } + + private static T Deserialize(byte[] data) + { + return JsonUtility.FromJson(Encoding.UTF8.GetString(data)); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta new file mode 100644 index 0000000..89e0904 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0de03ebd74e2b474fa23d05ab42d0cd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs new file mode 100644 index 0000000..c19621d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class CallbacksDelegatorListener : ScriptableObject, ITestRunnerListener + { + public void RunStarted(NUnit.Framework.Interfaces.ITest testsToRun) + { + CallbacksDelegator.instance.RunStarted(testsToRun); + } + + public void RunFinished(NUnit.Framework.Interfaces.ITestResult testResults) + { + CallbacksDelegator.instance.RunFinished(testResults); + } + + public void TestStarted(NUnit.Framework.Interfaces.ITest test) + { + CallbacksDelegator.instance.TestStarted(test); + } + + public void TestFinished(NUnit.Framework.Interfaces.ITestResult result) + { + CallbacksDelegator.instance.TestFinished(result); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta new file mode 100644 index 0000000..c9bb94a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3e1b3cbf3fac6a459b1a602167ad311 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksHolder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksHolder.cs new file mode 100644 index 0000000..5df378d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksHolder.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class CallbacksHolder : ScriptableSingleton, ICallbacksHolder + { + private List m_Callbacks = new List(); + public void Add(ICallbacks callback, int priority) + { + m_Callbacks.Add(new CallbackWithPriority(callback, priority)); + } + + public void Remove(ICallbacks callback) + { + m_Callbacks.RemoveAll(callbackWithPriority => callbackWithPriority.Callback == callback); + } + + public ICallbacks[] GetAll() + { + return m_Callbacks.OrderByDescending(callback => callback.Priority).Select(callback => callback.Callback).ToArray(); + } + + public void Clear() + { + m_Callbacks.Clear(); + } + + private struct CallbackWithPriority + { + public ICallbacks Callback; + public int Priority; + public CallbackWithPriority(ICallbacks callback, int priority) + { + Callback = callback; + Priority = priority; + } + } + + // Sometimes - such as when we want to test the test framework itself - it's necessary to launch a test run from + // inside a test. Because callbacks are registered globally, this can cause a lot of confusion (e.g. the in-test + // run will emit UTP messages, utterly confusing UTR). In such circumstances the safest thing to do is to + // temporarily suppress all registered callbacks for the duration of the in-test run. This method can be called + // to set up a using() block which will suppress the callbacks for the scope. + public IDisposable TemporarilySuppressCallbacks() + { + return new Suppressor(this); + } + + private sealed class Suppressor : IDisposable + { + private readonly CallbacksHolder _instance; + private readonly List _suppressed; + + public Suppressor(CallbacksHolder instance) + { + _instance = instance; + _suppressed = new List(instance.m_Callbacks); + instance.m_Callbacks.Clear(); + } + + public void Dispose() + { + _instance.m_Callbacks.AddRange(_suppressed); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta new file mode 100644 index 0000000..7c42028 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4884ccc3528cb2e40a0e6f0a19a2b35b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ExecutionSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ExecutionSettings.cs new file mode 100644 index 0000000..bc68007 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ExecutionSettings.cs @@ -0,0 +1,57 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + [Serializable] + public class ExecutionSettings + { + public ExecutionSettings(params Filter[] filtersToExecute) + { + filters = filtersToExecute; + } + + [SerializeField] + internal BuildTarget? targetPlatform; + + // Note: Is not available after serialization + public ITestRunSettings overloadTestRunSettings; + + [SerializeField] + internal Filter filter; + [SerializeField] + public Filter[] filters; + [SerializeField] + public bool runSynchronously; + [SerializeField] + public int playerHeartbeatTimeout = 60*10; + + internal bool EditModeIncluded() + { + return filters.Any(f => IncludesTestMode(f.testMode, TestMode.EditMode)); + } + + internal bool PlayModeInEditorIncluded() + { + return filters.Any(f => IncludesTestMode(f.testMode, TestMode.PlayMode) && targetPlatform == null); + } + + internal bool PlayerIncluded() + { + return filters.Any(f => IncludesTestMode(f.testMode, TestMode.PlayMode) && targetPlatform != null); + } + + private static bool IncludesTestMode(TestMode testMode, TestMode modeToCheckFor) + { + return (testMode & modeToCheckFor) == modeToCheckFor; + } + + internal ITestFilter BuildNUnitFilter() + { + return new OrFilter(filters.Select(f => f.ToRuntimeTestRunnerFilter(runSynchronously).BuildNUnitFilter()).ToArray()); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta new file mode 100644 index 0000000..602a117 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eea34a28297f9bc4c9f4c573bc8d5d1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/Filter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/Filter.cs new file mode 100644 index 0000000..133aca1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/Filter.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + [Serializable] + public class Filter + { + [SerializeField] + public TestMode testMode; + [SerializeField] + public string[] testNames; + [SerializeField] + public string[] groupNames; + [SerializeField] + public string[] categoryNames; + [SerializeField] + public string[] assemblyNames; + [SerializeField] + public BuildTarget? targetPlatform; + + internal RuntimeTestRunnerFilter ToRuntimeTestRunnerFilter(bool synchronousOnly) + { + return new RuntimeTestRunnerFilter() + { + testNames = testNames, + categoryNames = categoryNames, + groupNames = groupNames, + assemblyNames = assemblyNames, + synchronousOnly = synchronousOnly + }; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/Filter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/Filter.cs.meta new file mode 100644 index 0000000..bbb21b5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/Filter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05f92e4a2414cb144a92157752dfa324 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacks.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacks.cs new file mode 100644 index 0000000..365102b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacks.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ICallbacks + { + void RunStarted(ITestAdaptor testsToRun); + void RunFinished(ITestResultAdaptor result); + void TestStarted(ITestAdaptor test); + void TestFinished(ITestResultAdaptor result); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacks.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacks.cs.meta new file mode 100644 index 0000000..851e3f6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93eea84e53d0226479c9a584f19427b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs new file mode 100644 index 0000000..9005c46 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs @@ -0,0 +1,18 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ICallbacksDelegator + { + void RunStarted(ITest testsToRun); + void RunStartedRemotely(byte[] testsToRunData); + void RunFinished(ITestResult testResults); + void RunFinishedRemotely(byte[] testResultsData); + void RunFailed(string failureMessage); + void TestStarted(ITest test); + void TestStartedRemotely(byte[] testStartedData); + void TestFinished(ITestResult result); + void TestFinishedRemotely(byte[] testResultsData); + void TestTreeRebuild(ITest test); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs.meta new file mode 100644 index 0000000..fb26459 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8f8f74fe8e363da42875d9cab025d3b2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksHolder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksHolder.cs new file mode 100644 index 0000000..ff7128b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksHolder.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ICallbacksHolder + { + void Add(ICallbacks callback, int priority); + void Remove(ICallbacks callback); + ICallbacks[] GetAll(); + void Clear(); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta new file mode 100644 index 0000000..7f11d80 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d742f2caefd9f934d9f19dad07a08e6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/IErrorCallbacks.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/IErrorCallbacks.cs new file mode 100644 index 0000000..2d7a922 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/IErrorCallbacks.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface IErrorCallbacks : ICallbacks + { + void OnError(string message); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta new file mode 100644 index 0000000..34728c6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1a06c562b0c5eb046bcb876a29f93c98 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptor.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptor.cs new file mode 100644 index 0000000..7e7736a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptor.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ITestAdaptor + { + string Id { get; } + string Name { get; } + string FullName { get; } + int TestCaseCount { get; } + bool HasChildren { get; } + bool IsSuite { get; } + IEnumerable Children { get; } + ITestAdaptor Parent { get; } + int TestCaseTimeout { get; } + ITypeInfo TypeInfo { get; } + IMethodInfo Method { get; } + string[] Categories { get; } + bool IsTestAssembly { get; } + RunState RunState { get; } + string Description { get; } + string SkipReason { get; } + string ParentId { get; } + string ParentFullName { get; } + string UniqueName { get; } + string ParentUniqueName { get; } + int ChildIndex { get; } + TestMode TestMode { get; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta new file mode 100644 index 0000000..2ae45af --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85dd7af03f02aea4aae13a3945e3b313 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs new file mode 100644 index 0000000..021b313 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestAdaptorFactory + { + ITestAdaptor Create(ITest test); + ITestAdaptor Create(RemoteTestData testData); + ITestResultAdaptor Create(ITestResult testResult); + ITestResultAdaptor Create(RemoteTestResultData testResult, RemoteTestResultDataWithTestData allData); + ITestAdaptor BuildTree(RemoteTestResultDataWithTestData data); + IEnumerator BuildTreeAsync(RemoteTestResultDataWithTestData data); + void ClearResultsCache(); + void ClearTestsCache(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta new file mode 100644 index 0000000..05dadba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 803abab0f7e17044db56f8760186dbd1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs new file mode 100644 index 0000000..ae4b9f6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ITestResultAdaptor + { + ITestAdaptor Test { get; } + string Name { get; } + + /// Gets the full name of the test result + string FullName { get; } + + string ResultState { get; } + + TestStatus TestStatus { get; } + + /// Gets the elapsed time for running the test in seconds + double Duration { get; } + + /// Gets or sets the time the test started running. + DateTime StartTime { get; } + + /// Gets or sets the time the test finished running. + DateTime EndTime { get; } + + /// + /// Gets the message associated with a test + /// failure or with not running the test + /// + string Message { get; } + + /// + /// Gets any stacktrace associated with an + /// error or failure. Not available in + /// the Compact Framework 1.0. + /// + string StackTrace { get; } + + /// + /// Gets the number of asserts executed + /// when running the test and all its children. + /// + int AssertCount { get; } + + /// + /// Gets the number of test cases that failed + /// when running the test and all its children. + /// + int FailCount { get; } + + /// + /// Gets the number of test cases that passed + /// when running the test and all its children. + /// + int PassCount { get; } + + /// + /// Gets the number of test cases that were skipped + /// when running the test and all its children. + /// + int SkipCount { get; } + + /// + /// Gets the number of test cases that were inconclusive + /// when running the test and all its children. + /// + int InconclusiveCount { get; } + + /// + /// Indicates whether this result has any child results. + /// Accessing HasChildren should not force creation of the + /// Children collection in classes implementing this interface. + /// + bool HasChildren { get; } + + /// Gets the the collection of child results. + IEnumerable Children { get; } + + /// Gets any text output written to this result. + string Output { get; } + + TNode ToXml(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta new file mode 100644 index 0000000..5ea944f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f90cfe4bf5cfb44f84a5b11387f2a42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunSettings.cs new file mode 100644 index 0000000..90058c1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunSettings.cs @@ -0,0 +1,9 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public interface ITestRunSettings : IDisposable + { + void Apply(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta new file mode 100644 index 0000000..27a3a33 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ae2ce6274819484fa8747a28cebdf3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunnerApi.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunnerApi.cs new file mode 100644 index 0000000..da3ffdd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunnerApi.cs @@ -0,0 +1,12 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestRunnerApi + { + string Execute(ExecutionSettings executionSettings); + void RegisterCallbacks(T testCallbacks, int priority = 0) where T : ICallbacks; + void UnregisterCallbacks(T testCallbacks) where T : ICallbacks; + void RetrieveTestList(TestMode testMode, Action callback); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta new file mode 100644 index 0000000..d581ffd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7842a837a4b13e41ae16193db753418 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs new file mode 100644 index 0000000..cc5a301 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal interface ITestTreeRebuildCallbacks : ICallbacks + { + void TestTreeRebuild(ITestAdaptor test); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta new file mode 100644 index 0000000..eb1117c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4230e406313f1db43a4b548e7a3ad2e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/RunState.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/RunState.cs new file mode 100644 index 0000000..ab449de --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/RunState.cs @@ -0,0 +1,11 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public enum RunState + { + NotRunnable, + Runnable, + Explicit, + Skipped, + Ignored, + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/RunState.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/RunState.cs.meta new file mode 100644 index 0000000..818e3c0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/RunState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bb59cb2f66d156418ca1bd1e2703233 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptor.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptor.cs new file mode 100644 index 0000000..556bb0c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptor.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestAdaptor : ITestAdaptor + { + internal TestAdaptor(ITest test, ITestAdaptor[] children = null) + { + Id = test.Id; + Name = test.Name; + var childIndex = -1; + if (test.Properties["childIndex"].Count > 0) + { + childIndex = (int)test.Properties["childIndex"][0]; + } + FullName = childIndex != -1 ? GetIndexedTestCaseName(test.FullName, childIndex) : test.FullName; + TestCaseCount = test.TestCaseCount; + HasChildren = test.HasChildren; + IsSuite = test.IsSuite; + if (UnityTestExecutionContext.CurrentContext != null) + { + TestCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout; + } + else + { + TestCaseTimeout = CoroutineRunner.k_DefaultTimeout; + } + + TypeInfo = test.TypeInfo; + Method = test.Method; + Categories = test.GetAllCategoriesFromTest().Distinct().ToArray(); + IsTestAssembly = test is TestAssembly; + RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString()); + Description = (string)test.Properties.Get(PropertyNames.Description); + SkipReason = test.GetSkipReason(); + ParentId = test.GetParentId(); + ParentFullName = test.GetParentFullName(); + UniqueName = test.GetUniqueName(); + ParentUniqueName = test.GetParentUniqueName(); + ChildIndex = childIndex; + + if (test.Parent != null) + { + if (test.Parent.Parent == null) // Assembly level + { + TestMode = (TestMode)Enum.Parse(typeof(TestMode),test.Properties.Get("platform").ToString()); + } + } + + Children = children; + } + + public void SetParent(ITestAdaptor parent) + { + Parent = parent; + if (parent != null) + { + TestMode = parent.TestMode; + } + } + + internal TestAdaptor(RemoteTestData test) + { + Id = test.id; + Name = test.name; + FullName = test.ChildIndex != -1 ? GetIndexedTestCaseName(test.fullName, test.ChildIndex) : test.fullName; + TestCaseCount = test.testCaseCount; + HasChildren = test.hasChildren; + IsSuite = test.isSuite; + m_ChildrenIds = test.childrenIds; + TestCaseTimeout = test.testCaseTimeout; + Categories = test.Categories; + IsTestAssembly = test.IsTestAssembly; + RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString()); + Description = test.Description; + SkipReason = test.SkipReason; + ParentId = test.ParentId; + UniqueName = test.UniqueName; + ParentUniqueName = test.ParentUniqueName; + ParentFullName = test.ParentFullName; + ChildIndex = test.ChildIndex; + TestMode = TestMode.PlayMode; + } + + internal void ApplyChildren(IEnumerable allTests) + { + Children = m_ChildrenIds.Select(id => allTests.First(t => t.Id == id)).ToArray(); + if (!string.IsNullOrEmpty(ParentId)) + { + Parent = allTests.FirstOrDefault(t => t.Id == ParentId); + } + } + + public string Id { get; private set; } + public string Name { get; private set; } + public string FullName { get; private set; } + public int TestCaseCount { get; private set; } + public bool HasChildren { get; private set; } + public bool IsSuite { get; private set; } + public IEnumerable Children { get; private set; } + public ITestAdaptor Parent { get; private set; } + public int TestCaseTimeout { get; private set; } + public ITypeInfo TypeInfo { get; private set; } + public IMethodInfo Method { get; private set; } + private string[] m_ChildrenIds; + public string[] Categories { get; private set; } + public bool IsTestAssembly { get; private set; } + public RunState RunState { get; } + public string Description { get; } + public string SkipReason { get; } + public string ParentId { get; } + public string ParentFullName { get; } + public string UniqueName { get; } + public string ParentUniqueName { get; } + public int ChildIndex { get; } + public TestMode TestMode { get; private set; } + + private static string GetIndexedTestCaseName(string fullName, int index) + { + var generatedTestSuffix = " GeneratedTestCase" + index; + if (fullName.EndsWith(")")) + { + // Test names from generated TestCaseSource look like Test(TestCaseSourceType) + // This inserts a unique test case index in the name, so that it becomes Test(TestCaseSourceType GeneratedTestCase0) + return fullName.Substring(0, fullName.Length - 1) + generatedTestSuffix + fullName[fullName.Length - 1]; + } + + // In some cases there can be tests with duplicate names generated in other ways and they won't have () in their name + // We just append a suffix at the end of the name in that case + return fullName + generatedTestSuffix; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta new file mode 100644 index 0000000..81e39b7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e0e62db88935c74288c97c907243bd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs new file mode 100644 index 0000000..7a25ec8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestAdaptorFactory : ITestAdaptorFactory + { + private Dictionary m_TestAdaptorCache = new Dictionary(); + private Dictionary m_TestResultAdaptorCache = new Dictionary(); + public ITestAdaptor Create(ITest test) + { + var uniqueName = test.GetUniqueName(); + if (m_TestAdaptorCache.ContainsKey(uniqueName)) + { + return m_TestAdaptorCache[uniqueName]; + } + + var adaptor = new TestAdaptor(test, test.Tests.Select(Create).ToArray()); + foreach (var child in adaptor.Children) + { + (child as TestAdaptor).SetParent(adaptor); + } + m_TestAdaptorCache[uniqueName] = adaptor; + return adaptor; + } + + public ITestAdaptor Create(RemoteTestData testData) + { + return new TestAdaptor(testData); + } + + public ITestResultAdaptor Create(ITestResult testResult) + { + var uniqueName = testResult.Test.GetUniqueName(); + if (m_TestResultAdaptorCache.ContainsKey(uniqueName)) + { + return m_TestResultAdaptorCache[uniqueName]; + } + var adaptor = new TestResultAdaptor(testResult, Create(testResult.Test), testResult.Children.Select(Create).ToArray()); + m_TestResultAdaptorCache[uniqueName] = adaptor; + return adaptor; + } + + public ITestResultAdaptor Create(RemoteTestResultData testResult, RemoteTestResultDataWithTestData allData) + { + return new TestResultAdaptor(testResult, allData); + } + + public ITestAdaptor BuildTree(RemoteTestResultDataWithTestData data) + { + var tests = data.tests.Select(remoteTestData => new TestAdaptor(remoteTestData)).ToList(); + + foreach (var test in tests) + { + test.ApplyChildren(tests); + } + + return tests.First(); + } + + public IEnumerator BuildTreeAsync(RemoteTestResultDataWithTestData data) + { + var tests = data.tests.Select(remoteTestData => new TestAdaptor(remoteTestData)).ToList(); + + for (var index = 0; index < tests.Count; index++) + { + var test = tests[index]; + test.ApplyChildren(tests); + if (index % 100 == 0) + { + yield return null; + } + } + + yield return tests.First(); + } + + public void ClearResultsCache() + { + m_TestResultAdaptorCache.Clear(); + } + + public void ClearTestsCache() + { + m_TestAdaptorCache.Clear(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta new file mode 100644 index 0000000..0b1175f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0663d520c26b7c48a4135599e66acf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestMode.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestMode.cs new file mode 100644 index 0000000..e55ee3a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestMode.cs @@ -0,0 +1,11 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + [Flags] + public enum TestMode + { + EditMode = 1 << 0, + PlayMode = 1 << 1 + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestMode.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestMode.cs.meta new file mode 100644 index 0000000..e04594b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cad095eccea17b741bc4cd264e7441cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestResultAdaptor.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestResultAdaptor.cs new file mode 100644 index 0000000..7374b3f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestResultAdaptor.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + internal class TestResultAdaptor : ITestResultAdaptor + { + private TNode m_Node; + + internal TestResultAdaptor(ITestResult result, ITestAdaptor test, ITestResultAdaptor[] children = null) + { + Test = test; + Name = result.Name; + FullName = result.FullName; + ResultState = result.ResultState.ToString(); + TestStatus = ParseTestStatus(result.ResultState.Status); + Duration = result.Duration; + StartTime = result.StartTime; + EndTime = result.EndTime; + Message = result.Message; + StackTrace = result.StackTrace; + AssertCount = result.AssertCount; + FailCount = result.FailCount; + PassCount = result.PassCount; + SkipCount = result.SkipCount; + InconclusiveCount = result.InconclusiveCount; + HasChildren = result.HasChildren; + Output = result.Output; + Children = children; + m_Node = result.ToXml(true); + } + + internal TestResultAdaptor(RemoteTestResultData result, RemoteTestResultDataWithTestData allData) + { + Test = new TestAdaptor(allData.tests.First(t => t.id == result.testId)); + Name = result.name; + FullName = result.fullName; + ResultState = result.resultState; + TestStatus = ParseTestStatus(result.testStatus); + Duration = result.duration; + StartTime = result.startTime; + EndTime = result.endTime; + Message = result.message; + StackTrace = result.stackTrace; + AssertCount = result.assertCount; + FailCount = result.failCount; + PassCount = result.passCount; + SkipCount = result.skipCount; + InconclusiveCount = result.inconclusiveCount; + HasChildren = result.hasChildren; + Output = result.output; + Children = result.childrenIds.Select(childId => new TestResultAdaptor(allData.results.First(r => r.testId == childId), allData)).ToArray(); + m_Node = TNode.FromXml(result.xml); + } + + public ITestAdaptor Test { get; private set; } + public string Name { get; private set; } + public string FullName { get; private set; } + public string ResultState { get; private set; } + public TestStatus TestStatus { get; private set; } + public double Duration { get; private set; } + public DateTime StartTime { get; private set; } + public DateTime EndTime { get; private set; } + public string Message { get; private set; } + public string StackTrace { get; private set; } + public int AssertCount { get; private set; } + public int FailCount { get; private set; } + public int PassCount { get; private set; } + public int SkipCount { get; private set; } + public int InconclusiveCount { get; private set; } + public bool HasChildren { get; private set; } + public IEnumerable Children { get; private set; } + public string Output { get; private set; } + public TNode ToXml() + { + return m_Node; + } + + private static TestStatus ParseTestStatus(NUnit.Framework.Interfaces.TestStatus testStatus) + { + return (TestStatus)Enum.Parse(typeof(TestStatus), testStatus.ToString()); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta new file mode 100644 index 0000000..c2b119e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d061ada5d3169454daf54243390b5fdb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestRunnerApi.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestRunnerApi.cs new file mode 100644 index 0000000..c7af3f0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestRunnerApi.cs @@ -0,0 +1,120 @@ +using System; +using System.Linq; +using System.Threading; +using UnityEditor.TestTools.TestRunner.CommandLineTest; +using UnityEditor.TestTools.TestRunner.TestRun; +using UnityEngine; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + public class TestRunnerApi : ScriptableObject, ITestRunnerApi + { + internal ICallbacksHolder callbacksHolder; + + private ICallbacksHolder m_CallbacksHolder + { + get + { + if (callbacksHolder == null) + { + return CallbacksHolder.instance; + } + + return callbacksHolder; + } + } + + internal Func ScheduleJob = (executionSettings) => + { + var runner = new TestJobRunner(); + return runner.RunJob(new TestJobData(executionSettings)); + }; + + public string Execute(ExecutionSettings executionSettings) + { + if (executionSettings == null) + { + throw new ArgumentNullException(nameof(executionSettings)); + } + + if ((executionSettings.filters == null || executionSettings.filters.Length == 0) && executionSettings.filter != null) + { + // Map filter (singular) to filters (plural), for backwards compatibility. + executionSettings.filters = new [] {executionSettings.filter}; + } + + if (executionSettings.targetPlatform == null && executionSettings.filters != null && + executionSettings.filters.Length > 0) + { + executionSettings.targetPlatform = executionSettings.filters[0].targetPlatform; + } + + return ScheduleJob(executionSettings); + } + + public void RegisterCallbacks(T testCallbacks, int priority = 0) where T : ICallbacks + { + if (testCallbacks == null) + { + throw new ArgumentNullException(nameof(testCallbacks)); + } + + m_CallbacksHolder.Add(testCallbacks, priority); + } + + public void UnregisterCallbacks(T testCallbacks) where T : ICallbacks + { + if (testCallbacks == null) + { + throw new ArgumentNullException(nameof(testCallbacks)); + } + + m_CallbacksHolder.Remove(testCallbacks); + } + + internal void RetrieveTestList(ExecutionSettings executionSettings, Action callback) + { + if (executionSettings == null) + { + throw new ArgumentNullException(nameof(executionSettings)); + } + + var firstFilter = executionSettings.filters?.FirstOrDefault() ?? executionSettings.filter; + RetrieveTestList(firstFilter.testMode, callback); + } + + public void RetrieveTestList(TestMode testMode, Action callback) + { + if (callback == null) + { + throw new ArgumentNullException(nameof(callback)); + } + + var platform = ParseTestMode(testMode); + var testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + var testAdaptorFactory = new TestAdaptorFactory(); + var testListCache = new TestListCache(testAdaptorFactory, new RemoteTestResultDataFactory(), TestListCacheData.instance); + var testListProvider = new TestListProvider(testAssemblyProvider, new UnityTestAssemblyBuilder()); + var cachedTestListProvider = new CachingTestListProvider(testListProvider, testListCache, testAdaptorFactory); + + var job = new TestListJob(cachedTestListProvider, platform, (testRoot) => + { + callback(testRoot); + }); + job.Start(); + } + + internal static bool IsRunActive() + { + return RunData.instance.isRunning; + } + + private static TestPlatform ParseTestMode(TestMode testMode) + { + return (((testMode & TestMode.EditMode) == TestMode.EditMode) ? TestPlatform.EditMode : 0) | (((testMode & TestMode.PlayMode) == TestMode.PlayMode) ? TestPlatform.PlayMode : 0); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta new file mode 100644 index 0000000..7ad5fc1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68993ba529ae04440916cb7c23bf3279 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestStatus.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestStatus.cs new file mode 100644 index 0000000..f330fa1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestStatus.cs @@ -0,0 +1,10 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + public enum TestStatus + { + Inconclusive, + Skipped, + Passed, + Failed + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestStatus.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestStatus.cs.meta new file mode 100644 index 0000000..38bd6af --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/Api/TestStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ec94545c5b00344c9bd8e691f15d799 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/AssemblyInfo.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/AssemblyInfo.cs new file mode 100644 index 0000000..49b650e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/AssemblyInfo.cs @@ -0,0 +1,15 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle("UnityEditor.TestRunner")] +[assembly: InternalsVisibleTo("Assembly-CSharp-Editor-testable")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] +[assembly: InternalsVisibleTo("Unity.PerformanceTesting.Editor")] +[assembly: InternalsVisibleTo("Unity.IntegrationTests")] +[assembly: InternalsVisibleTo("UnityEditor.TestRunner.Tests")] +[assembly: InternalsVisibleTo("Unity.TestTools.CodeCoverage.Editor")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Develop.Editor")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Develop.EditorTests")] +[assembly: InternalsVisibleTo("Unity.PackageValidationSuite.Editor")] + +[assembly: AssemblyVersion("1.0.0")] diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/AssemblyInfo.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/AssemblyInfo.cs.meta new file mode 100644 index 0000000..5e1b8dd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9db19a04003fca7439552acd4de9baa1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser.meta new file mode 100644 index 0000000..b5a29bd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7602252bdb82b8d45ae3483c3a00d3e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs new file mode 100644 index 0000000..8582351 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs @@ -0,0 +1,45 @@ +using System; +using System.Linq; + +namespace UnityEditor.TestRunner.CommandLineParser +{ + internal class CommandLineOption : ICommandLineOption + { + Action m_ArgAction; + + public CommandLineOption(string argName, Action action) + { + ArgName = argName; + m_ArgAction = s => action(); + } + + public CommandLineOption(string argName, Action action) + { + ArgName = argName; + m_ArgAction = action; + } + + public CommandLineOption(string argName, Action action) + { + ArgName = argName; + m_ArgAction = s => action(SplitStringToArray(s)); + } + + public string ArgName { get; private set; } + + public void ApplyValue(string value) + { + m_ArgAction(value); + } + + static string[] SplitStringToArray(string value) + { + if (string.IsNullOrEmpty(value)) + { + return null; + } + + return value.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta new file mode 100644 index 0000000..65f3256 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3529368f4cd0424a89aa51080a16b06 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs new file mode 100644 index 0000000..d08c233 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs @@ -0,0 +1,49 @@ +using System; + +namespace UnityEditor.TestRunner.CommandLineParser +{ + internal class CommandLineOptionSet + { + ICommandLineOption[] m_Options; + + public CommandLineOptionSet(params ICommandLineOption[] options) + { + m_Options = options; + } + + public void Parse(string[] args) + { + var i = 0; + while (i < args.Length) + { + var arg = args[i]; + if (!arg.StartsWith("-")) + { + i++; + continue; + } + + string value = null; + if (i + 1 < args.Length && !args[i + 1].StartsWith("-")) + { + value = args[i + 1]; + i++; + } + + ApplyValueToMatchingOptions(arg, value); + i++; + } + } + + private void ApplyValueToMatchingOptions(string argName, string value) + { + foreach (var option in m_Options) + { + if ("-" + option.ArgName == argName) + { + option.ApplyValue(value); + } + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta new file mode 100644 index 0000000..1db24d0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 139c5eac101a4dc4fb3098e30c29f15e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs new file mode 100644 index 0000000..7f699ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs @@ -0,0 +1,8 @@ +namespace UnityEditor.TestRunner.CommandLineParser +{ + interface ICommandLineOption + { + string ArgName { get; } + void ApplyValue(string value); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta new file mode 100644 index 0000000..613d95f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f445ca0c614a846449fcd8ae648c24e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest.meta new file mode 100644 index 0000000..d005718 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b477d1f29b65a674e9d5cdab4eb72b01 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/Executer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/Executer.cs new file mode 100644 index 0000000..fe0eb3b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/Executer.cs @@ -0,0 +1,134 @@ +using System; +using System.Linq; +using UnityEditor.TestRunner.TestLaunchers; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class Executer + { + private ITestRunnerApi m_TestRunnerApi; + private ISettingsBuilder m_SettingsBuilder; + private Action m_LogErrorFormat; + private Action m_LogException; + private Action m_ExitEditorApplication; + private Func m_ScriptCompilationFailedCheck; + + public Executer(ITestRunnerApi testRunnerApi, ISettingsBuilder settingsBuilder, Action logErrorFormat, Action logException, Action exitEditorApplication, Func scriptCompilationFailedCheck) + { + m_TestRunnerApi = testRunnerApi; + m_SettingsBuilder = settingsBuilder; + m_LogErrorFormat = logErrorFormat; + m_LogException = logException; + m_ExitEditorApplication = exitEditorApplication; + m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck; + } + + internal void InitializeAndExecuteRun(string[] commandLineArgs) + { + Api.ExecutionSettings executionSettings; + try + { + executionSettings = m_SettingsBuilder.BuildApiExecutionSettings(commandLineArgs); + if (executionSettings.targetPlatform.HasValue) + RemotePlayerLogController.instance.SetBuildTarget(executionSettings.targetPlatform.Value); + } + catch (SetupException exception) + { + HandleSetupException(exception); + return; + } + + try + { + Debug.Log("Executing tests with settings: " + ExecutionSettingsToString(executionSettings)); + m_TestRunnerApi.Execute(executionSettings); + } + catch (Exception exception) + { + m_LogException(exception); + m_ExitEditorApplication((int)ReturnCodes.RunError); + } + } + + internal ExecutionSettings BuildExecutionSettings(string[] commandLineArgs) + { + return m_SettingsBuilder.BuildExecutionSettings(commandLineArgs); + } + + internal enum ReturnCodes + { + Ok = 0, + Failed = 2, + RunError = 3, + PlatformNotFoundReturnCode = 4 + } + + internal void SetUpCallbacks(ExecutionSettings executionSettings) + { + RemotePlayerLogController.instance.SetLogsDirectory(executionSettings.DeviceLogsDirectory); + + var resultSavingCallback = ScriptableObject.CreateInstance(); + resultSavingCallback.m_ResultFilePath = executionSettings.TestResultsFile; + + var logSavingCallback = ScriptableObject.CreateInstance(); + + m_TestRunnerApi.RegisterCallbacks(resultSavingCallback); + m_TestRunnerApi.RegisterCallbacks(logSavingCallback); + m_TestRunnerApi.RegisterCallbacks(ScriptableObject.CreateInstance(), -10); + } + + internal void ExitOnCompileErrors() + { + if (m_ScriptCompilationFailedCheck()) + { + var handling = s_ExceptionHandlingMapping.First(h => h.m_ExceptionType == SetupException.ExceptionType.ScriptCompilationFailed); + m_LogErrorFormat(handling.m_Message, new object[0]); + m_ExitEditorApplication(handling.m_ReturnCode); + } + } + + void HandleSetupException(SetupException exception) + { + ExceptionHandling handling = s_ExceptionHandlingMapping.FirstOrDefault(h => h.m_ExceptionType == exception.Type) ?? new ExceptionHandling(exception.Type, "Unknown command line test run error. " + exception.Type, ReturnCodes.RunError); + m_LogErrorFormat(handling.m_Message, exception.Details); + m_ExitEditorApplication(handling.m_ReturnCode); + } + + private class ExceptionHandling + { + internal SetupException.ExceptionType m_ExceptionType; + internal string m_Message; + internal int m_ReturnCode; + public ExceptionHandling(SetupException.ExceptionType exceptionType, string message, ReturnCodes returnCode) + { + m_ExceptionType = exceptionType; + m_Message = message; + m_ReturnCode = (int)returnCode; + } + } + + static ExceptionHandling[] s_ExceptionHandlingMapping = new[] + { + new ExceptionHandling(SetupException.ExceptionType.ScriptCompilationFailed, "Scripts had compilation errors.", ReturnCodes.RunError), + new ExceptionHandling(SetupException.ExceptionType.PlatformNotFound, "Test platform not found ({0}).", ReturnCodes.PlatformNotFoundReturnCode), + new ExceptionHandling(SetupException.ExceptionType.TestSettingsFileNotFound, "Test settings file not found at {0}.", ReturnCodes.RunError) + }; + + private static string ExecutionSettingsToString(Api.ExecutionSettings executionSettings) + { + if (executionSettings == null) + { + return "none"; + } + + if (executionSettings.filters == null || executionSettings.filters.Length == 0) + { + return "no filter"; + } + + return "test mode = " + executionSettings.filters[0].testMode; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta new file mode 100644 index 0000000..e57a010 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 083c6a3a5426382449369ddc12b691d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs new file mode 100644 index 0000000..3ff2356 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs @@ -0,0 +1,11 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ExecutionSettings + { + public string TestResultsFile; + public string DeviceLogsDirectory; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta new file mode 100644 index 0000000..35edc4c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3a75354f6ceac94ca15ca9d96593290 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs new file mode 100644 index 0000000..16b77b5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs @@ -0,0 +1,53 @@ +using System; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ExitCallbacks : ScriptableObject, IErrorCallbacks + { + private bool m_AnyTestsExecuted; + private bool m_RunFailed; + internal static bool preventExit; + + public void RunFinished(ITestResultAdaptor testResults) + { + if (preventExit) + { + return; + } + + if (!m_AnyTestsExecuted) + { + Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "No tests were executed"); + } + EditorApplication.Exit(m_RunFailed ? (int)Executer.ReturnCodes.Failed : (int)Executer.ReturnCodes.Ok); + } + + public void TestStarted(ITestAdaptor test) + { + if (!test.IsSuite) + { + m_AnyTestsExecuted = true; + } + } + + public void TestFinished(ITestResultAdaptor result) + { + if (!result.Test.IsSuite && (result.TestStatus == TestStatus.Failed || result.TestStatus == TestStatus.Inconclusive)) + { + m_RunFailed = true; + } + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public void OnError(string message) + { + EditorApplication.Exit((int)Executer.ReturnCodes.RunError); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta new file mode 100644 index 0000000..6296463 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1adaa8dcc4fda3d4cb4d3c8e0cb65d12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs new file mode 100644 index 0000000..557195d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs @@ -0,0 +1,10 @@ +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + interface ISettingsBuilder + { + Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs); + ExecutionSettings BuildExecutionSettings(string[] commandLineArgs); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta new file mode 100644 index 0000000..cc0b248 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a13cbeb2099aca47bb456f49845f86c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs new file mode 100644 index 0000000..40a185f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs @@ -0,0 +1,29 @@ +using System; +using UnityEditor.TestRunner.TestLaunchers; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class LogSavingCallbacks : ScriptableObject, ICallbacks + { + public void RunStarted(ITestAdaptor testsToRun) + { + RemotePlayerLogController.instance.StartLogWriters(); + } + + public virtual void RunFinished(ITestResultAdaptor testResults) + { + RemotePlayerLogController.instance.StopLogWriters(); + } + + public void TestStarted(ITestAdaptor test) + { + } + + public void TestFinished(ITestResultAdaptor result) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta new file mode 100644 index 0000000..c968178 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d20eedbe40f0ce41a4c4f633f225de8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs new file mode 100644 index 0000000..5470fd7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor.DeploymentTargets; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class LogWriter : IDisposable + { + private string m_LogsDirectory; + private string m_DeviceID; + private Dictionary m_LogStreams; + private DeploymentTargetLogger m_Logger; + + internal LogWriter(string logsDirectory, string deviceID, DeploymentTargetLogger logger) + { + m_LogStreams = new Dictionary(); + m_Logger = logger; + m_LogsDirectory = logsDirectory; + m_DeviceID = deviceID; + + logger.logMessage += WriteLogToFile; + } + + private void WriteLogToFile(string id, string logLine) + { + StreamWriter logStream; + var streamExists = m_LogStreams.TryGetValue(id, out logStream); + if (!streamExists) + { + var filePath = GetLogFilePath(m_LogsDirectory, m_DeviceID, id); + logStream = CreateLogFile(filePath); + + m_LogStreams.Add(id, logStream); + } + + try + { + if (logLine != null) + logStream.WriteLine(logLine); + } + catch (Exception ex) + { + Debug.LogError($"Writing {id} log failed."); + Debug.LogException(ex); + } + } + + public void Stop() + { + m_Logger.Stop(); + foreach (var logStream in m_LogStreams) + { + logStream.Value.Close(); + } + } + + public void Dispose() + { + Stop(); + } + + private StreamWriter CreateLogFile(string path) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Creating {0} device log: {1}", m_DeviceID, path); + StreamWriter streamWriter = null; + try + { + if (!Directory.Exists(path)) + Directory.CreateDirectory(Path.GetDirectoryName(path)); + + streamWriter = File.CreateText(path); + } + catch (Exception ex) + { + Debug.LogError($"Creating device log {path} file failed."); + Debug.LogException(ex); + } + + return streamWriter; + } + + private string GetLogFilePath(string lgosDirectory, string deviceID, string logID) + { + var fileName = "Device-" + deviceID + "-" + logID + ".txt"; + fileName = string.Join("_", fileName.Split(Path.GetInvalidFileNameChars())); + return Paths.Combine(lgosDirectory, fileName); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta new file mode 100644 index 0000000..56872b9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05778dd1de4433d418793b6f3d3c18cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs new file mode 100644 index 0000000..a3837bf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs @@ -0,0 +1,50 @@ +using System; +using System.IO; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ResultsSavingCallbacks : ScriptableObject, ICallbacks + { + [SerializeField] + public string m_ResultFilePath; + + public ResultsSavingCallbacks() + { + this.m_ResultFilePath = GetDefaultResultFilePath(); + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public virtual void RunFinished(ITestResultAdaptor testResults) + { + if (string.IsNullOrEmpty(m_ResultFilePath)) + { + m_ResultFilePath = GetDefaultResultFilePath(); + } + + var resultWriter = new ResultsWriter(); + resultWriter.WriteResultToFile(testResults, m_ResultFilePath); + } + + public void TestStarted(ITestAdaptor test) + { + } + + public void TestFinished(ITestResultAdaptor result) + { + } + + private static string GetDefaultResultFilePath() + { + var fileName = "TestResults-" + DateTime.Now.Ticks + ".xml"; + var projectPath = Directory.GetCurrentDirectory(); + return Paths.Combine(projectPath, fileName); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta new file mode 100644 index 0000000..ca06f3a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef563c5a6ecf64d4193dc144cb7d472a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs new file mode 100644 index 0000000..e713a6e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs @@ -0,0 +1,103 @@ +using System; +using System.IO; +using System.Xml; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class ResultsWriter + { + private const string k_nUnitVersion = "3.5.0.0"; + + private const string k_TestRunNode = "test-run"; + private const string k_Id = "id"; + private const string k_Testcasecount = "testcasecount"; + private const string k_Result = "result"; + private const string k_Total = "total"; + private const string k_Passed = "passed"; + private const string k_Failed = "failed"; + private const string k_Inconclusive = "inconclusive"; + private const string k_Skipped = "skipped"; + private const string k_Asserts = "asserts"; + private const string k_EngineVersion = "engine-version"; + private const string k_ClrVersion = "clr-version"; + private const string k_StartTime = "start-time"; + private const string k_EndTime = "end-time"; + private const string k_Duration = "duration"; + + private const string k_TimeFormat = "u"; + + public void WriteResultToFile(ITestResultAdaptor result, string filePath) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Saving results to: {0}", filePath); + + try + { + if (!Directory.Exists(filePath)) + { + CreateDirectory(filePath); + } + + using (var fileStream = File.CreateText(filePath)) + { + WriteResultToStream(result, fileStream); + } + } + catch (Exception ex) + { + Debug.LogError("Saving result file failed."); + Debug.LogException(ex); + } + } + + void CreateDirectory(string filePath) + { + var driectoryPath = Path.GetDirectoryName(filePath); + if (!String.IsNullOrEmpty(driectoryPath)) + { + Directory.CreateDirectory(driectoryPath); + } + } + + public void WriteResultToStream(ITestResultAdaptor result, StreamWriter streamWriter, XmlWriterSettings settings = null) + { + settings = settings ?? new XmlWriterSettings(); + settings.Indent = true; + settings.NewLineOnAttributes = false; + + using (var xmlWriter = XmlWriter.Create(streamWriter, settings)) + { + WriteResultsToXml(result, xmlWriter); + } + } + + void WriteResultsToXml(ITestResultAdaptor result, XmlWriter xmlWriter) + { + // XML format as specified at https://github.com/nunit/docs/wiki/Test-Result-XML-Format + + var testRunNode = new TNode(k_TestRunNode); + + testRunNode.AddAttribute(k_Id, "2"); + testRunNode.AddAttribute(k_Testcasecount, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString()); + testRunNode.AddAttribute(k_Result, result.ResultState.ToString()); + testRunNode.AddAttribute(k_Total, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString()); + testRunNode.AddAttribute(k_Passed, result.PassCount.ToString()); + testRunNode.AddAttribute(k_Failed, result.FailCount.ToString()); + testRunNode.AddAttribute(k_Inconclusive, result.InconclusiveCount.ToString()); + testRunNode.AddAttribute(k_Skipped, result.SkipCount.ToString()); + testRunNode.AddAttribute(k_Asserts, result.AssertCount.ToString()); + testRunNode.AddAttribute(k_EngineVersion, k_nUnitVersion); + testRunNode.AddAttribute(k_ClrVersion, Environment.Version.ToString()); + testRunNode.AddAttribute(k_StartTime, result.StartTime.ToString(k_TimeFormat)); + testRunNode.AddAttribute(k_EndTime, result.EndTime.ToString(k_TimeFormat)); + testRunNode.AddAttribute(k_Duration, result.Duration.ToString()); + + var resultNode = result.ToXml(); + testRunNode.ChildNodes.Add(resultNode); + + testRunNode.WriteTo(xmlWriter); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta new file mode 100644 index 0000000..074fe65 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29d603e0a726a9043b3503112271844a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunData.cs new file mode 100644 index 0000000..6a469a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunData.cs @@ -0,0 +1,8 @@ +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class RunData : ScriptableSingleton + { + public bool isRunning; + public ExecutionSettings executionSettings; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta new file mode 100644 index 0000000..4cfe30e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f8c1075884df0249b80e23a0598f9c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs new file mode 100644 index 0000000..9b914c7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs @@ -0,0 +1,29 @@ +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class RunSettings : ITestRunSettings + { + private ITestSettings m_TestSettings; + public RunSettings(ITestSettings testSettings) + { + this.m_TestSettings = testSettings; + } + + public void Apply() + { + if (m_TestSettings != null) + { + m_TestSettings.SetupProjectParameters(); + } + } + + public void Dispose() + { + if (m_TestSettings != null) + { + m_TestSettings.Dispose(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta new file mode 100644 index 0000000..0e241ba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59d3f5586b341a74c84c8f72144a4568 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs new file mode 100644 index 0000000..16b66e4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs @@ -0,0 +1,188 @@ +using System; +using System.IO; +using UnityEditor.TestRunner.CommandLineParser; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class SettingsBuilder : ISettingsBuilder + { + private ITestSettingsDeserializer m_TestSettingsDeserializer; + private Action m_LogAction; + private Action m_LogWarningAction; + private Func m_FileExistsCheck; + private Func m_ScriptCompilationFailedCheck; + public SettingsBuilder(ITestSettingsDeserializer testSettingsDeserializer, Action logAction, Action logWarningAction, Func fileExistsCheck, Func scriptCompilationFailedCheck) + { + m_LogAction = logAction; + m_LogWarningAction = logWarningAction; + m_FileExistsCheck = fileExistsCheck; + m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck; + m_TestSettingsDeserializer = testSettingsDeserializer; + } + + public Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs) + { + var quit = false; + string testPlatform = TestMode.EditMode.ToString(); + string[] testFilters = null; + string[] testCategories = null; + string testSettingsFilePath = null; + int testRepetitions = 1; + int? playerHeartbeatTimeout = null; + bool runSynchronously = false; + string[] testAssemblyNames = null; + + var optionSet = new CommandLineOptionSet( + new CommandLineOption("quit", () => { quit = true; }), + new CommandLineOption("testPlatform", platform => { testPlatform = platform; }), + new CommandLineOption("editorTestsFilter", filters => { testFilters = filters; }), + new CommandLineOption("testFilter", filters => { testFilters = filters; }), + new CommandLineOption("editorTestsCategories", catagories => { testCategories = catagories; }), + new CommandLineOption("testCategory", catagories => { testCategories = catagories; }), + new CommandLineOption("testSettingsFile", settingsFilePath => { testSettingsFilePath = settingsFilePath; }), + new CommandLineOption("testRepetitions", reps => { testRepetitions = int.Parse(reps); }), + new CommandLineOption("playerHeartbeatTimeout", timeout => { playerHeartbeatTimeout = int.Parse(timeout); }), + new CommandLineOption("runSynchronously", () => { runSynchronously = true; }), + new CommandLineOption("assemblyNames", assemblyNames => { testAssemblyNames = assemblyNames; }) + ); + optionSet.Parse(commandLineArgs); + + DisplayQuitWarningIfQuitIsGiven(quit); + + CheckForScriptCompilationErrors(); + + LogParametersForRun(testPlatform, testFilters, testCategories, testSettingsFilePath); + + var testSettings = GetTestSettings(testSettingsFilePath); + + var filter = new Filter() + { + groupNames = testFilters, + categoryNames = testCategories, + assemblyNames = testAssemblyNames + }; + + var buildTarget = SetFilterAndGetBuildTarget(testPlatform, filter); + + RerunCallbackData.instance.runFilters = new []{new UITestRunnerFilter() + { + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testRepetitions = testRepetitions + }}; + + RerunCallbackData.instance.testMode = filter.testMode; + + var settings = new Api.ExecutionSettings() + { + filters = new []{filter}, + overloadTestRunSettings = new RunSettings(testSettings), + targetPlatform = buildTarget, + runSynchronously = runSynchronously + }; + + if (playerHeartbeatTimeout != null) + { + settings.playerHeartbeatTimeout = playerHeartbeatTimeout.Value; + } + + return settings; + } + + public ExecutionSettings BuildExecutionSettings(string[] commandLineArgs) + { + string resultFilePath = null; + string deviceLogsDirectory = null; + + var optionSet = new CommandLineOptionSet( + new CommandLineOption("editorTestsResultFile", filePath => { resultFilePath = filePath; }), + new CommandLineOption("testResults", filePath => { resultFilePath = filePath; }), + new CommandLineOption("deviceLogs", dirPath => { deviceLogsDirectory = dirPath; }) + ); + optionSet.Parse(commandLineArgs); + + return new ExecutionSettings() + { + TestResultsFile = resultFilePath, + DeviceLogsDirectory = deviceLogsDirectory + }; + } + + void DisplayQuitWarningIfQuitIsGiven(bool quitIsGiven) + { + if (quitIsGiven) + { + m_LogWarningAction("Running tests from command line arguments will not work when \"quit\" is specified."); + } + } + + void CheckForScriptCompilationErrors() + { + if (m_ScriptCompilationFailedCheck()) + { + throw new SetupException(SetupException.ExceptionType.ScriptCompilationFailed); + } + } + + void LogParametersForRun(string testPlatform, string[] testFilters, string[] testCategories, string testSettingsFilePath) + { + m_LogAction("Running tests for " + testPlatform); + if (testFilters != null && testFilters.Length > 0) + { + m_LogAction("With test filter: " + string.Join(", ", testFilters)); + } + if (testCategories != null && testCategories.Length > 0) + { + m_LogAction("With test categories: " + string.Join(", ", testCategories)); + } + if (!string.IsNullOrEmpty(testSettingsFilePath)) + { + m_LogAction("With test settings file: " + testSettingsFilePath); + } + } + + ITestSettings GetTestSettings(string testSettingsFilePath) + { + ITestSettings testSettings = null; + if (!string.IsNullOrEmpty(testSettingsFilePath)) + { + if (!m_FileExistsCheck(testSettingsFilePath)) + { + throw new SetupException(SetupException.ExceptionType.TestSettingsFileNotFound, testSettingsFilePath); + } + + testSettings = m_TestSettingsDeserializer.GetSettingsFromJsonFile(testSettingsFilePath); + } + return testSettings; + } + + static BuildTarget? SetFilterAndGetBuildTarget(string testPlatform, Filter filter) + { + BuildTarget? buildTarget = null; + if (testPlatform.ToLower() == "editmode") + { + filter.testMode = TestMode.EditMode; + } + else if (testPlatform.ToLower() == "playmode") + { + filter.testMode = TestMode.PlayMode; + } + else + { + try + { + buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), testPlatform, true); + + filter.testMode = TestMode.PlayMode; + } + catch (ArgumentException) + { + throw new SetupException(SetupException.ExceptionType.PlatformNotFound, testPlatform); + } + } + return buildTarget; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta new file mode 100644 index 0000000..1e2f8c9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7468a027a77337478e133b40b42b4f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SetupException.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SetupException.cs new file mode 100644 index 0000000..3337713 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SetupException.cs @@ -0,0 +1,23 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class SetupException : Exception + { + public ExceptionType Type { get; } + public object[] Details { get; } + + public SetupException(ExceptionType type, params object[] details) + { + Type = type; + Details = details; + } + + public enum ExceptionType + { + ScriptCompilationFailed, + PlatformNotFound, + TestSettingsFileNotFound, + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta new file mode 100644 index 0000000..bdb235c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 63572993f2104574099a48392460b211 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs new file mode 100644 index 0000000..44130b2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs @@ -0,0 +1,82 @@ +using System; +using System.IO; +using UnityEditor.TestRunner.CommandLineParser; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEditor.Compilation; +using System.Linq; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [InitializeOnLoad] + static class TestStarter + { + static TestStarter() + { + if (!ShouldRunTests()) + { + return; + } + + if (EditorApplication.isCompiling) + { + return; + } + + if (RunData.instance.isRunning) + { + executer.ExitOnCompileErrors(); + executer.SetUpCallbacks(RunData.instance.executionSettings); + return; + } + + EditorApplication.update += UpdateWatch; + } + + static void UpdateWatch() + { + EditorApplication.update -= UpdateWatch; + + if (RunData.instance.isRunning) + { + return; + } + + RunData.instance.isRunning = true; + var commandLineArgs = Environment.GetCommandLineArgs(); + RunData.instance.executionSettings = executer.BuildExecutionSettings(commandLineArgs); + executer.SetUpCallbacks(RunData.instance.executionSettings); + executer.InitializeAndExecuteRun(commandLineArgs); + } + + static bool ShouldRunTests() + { + var shouldRunTests = false; + var optionSet = new CommandLineOptionSet( + new CommandLineOption("runTests", () => { shouldRunTests = true; }), + new CommandLineOption("runEditorTests", () => { shouldRunTests = true; }) + ); + optionSet.Parse(Environment.GetCommandLineArgs()); + return shouldRunTests; + } + + static Executer s_Executer; + + static Executer executer + { + get + { + if (s_Executer == null) + { + Func compilationCheck = () => EditorUtility.scriptCompilationFailed; + Action actionLogger = (string msg) => { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); }; + var apiSettingsBuilder = new SettingsBuilder(new TestSettingsDeserializer(() => new TestSettings()), actionLogger, Debug.LogWarning, File.Exists, compilationCheck); + s_Executer = new Executer(ScriptableObject.CreateInstance(), apiSettingsBuilder, Debug.LogErrorFormat, Debug.LogException, EditorApplication.Exit, compilationCheck); + } + + return s_Executer; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta new file mode 100644 index 0000000..4d5dfdc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4d616d1a494edd144b262cf6cd5e5fda +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI.meta new file mode 100644 index 0000000..bc9308a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e609b27ad2caa14c83dd9951b6c13c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs new file mode 100644 index 0000000..0016142 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs @@ -0,0 +1,11 @@ +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class AssetsDatabaseHelper : IAssetsDatabaseHelper + { + public void OpenAssetInItsDefaultExternalEditor(string assetPath, int line) + { + var asset = AssetDatabase.LoadMainAssetAtPath(assetPath); + AssetDatabase.OpenAsset(asset, line); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta new file mode 100644 index 0000000..4fad1fc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 740b3785866edda4b8d1e1a05570a5f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/GuiHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/GuiHelper.cs new file mode 100644 index 0000000..e1f23a3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/GuiHelper.cs @@ -0,0 +1,108 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class GuiHelper : IGuiHelper + { + public GuiHelper(IMonoCecilHelper monoCecilHelper, IAssetsDatabaseHelper assetsDatabaseHelper) + { + MonoCecilHelper = monoCecilHelper; + AssetsDatabaseHelper = assetsDatabaseHelper; + } + + protected IMonoCecilHelper MonoCecilHelper { get; private set; } + public IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; } + + public void OpenScriptInExternalEditor(Type type, MethodInfo method) + { + var fileOpenInfo = GetFileOpenInfo(type, method); + + if (string.IsNullOrEmpty(fileOpenInfo.FilePath)) + { + Debug.LogWarning("Failed to open test method source code in external editor. Inconsistent filename and yield return operator in target method."); + + return; + } + + if (fileOpenInfo.LineNumber == 1) + { + Debug.LogWarning("Failed to get a line number for unity test method. So please find it in opened file in external editor."); + } + + AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(fileOpenInfo.FilePath, fileOpenInfo.LineNumber); + } + + public IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method) + { + const string fileExtension = ".cs"; + + var fileOpenInfo = MonoCecilHelper.TryGetCecilFileOpenInfo(type, method); + if (string.IsNullOrEmpty(fileOpenInfo.FilePath)) + { + var dirPath = Paths.UnifyDirectorySeparator(Application.dataPath); + var allCsFiles = Directory.GetFiles(dirPath, $"*{fileExtension}", SearchOption.AllDirectories) + .Select(Paths.UnifyDirectorySeparator); + + var fileName = allCsFiles.FirstOrDefault(x => + x.Split(Path.DirectorySeparatorChar).Last().Equals(string.Concat(type.Name, fileExtension))); + + fileOpenInfo.FilePath = fileName ?? string.Empty; + } + + fileOpenInfo.FilePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath); + + return fileOpenInfo; + } + + public string FilePathToAssetsRelativeAndUnified(string filePath) + { + if (string.IsNullOrEmpty(filePath)) + return string.Empty; + + filePath = Paths.UnifyDirectorySeparator(filePath); + var length = Paths.UnifyDirectorySeparator(Application.dataPath).Length - "Assets".Length; + + return filePath.Substring(length); + } + + public bool OpenScriptInExternalEditor(string stacktrace) + { + if (string.IsNullOrEmpty(stacktrace)) + return false; + + var regex = new Regex("in (?.*):{1}(?[0-9]+)"); + + var matchingLines = stacktrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Where(x => regex.IsMatch(x)).ToList(); + if (!matchingLines.Any()) + return false; + + var fileOpenInfos = matchingLines + .Select(x => regex.Match(x)) + .Select(x => + new FileOpenInfo + { + FilePath = x.Groups["path"].Value, + LineNumber = int.Parse(x.Groups["line"].Value) + }).ToList(); + + var fileOpenInfo = fileOpenInfos + .FirstOrDefault(openInfo => !string.IsNullOrEmpty(openInfo.FilePath) && File.Exists(openInfo.FilePath)); + + if (fileOpenInfo == null) + { + return false; + } + + var filePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath); + AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(filePath, fileOpenInfo.LineNumber); + + return true; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta new file mode 100644 index 0000000..a1512d0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0138170d24533e47b8e6c250c6d7fbc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs new file mode 100644 index 0000000..3e26c53 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal interface IAssetsDatabaseHelper + { + void OpenAssetInItsDefaultExternalEditor(string assetPath, int line); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta new file mode 100644 index 0000000..622fe68 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 208e46d59ff6e304db0318377d20f5a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IGuiHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IGuiHelper.cs new file mode 100644 index 0000000..a87fb8d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IGuiHelper.cs @@ -0,0 +1,13 @@ +using System; +using System.Reflection; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal interface IGuiHelper + { + bool OpenScriptInExternalEditor(string stacktrace); + void OpenScriptInExternalEditor(Type type, MethodInfo method); + IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method); + string FilePathToAssetsRelativeAndUnified(string filePath); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta new file mode 100644 index 0000000..9c6e266 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd57cf917f61bbb42b8f030436426ddd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder.meta new file mode 100644 index 0000000..e682923 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07ea0326ed848fb4489187cb58f96113 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs new file mode 100644 index 0000000..34118d6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs @@ -0,0 +1,12 @@ +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class RenderingOptions + { + public string nameFilter; + public bool showSucceeded; + public bool showFailed; + public bool showIgnored; + public bool showNotRunned; + public string[] categories; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta new file mode 100644 index 0000000..57e6748 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87357ff0dec4ef348a295235835c6ee4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs new file mode 100644 index 0000000..7d7b7ff --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs @@ -0,0 +1,174 @@ +// **************************************************************** +// Based on nUnit 2.6.2 (http://www.nunit.org/) +// **************************************************************** + +using System; +using System.Collections.Generic; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + /// + /// Summary description for ResultSummarizer. + /// + internal class ResultSummarizer + { + private int m_ErrorCount = -1; + private int m_FailureCount; + private int m_IgnoreCount = -1; + private int m_InconclusiveCount = -1; + private int m_NotRunnable = -1; + private int m_ResultCount; + private int m_SkipCount; + private int m_SuccessCount; + private int m_TestsRun; + + private TimeSpan m_Duration = TimeSpan.FromSeconds(0); + + public ResultSummarizer(IEnumerable results) + { + foreach (var result in results) + Summarize(result); + } + + public bool success + { + get { return m_FailureCount == 0; } + } + + /// + /// Returns the number of test cases for which results + /// have been summarized. Any tests excluded by use of + /// Category or Explicit attributes are not counted. + /// + public int ResultCount + { + get { return m_ResultCount; } + } + + /// + /// Returns the number of test cases actually run, which + /// is the same as ResultCount, less any Skipped, Ignored + /// or NonRunnable tests. + /// + public int TestsRun + { + get { return m_TestsRun; } + } + + /// + /// Returns the number of tests that passed + /// + public int Passed + { + get { return m_SuccessCount; } + } + + /// + /// Returns the number of test cases that had an error. + /// + public int errors + { + get { return m_ErrorCount; } + } + + /// + /// Returns the number of test cases that failed. + /// + public int failures + { + get { return m_FailureCount; } + } + + /// + /// Returns the number of test cases that failed. + /// + public int inconclusive + { + get { return m_InconclusiveCount; } + } + + /// + /// Returns the number of test cases that were not runnable + /// due to errors in the signature of the class or method. + /// Such tests are also counted as Errors. + /// + public int notRunnable + { + get { return m_NotRunnable; } + } + + /// + /// Returns the number of test cases that were skipped. + /// + public int Skipped + { + get { return m_SkipCount; } + } + + public int ignored + { + get { return m_IgnoreCount; } + } + + public double duration + { + get { return m_Duration.TotalSeconds; } + } + + public int testsNotRun + { + get { return m_SkipCount + m_IgnoreCount + m_NotRunnable; } + } + + public void Summarize(TestRunnerResult result) + { + m_Duration += TimeSpan.FromSeconds(result.duration); + m_ResultCount++; + + if (result.resultStatus != TestRunnerResult.ResultStatus.NotRun) + { + //TODO implement missing features + // if(result.IsIgnored) + // { + // m_IgnoreCount++; + // return; + // } + + m_SkipCount++; + return; + } + + switch (result.resultStatus) + { + case TestRunnerResult.ResultStatus.Passed: + m_SuccessCount++; + m_TestsRun++; + break; + case TestRunnerResult.ResultStatus.Failed: + m_FailureCount++; + m_TestsRun++; + break; + //TODO implement missing features + // case TestResultState.Error: + // case TestResultState.Cancelled: + // m_ErrorCount++; + // m_TestsRun++; + // break; + // case TestResultState.Inconclusive: + // m_InconclusiveCount++; + // m_TestsRun++; + // break; + // case TestResultState.NotRunnable: + // m_NotRunnable++; + // // errorCount++; + // break; + // case TestResultState.Ignored: + // m_IgnoreCount++; + // break; + default: + m_SkipCount++; + break; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta new file mode 100644 index 0000000..bc4b465 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a2914724952ef40bb590d0607fc878 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs new file mode 100644 index 0000000..10f96bf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestFilterSettings + { + public bool showSucceeded; + public bool showFailed; + public bool showIgnored; + public bool showNotRun; + + public string filterByName; + public int filterByCategory; + + private GUIContent m_SucceededBtn; + private GUIContent m_FailedBtn; + private GUIContent m_IgnoredBtn; + private GUIContent m_NotRunBtn; + + public string[] availableCategories; + + private readonly string m_PrefsKey; + + public TestFilterSettings(string prefsKey) + { + availableCategories = null; + m_PrefsKey = prefsKey; + Load(); + UpdateCounters(Enumerable.Empty()); + } + + public void Load() + { + showSucceeded = EditorPrefs.GetBool(m_PrefsKey + ".ShowSucceeded", true); + showFailed = EditorPrefs.GetBool(m_PrefsKey + ".ShowFailed", true); + showIgnored = EditorPrefs.GetBool(m_PrefsKey + ".ShowIgnored", true); + showNotRun = EditorPrefs.GetBool(m_PrefsKey + ".ShowNotRun", true); + filterByName = EditorPrefs.GetString(m_PrefsKey + ".FilterByName", string.Empty); + filterByCategory = EditorPrefs.GetInt(m_PrefsKey + ".FilterByCategory", 0); + } + + public void Save() + { + EditorPrefs.SetBool(m_PrefsKey + ".ShowSucceeded", showSucceeded); + EditorPrefs.SetBool(m_PrefsKey + ".ShowFailed", showFailed); + EditorPrefs.SetBool(m_PrefsKey + ".ShowIgnored", showIgnored); + EditorPrefs.SetBool(m_PrefsKey + ".ShowNotRun", showNotRun); + EditorPrefs.SetString(m_PrefsKey + ".FilterByName", filterByName); + EditorPrefs.SetInt(m_PrefsKey + ".FilterByCategory", filterByCategory); + } + + public void UpdateCounters(IEnumerable results) + { + var summary = new ResultSummarizer(results); + + m_SucceededBtn = new GUIContent(summary.Passed.ToString(), Icons.s_SuccessImg, "Show tests that succeeded"); + m_FailedBtn = new GUIContent((summary.errors + summary.failures + summary.inconclusive).ToString(), Icons.s_FailImg, "Show tests that failed"); + m_IgnoredBtn = new GUIContent((summary.ignored + summary.notRunnable).ToString(), Icons.s_IgnoreImg, "Show tests that are ignored"); + m_NotRunBtn = new GUIContent((summary.testsNotRun - summary.ignored - summary.notRunnable).ToString(), Icons.s_UnknownImg, "Show tests that didn't run"); + } + + public string[] GetSelectedCategories() + { + if (availableCategories == null) + return new string[0]; + + return availableCategories.Where((c, i) => (filterByCategory & (1 << i)) != 0).ToArray(); + } + + public void OnGUI() + { + EditorGUI.BeginChangeCheck(); + + filterByName = GUILayout.TextField(filterByName, "ToolbarSeachTextField", GUILayout.MinWidth(100), GUILayout.MaxWidth(250), GUILayout.ExpandWidth(true)); + if (GUILayout.Button(GUIContent.none, string.IsNullOrEmpty(filterByName) ? "ToolbarSeachCancelButtonEmpty" : "ToolbarSeachCancelButton")) + filterByName = string.Empty; + + if (availableCategories != null && availableCategories.Length > 0) + filterByCategory = EditorGUILayout.MaskField(filterByCategory, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(90)); + + showSucceeded = GUILayout.Toggle(showSucceeded, m_SucceededBtn, EditorStyles.toolbarButton); + showFailed = GUILayout.Toggle(showFailed, m_FailedBtn, EditorStyles.toolbarButton); + showIgnored = GUILayout.Toggle(showIgnored, m_IgnoredBtn, EditorStyles.toolbarButton); + showNotRun = GUILayout.Toggle(showNotRun, m_NotRunBtn, EditorStyles.toolbarButton); + + if (EditorGUI.EndChangeCheck()) + Save(); + } + + public RenderingOptions BuildRenderingOptions() + { + var options = new RenderingOptions(); + options.showSucceeded = showSucceeded; + options.showFailed = showFailed; + options.showIgnored = showIgnored; + options.showNotRunned = showNotRun; + options.nameFilter = filterByName; + options.categories = GetSelectedCategories(); + return options; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta new file mode 100644 index 0000000..af8b799 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 046c3854296c5ec48bac50da6ca248ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs new file mode 100644 index 0000000..63965af --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Filters; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestTreeViewBuilder + { + public List results = new List(); + private readonly List m_OldTestResultList; + private readonly TestRunnerUIFilter m_UIFilter; + private readonly ITestAdaptor m_TestListRoot; + + private readonly List m_AvailableCategories = new List(); + + public string[] AvailableCategories + { + get { return m_AvailableCategories.Distinct().OrderBy(a => a).ToArray(); } + } + + public TestTreeViewBuilder(ITestAdaptor tests, List oldTestResultResults, TestRunnerUIFilter uiFilter) + { + m_AvailableCategories.Add(CategoryFilterExtended.k_DefaultCategory); + m_OldTestResultList = oldTestResultResults; + m_TestListRoot = tests; + m_UIFilter = uiFilter; + } + + public TreeViewItem BuildTreeView(TestFilterSettings settings, bool sceneBased, string sceneName) + { + var rootItem = new TreeViewItem(int.MaxValue, 0, null, "Invisible Root Item"); + ParseTestTree(0, rootItem, m_TestListRoot); + return rootItem; + } + + private bool IsFilteredOutByUIFilter(ITestAdaptor test, TestRunnerResult result) + { + if (m_UIFilter.PassedHidden && result.resultStatus == TestRunnerResult.ResultStatus.Passed) + return true; + if (m_UIFilter.FailedHidden && (result.resultStatus == TestRunnerResult.ResultStatus.Failed || result.resultStatus == TestRunnerResult.ResultStatus.Inconclusive)) + return true; + if (m_UIFilter.NotRunHidden && (result.resultStatus == TestRunnerResult.ResultStatus.NotRun || result.resultStatus == TestRunnerResult.ResultStatus.Skipped)) + return true; + if (m_UIFilter.CategoryFilter.Length > 0) + return !test.Categories.Any(category => m_UIFilter.CategoryFilter.Contains(category)); + return false; + } + + private void ParseTestTree(int depth, TreeViewItem rootItem, ITestAdaptor testElement) + { + m_AvailableCategories.AddRange(testElement.Categories); + + var testElementId = testElement.UniqueName; + if (!testElement.HasChildren) + { + var result = m_OldTestResultList.FirstOrDefault(a => a.uniqueId == testElementId); + + if (result != null && + (result.ignoredOrSkipped + || result.notRunnable + || testElement.RunState == RunState.NotRunnable + || testElement.RunState == RunState.Ignored + || testElement.RunState == RunState.Skipped + ) + ) + { + //if the test was or becomes ignored or not runnable, we recreate the result in case it has changed + result = null; + } + if (result == null) + { + result = new TestRunnerResult(testElement); + } + results.Add(result); + + var test = new TestTreeViewItem(testElement, depth, rootItem); + if (!IsFilteredOutByUIFilter(testElement, result)) + rootItem.AddChild(test); + test.SetResult(result); + return; + } + + var groupResult = m_OldTestResultList.FirstOrDefault(a => a.uniqueId == testElementId); + if (groupResult == null) + { + groupResult = new TestRunnerResult(testElement); + } + + results.Add(groupResult); + var group = new TestTreeViewItem(testElement, depth, rootItem); + group.SetResult(groupResult); + + depth++; + foreach (var child in testElement.Children) + { + ParseTestTree(depth, group, child); + } + + + if (testElement.IsTestAssembly && !testElement.HasChildren) + return; + + if (group.hasChildren) + rootItem.AddChild(group); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta new file mode 100644 index 0000000..68a6c25 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e17c88b021c2a4c409b3f15b0d80ac62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs new file mode 100644 index 0000000..05cadba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs @@ -0,0 +1,135 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditor.ProjectWindowCallback; +using UnityEditor.Scripting.ScriptCompilation; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestListGUIHelper + { + private const string kResourcesTemplatePath = "Resources/ScriptTemplates"; + private const string kAssemblyDefinitionTestTemplate = "92-Assembly Definition-NewTestAssembly.asmdef.txt"; + + private const string kAssemblyDefinitionEditModeTestTemplate = + "92-Assembly Definition-NewEditModeTestAssembly.asmdef.txt"; + + private const string kTestScriptTemplate = "83-C# Script-NewTestScript.cs.txt"; + private const string kNewTestScriptName = "NewTestScript.cs"; + private const string kNunit = "nunit.framework.dll"; + + [MenuItem("Assets/Create/Testing/Tests Assembly Folder", false, 83)] + public static void MenuItemAddFolderAndAsmDefForTesting() + { + AddFolderAndAsmDefForTesting(); + } + + [MenuItem("Assets/Create/Testing/Tests Assembly Folder", true, 83)] + public static bool MenuItemAddFolderAndAsmDefForTestingWithValidation() + { + return !SelectedFolderContainsTestAssembly(); + } + + public static void AddFolderAndAsmDefForTesting(bool isEditorOnly = false) + { + ProjectWindowUtil.CreateFolderWithTemplates("Tests", + isEditorOnly ? kAssemblyDefinitionEditModeTestTemplate : kAssemblyDefinitionTestTemplate); + } + + public static bool SelectedFolderContainsTestAssembly() + { + var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly(); + if (theNearestCustomScriptAssembly != null) + { + return theNearestCustomScriptAssembly.PrecompiledReferences != null && theNearestCustomScriptAssembly.PrecompiledReferences.Any(x => Path.GetFileName(x) == kNunit); + } + + return false; + } + + [MenuItem("Assets/Create/Testing/C# Test Script", false, 83)] + public static void AddTest() + { + var basePath = Path.Combine(EditorApplication.applicationContentsPath, kResourcesTemplatePath); + var destPath = Path.Combine(GetActiveFolderPath(), kNewTestScriptName); + var templatePath = Path.Combine(basePath, kTestScriptTemplate); + var icon = EditorGUIUtility.IconContent("cs Script Icon").image as Texture2D; + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, + ScriptableObject.CreateInstance(), destPath, icon, templatePath); + + AssetDatabase.Refresh(); + } + + [MenuItem("Assets/Create/Testing/C# Test Script", true, 83)] + public static bool CanAddScriptAndItWillCompile() + { + return CanAddEditModeTestScriptAndItWillCompile() || CanAddPlayModeTestScriptAndItWillCompile(); + } + + public static bool CanAddEditModeTestScriptAndItWillCompile() + { + var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly(); + if (theNearestCustomScriptAssembly != null) + { + return (theNearestCustomScriptAssembly.AssemblyFlags & AssemblyFlags.EditorOnly) == + AssemblyFlags.EditorOnly; + } + + var activeFolderPath = GetActiveFolderPath(); + return activeFolderPath.ToLower().Contains("/editor"); + } + + public static bool CanAddPlayModeTestScriptAndItWillCompile() + { + if (PlayerSettings.playModeTestRunnerEnabled) + { + return true; + } + + var theNearestCustomScriptAssembly = GetTheNearestCustomScriptAssembly(); + + if (theNearestCustomScriptAssembly == null) + { + return false; + } + + var hasTestAssemblyFlag = theNearestCustomScriptAssembly.PrecompiledReferences != null && theNearestCustomScriptAssembly.PrecompiledReferences.Any(x => Path.GetFileName(x) == kNunit);; + var editorOnlyAssembly = (theNearestCustomScriptAssembly.AssemblyFlags & AssemblyFlags.EditorOnly) != 0; + + return hasTestAssemblyFlag && !editorOnlyAssembly; + } + + public static string GetActiveFolderPath() + { + var path = "Assets"; + + foreach (var obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) + { + path = AssetDatabase.GetAssetPath(obj); + if (!string.IsNullOrEmpty(path) && File.Exists(path)) + { + path = Path.GetDirectoryName(path); + break; + } + } + return path; + } + + private static CustomScriptAssembly GetTheNearestCustomScriptAssembly() + { + CustomScriptAssembly findCustomScriptAssemblyFromScriptPath; + try + { + findCustomScriptAssemblyFromScriptPath = + EditorCompilationInterface.Instance.FindCustomScriptAssemblyFromScriptPath( + Path.Combine(GetActiveFolderPath(), "Foo.cs")); + } + catch (Exception) + { + return null; + } + return findCustomScriptAssemblyFromScriptPath; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta new file mode 100644 index 0000000..70d8f19 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97a05971510726f438153cd4987526fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView.meta new file mode 100644 index 0000000..63ce2ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68cb547af0187634aad591a09c01cd5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs new file mode 100644 index 0000000..52c94a5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal static class Icons + { + public static readonly Texture2D s_FailImg; + public static readonly Texture2D s_IgnoreImg; + public static readonly Texture2D s_SuccessImg; + public static readonly Texture2D s_UnknownImg; + public static readonly Texture2D s_InconclusiveImg; + public static readonly Texture2D s_StopwatchImg; + + static Icons() + { + s_FailImg = EditorGUIUtility.IconContent("TestFailed").image as Texture2D; + s_IgnoreImg = EditorGUIUtility.IconContent("TestIgnored").image as Texture2D; + s_SuccessImg = EditorGUIUtility.IconContent("TestPassed").image as Texture2D; + s_UnknownImg = EditorGUIUtility.IconContent("TestNormal").image as Texture2D; + s_InconclusiveImg = EditorGUIUtility.IconContent("TestInconclusive").image as Texture2D; + s_StopwatchImg = EditorGUIUtility.IconContent("TestStopwatch").image as Texture2D; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta new file mode 100644 index 0000000..3ddb7ee --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27769e9b00b038d47aefe306a4d20bec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs new file mode 100644 index 0000000..454af2a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestListTreeViewDataSource : TreeViewDataSource + { + private bool m_ExpandTreeOnCreation; + private readonly TestListGUI m_TestListGUI; + private ITestAdaptor m_RootTest; + + public TestListTreeViewDataSource(TreeViewController testListTree, TestListGUI testListGUI, ITestAdaptor rootTest) : base(testListTree) + { + showRootItem = false; + rootIsCollapsable = false; + m_TestListGUI = testListGUI; + m_RootTest = rootTest; + } + + public void UpdateRootTest(ITestAdaptor rootTest) + { + m_RootTest = rootTest; + } + + public override void FetchData() + { + var sceneName = SceneManager.GetActiveScene().name; + if (sceneName.StartsWith("InitTestScene")) + sceneName = PlaymodeTestsController.GetController().settings.originalScene; + + var testListBuilder = new TestTreeViewBuilder(m_RootTest, m_TestListGUI.newResultList, m_TestListGUI.m_TestRunnerUIFilter); + + m_RootItem = testListBuilder.BuildTreeView(null, false, sceneName); + SetExpanded(m_RootItem, true); + if (m_RootItem.hasChildren && m_RootItem.children.Count == 1) + SetExpanded(m_RootItem.children[0], true); + + if (m_ExpandTreeOnCreation) + SetExpandedWithChildren(m_RootItem, true); + + m_TestListGUI.newResultList = new List(testListBuilder.results); + m_TestListGUI.m_TestRunnerUIFilter.availableCategories = testListBuilder.AvailableCategories; + m_NeedRefreshRows = true; + } + + public override bool IsRenamingItemAllowed(TreeViewItem item) + { + return false; + } + + public void ExpandTreeOnCreation() + { + m_ExpandTreeOnCreation = true; + } + + public override bool IsExpandable(TreeViewItem item) + { + if (item is TestTreeViewItem) + return ((TestTreeViewItem)item).IsGroupNode; + return base.IsExpandable(item); + } + + protected override List Search(TreeViewItem rootItem, string search) + { + var result = new List(); + + if (rootItem.hasChildren) + { + foreach (var child in rootItem.children) + { + SearchTestTree(child, search, result); + } + } + return result; + } + + protected void SearchTestTree(TreeViewItem item, string search, IList searchResult) + { + var testItem = item as TestTreeViewItem; + if (!testItem.IsGroupNode) + { + if (testItem.FullName.ToLower().Contains(search)) + { + searchResult.Add(item); + } + } + else if (item.children != null) + { + foreach (var child in item.children) + SearchTestTree(child, search, searchResult); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta new file mode 100644 index 0000000..5ec5332 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce87c287371edde43a4b5fcfdee7b9ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs new file mode 100644 index 0000000..6657813 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs @@ -0,0 +1,11 @@ +using UnityEditor.IMGUI.Controls; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class TestListTreeViewGUI : TreeViewGUI + { + public TestListTreeViewGUI(TreeViewController testListTree) : base(testListTree) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta new file mode 100644 index 0000000..ed09e25 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52c907c81459f324497af504b84fd557 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs new file mode 100644 index 0000000..3c3f649 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs @@ -0,0 +1,137 @@ +using System; +using System.Reflection; +using System.Text; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal sealed class TestTreeViewItem : TreeViewItem + { + public TestRunnerResult result; + internal ITestAdaptor m_Test; + + public Type type; + public MethodInfo method; + + private const int k_ResultTestMaxLength = 15000; + + public bool IsGroupNode { get { return m_Test.IsSuite; } } + + public string FullName { get { return m_Test.FullName; } } + + public string GetAssemblyName() + { + var test = m_Test; + while (test != null) + { + if (test.IsTestAssembly) + { + return test.FullName; + } + + test = test.Parent; + } + + return null; + } + + public TestTreeViewItem(ITestAdaptor test, int depth, TreeViewItem parent) + : base(GetId(test), depth, parent, test.Name) + { + m_Test = test; + + if (test.TypeInfo != null) + { + type = test.TypeInfo.Type; + } + if (test.Method != null) + { + method = test.Method.MethodInfo; + } + + displayName = test.Name.Replace("\n", ""); + icon = Icons.s_UnknownImg; + } + + private static int GetId(ITestAdaptor test) + { + return test.UniqueName.GetHashCode(); + } + + public void SetResult(TestRunnerResult testResult) + { + result = testResult; + result.SetResultChangedCallback(ResultUpdated); + ResultUpdated(result); + } + + public string GetResultText() + { + if (result.resultStatus == TestRunnerResult.ResultStatus.NotRun) + { + return string.Empty; + } + var durationString = String.Format("{0:0.000}", result.duration); + var sb = new StringBuilder(string.Format("{0} ({1}s)", displayName.Trim(), durationString)); + if (!string.IsNullOrEmpty(result.description)) + { + sb.AppendFormat("\n{0}", result.description); + } + if (!string.IsNullOrEmpty(result.messages)) + { + sb.Append("\n---\n"); + sb.Append(result.messages.Trim()); + } + if (!string.IsNullOrEmpty(result.stacktrace)) + { + sb.Append("\n---\n"); + sb.Append(result.stacktrace.Trim()); + } + if (!string.IsNullOrEmpty(result.output)) + { + sb.Append("\n---\n"); + sb.Append(result.output.Trim()); + } + if (sb.Length > k_ResultTestMaxLength) + { + sb.Length = k_ResultTestMaxLength; + sb.AppendFormat("...\n\n---MESSAGE TRUNCATED AT {0} CHARACTERS---", k_ResultTestMaxLength); + } + return sb.ToString().Trim(); + } + + private void ResultUpdated(TestRunnerResult testResult) + { + switch (testResult.resultStatus) + { + case TestRunnerResult.ResultStatus.Passed: + icon = Icons.s_SuccessImg; + break; + case TestRunnerResult.ResultStatus.Failed: + icon = Icons.s_FailImg; + break; + case TestRunnerResult.ResultStatus.Inconclusive: + icon = Icons.s_InconclusiveImg; + break; + case TestRunnerResult.ResultStatus.Skipped: + icon = Icons.s_IgnoreImg; + break; + default: + if (testResult.ignoredOrSkipped) + { + icon = Icons.s_IgnoreImg; + } + else if (testResult.notRunnable) + { + icon = Icons.s_FailImg; + } + else + { + icon = Icons.s_UnknownImg; + } + break; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta new file mode 100644 index 0000000..1a29abe --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce567ddbf30368344bc7b80e20cac36e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerResult.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerResult.cs new file mode 100644 index 0000000..717cf37 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerResult.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class TestRunnerResult : UITestRunnerFilter.IClearableResult + { + public string id; + public string uniqueId; + public string name; + public string fullName; + public ResultStatus resultStatus = ResultStatus.NotRun; + public float duration; + public string messages; + public string output; + public string stacktrace; + public bool notRunnable; + public bool ignoredOrSkipped; + public string description; + public bool isSuite; + public List categories; + public string parentId; + public string parentUniqueId; + + //This field is suppose to mark results from before domain reload + //Such result is outdated because the code might haev changed + //This field will get reset every time a domain reload happens + [NonSerialized] + public bool notOutdated; + + protected Action m_OnResultUpdate; + + internal TestRunnerResult(ITestAdaptor test) + { + id = test.Id; + uniqueId = test.UniqueName; + + fullName = test.FullName; + name = test.Name; + description = test.Description; + isSuite = test.IsSuite; + + ignoredOrSkipped = test.RunState == RunState.Ignored || test.RunState == RunState.Skipped; + notRunnable = test.RunState == RunState.NotRunnable; + + if (ignoredOrSkipped) + { + messages = test.SkipReason; + } + if (notRunnable) + { + resultStatus = ResultStatus.Failed; + messages = test.SkipReason; + } + categories = test.Categories.ToList(); + parentId = test.ParentId; + parentUniqueId = test.ParentUniqueName; + } + + internal TestRunnerResult(ITestResultAdaptor testResult) : this(testResult.Test) + { + notOutdated = true; + + messages = testResult.Message; + output = testResult.Output; + stacktrace = testResult.StackTrace; + duration = (float)testResult.Duration; + if (testResult.Test.IsSuite && testResult.ResultState == "Ignored") + { + resultStatus = ResultStatus.Passed; + } + else + { + resultStatus = ParseNUnitResultStatus(testResult.TestStatus); + } + } + + public void Update(TestRunnerResult result) + { + if (ReferenceEquals(result, null)) + return; + resultStatus = result.resultStatus; + duration = result.duration; + messages = result.messages; + output = result.output; + stacktrace = result.stacktrace; + ignoredOrSkipped = result.ignoredOrSkipped; + notRunnable = result.notRunnable; + description = result.description; + notOutdated = result.notOutdated; + if (m_OnResultUpdate != null) + m_OnResultUpdate(this); + } + + public void SetResultChangedCallback(Action resultUpdated) + { + m_OnResultUpdate = resultUpdated; + } + + [Serializable] + internal enum ResultStatus + { + NotRun, + Passed, + Failed, + Inconclusive, + Skipped + } + + private static ResultStatus ParseNUnitResultStatus(TestStatus status) + { + switch (status) + { + case TestStatus.Passed: + return ResultStatus.Passed; + case TestStatus.Failed: + return ResultStatus.Failed; + case TestStatus.Inconclusive: + return ResultStatus.Inconclusive; + case TestStatus.Skipped: + return ResultStatus.Skipped; + default: + return ResultStatus.NotRun; + } + } + + public override string ToString() + { + return string.Format("{0} ({1})", name, fullName); + } + + public string Id { get { return uniqueId; } } + public string FullName { get { return fullName; } } + public string ParentId { get { return parentUniqueId; } } + public bool IsSuite { get { return isSuite; } } + public List Categories { get { return categories; } } + + public void Clear() + { + resultStatus = ResultStatus.NotRun; + if (m_OnResultUpdate != null) + m_OnResultUpdate(this); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta new file mode 100644 index 0000000..771053c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a04a45bbed9e1714f9902fc9443669b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs new file mode 100644 index 0000000..c55c2b3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs @@ -0,0 +1,177 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class TestRunnerUIFilter + { + private int m_PassedCount; + private int m_FailedCount; + private int m_NotRunCount; + private int m_InconclusiveCount; + private int m_SkippedCount; + + public int PassedCount { get { return m_PassedCount; } } + public int FailedCount { get { return m_FailedCount + m_InconclusiveCount; } } + public int NotRunCount { get { return m_NotRunCount + m_SkippedCount; } } + + [SerializeField] + public bool PassedHidden; + [SerializeField] + public bool FailedHidden; + [SerializeField] + public bool NotRunHidden; + + [SerializeField] + private string m_SearchString; + [SerializeField] + private int selectedCategoryMask; + + public string[] availableCategories = new string[0]; + + + private GUIContent m_SucceededBtn; + private GUIContent m_FailedBtn; + private GUIContent m_NotRunBtn; + + public Action RebuildTestList; + public Action SearchStringChanged; + public Action SearchStringCleared; + public bool IsFiltering + { + get + { + return !string.IsNullOrEmpty(m_SearchString) || PassedHidden || FailedHidden || NotRunHidden || + selectedCategoryMask != 0; + } + } + + public string[] CategoryFilter + { + get + { + var list = new List(); + for (int i = 0; i < availableCategories.Length; i++) + { + if ((selectedCategoryMask & (1 << i)) != 0) + { + list.Add(availableCategories[i]); + } + } + return list.ToArray(); + } + } + + public void UpdateCounters(List resultList) + { + m_PassedCount = m_FailedCount = m_NotRunCount = m_InconclusiveCount = m_SkippedCount = 0; + foreach (var result in resultList) + { + if (result.isSuite) + continue; + switch (result.resultStatus) + { + case TestRunnerResult.ResultStatus.Passed: + m_PassedCount++; + break; + case TestRunnerResult.ResultStatus.Failed: + m_FailedCount++; + break; + case TestRunnerResult.ResultStatus.Inconclusive: + m_InconclusiveCount++; + break; + case TestRunnerResult.ResultStatus.Skipped: + m_SkippedCount++; + break; + case TestRunnerResult.ResultStatus.NotRun: + default: + m_NotRunCount++; + break; + } + } + + var succeededTooltip = string.Format("Show tests that succeeded\n{0} succeeded", m_PassedCount); + m_SucceededBtn = new GUIContent(PassedCount.ToString(), Icons.s_SuccessImg, succeededTooltip); + var failedTooltip = string.Format("Show tests that failed\n{0} failed\n{1} inconclusive", m_FailedCount, m_InconclusiveCount); + m_FailedBtn = new GUIContent(FailedCount.ToString(), Icons.s_FailImg, failedTooltip); + var notRunTooltip = string.Format("Show tests that didn't run\n{0} didn't run\n{1} skipped or ignored", m_NotRunCount, m_SkippedCount); + m_NotRunBtn = new GUIContent(NotRunCount.ToString(), Icons.s_UnknownImg, notRunTooltip); + } + + public void Draw() + { + EditorGUI.BeginChangeCheck(); + if (m_SearchString == null) + { + m_SearchString = ""; + } + m_SearchString = EditorGUILayout.ToolbarSearchField(m_SearchString); + if (EditorGUI.EndChangeCheck() && SearchStringChanged != null) + { + SearchStringChanged(m_SearchString); + if (String.IsNullOrEmpty(m_SearchString)) + SearchStringCleared(); + } + + if (availableCategories != null && availableCategories.Any()) + { + EditorGUI.BeginChangeCheck(); + selectedCategoryMask = EditorGUILayout.MaskField(selectedCategoryMask, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150)); + if (EditorGUI.EndChangeCheck() && RebuildTestList != null) + { + RebuildTestList(); + } + } + else + { + EditorGUILayout.Popup(0, new[] { "" }, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150)); + } + + EditorGUI.BeginChangeCheck(); + if (m_SucceededBtn != null) + { + PassedHidden = !GUILayout.Toggle(!PassedHidden, m_SucceededBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(PassedCount))); + } + if (m_FailedBtn != null) + { + FailedHidden = !GUILayout.Toggle(!FailedHidden, m_FailedBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(FailedCount))); + } + if (m_NotRunBtn != null) + { + NotRunHidden = !GUILayout.Toggle(!NotRunHidden, m_NotRunBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(NotRunCount))); + } + + if (EditorGUI.EndChangeCheck() && RebuildTestList != null) + { + RebuildTestList(); + } + } + + private static int GetMaxWidth(int count) + { + if (count < 10) + return 33; + return count < 100 ? 40 : 47; + } + + public void Clear() + { + PassedHidden = false; + FailedHidden = false; + NotRunHidden = false; + selectedCategoryMask = 0; + m_SearchString = ""; + if (SearchStringChanged != null) + { + SearchStringChanged(m_SearchString); + } + if (SearchStringCleared != null) + { + SearchStringCleared(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta new file mode 100644 index 0000000..e65f91a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15f870c6975ad6449b5b52514b90dc2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs new file mode 100644 index 0000000..a557dee --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class UITestRunnerFilter + { +#pragma warning disable 649 + public string[] assemblyNames; + public string[] groupNames; + public string[] categoryNames; + public string[] testNames; + public int testRepetitions = 1; + public bool synchronousOnly = false; + + public static string AssemblyNameFromPath(string path) + { + string output = Path.GetFileName(path); + if (output != null && output.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + return output.Substring(0, output.Length - 4); + return output; + } + + private bool CategoryMatches(IEnumerable categories) + { + if (categoryNames == null || categoryNames.Length == 0) + return true; + + foreach (string category in categories) + { + if (categoryNames.Contains(category)) + return true; + } + + return false; + } + + private bool IDMatchesAssembly(string id) + { + if (AreOptionalFiltersEmpty()) + return true; + + if (assemblyNames == null || assemblyNames.Length == 0) + return true; + + int openingBracket = id.IndexOf('['); + int closingBracket = id.IndexOf(']'); + if (openingBracket >= 0 && openingBracket < id.Length && closingBracket > openingBracket && + openingBracket < id.Length) + { + //Some assemblies are absolute and explicitly part of the test ID e.g. + //"[/path/to/assembly-name.dll][rest of ID ...]" + //While some are minimal assembly names e.g. + //"[assembly-name][rest of ID ...]" + //Strip them down to just the assembly name + string assemblyNameFromID = + AssemblyNameFromPath(id.Substring(openingBracket + 1, closingBracket - openingBracket - 1)); + foreach (string assemblyName in assemblyNames) + { + if (assemblyName.Equals(assemblyNameFromID, StringComparison.OrdinalIgnoreCase)) + return true; + } + } + + return false; + } + + private bool NameMatches(string name) + { + if (AreOptionalFiltersEmpty()) + return true; + + if (groupNames == null || groupNames.Length == 0) + return true; + + foreach (var nameFromFilter in groupNames) + { + //Strict regex match for test group name on its own + if (Regex.IsMatch(name, nameFromFilter)) + return true; + //Match test names that end with parametrized test values and full nunit generated test names that have . separators + var regex = nameFromFilter.TrimEnd('$') + @"[\.|\(.*\)]"; + if (Regex.IsMatch(name, regex)) + return true; + } + + return false; + } + + private bool AreOptionalFiltersEmpty() + { + if (assemblyNames != null && assemblyNames.Length != 0) + return false; + if (groupNames != null && groupNames.Length != 0) + return false; + if (testNames != null && testNames.Length != 0) + return false; + return true; + } + + private bool NameMatchesExactly(string name) + { + if (AreOptionalFiltersEmpty()) + return true; + + if (testNames == null || testNames.Length == 0) + return true; + + foreach (var exactName in testNames) + { + if (name == exactName) + return true; + } + + return false; + } + + private static void ClearAncestors(IEnumerable newResultList, string parentID) + { + if (string.IsNullOrEmpty(parentID)) + return; + foreach (var result in newResultList) + { + if (result.Id == parentID) + { + result.Clear(); + ClearAncestors(newResultList, result.ParentId); + break; + } + } + } + + public void ClearResults(List newResultList) + { + foreach (var result in newResultList) + { + if (!result.IsSuite && CategoryMatches(result.Categories)) + { + if (IDMatchesAssembly(result.Id) && NameMatches(result.FullName) && + NameMatchesExactly(result.FullName)) + { + result.Clear(); + ClearAncestors(newResultList, result.ParentId); + } + } + } + } + + internal interface IClearableResult + { + string Id { get; } + string FullName { get; } + string ParentId { get; } + bool IsSuite { get; } + List Categories { get; } + void Clear(); + } + + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs.meta new file mode 100644 index 0000000..26ef62e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8069e1fc631e461ababf11f19a9c0df3 +timeCreated: 1595586126 \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views.meta new file mode 100644 index 0000000..ca14182 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5535d742ea2e4941850b421f9c70a1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs new file mode 100644 index 0000000..1a7d906 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs @@ -0,0 +1,92 @@ +using System; +using System.Linq; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class EditModeTestListGUI : TestListGUI + { + public override TestMode TestMode + { + get { return TestMode.EditMode; } + } + + public override void RenderNoTestsInfo() + { + if (!TestListGUIHelper.SelectedFolderContainsTestAssembly()) + { + var noTestText = "No tests to show"; + + if (!PlayerSettings.playModeTestRunnerEnabled) + { + const string testsArePulledFromCustomAssemblies = + "EditMode tests can be in Editor only Assemblies, either in the editor special folder or Editor only Assembly Definitions that references the \"nunit.framework.dll\" Assembly Reference or any of the Assembly Definition References \"UnityEngine.TestRunner\" or \"UnityEditor.TestRunner\".."; + noTestText += Environment.NewLine + testsArePulledFromCustomAssemblies; + } + + EditorGUILayout.HelpBox(noTestText, MessageType.Info); + if (GUILayout.Button("Create EditMode Test Assembly Folder")) + { + TestListGUIHelper.AddFolderAndAsmDefForTesting(isEditorOnly: true); + } + } + + if (!TestListGUIHelper.CanAddEditModeTestScriptAndItWillCompile()) + { + UnityEngine.GUI.enabled = false; + EditorGUILayout.HelpBox("EditMode test scripts can only be created in editor test assemblies.", MessageType.Warning); + } + if (GUILayout.Button("Create Test Script in current folder")) + { + TestListGUIHelper.AddTest(); + } + UnityEngine.GUI.enabled = true; + } + + public override void PrintHeadPanel() + { + base.PrintHeadPanel(); + DrawFilters(); + } + + protected override void RunTests(params UITestRunnerFilter[] filters) + { + if (EditorUtility.scriptCompilationFailed) + { + Debug.LogError("Fix compilation issues before running tests"); + return; + } + + foreach (var filter in filters) + { + filter.ClearResults(newResultList.OfType().ToList()); + } + + RerunCallbackData.instance.runFilters = filters; + RerunCallbackData.instance.testMode = TestMode.EditMode; + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new ExecutionSettings() + { + filters = filters.Select(filter => new Filter() + { + assemblyNames = filter.assemblyNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testMode = TestMode, + testNames = filter.testNames + }).ToArray() + }); + } + + public override TestPlatform TestPlatform { get { return TestPlatform.EditMode; } } + + protected override bool IsBusy() + { + return TestRunnerApi.IsRunActive() || EditorApplication.isCompiling || EditorApplication.isPlaying; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta new file mode 100644 index 0000000..afd4abb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0336a32a79bfaed43a3fd2d88b91e974 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs new file mode 100644 index 0000000..4f82f47 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs @@ -0,0 +1,241 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditor.SceneManagement; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + [Serializable] + internal class PlayModeTestListGUI : TestListGUI + { + private struct PlayerMenuItem + { + public GUIContent name; + public bool filterSelectedTestsOnly; + public bool buildOnly; + } + + [SerializeField] + private int m_SelectedOption; + + public override TestMode TestMode + { + get { return TestMode.PlayMode; } + } + + private string GetBuildText() + { + switch (EditorUserBuildSettings.activeBuildTarget) + { + case BuildTarget.Android: + if (EditorUserBuildSettings.exportAsGoogleAndroidProject) + return "Export"; + break; + case BuildTarget.iOS: + return "Export"; + } + return "Build"; + } + + private string PickBuildLocation() + { + var target = EditorUserBuildSettings.activeBuildTarget; + var targetGroup = BuildPipeline.GetBuildTargetGroup(target); + var lastLocation = EditorUserBuildSettings.GetBuildLocation(target); + var extension = PostprocessBuildPlayer.GetExtensionForBuildTarget(targetGroup, target, BuildOptions.None); + var defaultName = FileUtil.GetLastPathNameComponent(lastLocation); + lastLocation = string.IsNullOrEmpty(lastLocation) ? string.Empty : Path.GetDirectoryName(lastLocation); + bool updateExistingBuild; + var location = EditorUtility.SaveBuildPanel(target, $"{GetBuildText()} {target}", lastLocation, defaultName, extension, + out updateExistingBuild); + if (!string.IsNullOrEmpty(location)) + EditorUserBuildSettings.SetBuildLocation(target, location); + return location; + } + + private void ExecuteAction(PlayerMenuItem item) + { + var runSettings = new PlayerLauncherTestRunSettings(); + runSettings.buildOnly = item.buildOnly; + if (runSettings.buildOnly) + { + runSettings.buildOnlyLocationPath = PickBuildLocation(); + if (string.IsNullOrEmpty(runSettings.buildOnlyLocationPath)) + { + Debug.LogWarning("Aborting, build selection was canceled."); + return; + } + } + + if (item.filterSelectedTestsOnly) + RunTestsInPlayer(runSettings, SelectedTestsFilter); + else + { + var filter = new UITestRunnerFilter { categoryNames = m_TestRunnerUIFilter.CategoryFilter }; + RunTestsInPlayer(runSettings, filter); + } + } + + public override void PrintHeadPanel() + { + EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false)); + base.PrintHeadPanel(); + + PlayerMenuItem[] menuItems; + + if (EditorUserBuildSettings.installInBuildFolder) + { + menuItems = new [] + { + // Note: We select here buildOnly = false, so build location dialog won't show up + // The player won't actually be ran when using together with EditorUserBuildSettings.installInBuildFolder + new PlayerMenuItem() + { + name = new GUIContent("Install All Tests In Build Folder"), buildOnly = false, filterSelectedTestsOnly = false + }, + new PlayerMenuItem() + { + name = new GUIContent("Install Selected Tests In Build Folder"), buildOnly = false, filterSelectedTestsOnly = true + } + }; + } + else + { + menuItems = new [] + { + new PlayerMenuItem() + { + name = new GUIContent("Run All Tests"), buildOnly = false, filterSelectedTestsOnly = false + }, + new PlayerMenuItem() + { + name = new GUIContent("Run Selected Tests"), buildOnly = false, filterSelectedTestsOnly = true + }, + new PlayerMenuItem() + { + name = new GUIContent($"{GetBuildText()} All Tests"), buildOnly = true, filterSelectedTestsOnly = false + }, + new PlayerMenuItem() + { + name = new GUIContent($"{GetBuildText()} Selected Tests"), buildOnly = true, filterSelectedTestsOnly = true + }, + }; + } + + m_SelectedOption = Math.Min(m_SelectedOption, menuItems.Length - 1); + var selectedMenuItem = menuItems[m_SelectedOption]; + if (GUILayout.Button( + new GUIContent($"{selectedMenuItem.name.text} ({EditorUserBuildSettings.activeBuildTarget})"), + EditorStyles.toolbarButton)) + { + ExecuteAction(selectedMenuItem); + } + + if (GUILayout.Button(GUIContent.none, EditorStyles.toolbarDropDown)) + { + Vector2 mousePos = Event.current.mousePosition; + EditorUtility.DisplayCustomMenu(new Rect(mousePos.x, mousePos.y, 0, 0), + menuItems.Select(m => m.name).ToArray(), + -1, + (object userData, string[] options, int selected) => m_SelectedOption = selected, + menuItems); + } + + EditorGUILayout.EndHorizontal(); + DrawFilters(); + EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false)); + EditorGUILayout.EndHorizontal(); + } + + public override void RenderNoTestsInfo() + { + if (!TestListGUIHelper.SelectedFolderContainsTestAssembly()) + { + var noTestText = "No tests to show"; + if (!PlayerSettings.playModeTestRunnerEnabled) + { + const string testsArePulledFromCustomAssemblues = "Test Assemblies are defined by Assembly Definitions that references the \"nunit.framework.dll\" Assembly Reference or the Assembly Definition Reference \"UnityEngine.TestRunner\"."; + const string infoTextAboutTestsInAllAssemblies = + "To have tests in all assemblies enable it in the Test Runner window context menu"; + noTestText += Environment.NewLine + testsArePulledFromCustomAssemblues + Environment.NewLine + + infoTextAboutTestsInAllAssemblies; + } + + EditorGUILayout.HelpBox(noTestText, MessageType.Info); + if (GUILayout.Button("Create PlayMode Test Assembly Folder")) + { + TestListGUIHelper.AddFolderAndAsmDefForTesting(); + } + } + + if (!TestListGUIHelper.CanAddPlayModeTestScriptAndItWillCompile()) + { + UnityEngine.GUI.enabled = false; + EditorGUILayout.HelpBox("PlayMode test scripts can only be created in non editor test assemblies.", MessageType.Warning); + } + if (GUILayout.Button("Create Test Script in current folder")) + { + TestListGUIHelper.AddTest(); + } + UnityEngine.GUI.enabled = true; + } + + protected override void RunTests(UITestRunnerFilter[] filters) + { + foreach (var filter in filters) + { + filter.ClearResults(newResultList.OfType().ToList()); + } + + RerunCallbackData.instance.runFilters = filters; + RerunCallbackData.instance.testMode = TestMode.PlayMode; + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new ExecutionSettings() + { + filters = filters.Select(filter => new Filter() + { + assemblyNames = filter.assemblyNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testMode = TestMode, + testNames = filter.testNames + }).ToArray() + }); + } + + + protected void RunTestsInPlayer(PlayerLauncherTestRunSettings runSettings, params UITestRunnerFilter[] filters) + { + foreach (var filter in filters) + { + filter.ClearResults(newResultList.OfType().ToList()); + } + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new ExecutionSettings() + { + overloadTestRunSettings = runSettings, + filters = filters.Select(filter => new Filter() + { + assemblyNames = filter.assemblyNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + testMode = TestMode, + testNames = filter.testNames + }).ToArray(), + targetPlatform = EditorUserBuildSettings.activeBuildTarget + }); + } + + public override TestPlatform TestPlatform { get { return TestPlatform.PlayMode; } } + + protected override bool IsBusy() + { + return TestRunnerApi.IsRunActive() || PlaymodeLauncher.IsRunning || EditorApplication.isCompiling || EditorApplication.isPlaying; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta new file mode 100644 index 0000000..6f0c1d6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3efd39f2cfb43a4c830d4fd5689900f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs new file mode 100644 index 0000000..ae633ba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs @@ -0,0 +1,540 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using UnityEditor.IMGUI.Controls; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal abstract class TestListGUI + { + private static readonly GUIContent s_GUIRunSelectedTests = EditorGUIUtility.TrTextContent("Run Selected", "Run selected test(s)"); + private static readonly GUIContent s_GUIRunAllTests = EditorGUIUtility.TrTextContent("Run All", "Run all tests"); + private static readonly GUIContent s_GUIRerunFailedTests = EditorGUIUtility.TrTextContent("Rerun Failed", "Rerun all failed tests"); + private static readonly GUIContent s_GUIRun = EditorGUIUtility.TrTextContent("Run"); + private static readonly GUIContent s_GUIRunUntilFailed = EditorGUIUtility.TrTextContent("Run Until Failed"); + private static readonly GUIContent s_GUIRun100Times = EditorGUIUtility.TrTextContent("Run 100 times"); + private static readonly GUIContent s_GUIOpenTest = EditorGUIUtility.TrTextContent("Open source code"); + private static readonly GUIContent s_GUIOpenErrorLine = EditorGUIUtility.TrTextContent("Open error line"); + private static readonly GUIContent s_GUIClearResults = EditorGUIUtility.TrTextContent("Clear Results", "Clear all test results"); + + [SerializeField] + protected TestRunnerWindow m_Window; + [SerializeField] + public List newResultList = new List(); + [SerializeField] + private string m_ResultText; + [SerializeField] + private string m_ResultStacktrace; + + private TreeViewController m_TestListTree; + [SerializeField] + internal TreeViewState m_TestListState; + [SerializeField] + internal TestRunnerUIFilter m_TestRunnerUIFilter = new TestRunnerUIFilter(); + + private Vector2 m_TestInfoScroll, m_TestListScroll; + private string m_PreviousProjectPath; + private List m_QueuedResults = new List(); + + protected TestListGUI() + { + MonoCecilHelper = new MonoCecilHelper(); + AssetsDatabaseHelper = new AssetsDatabaseHelper(); + + GuiHelper = new GuiHelper(MonoCecilHelper, AssetsDatabaseHelper); + } + + protected IMonoCecilHelper MonoCecilHelper { get; private set; } + protected IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; } + protected IGuiHelper GuiHelper { get; private set; } + protected UITestRunnerFilter[] SelectedTestsFilter => GetSelectedTestsAsFilter(m_TestListTree.GetSelection()); + + public abstract TestMode TestMode { get; } + + public virtual void PrintHeadPanel() + { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + using (new EditorGUI.DisabledScope(IsBusy())) + { + if (GUILayout.Button(s_GUIRunAllTests, EditorStyles.toolbarButton)) + { + var filter = new UITestRunnerFilter {categoryNames = m_TestRunnerUIFilter.CategoryFilter}; + RunTests(filter); + GUIUtility.ExitGUI(); + } + } + using (new EditorGUI.DisabledScope(m_TestListTree == null || !m_TestListTree.HasSelection() || IsBusy())) + { + if (GUILayout.Button(s_GUIRunSelectedTests, EditorStyles.toolbarButton)) + { + RunTests(SelectedTestsFilter); + GUIUtility.ExitGUI(); + } + } + using (new EditorGUI.DisabledScope(m_TestRunnerUIFilter.FailedCount == 0 || IsBusy())) + { + if (GUILayout.Button(s_GUIRerunFailedTests, EditorStyles.toolbarButton)) + { + var failedTestnames = new List(); + foreach (var result in newResultList) + { + if (result.isSuite) + continue; + if (result.resultStatus == TestRunnerResult.ResultStatus.Failed || + result.resultStatus == TestRunnerResult.ResultStatus.Inconclusive) + failedTestnames.Add(result.fullName); + } + RunTests(new UITestRunnerFilter() {testNames = failedTestnames.ToArray(), categoryNames = m_TestRunnerUIFilter.CategoryFilter}); + GUIUtility.ExitGUI(); + } + } + using (new EditorGUI.DisabledScope(IsBusy())) + { + if (GUILayout.Button(s_GUIClearResults, EditorStyles.toolbarButton)) + { + foreach (var result in newResultList) + { + result.Clear(); + } + m_TestRunnerUIFilter.UpdateCounters(newResultList); + Reload(); + GUIUtility.ExitGUI(); + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + } + + protected void DrawFilters() + { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + m_TestRunnerUIFilter.Draw(); + EditorGUILayout.EndHorizontal(); + } + + public bool HasTreeData() + { + return m_TestListTree != null; + } + + public virtual void RenderTestList() + { + if (m_TestListTree == null) + { + GUILayout.Label("Loading..."); + return; + } + + m_TestListScroll = EditorGUILayout.BeginScrollView(m_TestListScroll, + GUILayout.ExpandWidth(true), + GUILayout.MaxWidth(2000)); + + if (m_TestListTree.data.root == null || m_TestListTree.data.rowCount == 0 || (!m_TestListTree.isSearching && !m_TestListTree.data.GetItem(0).hasChildren)) + { + if (m_TestRunnerUIFilter.IsFiltering) + { + if (GUILayout.Button("Clear filters")) + { + m_TestRunnerUIFilter.Clear(); + m_TestListTree.ReloadData(); + m_Window.Repaint(); + } + } + RenderNoTestsInfo(); + } + else + { + var treeRect = EditorGUILayout.GetControlRect(GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)); + var treeViewKeyboardControlId = GUIUtility.GetControlID(FocusType.Keyboard); + + m_TestListTree.OnGUI(treeRect, treeViewKeyboardControlId); + } + + EditorGUILayout.EndScrollView(); + } + + public virtual void RenderNoTestsInfo() + { + EditorGUILayout.HelpBox("No tests to show", MessageType.Info); + } + + public void RenderDetails() + { + m_TestInfoScroll = EditorGUILayout.BeginScrollView(m_TestInfoScroll); + var resultTextSize = TestRunnerWindow.Styles.info.CalcSize(new GUIContent(m_ResultText)); + EditorGUILayout.SelectableLabel(m_ResultText, TestRunnerWindow.Styles.info, + GUILayout.ExpandHeight(true), + GUILayout.ExpandWidth(true), + GUILayout.MinWidth(resultTextSize.x), + GUILayout.MinHeight(resultTextSize.y)); + EditorGUILayout.EndScrollView(); + } + + public void Reload() + { + if (m_TestListTree != null) + { + m_TestListTree.ReloadData(); + UpdateQueuedResults(); + } + } + + public void Repaint() + { + if (m_TestListTree == null || m_TestListTree.data.root == null) + { + return; + } + + m_TestListTree.Repaint(); + if (m_TestListTree.data.rowCount == 0) + m_TestListTree.SetSelection(new int[0], false); + TestSelectionCallback(m_TestListState.selectedIDs.ToArray()); + } + + public void Init(TestRunnerWindow window, ITestAdaptor rootTest) + { + if (m_Window == null) + { + m_Window = window; + } + + if (m_TestListTree == null) + { + if (m_TestListState == null) + { + m_TestListState = new TreeViewState(); + } + if (m_TestListTree == null) + m_TestListTree = new TreeViewController(m_Window, m_TestListState); + + m_TestListTree.deselectOnUnhandledMouseDown = false; + + m_TestListTree.selectionChangedCallback += TestSelectionCallback; + m_TestListTree.itemDoubleClickedCallback += TestDoubleClickCallback; + m_TestListTree.contextClickItemCallback += TestContextClickCallback; + + var testListTreeViewDataSource = new TestListTreeViewDataSource(m_TestListTree, this, rootTest); + + if (!newResultList.Any()) + testListTreeViewDataSource.ExpandTreeOnCreation(); + + m_TestListTree.Init(new Rect(), + testListTreeViewDataSource, + new TestListTreeViewGUI(m_TestListTree), + null); + } + + EditorApplication.update += RepaintIfProjectPathChanged; + + m_TestRunnerUIFilter.UpdateCounters(newResultList); + m_TestRunnerUIFilter.RebuildTestList = () => m_TestListTree.ReloadData(); + m_TestRunnerUIFilter.SearchStringChanged = s => m_TestListTree.searchString = s; + m_TestRunnerUIFilter.SearchStringCleared = () => FrameSelection(); + } + + public void UpdateResult(TestRunnerResult result) + { + if (!HasTreeData()) + { + m_QueuedResults.Add(result); + return; + } + + if (newResultList.All(x => x.uniqueId != result.uniqueId)) + { + return; + } + + var testRunnerResult = newResultList.FirstOrDefault(x => x.uniqueId == result.uniqueId); + if (testRunnerResult != null) + { + testRunnerResult.Update(result); + } + + Repaint(); + m_Window.Repaint(); + } + + public void UpdateTestTree(ITestAdaptor test) + { + if (!HasTreeData()) + { + return; + } + + (m_TestListTree.data as TestListTreeViewDataSource).UpdateRootTest(test); + + m_TestListTree.ReloadData(); + Repaint(); + m_Window.Repaint(); + } + + private void UpdateQueuedResults() + { + foreach (var testRunnerResult in m_QueuedResults) + { + var existingResult = newResultList.FirstOrDefault(x => x.uniqueId == testRunnerResult.uniqueId); + if (existingResult != null) + { + existingResult.Update(testRunnerResult); + } + } + m_QueuedResults.Clear(); + TestSelectionCallback(m_TestListState.selectedIDs.ToArray()); + m_TestRunnerUIFilter.UpdateCounters(newResultList); + Repaint(); + m_Window.Repaint(); + } + + internal void TestSelectionCallback(int[] selected) + { + if (m_TestListTree != null && selected.Length == 1) + { + if (m_TestListTree != null) + { + var node = m_TestListTree.FindItem(selected[0]); + if (node is TestTreeViewItem) + { + var test = node as TestTreeViewItem; + m_ResultText = test.GetResultText(); + m_ResultStacktrace = test.result.stacktrace; + } + } + } + else if (selected.Length == 0) + { + m_ResultText = ""; + } + } + + protected virtual void TestDoubleClickCallback(int id) + { + if (IsBusy()) + return; + + RunTests(GetSelectedTestsAsFilter(new List { id })); + GUIUtility.ExitGUI(); + } + + protected virtual void RunTests(params UITestRunnerFilter[] filters) + { + throw new NotImplementedException(); + } + + protected virtual void TestContextClickCallback(int id) + { + if (id == 0) + return; + + var m = new GenericMenu(); + var testFilters = GetSelectedTestsAsFilter(m_TestListState.selectedIDs); + var multilineSelection = m_TestListState.selectedIDs.Count > 1; + + if (!multilineSelection) + { + var testNode = GetSelectedTest(); + var isNotSuite = !testNode.IsGroupNode; + if (isNotSuite) + { + if (!string.IsNullOrEmpty(m_ResultStacktrace)) + { + m.AddItem(s_GUIOpenErrorLine, + false, + data => + { + if (!GuiHelper.OpenScriptInExternalEditor(m_ResultStacktrace)) + { + GuiHelper.OpenScriptInExternalEditor(testNode.type, testNode.method); + } + }, + ""); + } + + m.AddItem(s_GUIOpenTest, + false, + data => GuiHelper.OpenScriptInExternalEditor(testNode.type, testNode.method), + ""); + m.AddSeparator(""); + } + } + + if (!IsBusy()) + { + m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun, + false, + data => RunTests(testFilters), + ""); + + if (EditorPrefs.GetBool("DeveloperMode", false)) + { + m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRunUntilFailed, + false, + data => + { + foreach (var filter in testFilters) + { + filter.testRepetitions = int.MaxValue; + } + + RunTests(testFilters); + }, + ""); + + m.AddItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun100Times, + false, + data => + { + foreach (var filter in testFilters) + { + filter.testRepetitions = 100; + } + + RunTests(testFilters); + }, + ""); + } + } + else + m.AddDisabledItem(multilineSelection ? s_GUIRunSelectedTests : s_GUIRun, false); + + m.ShowAsContext(); + } + + private UITestRunnerFilter[] GetSelectedTestsAsFilter(IEnumerable selectedIDs) + { + var namesToRun = new List(); + var assembliesForNamesToRun = new List(); + var exactNamesToRun = new List(); + var assembliesToRun = new List(); + foreach (var lineId in selectedIDs) + { + var line = m_TestListTree.FindItem(lineId); + if (line is TestTreeViewItem) + { + var testLine = line as TestTreeViewItem; + if (testLine.IsGroupNode && !testLine.FullName.Contains("+")) + { + if (testLine.parent != null && testLine.parent.displayName == "Invisible Root Item") + { + //Root node selected. Use an empty TestRunnerFilter to run every test + return new[] {new UITestRunnerFilter()}; + } + + if (testLine.FullName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + { + assembliesToRun.Add(UITestRunnerFilter.AssemblyNameFromPath(testLine.FullName)); + } + else + { + namesToRun.Add($"^{Regex.Escape(testLine.FullName)}$"); + var assembly = UITestRunnerFilter.AssemblyNameFromPath(testLine.GetAssemblyName()); + if (!string.IsNullOrEmpty(assembly) && !assembliesForNamesToRun.Contains(assembly)) + { + assembliesForNamesToRun.Add(assembly); + } + } + } + else + { + exactNamesToRun.Add(testLine.FullName); + } + } + } + + var filters = new List(); + + if (assembliesToRun.Count > 0) + { + filters.Add(new UITestRunnerFilter() + { + assemblyNames = assembliesToRun.ToArray() + }); + } + + if (namesToRun.Count > 0) + { + filters.Add(new UITestRunnerFilter() + { + groupNames = namesToRun.ToArray(), + assemblyNames = assembliesForNamesToRun.ToArray() + }); + } + + if (exactNamesToRun.Count > 0) + { + filters.Add(new UITestRunnerFilter() + { + testNames = exactNamesToRun.ToArray() + }); + } + + if (filters.Count == 0) + { + filters.Add(new UITestRunnerFilter()); + } + + var categories = m_TestRunnerUIFilter.CategoryFilter.ToArray(); + if (categories.Length > 0) + { + foreach (var filter in filters) + { + filter.categoryNames = categories; + } + } + + return filters.ToArray(); + } + + private TestTreeViewItem GetSelectedTest() + { + foreach (var lineId in m_TestListState.selectedIDs) + { + var line = m_TestListTree.FindItem(lineId); + if (line is TestTreeViewItem) + { + return line as TestTreeViewItem; + } + } + return null; + } + + private void FrameSelection() + { + if (m_TestListTree.HasSelection()) + { + var firstClickedID = m_TestListState.selectedIDs.First() == m_TestListState.lastClickedID ? m_TestListState.selectedIDs.Last() : m_TestListState.selectedIDs.First(); + m_TestListTree.Frame(firstClickedID, true, false); + } + } + + public abstract TestPlatform TestPlatform { get; } + + public void RebuildUIFilter() + { + m_TestRunnerUIFilter.UpdateCounters(newResultList); + if (m_TestRunnerUIFilter.IsFiltering) + { + m_TestListTree.ReloadData(); + } + } + + public void RepaintIfProjectPathChanged() + { + var path = TestListGUIHelper.GetActiveFolderPath(); + if (path != m_PreviousProjectPath) + { + m_PreviousProjectPath = path; + TestRunnerWindow.s_Instance.Repaint(); + } + + EditorApplication.update -= RepaintIfProjectPathChanged; + } + + protected abstract bool IsBusy(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta new file mode 100644 index 0000000..3bef151 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8abb41ceb6f62c45a00197ae59224c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension.meta new file mode 100644 index 0000000..0c99889 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f9202a39620f51418046c7754f215f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes.meta new file mode 100644 index 0000000..a5930f1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96c503bf059df984c86eecf572370347 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs new file mode 100644 index 0000000..e71b62c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs @@ -0,0 +1,63 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEditor.TestTools +{ + /// + /// Ignore attributes dedicated to Asset Import Pipeline backend version handling. + /// + internal static class AssetPipelineIgnore + { + internal enum AssetPipelineBackend + { + V1, + V2 + } + + /// + /// Ignore the test when running with the legacy Asset Import Pipeline V1 backend. + /// + internal class IgnoreInV1 : AssetPipelineIgnoreAttribute + { + public IgnoreInV1(string ignoreReason) : base(AssetPipelineBackend.V1, ignoreReason) {} + } + + /// + /// Ignore the test when running with the latest Asset Import Pipeline V2 backend. + /// + internal class IgnoreInV2 : AssetPipelineIgnoreAttribute + { + public IgnoreInV2(string ignoreReason) : base(AssetPipelineBackend.V2, ignoreReason) {} + } + + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal class AssetPipelineIgnoreAttribute : NUnitAttribute, IApplyToTest + { + readonly string m_IgnoreReason; + readonly AssetPipelineBackend m_IgnoredBackend; + static readonly AssetPipelineBackend k_ActiveBackend = AssetDatabase.IsV2Enabled() + ? AssetPipelineBackend.V2 + : AssetPipelineBackend.V1; + + static string ActiveBackendName = Enum.GetName(typeof(AssetPipelineBackend), k_ActiveBackend); + + public AssetPipelineIgnoreAttribute(AssetPipelineBackend backend, string ignoreReason) + { + m_IgnoredBackend = backend; + m_IgnoreReason = ignoreReason; + } + + public void ApplyToTest(Test test) + { + if (k_ActiveBackend == m_IgnoredBackend) + { + test.RunState = RunState.Ignored; + var skipReason = string.Format("Not supported by asset pipeline {0} backend {1}", ActiveBackendName, m_IgnoreReason); + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta new file mode 100644 index 0000000..5f7207f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b88caca58e05ee74486d86fb404c48e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs new file mode 100644 index 0000000..08bab3a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools +{ + public interface ITestPlayerBuildModifier + { + BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta new file mode 100644 index 0000000..1bb36a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d2f47eae5f447748892c46848956d5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs new file mode 100644 index 0000000..328e666 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs @@ -0,0 +1,25 @@ +using System; + +namespace UnityEditor.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly)] + public class TestPlayerBuildModifierAttribute : Attribute + { + private Type m_Type; + public TestPlayerBuildModifierAttribute(Type type) + { + var interfaceType = typeof(ITestPlayerBuildModifier); + if (!interfaceType.IsAssignableFrom(type)) + { + throw new ArgumentException(string.Format("Type provided to {0} does not implement {1}", this.GetType().Name, interfaceType.Name)); + } + m_Type = type; + } + + internal ITestPlayerBuildModifier ConstructModifier() + { + return Activator.CreateInstance(m_Type) as ITestPlayerBuildModifier; + } + } +} + diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta new file mode 100644 index 0000000..3f9dfe3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd57b1176859fc84e93586103d3b5f73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs new file mode 100644 index 0000000..a24190e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs @@ -0,0 +1,162 @@ +using System; +using System.Reflection; +using System.Text; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.Logging; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class TestRunnerStateSerializer : IStateSerializer + { + private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; + + [SerializeField] + private HideFlags m_OriginalHideFlags; + + [SerializeField] + private bool m_ShouldRestore; + + [SerializeField] + private string m_TestObjectTypeName; + + [SerializeField] + private ScriptableObject m_TestObject; + + [SerializeField] + private string m_TestObjectTxt; + + [SerializeField] + private long StartTicks; + + [SerializeField] + private double StartTimeOA; + + [SerializeField] + private string output; + + [SerializeField] + private LogMatch[] m_ExpectedLogs; + + public bool ShouldRestore() + { + return m_ShouldRestore; + } + + public void SaveContext() + { + var currentContext = UnityTestExecutionContext.CurrentContext; + + if (currentContext.TestObject != null) + { + m_TestObjectTypeName = currentContext.TestObject.GetType().AssemblyQualifiedName; + m_TestObject = null; + m_TestObjectTxt = null; + if (currentContext.TestObject is ScriptableObject) + { + m_TestObject = currentContext.TestObject as ScriptableObject; + m_OriginalHideFlags = m_TestObject.hideFlags; + m_TestObject.hideFlags |= HideFlags.DontSave; + } + else + { + m_TestObjectTxt = JsonUtility.ToJson(currentContext.TestObject); + } + } + + output = currentContext.CurrentResult.Output; + StartTicks = currentContext.StartTicks; + StartTimeOA = currentContext.StartTime.ToOADate(); + if (LogScope.HasCurrentLogScope()) + { + m_ExpectedLogs = LogScope.Current.ExpectedLogs.ToArray(); + } + + m_ShouldRestore = true; + } + + public void RestoreContext() + { + var currentContext = UnityTestExecutionContext.CurrentContext; + + var outputProp = currentContext.CurrentResult.GetType().BaseType.GetField("_output", Flags); + (outputProp.GetValue(currentContext.CurrentResult) as StringBuilder).Append(output); + + currentContext.StartTicks = StartTicks; + currentContext.StartTime = DateTime.FromOADate(StartTimeOA); + if (LogScope.HasCurrentLogScope()) + { + LogScope.Current.ExpectedLogs = new Queue(m_ExpectedLogs); + } + + m_ShouldRestore = false; + } + + public bool CanRestoreFromScriptableObject(Type requestedType) + { + if (m_TestObject == null) + { + return false; + } + return m_TestObjectTypeName == requestedType.AssemblyQualifiedName; + } + + public ScriptableObject RestoreScriptableObjectInstance() + { + if (m_TestObject == null) + { + Debug.LogError("No object to restore"); + return null; + } + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + var temp = m_TestObject; + m_TestObject = null; + m_TestObjectTypeName = null; + return temp; + } + + public bool CanRestoreFromJson(Type requestedType) + { + if (string.IsNullOrEmpty(m_TestObjectTxt)) + { + return false; + } + return m_TestObjectTypeName == requestedType.AssemblyQualifiedName; + } + + public void RestoreClassFromJson(ref object instance) + { + if (string.IsNullOrEmpty(m_TestObjectTxt)) + { + Debug.LogWarning("No JSON representation to restore"); + return; + } + JsonUtility.FromJsonOverwrite(m_TestObjectTxt, instance); + m_TestObjectTxt = null; + m_TestObjectTypeName = null; + } + + private void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (m_TestObject == null) + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + return; + } + + //We set the DontSave flag here because the ScriptableObject would be nulled right before entering EditMode + if (state == PlayModeStateChange.ExitingPlayMode) + { + m_TestObject.hideFlags |= HideFlags.DontSave; + } + else if (state == PlayModeStateChange.EnteredEditMode) + { + m_TestObject.hideFlags = m_OriginalHideFlags; + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta new file mode 100644 index 0000000..7d36e9d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 124533853216377448d786fd7c725701 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequireApiProfileAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequireApiProfileAttribute.cs new file mode 100644 index 0000000..e99d452 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequireApiProfileAttribute.cs @@ -0,0 +1,32 @@ +using System; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEditor.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal class RequireApiProfileAttribute : NUnitAttribute, IApplyToTest + { + public ApiCompatibilityLevel[] apiProfiles { get; private set; } + + public RequireApiProfileAttribute(params ApiCompatibilityLevel[] apiProfiles) + { + this.apiProfiles = apiProfiles; + } + + void IApplyToTest.ApplyToTest(Test test) + { + test.Properties.Add(PropertyNames.Category, string.Format("ApiProfile({0})", string.Join(", ", apiProfiles.Select(p => p.ToString()).OrderBy(p => p).ToArray()))); + ApiCompatibilityLevel testProfile = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup); + + if (!apiProfiles.Contains(testProfile)) + { + string skipReason = "Skipping test as it requires a compatible api profile set: " + string.Join(", ", apiProfiles.Select(p => p.ToString()).ToArray()); + test.RunState = RunState.Skipped; + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta new file mode 100644 index 0000000..66d03bd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a667f6654ad7a9548b8c8e68b51c8895 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs new file mode 100644 index 0000000..321a0fe --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs @@ -0,0 +1,33 @@ +using System; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEditor.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class RequirePlatformSupportAttribute : NUnitAttribute, IApplyToTest + { + public RequirePlatformSupportAttribute(params BuildTarget[] platforms) + { + this.platforms = platforms; + } + + public BuildTarget[] platforms { get; private set; } + + void IApplyToTest.ApplyToTest(Test test) + { + test.Properties.Add(PropertyNames.Category, string.Format("RequirePlatformSupport({0})", string.Join(", ", platforms.Select(p => p.ToString()).OrderBy(p => p).ToArray()))); + + if (!platforms.All(p => BuildPipeline.IsBuildTargetSupported(BuildTargetGroup.Unknown, p))) + { + var missingPlatforms = platforms.Where(p => !BuildPipeline.IsBuildTargetSupported(BuildTargetGroup.Unknown, p)).Select(p => p.ToString()).ToArray(); + string skipReason = "Test cannot be run as it requires support for the following platforms to be installed: " + string.Join(", ", missingPlatforms); + + test.RunState = RunState.Skipped; + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta new file mode 100644 index 0000000..8493058 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d2146428d3f1ad54eb7326c9a44b3284 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs new file mode 100644 index 0000000..a0947cb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs @@ -0,0 +1,22 @@ +using System.Linq; +using UnityEditor.Build; + +namespace UnityEditor.TestRunner +{ + // This class is invoked from native, during build + internal class TestBuildAssemblyFilter : IFilterBuildAssemblies + { + private const string nunitAssemblyName = "nunit.framework"; + private const string unityTestRunnerAssemblyName = "UnityEngine.TestRunner"; + + public int callbackOrder { get; } + public string[] OnFilterAssemblies(BuildOptions buildOptions, string[] assemblies) + { + if ((buildOptions & BuildOptions.IncludeTestAssemblies) == BuildOptions.IncludeTestAssemblies || PlayerSettings.playModeTestRunnerEnabled) + { + return assemblies; + } + return assemblies.Where(x => !x.Contains(nunitAssemblyName) && !x.Contains(unityTestRunnerAssemblyName)).ToArray(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta new file mode 100644 index 0000000..f3cd3bd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3411e19edd44cfd46b548b058c3bc36c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers.meta new file mode 100644 index 0000000..c6a951b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d64d92e4f04a13e4b99ea8d48e9e8ae9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs new file mode 100644 index 0000000..236d6a8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal abstract class AttributeFinderBase : IAttributeFinder + { + public abstract IEnumerable Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform); + } + + internal interface IAttributeFinder + { + IEnumerable Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform); + } + + internal abstract class AttributeFinderBase : AttributeFinderBase where T2 : Attribute + { + private readonly Func m_TypeSelector; + protected AttributeFinderBase(Func typeSelector) + { + m_TypeSelector = typeSelector; + } + + public override IEnumerable Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform) + { + var selectedTests = new List(); + GetMatchingTests(tests, filter, ref selectedTests, testTargetPlatform); + + var result = new List(); + result.AddRange(GetTypesFromPrebuildAttributes(selectedTests)); + result.AddRange(GetTypesFromInterface(selectedTests, testTargetPlatform)); + + return result.Distinct(); + } + + private static void GetMatchingTests(ITest tests, ITestFilter filter, ref List resultList, RuntimePlatform testTargetPlatform) + { + foreach (var test in tests.Tests) + { + if (IsTestEnabledOnPlatform(test, testTargetPlatform)) + { + if (test.IsSuite) + { + GetMatchingTests(test, filter, ref resultList, testTargetPlatform); + } + else + { + if (filter.Pass(test)) + resultList.Add(test); + } + } + } + } + + private static bool IsTestEnabledOnPlatform(ITest test, RuntimePlatform testTargetPlatform) + { + if (test.Method == null) + { + return true; + } + + var attributesFromMethods = test.Method.GetCustomAttributes(true).Select(attribute => attribute); + var attributesFromTypes = test.Method.TypeInfo.GetCustomAttributes(true).Select(attribute => attribute); + + if (!attributesFromMethods.All(a => a.IsPlatformSupported(testTargetPlatform))) + { + return false; + } + + if (!attributesFromTypes.All(a => a.IsPlatformSupported(testTargetPlatform))) + { + return false; + } + + return true; + } + + private IEnumerable GetTypesFromPrebuildAttributes(IEnumerable tests) + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + allAssemblies = allAssemblies.Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEditor.TestRunner")).ToArray(); + var attributesFromAssemblies = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(T2), true).OfType()); + var attributesFromMethods = tests.SelectMany(t => t.Method.GetCustomAttributes(true).Select(attribute => attribute)); + var attributesFromTypes = tests.SelectMany(t => t.Method.TypeInfo.GetCustomAttributes(true).Select(attribute => attribute)); + + var result = new List(); + result.AddRange(attributesFromAssemblies); + result.AddRange(attributesFromMethods); + result.AddRange(attributesFromTypes); + + return result.Select(m_TypeSelector).Where(type => type != null); + } + + private static IEnumerable GetTypesFromInterface(IEnumerable selectedTests, RuntimePlatform testTargetPlatform) + { + var typesWithInterfaces = selectedTests.Where(t => typeof(T1).IsAssignableFrom(t.Method.TypeInfo.Type) && IsTestEnabledOnPlatform(t, testTargetPlatform)); + return typesWithInterfaces.Select(t => t.Method.TypeInfo.Type); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta new file mode 100644 index 0000000..19986f0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d4de3d4682a8d641907cc75e4fb950e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs new file mode 100644 index 0000000..b331d15 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs @@ -0,0 +1,44 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class DelayedCallback + { + private System.Action m_Callback; + private double m_CallbackTime; + private double m_Delay; + + public DelayedCallback(System.Action function, double timeFromNow) + { + m_Callback = function; + m_CallbackTime = EditorApplication.timeSinceStartup + timeFromNow; + m_Delay = timeFromNow; + EditorApplication.update += Update; + } + + public void Clear() + { + EditorApplication.update -= Update; + m_CallbackTime = 0.0; + m_Callback = null; + } + + private void Update() + { + if (EditorApplication.timeSinceStartup > m_CallbackTime) + { + // Clear state before firing callback to ensure reset (callback could call ExitGUI) + var callback = m_Callback; + Clear(); + + callback?.Invoke(); + } + } + + public void Reset() + { + if (m_Callback != null) + { + m_CallbackTime = EditorApplication.timeSinceStartup + m_Delay; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs.meta new file mode 100644 index 0000000..5218c8e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b9d121df8c444236a5b38ccfadfdd1a7 +timeCreated: 1583140472 \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs new file mode 100644 index 0000000..12683dc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.SceneManagement; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.GUI; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.Utils; +using UnityEngine.TestTools; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModeLauncher : TestLauncherBase + { + public static bool IsRunning; + internal readonly EditModeRunner m_EditModeRunner; + public bool launchedOutsideApi; + + // provided for backward compatibility with Rider UnitTesting prior to Rider package v.1.1.1 + public EditModeLauncher(UITestRunnerFilter filter, TestPlatform platform) + { + launchedOutsideApi = true; + var apiFilter = new[] + { + new Filter() + { + testMode = TestMode.EditMode, + testNames = filter.testNames, + categoryNames = filter.categoryNames, + groupNames = filter.groupNames, + assemblyNames = filter.assemblyNames + } + }; + + ScriptableObject.CreateInstance().Execute(new ExecutionSettings(apiFilter)); + } + + public EditModeLauncher(Filter[] filters, TestPlatform platform, bool runSynchronously) + { + TestEnumerator.Reset(); + m_EditModeRunner = ScriptableObject.CreateInstance(); + m_EditModeRunner.UnityTestAssemblyRunnerFactory = new UnityTestAssemblyRunnerFactory(); + m_EditModeRunner.Init(filters, platform, runSynchronously); + } + + public override void Run() + { + if (launchedOutsideApi) + { + // Do not use the launcher, as it will be relaunched trough the api. See ctor. + return; + } + + IsRunning = true; + + SceneSetup[] previousSceneSetup; + if (!OpenNewScene(out previousSceneSetup)) + return; + + var callback = AddEventHandler(); + callback.previousSceneSetup = previousSceneSetup; + callback.runner = m_EditModeRunner; + AddEventHandler(); + + m_EditModeRunner.Run(); + AddEventHandler(); + AddEventHandler(); + + if (m_EditModeRunner.RunningSynchronously) + m_EditModeRunner.CompleteSynchronously(); + } + + private static bool OpenNewScene(out SceneSetup[] previousSceneSetup) + { + previousSceneSetup = null; + + var sceneCount = SceneManager.sceneCount; + + var scene = SceneManager.GetSceneAt(0); + var isSceneNotPersisted = string.IsNullOrEmpty(scene.path); + + if (sceneCount == 1 && isSceneNotPersisted) + { + EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); + return true; + } + RemoveUntitledScenes(); + + // In case the user chose not to save the dirty scenes we reload them + ReloadUnsavedDirtyScene(); + + previousSceneSetup = EditorSceneManager.GetSceneManagerSetup(); + + scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive); + SceneManager.SetActiveScene(scene); + + return true; + } + + private static void ReloadUnsavedDirtyScene() + { + for (var i = 0; i < SceneManager.sceneCount; i++) + { + var scene = SceneManager.GetSceneAt(i); + var isSceneNotPersisted = string.IsNullOrEmpty(scene.path); + var isSceneDirty = scene.isDirty; + if (isSceneNotPersisted && isSceneDirty) + { + EditorSceneManager.ReloadScene(scene); + } + } + } + + private static void RemoveUntitledScenes() + { + int sceneCount = SceneManager.sceneCount; + + var scenesToClose = new List(); + for (var i = 0; i < sceneCount; i++) + { + var scene = SceneManager.GetSceneAt(i); + var isSceneNotPersisted = string.IsNullOrEmpty(scene.path); + if (isSceneNotPersisted) + { + scenesToClose.Add(scene); + } + } + foreach (Scene scene in scenesToClose) + { + EditorSceneManager.CloseScene(scene, true); + } + } + + public class BackgroundListener : ScriptableObject, ITestRunnerListener + { + public void RunStarted(ITest testsToRun) + { + } + + public void RunFinished(ITestResult testResults) + { + IsRunning = false; + } + + public void TestStarted(ITest test) + { + } + + public void TestFinished(ITestResult result) + { + } + } + + public T AddEventHandler() where T : ScriptableObject, ITestRunnerListener + { + return m_EditModeRunner.AddEventHandler(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta new file mode 100644 index 0000000..694d7d6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac68f5ae37c8957468562b8da42f9984 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs new file mode 100644 index 0000000..e20305c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs @@ -0,0 +1,31 @@ +using System; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModeLauncherContextSettings : IDisposable + { + private bool m_RunInBackground; + + public EditModeLauncherContextSettings() + { + SetupProjectParameters(); + } + + public void Dispose() + { + CleanupProjectParameters(); + } + + private void SetupProjectParameters() + { + m_RunInBackground = Application.runInBackground; + Application.runInBackground = true; + } + + private void CleanupProjectParameters() + { + Application.runInBackground = m_RunInBackground; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta new file mode 100644 index 0000000..2bed8fd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a582090813554df479fb9ca03e9857d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta new file mode 100644 index 0000000..4947382 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ebc4d20cc106cea49b1df1153f0b3b5e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs new file mode 100644 index 0000000..e0f7277 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs @@ -0,0 +1,66 @@ +using System; +using UnityEngine; +using System.Net; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class AndroidPlatformSetup : IPlatformSetup + { + private string m_oldApplicationIdentifier; + private string m_oldDeviceSocketAddress; + [SerializeField] + private bool m_Stripping; + + public void Setup() + { + m_oldApplicationIdentifier = PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, "com.UnityTestRunner.UnityTestRunner"); + + m_oldDeviceSocketAddress = EditorUserBuildSettings.androidDeviceSocketAddress; + var androidDeviceConnection = Environment.GetEnvironmentVariable("ANDROID_DEVICE_CONNECTION"); + EditorUserBuildSettings.waitForPlayerConnection = true; + if (androidDeviceConnection != null) + { + EditorUserBuildSettings.androidDeviceSocketAddress = androidDeviceConnection; + } + m_Stripping = PlayerSettings.stripEngineCode; + PlayerSettings.stripEngineCode = false; + } + + public void PostBuildAction() + { + PlayerSettings.stripEngineCode = m_Stripping; + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + var connectionResult = -1; + var maxTryCount = 10; + var tryCount = maxTryCount; + while (tryCount-- > 0 && connectionResult == -1) + { + connectionResult = EditorConnectionInternal.ConnectPlayerProxy(IPAddress.Loopback.ToString(), 34999); + if (EditorUtility.DisplayCancelableProgressBar("Editor Connection", "Connecting to the player", + 1 - ((float)tryCount / maxTryCount))) + { + EditorUtility.ClearProgressBar(); + throw new TestLaunchFailedException(); + } + } + EditorUtility.ClearProgressBar(); + if (connectionResult == -1) + throw new TestLaunchFailedException( + "Timed out trying to connect to the player. Player failed to launch or crashed soon after launching"); + } + + public void CleanUp() + { + EditorUserBuildSettings.androidDeviceSocketAddress = m_oldDeviceSocketAddress; + PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, m_oldApplicationIdentifier); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta new file mode 100644 index 0000000..6e18a7c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 961642509dec50b44a293d26240140ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs new file mode 100644 index 0000000..f625eb2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs @@ -0,0 +1,42 @@ +using System; +using System.Diagnostics; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class ApplePlatformSetup : IPlatformSetup + { + [SerializeField] + private bool m_Stripping; + + public ApplePlatformSetup(BuildTarget buildTarget) + { + } + + public void Setup() + { + // Camera and fonts are stripped out and app crashes on iOS when test runner is trying to add a scene with... camera and text + m_Stripping = PlayerSettings.stripEngineCode; + PlayerSettings.stripEngineCode = false; + } + + public void PostBuildAction() + { + // Restoring player setting as early as possible + PlayerSettings.stripEngineCode = m_Stripping; + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + } + + public void CleanUp() + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta new file mode 100644 index 0000000..36f22a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6c189a159d3bde4c964cee562e508ea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs new file mode 100644 index 0000000..db76c21 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs @@ -0,0 +1,11 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IPlatformSetup + { + void Setup(); + void PostBuildAction(); + void PostSuccessfulBuildAction(); + void PostSuccessfulLaunchAction(); + void CleanUp(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta new file mode 100644 index 0000000..94405b5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d614808f9add8a4f8e4860db2c7af0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs new file mode 100644 index 0000000..1a0c4bf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class LuminPlatformSetup : IPlatformSetup + { + private const string kDeviceAddress = "127.0.0.1"; + private const int kDevicePort = 55000; + + public void Setup() + { + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + var connectionResult = -1; + var maxTryCount = 100; + var tryCount = maxTryCount; + while (tryCount-- > 0 && connectionResult == -1) + { + Thread.Sleep(1000); + connectionResult = EditorConnectionInternal.ConnectPlayerProxy(kDeviceAddress, kDevicePort); + if (EditorUtility.DisplayCancelableProgressBar("Editor Connection", "Connecting to the player", + 1 - ((float)tryCount / maxTryCount))) + { + EditorUtility.ClearProgressBar(); + throw new TestLaunchFailedException(); + } + } + EditorUtility.ClearProgressBar(); + if (connectionResult == -1) + throw new TestLaunchFailedException( + "Timed out trying to connect to the player. Player failed to launch or crashed soon after launching"); + } + + public void CleanUp() + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta new file mode 100644 index 0000000..9e4dcc5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c38ae0585d6a55042a2d678330689685 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs new file mode 100644 index 0000000..4c8ae77 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class PlatformSpecificSetup + { + [SerializeField] + private ApplePlatformSetup m_AppleiOSPlatformSetup = new ApplePlatformSetup(BuildTarget.iOS); + [SerializeField] + private ApplePlatformSetup m_AppleTvOSPlatformSetup = new ApplePlatformSetup(BuildTarget.tvOS); + [SerializeField] + private XboxOnePlatformSetup m_XboxOnePlatformSetup = new XboxOnePlatformSetup(); + [SerializeField] + private AndroidPlatformSetup m_AndroidPlatformSetup = new AndroidPlatformSetup(); + [SerializeField] + private SwitchPlatformSetup m_SwitchPlatformSetup = new SwitchPlatformSetup(); +#if UNITY_2019_3_OR_NEWER + [SerializeField] + private StadiaPlatformSetup m_StadiaPlatformSetup = new StadiaPlatformSetup(); +#endif + [SerializeField] + private UwpPlatformSetup m_UwpPlatformSetup = new UwpPlatformSetup(); + + [SerializeField] + private LuminPlatformSetup m_LuminPlatformSetup = new LuminPlatformSetup(); + + + private IDictionary m_SetupTypes; + + [SerializeField] + private BuildTarget m_Target; + + public PlatformSpecificSetup() + { + } + + public PlatformSpecificSetup(BuildTarget target) + { + m_Target = target; + } + + public void Setup() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].Setup(); + } + + public void PostBuildAction() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].PostBuildAction(); + } + + public void PostSuccessfulBuildAction() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].PostSuccessfulBuildAction(); + } + + public void PostSuccessfulLaunchAction() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].PostSuccessfulLaunchAction(); + } + + public void CleanUp() + { + var dictionary = GetSetup(); + + if (!dictionary.ContainsKey(m_Target)) + { + return; + } + + dictionary[m_Target].CleanUp(); + } + + private IDictionary GetSetup() + { + m_SetupTypes = new Dictionary() + { + {BuildTarget.iOS, m_AppleiOSPlatformSetup}, + {BuildTarget.tvOS, m_AppleTvOSPlatformSetup}, + {BuildTarget.XboxOne, m_XboxOnePlatformSetup}, + {BuildTarget.Android, m_AndroidPlatformSetup}, + {BuildTarget.WSAPlayer, m_UwpPlatformSetup}, + {BuildTarget.Lumin, m_LuminPlatformSetup}, +#if UNITY_2019_3_OR_NEWER + {BuildTarget.Stadia, m_StadiaPlatformSetup}, +#endif + {BuildTarget.Switch, m_SwitchPlatformSetup} + }; + return m_SetupTypes; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta new file mode 100644 index 0000000..a250a1a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6cccd50ebf7384242bda4d7bcb282ebf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs new file mode 100644 index 0000000..c62016b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs @@ -0,0 +1,25 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class StadiaPlatformSetup : IPlatformSetup + { + public void Setup() + { + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + } + + public void CleanUp() + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs.meta new file mode 100644 index 0000000..59e70a4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa19b42bd3dc35e40a618448bd330270 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs new file mode 100644 index 0000000..7c1ea36 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs @@ -0,0 +1,41 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class SwitchPlatformSetup : IPlatformSetup + { + public void Setup() + { + EditorUserBuildSettings.switchCreateRomFile = true; + EditorUserBuildSettings.switchNVNGraphicsDebugger = false; +#if UNITY_2020_1_OR_NEWER + EditorUserBuildSettings.switchNVNDrawValidation_Heavy = true; // catches more graphics errors +#else + EditorUserBuildSettings.switchNVNDrawValidation = true; // catches more graphics errors +#endif + EditorUserBuildSettings.development = true; + EditorUserBuildSettings.switchRedirectWritesToHostMount = true; + + // We can use these when more debugging is required: + //EditorUserBuildSettings.switchNVNDrawValidation = false; // cannot be used with shader debug + //EditorUserBuildSettings.switchNVNGraphicsDebugger = true; + //EditorUserBuildSettings.switchNVNShaderDebugging = true; + //EditorUserBuildSettings.switchCreateSolutionFile = true; // for shorter iteration time + //EditorUserBuildSettings.allowDebugging = true; // managed debugger can be attached + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + } + + public void CleanUp() + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta new file mode 100644 index 0000000..fb9dd05 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adf7bea9401c1834380d55601add6cfb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs new file mode 100644 index 0000000..a229c34 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs @@ -0,0 +1,52 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class UwpPlatformSetup : IPlatformSetup + { + private const string k_SettingsBuildConfiguration = "BuildConfiguration"; + private bool m_InternetClientServer; + private bool m_PrivateNetworkClientServer; + + public void Setup() + { + m_InternetClientServer = PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.InternetClientServer); + m_PrivateNetworkClientServer = PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer); + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.InternetClientServer, true); + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer, true); + + // This setting is initialized only when Window Store App is selected from the Build Settings window, and + // is typically an empty strings when running tests via UTR on the command-line. + bool wsaSettingNotInitialized = string.IsNullOrEmpty(EditorUserBuildSettings.wsaArchitecture); + + // If WSA build settings aren't fully initialized or running from a build machine, specify a default build configuration. + // Otherwise we can use the existing configuration specified by the user in Build Settings. + if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("UNITY_THISISABUILDMACHINE")) || wsaSettingNotInitialized) + { + EditorUserBuildSettings.wsaSubtarget = WSASubtarget.PC; + EditorUserBuildSettings.wsaArchitecture = "x64"; + EditorUserBuildSettings.SetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.WSAPlayer), k_SettingsBuildConfiguration, WSABuildType.Debug.ToString()); + EditorUserBuildSettings.wsaUWPBuildType = WSAUWPBuildType.ExecutableOnly; + PlayerSettings.SetIl2CppCompilerConfiguration(BuildTargetGroup.WSA, Il2CppCompilerConfiguration.Debug); + } + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + } + + public void CleanUp() + { + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.InternetClientServer, m_InternetClientServer); + PlayerSettings.WSA.SetCapability(PlayerSettings.WSACapability.PrivateNetworkClientServer, m_PrivateNetworkClientServer); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta new file mode 100644 index 0000000..751ac7e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 667c6ad86a0b7a548aaa5c287f2c2861 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs new file mode 100644 index 0000000..54c51ed --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs @@ -0,0 +1,47 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class XboxOnePlatformSetup : IPlatformSetup + { + private XboxOneDeployMethod oldXboxOneDeployMethod; + private XboxOneDeployDrive oldXboxOneDeployDrive; + private string oldXboxOneAdditionalDebugPorts; + + public void Setup() + { + oldXboxOneDeployMethod = EditorUserBuildSettings.xboxOneDeployMethod; + oldXboxOneDeployDrive = EditorUserBuildSettings.xboxOneDeployDrive; + oldXboxOneAdditionalDebugPorts = EditorUserBuildSettings.xboxOneAdditionalDebugPorts; + + EditorUserBuildSettings.xboxOneDeployMethod = XboxOneDeployMethod.Package; + EditorUserBuildSettings.xboxOneDeployDrive = XboxOneDeployDrive.Default; + + // This causes the XboxOne post processing systems to open this port in your package manifest. + // In addition it will open the ephemeral range for debug connections as well. + // Failure to do this will cause connection problems. + EditorUserBuildSettings.xboxOneAdditionalDebugPorts = "34999"; + } + + public void PostBuildAction() + { + } + + public void PostSuccessfulBuildAction() + { + } + + public void PostSuccessfulLaunchAction() + { + } + + public void CleanUp() + { + EditorUserBuildSettings.xboxOneDeployMethod = oldXboxOneDeployMethod; + EditorUserBuildSettings.xboxOneDeployDrive = oldXboxOneDeployDrive; + + // This causes the XboxOne post processing systems to open this port in your package manifest. + // In addition it will open the ephemeral range for debug connections as well. + // Failure to do this will cause connection problems. + EditorUserBuildSettings.xboxOneAdditionalDebugPorts = oldXboxOneAdditionalDebugPorts; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta new file mode 100644 index 0000000..771c853 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aed7ab02155e43341a2dbcb7bc17c160 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs new file mode 100644 index 0000000..2e0b120 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs @@ -0,0 +1,250 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using NUnit.Framework.Internal.Filters; +using UnityEditor; +using UnityEditor.TestRunner.TestLaunchers; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.Utils; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.Callbacks; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestLaunchFailedException : Exception + { + public TestLaunchFailedException() {} + public TestLaunchFailedException(string message) : base(message) {} + } + + [Serializable] + internal class PlayerLauncher : RuntimeTestLauncherBase + { + private readonly PlaymodeTestsControllerSettings m_Settings; + private readonly BuildTarget m_TargetPlatform; + private ITestRunSettings m_OverloadTestRunSettings; + private string m_SceneName; + private int m_HeartbeatTimeout; + + public PlayerLauncher(PlaymodeTestsControllerSettings settings, BuildTarget? targetPlatform, ITestRunSettings overloadTestRunSettings, int heartbeatTimeout) + { + m_Settings = settings; + m_TargetPlatform = targetPlatform ?? EditorUserBuildSettings.activeBuildTarget; + m_OverloadTestRunSettings = overloadTestRunSettings; + m_HeartbeatTimeout = heartbeatTimeout; + } + + protected override RuntimePlatform? TestTargetPlatform + { + get { return BuildTargetConverter.TryConvertToRuntimePlatform(m_TargetPlatform); } + } + + public override void Run() + { + var editorConnectionTestCollector = RemoteTestRunController.instance; + editorConnectionTestCollector.hideFlags = HideFlags.HideAndDontSave; + editorConnectionTestCollector.Init(m_TargetPlatform, m_HeartbeatTimeout); + + var remotePlayerLogController = RemotePlayerLogController.instance; + remotePlayerLogController.hideFlags = HideFlags.HideAndDontSave; + + using (var settings = new PlayerLauncherContextSettings(m_OverloadTestRunSettings)) + { + m_SceneName = CreateSceneName(); + var scene = PrepareScene(m_SceneName); + string scenePath = scene.path; + + var filter = m_Settings.BuildNUnitFilter(); + var runner = LoadTests(filter); + var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, filter); + if (exceptionThrown) + { + ReopenOriginalScene(m_Settings.originalScene); + AssetDatabase.DeleteAsset(m_SceneName); + CallbacksDelegator.instance.RunFailed("Run Failed: One or more errors in a prebuild setup. See the editor log for details."); + return; + } + + var playerBuildOptions = GetBuildOptions(scenePath); + + var success = BuildAndRunPlayer(playerBuildOptions); + + editorConnectionTestCollector.PostBuildAction(); + ExecutePostBuildCleanupMethods(runner.LoadedTest, filter); + + ReopenOriginalScene(m_Settings.originalScene); + AssetDatabase.DeleteAsset(m_SceneName); + + if (!success) + { + ScriptableObject.DestroyImmediate(editorConnectionTestCollector); + Debug.LogError("Player build failed"); + throw new TestLaunchFailedException("Player build failed"); + } + + if ((playerBuildOptions.BuildPlayerOptions.options & BuildOptions.AutoRunPlayer) != 0) + { + editorConnectionTestCollector.PostSuccessfulBuildAction(); + editorConnectionTestCollector.PostSuccessfulLaunchAction(); + } + + var runSettings = m_OverloadTestRunSettings as PlayerLauncherTestRunSettings; + if (success && runSettings != null && runSettings.buildOnly) + { + EditorUtility.RevealInFinder(playerBuildOptions.BuildPlayerOptions.locationPathName); + } + } + } + + public Scene PrepareScene(string sceneName) + { + var scene = CreateBootstrapScene(sceneName, runner => + { + runner.AddEventHandlerMonoBehaviour(); + runner.settings = m_Settings; + var commandLineArgs = Environment.GetCommandLineArgs(); + if (!commandLineArgs.Contains("-doNotReportTestResultsBackToEditor")) + { + runner.AddEventHandlerMonoBehaviour(); + } + runner.AddEventHandlerMonoBehaviour(); + runner.AddEventHandlerScriptableObject(); + }); + return scene; + } + + private static bool BuildAndRunPlayer(PlayerLauncherBuildOptions buildOptions) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Building player with following options:\n{0}", buildOptions); + + + // Android has to be in listen mode to establish player connection + if (buildOptions.BuildPlayerOptions.target == BuildTarget.Android) + { + buildOptions.BuildPlayerOptions.options &= ~BuildOptions.ConnectToHost; + } + + // For now, so does Lumin + if (buildOptions.BuildPlayerOptions.target == BuildTarget.Lumin) + { + buildOptions.BuildPlayerOptions.options &= ~BuildOptions.ConnectToHost; + } + + var result = BuildPipeline.BuildPlayer(buildOptions.BuildPlayerOptions); + if (result.summary.result != Build.Reporting.BuildResult.Succeeded) + Debug.LogError(result.SummarizeErrors()); + + return result.summary.result == Build.Reporting.BuildResult.Succeeded; + } + + internal PlayerLauncherBuildOptions GetBuildOptions(string scenePath) + { + var buildOnly = false; + var runSettings = m_OverloadTestRunSettings as PlayerLauncherTestRunSettings; + if (runSettings != null) + { + buildOnly = runSettings.buildOnly; + } + + var buildOptions = new BuildPlayerOptions(); + + var scenes = new List() { scenePath }; + scenes.AddRange(EditorBuildSettings.scenes.Select(x => x.path)); + buildOptions.scenes = scenes.ToArray(); + + buildOptions.options |= BuildOptions.Development | BuildOptions.ConnectToHost | BuildOptions.IncludeTestAssemblies | BuildOptions.StrictMode; + buildOptions.target = m_TargetPlatform; + + if (EditorUserBuildSettings.waitForPlayerConnection) + buildOptions.options |= BuildOptions.WaitForPlayerConnection; + + if (EditorUserBuildSettings.allowDebugging) + buildOptions.options |= BuildOptions.AllowDebugging; + + if (EditorUserBuildSettings.installInBuildFolder) + buildOptions.options |= BuildOptions.InstallInBuildFolder; + else if (!buildOnly) + buildOptions.options |= BuildOptions.AutoRunPlayer; + + var buildTargetGroup = EditorUserBuildSettings.activeBuildTargetGroup; + + //Check if Lz4 is supported for the current buildtargetgroup and enable it if need be + if (PostprocessBuildPlayer.SupportsLz4Compression(buildTargetGroup, m_TargetPlatform)) + { + if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4) + buildOptions.options |= BuildOptions.CompressWithLz4; + else if (EditorUserBuildSettings.GetCompressionType(buildTargetGroup) == Compression.Lz4HC) + buildOptions.options |= BuildOptions.CompressWithLz4HC; + } + + string buildLocation; + if (buildOnly) + { + buildLocation = buildOptions.locationPathName = runSettings.buildOnlyLocationPath; + } + else + { + var reduceBuildLocationPathLength = false; + + //Some platforms hit MAX_PATH limits during the build process, in these cases minimize the path length + if ((m_TargetPlatform == BuildTarget.WSAPlayer) || (m_TargetPlatform == BuildTarget.XboxOne)) + { + reduceBuildLocationPathLength = true; + } + + var uniqueTempPathInProject = FileUtil.GetUniqueTempPathInProject(); + var playerDirectoryName = reduceBuildLocationPathLength ? "PwT" : "PlayerWithTests"; + + if (reduceBuildLocationPathLength) + { + uniqueTempPathInProject = Path.GetTempFileName(); + File.Delete(uniqueTempPathInProject); + Directory.CreateDirectory(uniqueTempPathInProject); + } + + var tempPath = Path.GetFullPath(uniqueTempPathInProject); + buildLocation = Path.Combine(tempPath, playerDirectoryName); + + // iOS builds create a folder with Xcode project instead of an executable, therefore no executable name is added + if (m_TargetPlatform == BuildTarget.iOS) + { + buildOptions.locationPathName = buildLocation; + } + else + { + string extensionForBuildTarget = + PostprocessBuildPlayer.GetExtensionForBuildTarget(buildTargetGroup, buildOptions.target, + buildOptions.options); + var playerExecutableName = "PlayerWithTests"; + playerExecutableName += string.Format(".{0}", extensionForBuildTarget); + buildOptions.locationPathName = Path.Combine(buildLocation, playerExecutableName); + } + } + + return new PlayerLauncherBuildOptions + { + BuildPlayerOptions = ModifyBuildOptions(buildOptions), + PlayerDirectory = buildLocation, + }; + } + + private BuildPlayerOptions ModifyBuildOptions(BuildPlayerOptions buildOptions) + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies() + .Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEditor.TestRunner")).ToArray(); + var attributes = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(TestPlayerBuildModifierAttribute), true).OfType()).ToArray(); + var modifiers = attributes.Select(attribute => attribute.ConstructModifier()).ToArray(); + + foreach (var modifier in modifiers) + { + buildOptions = modifier.ModifyOptions(buildOptions); + } + + return buildOptions; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta new file mode 100644 index 0000000..60bb1c7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d973fc1524e4d724081553934c55958c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs new file mode 100644 index 0000000..b498514 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs @@ -0,0 +1,23 @@ +using System.Text; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PlayerLauncherBuildOptions + { + public BuildPlayerOptions BuildPlayerOptions; + public string PlayerDirectory; + + public override string ToString() + { + var str = new StringBuilder(); + str.AppendLine("locationPathName = " + BuildPlayerOptions.locationPathName); + str.AppendLine("target = " + BuildPlayerOptions.target); + str.AppendLine("scenes = " + string.Join(", ", BuildPlayerOptions.scenes)); + str.AppendLine("assetBundleManifestPath = " + BuildPlayerOptions.assetBundleManifestPath); + str.AppendLine("options.Development = " + ((BuildPlayerOptions.options & BuildOptions.Development) != 0)); + str.AppendLine("options.AutoRunPlayer = " + ((BuildPlayerOptions.options & BuildOptions.AutoRunPlayer) != 0)); + str.AppendLine("options.ForceEnableAssertions = " + ((BuildPlayerOptions.options & BuildOptions.ForceEnableAssertions) != 0)); + return str.ToString(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta new file mode 100644 index 0000000..73c1779 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a0bd678385f98e4d8eabdfc07d62b4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs new file mode 100644 index 0000000..151d8a2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs @@ -0,0 +1,113 @@ +using System; +using System.IO; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PlayerLauncherContextSettings : IDisposable + { + private ITestRunSettings m_OverloadSettings; + + private EditorBuildSettingsScene[] m_EditorBuildSettings; +#pragma warning disable 618 + private ResolutionDialogSetting m_DisplayResolutionDialog; +#pragma warning restore 618 + private bool m_RunInBackground; + private FullScreenMode m_FullScreenMode; + private bool m_ResizableWindow; + private bool m_ShowUnitySplashScreen; + private string m_OldproductName; + private string m_OldAotOptions; +#pragma warning disable 618 + private Lightmapping.GIWorkflowMode m_OldLightmapping; +#pragma warning restore 618 + private bool m_explicitNullChecks; + + private bool m_Disposed; + + public PlayerLauncherContextSettings(ITestRunSettings overloadSettings) + { + m_OverloadSettings = overloadSettings; + SetupProjectParameters(); + + if (overloadSettings != null) + { + overloadSettings.Apply(); + } + } + + public void Dispose() + { + if (!m_Disposed) + { + CleanupProjectParameters(); + if (m_OverloadSettings != null) + { + m_OverloadSettings.Dispose(); + } + + m_Disposed = true; + } + } + + private void SetupProjectParameters() + { + EditorApplication.LockReloadAssemblies(); + + m_EditorBuildSettings = EditorBuildSettings.scenes; + +#pragma warning disable 618 + m_DisplayResolutionDialog = PlayerSettings.displayResolutionDialog; + PlayerSettings.displayResolutionDialog = ResolutionDialogSetting.Disabled; +#pragma warning restore 618 + + m_RunInBackground = PlayerSettings.runInBackground; + PlayerSettings.runInBackground = true; + + m_FullScreenMode = PlayerSettings.fullScreenMode; + PlayerSettings.fullScreenMode = FullScreenMode.Windowed; + + m_OldAotOptions = PlayerSettings.aotOptions; + PlayerSettings.aotOptions = "nimt-trampolines=1024"; + + m_ResizableWindow = PlayerSettings.resizableWindow; + PlayerSettings.resizableWindow = true; + + m_ShowUnitySplashScreen = PlayerSettings.SplashScreen.show; + PlayerSettings.SplashScreen.show = false; + + m_OldproductName = PlayerSettings.productName; + PlayerSettings.productName = string.Join("_", Application.productName.Split(Path.GetInvalidFileNameChars())); + +#pragma warning disable 618 + m_OldLightmapping = Lightmapping.giWorkflowMode; + Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand; +#pragma warning restore 618 + + m_explicitNullChecks = EditorUserBuildSettings.explicitNullChecks; + EditorUserBuildSettings.explicitNullChecks = true; + } + + private void CleanupProjectParameters() + { + EditorBuildSettings.scenes = m_EditorBuildSettings; + + PlayerSettings.fullScreenMode = m_FullScreenMode; + PlayerSettings.runInBackground = m_RunInBackground; +#pragma warning disable 618 + PlayerSettings.displayResolutionDialog = m_DisplayResolutionDialog; +#pragma warning restore 618 + PlayerSettings.resizableWindow = m_ResizableWindow; + PlayerSettings.SplashScreen.show = m_ShowUnitySplashScreen; + PlayerSettings.productName = m_OldproductName; + PlayerSettings.aotOptions = m_OldAotOptions; +#pragma warning disable 618 + Lightmapping.giWorkflowMode = m_OldLightmapping; +#pragma warning restore 618 + EditorUserBuildSettings.explicitNullChecks = m_explicitNullChecks; + + EditorApplication.UnlockReloadAssemblies(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta new file mode 100644 index 0000000..29cb891 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6965880f76f40194593cb53a88f74005 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs new file mode 100644 index 0000000..2183282 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs @@ -0,0 +1,19 @@ +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner +{ + class PlayerLauncherTestRunSettings : ITestRunSettings + { + public bool buildOnly { set; get; } + + public string buildOnlyLocationPath { set; get; } + + public void Dispose() + { + } + + void ITestRunSettings.Apply() + { + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs.meta new file mode 100644 index 0000000..ea71a0c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c1cba6f3ed484514097080a3bb835958 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs new file mode 100644 index 0000000..223db27 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.Utils; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.TestRunner.Callbacks; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PlaymodeLauncher : RuntimeTestLauncherBase + { + public static bool IsRunning; + private Scene m_Scene; + private bool m_IsTestSetupPerformed; + private readonly PlaymodeTestsControllerSettings m_Settings; + private ITestFilter testFilter; + + [SerializeField] + private List m_EventHandlers = new List(); + + public PlaymodeLauncher(PlaymodeTestsControllerSettings settings) + { + m_Settings = settings; + } + + public override void Run() + { + IsRunning = true; + ConsoleWindow.SetConsoleErrorPause(false); + Application.runInBackground = true; + + var sceneName = CreateSceneName(); + m_Scene = CreateBootstrapScene(sceneName, runner => + { + runner.AddEventHandlerMonoBehaviour(); + runner.AddEventHandlerScriptableObject(); + runner.AddEventHandlerScriptableObject(); + runner.AddEventHandlerScriptableObject(); + + foreach (var eventHandler in m_EventHandlers) + { + var obj = ScriptableObject.CreateInstance(eventHandler); + runner.AddEventHandlerScriptableObject(obj as ITestRunnerListener); + } + + runner.settings = m_Settings; + }); + + if (m_Settings.sceneBased) + { + var newListOfScenes = + new List {new EditorBuildSettingsScene(sceneName, true)}; + newListOfScenes.AddRange(EditorBuildSettings.scenes); + EditorBuildSettings.scenes = newListOfScenes.ToArray(); + } + + EditorApplication.update += UpdateCallback; + } + + public void UpdateCallback() + { + if (m_IsTestSetupPerformed) + { + if (m_Scene.IsValid()) + SceneManager.SetActiveScene(m_Scene); + EditorApplication.update -= UpdateCallback; + EditorApplication.isPlaying = true; + } + else + { + testFilter = m_Settings.BuildNUnitFilter(); + var runner = LoadTests(testFilter); + + var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, testFilter); + if (exceptionThrown) + { + EditorApplication.update -= UpdateCallback; + IsRunning = false; + var controller = PlaymodeTestsController.GetController(); + ReopenOriginalScene(controller); + AssetDatabase.DeleteAsset(controller.settings.bootstrapScene); + CallbacksDelegator.instance.RunFailed("Run Failed: One or more errors in a prebuild setup. See the editor log for details."); + return; + } + m_IsTestSetupPerformed = true; + } + } + + [InitializeOnLoad] + public class BackgroundWatcher + { + static BackgroundWatcher() + { + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (!PlaymodeTestsController.IsControllerOnScene()) + return; + var runner = PlaymodeTestsController.GetController(); + if (runner == null) + return; + if (state == PlayModeStateChange.ExitingPlayMode) + { + AssetDatabase.DeleteAsset(runner.settings.bootstrapScene); + ExecutePostBuildCleanupMethods(runner.m_Runner.LoadedTest, runner.settings.BuildNUnitFilter(), Application.platform); + IsRunning = false; + } + else if (state == PlayModeStateChange.EnteredEditMode) + { + //reopen the original scene once we exit playmode + ReopenOriginalScene(runner); + } + } + } + + protected static void ReopenOriginalScene(PlaymodeTestsController runner) + { + ReopenOriginalScene(runner.settings.originalScene); + } + + public void AddEventHandler() where T : ScriptableObject, ITestRunnerListener + { + m_EventHandlers.Add(typeof(T)); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta new file mode 100644 index 0000000..ddb6e1c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3217d58bbd1d2b4aaee933e2e8b9195 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs new file mode 100644 index 0000000..32dee2b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs @@ -0,0 +1,9 @@ +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PostbuildCleanupAttributeFinder : AttributeFinderBase + { + public PostbuildCleanupAttributeFinder() : base(attribute => attribute.TargetClass) {} + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta new file mode 100644 index 0000000..454dd10 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c2dfcbbb77359547bcaa7cdabd47ebb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs new file mode 100644 index 0000000..b51241f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs @@ -0,0 +1,9 @@ +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class PrebuildSetupAttributeFinder : AttributeFinderBase + { + public PrebuildSetupAttributeFinder() : base((attribute) => attribute.TargetClass) {} + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta new file mode 100644 index 0000000..d524e56 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c4ccfb0896bcf44da13e152b267aa49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs new file mode 100644 index 0000000..abaa219 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using UnityEditor.DeploymentTargets; +using UnityEditor.TestTools.TestRunner.CommandLineTest; +using UnityEngine; + +namespace UnityEditor.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemotePlayerLogController : ScriptableSingleton + { + private List m_LogWriters; + + private Dictionary m_Loggers; + + private string m_DeviceLogsDirectory; + + public void SetBuildTarget(BuildTarget buildTarget) + { + m_Loggers = GetDeploymentTargetLoggers(buildTarget); + + if (m_Loggers == null) + Debug.Log("Deployment target logger could not be created"); + } + + public void SetLogsDirectory(string dir) + { + m_DeviceLogsDirectory = dir; + } + + public void StartLogWriters() + { + if (m_DeviceLogsDirectory == null || m_Loggers == null) + return; + + m_LogWriters = new List(); + + foreach (var logger in m_Loggers) + { + m_LogWriters.Add(new LogWriter(m_DeviceLogsDirectory, logger.Key, logger.Value)); + logger.Value.Start(); + } + } + + public void StopLogWriters() + { + if (m_LogWriters == null) + return; + + foreach (var logWriter in m_LogWriters) + { + logWriter.Stop(); + } + } + + private Dictionary GetDeploymentTargetLoggers(BuildTarget buildTarget) + { + DeploymentTargetManager deploymentTargetManager; + + try + { + deploymentTargetManager = DeploymentTargetManager.CreateInstance(EditorUserBuildSettings.activeBuildTargetGroup, buildTarget); + + if (deploymentTargetManager == null) + return null; + } + catch (NotSupportedException ex) + { + Debug.Log(ex.Message); + Debug.Log("Deployment target logger not initialised"); + return null; + } + + var targets = deploymentTargetManager.GetKnownTargets(); + var loggers = new Dictionary(); + + foreach (var target in targets) + { + if (target.status != DeploymentTargetStatus.Ready) continue; + + var logger = deploymentTargetManager.GetTargetLogger(target.id); + logger.Clear(); + loggers.Add(target.id, logger); + } + + return loggers; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta new file mode 100644 index 0000000..b208419 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: edd2a1fe1acbbde43aad39862bb3f4a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs new file mode 100644 index 0000000..951bb8a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs @@ -0,0 +1,110 @@ +using System; +using UnityEditor.Networking.PlayerConnection; +using UnityEditor.TestTools.TestRunner; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.UnityTestProtocol; +using UnityEngine; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestRunController : ScriptableSingleton + { + internal const int k_HeartbeatTimeout = 60 * 10; + + [SerializeField] + private RemoteTestResultReciever m_RemoteTestResultReciever; + + [SerializeField] + private PlatformSpecificSetup m_PlatformSpecificSetup; + + [SerializeField] + private bool m_RegisteredConnectionCallbacks; + + [SerializeField] + private int m_HearbeatTimeOut; + + private UnityEditor.TestTools.TestRunner.DelayedCallback m_TimeoutCallback; + + public void Init(BuildTarget buildTarget, int heartbeatTimeout) + { + m_HearbeatTimeOut = heartbeatTimeout; + m_PlatformSpecificSetup = new PlatformSpecificSetup(buildTarget); + m_PlatformSpecificSetup.Setup(); + m_RemoteTestResultReciever = new RemoteTestResultReciever(); + EditorConnection.instance.Initialize(); + if (!m_RegisteredConnectionCallbacks) + { + EditorConnection.instance.Initialize(); + DelegateEditorConnectionEvents(); + } + } + + private void DelegateEditorConnectionEvents() + { + m_RegisteredConnectionCallbacks = true; + //This is needed because RemoteTestResultReceiver is not a ScriptableObject + EditorConnection.instance.Register(PlayerConnectionMessageIds.runStartedMessageId, RunStarted); + EditorConnection.instance.Register(PlayerConnectionMessageIds.runFinishedMessageId, RunFinished); + EditorConnection.instance.Register(PlayerConnectionMessageIds.testStartedMessageId, TestStarted); + EditorConnection.instance.Register(PlayerConnectionMessageIds.testFinishedMessageId, TestFinished); + EditorConnection.instance.Register(PlayerConnectionMessageIds.playerAliveHeartbeat, PlayerAliveHeartbeat); + } + + private void RunStarted(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback?.Reset(); + m_RemoteTestResultReciever.RunStarted(messageEventArgs); + CallbacksDelegator.instance.RunStartedRemotely(messageEventArgs.data); + } + + private void RunFinished(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback?.Clear(); + m_RemoteTestResultReciever.RunFinished(messageEventArgs); + m_PlatformSpecificSetup.CleanUp(); + + CallbacksDelegator.instance.RunFinishedRemotely(messageEventArgs.data); + } + + private void TestStarted(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback?.Reset(); + CallbacksDelegator.instance.TestStartedRemotely(messageEventArgs.data); + } + + private void TestFinished(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback?.Reset(); + CallbacksDelegator.instance.TestFinishedRemotely(messageEventArgs.data); + } + + private void PlayerAliveHeartbeat(MessageEventArgs messageEventArgs) + { + m_TimeoutCallback?.Reset(); + } + + private void TimeoutCallback() + { + CallbacksDelegator.instance.RunFailed($"Test execution timed out. No activity received from the player in {m_HearbeatTimeOut} seconds."); + } + + public void PostBuildAction() + { + m_PlatformSpecificSetup.PostBuildAction(); + } + + public void PostSuccessfulBuildAction() + { + m_PlatformSpecificSetup.PostSuccessfulBuildAction(); + m_TimeoutCallback = new UnityEditor.TestTools.TestRunner.DelayedCallback(TimeoutCallback, m_HearbeatTimeOut); + } + + public void PostSuccessfulLaunchAction() + { + m_PlatformSpecificSetup.PostSuccessfulLaunchAction(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta new file mode 100644 index 0000000..020222b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7d36034e63ad8254b9b2f55280fcc040 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs new file mode 100644 index 0000000..75b0712 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs @@ -0,0 +1,22 @@ +using System; +using UnityEditor.Networking.PlayerConnection; +using UnityEngine; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class RemoteTestResultReciever + { + public void RunStarted(MessageEventArgs messageEventArgs) + { + } + + public void RunFinished(MessageEventArgs messageEventArgs) + { + EditorConnection.instance.Send(PlayerConnectionMessageIds.quitPlayerMessageId, null, messageEventArgs.playerId); + EditorConnection.instance.DisconnectAll(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta new file mode 100644 index 0000000..e701015 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdb35ef8fc437e14fa4b6c74a0609e86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs new file mode 100644 index 0000000..87d9672 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs @@ -0,0 +1,92 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEditor.Events; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal abstract class RuntimeTestLauncherBase : TestLauncherBase + { + protected Scene CreateBootstrapScene(string sceneName, Action runnerSetup) + { + var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + var go = new GameObject(PlaymodeTestsController.kPlaymodeTestControllerName); + + var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + + var runner = go.AddComponent(); + runnerSetup(runner); + runner.settings.bootstrapScene = sceneName; + runner.AssembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList(); + + EditorSceneManager.MarkSceneDirty(scene); + AssetDatabase.SaveAssets(); + EditorSceneManager.SaveScene(scene, sceneName, false); + + return scene; + } + + public string CreateSceneName() + { + return "Assets/InitTestScene" + DateTime.Now.Ticks + ".unity"; + } + + protected UnityTestAssemblyRunner LoadTests(ITestFilter filter) + { + var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + var assembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList(); + + var nUnitTestAssemblyRunner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), null); + var assemblyProvider = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), assembliesWithTests); + nUnitTestAssemblyRunner.Load(assemblyProvider.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode)); + return nUnitTestAssemblyRunner; + } + + protected static void ReopenOriginalScene(string originalSceneName) + { + EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects); + if (!string.IsNullOrEmpty(originalSceneName)) + { + EditorSceneManager.OpenScene(originalSceneName); + } + } + } + + internal static class PlaymodeTestsControllerExtensions + { + internal static T AddEventHandlerMonoBehaviour(this PlaymodeTestsController controller) where T : MonoBehaviour, ITestRunnerListener + { + var eventHandler = controller.gameObject.AddComponent(); + SetListeners(controller, eventHandler); + return eventHandler; + } + + internal static T AddEventHandlerScriptableObject(this PlaymodeTestsController controller) where T : ScriptableObject, ITestRunnerListener + { + var eventListener = ScriptableObject.CreateInstance(); + AddEventHandlerScriptableObject(controller, eventListener); + return eventListener; + } + + internal static void AddEventHandlerScriptableObject(this PlaymodeTestsController controller, ITestRunnerListener obj) + { + SetListeners(controller, obj); + } + + private static void SetListeners(PlaymodeTestsController controller, ITestRunnerListener eventHandler) + { + UnityEventTools.AddPersistentListener(controller.testStartedEvent, eventHandler.TestStarted); + UnityEventTools.AddPersistentListener(controller.testFinishedEvent, eventHandler.TestFinished); + UnityEventTools.AddPersistentListener(controller.runStartedEvent, eventHandler.RunStarted); + UnityEventTools.AddPersistentListener(controller.runFinishedEvent, eventHandler.RunFinished); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta new file mode 100644 index 0000000..28c7416 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0efb23ecb373b6d4bbe5217485785138 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs new file mode 100644 index 0000000..7bfd354 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs @@ -0,0 +1,85 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal abstract class TestLauncherBase + { + public abstract void Run(); + + protected virtual RuntimePlatform? TestTargetPlatform + { + get { return Application.platform; } + } + + protected bool ExecutePreBuildSetupMethods(ITest tests, ITestFilter testRunnerFilter) + { + var attributeFinder = new PrebuildSetupAttributeFinder(); + var logString = "Executing setup for: {0}"; + return ExecuteMethods(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Setup(), TestTargetPlatform); + } + + public void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter) + { + ExecutePostBuildCleanupMethods(tests, testRunnerFilter, TestTargetPlatform); + } + + public static void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter, RuntimePlatform? testTargetPlatform) + { + var attributeFinder = new PostbuildCleanupAttributeFinder(); + var logString = "Executing cleanup for: {0}"; + ExecuteMethods(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Cleanup(), testTargetPlatform); + } + + private static bool ExecuteMethods(ITest tests, ITestFilter testRunnerFilter, AttributeFinderBase attributeFinder, string logString, Action action, RuntimePlatform? testTargetPlatform) + { + var exceptionsThrown = false; + + if (testTargetPlatform == null) + { + Debug.LogError("Could not determine test target platform from build target " + EditorUserBuildSettings.activeBuildTarget); + return true; + } + + foreach (var targetClassType in attributeFinder.Search(tests, testRunnerFilter, testTargetPlatform.Value)) + { + try + { + var targetClass = (T)Activator.CreateInstance(targetClassType); + + Debug.LogFormat(logString, targetClassType.FullName); + + using (var logScope = new LogScope()) + { + action(targetClass); + + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + + if (logScope.ExpectedLogs.Any()) + { + var expectedLogs = logScope.ExpectedLogs.First(); + throw new UnexpectedLogMessageException(expectedLogs); + } + } + } + catch (InvalidCastException) {} + catch (Exception e) + { + Debug.LogException(e); + exceptionsThrown = true; + } + } + + return exceptionsThrown; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta new file mode 100644 index 0000000..c36990c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cddf785b0d07434d8e0607c97b09135 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestResultSerializer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestResultSerializer.cs new file mode 100644 index 0000000..e3b5220 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestResultSerializer.cs @@ -0,0 +1,75 @@ +using System; +using System.Reflection; +using System.Text; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine; +using UnityEngine.TestRunner.NUnitExtensions; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + internal class TestResultSerializer + { + private static readonly BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | + BindingFlags.Instance | BindingFlags.FlattenHierarchy; + + [SerializeField] public string id; + + [SerializeField] public string fullName; + + [SerializeField] private double duration; + + [SerializeField] private string label; + + [SerializeField] private string message; + + [SerializeField] private string output; + + [SerializeField] private string site; + + [SerializeField] private string stacktrace; + + [SerializeField] private double startTimeAO; + + [SerializeField] private string status; + + [SerializeField] public string uniqueName; + + public static TestResultSerializer MakeFromTestResult(ITestResult result) + { + var wrapper = new TestResultSerializer(); + wrapper.id = result.Test.Id; + wrapper.fullName = result.FullName; + wrapper.status = result.ResultState.Status.ToString(); + wrapper.label = result.ResultState.Label; + wrapper.site = result.ResultState.Site.ToString(); + wrapper.output = result.Output; + wrapper.duration = result.Duration; + wrapper.stacktrace = result.StackTrace; + wrapper.message = result.Message; + wrapper.startTimeAO = result.StartTime.ToOADate(); + wrapper.uniqueName = result.Test.GetUniqueName(); + return wrapper; + } + + public void RestoreTestResult(TestResult result) + { + var resultState = new ResultState((TestStatus)Enum.Parse(typeof(TestStatus), status), label, + (FailureSite)Enum.Parse(typeof(FailureSite), site)); + result.GetType().BaseType.GetField("_resultState", flags).SetValue(result, resultState); + result.GetType().BaseType.GetField("_output", flags).SetValue(result, new StringBuilder(output)); + result.GetType().BaseType.GetField("_duration", flags).SetValue(result, duration); + result.GetType().BaseType.GetField("_message", flags).SetValue(result, message); + result.GetType().BaseType.GetField("_stackTrace", flags).SetValue(result, stacktrace); + result.GetType() + .BaseType.GetProperty("StartTime", flags) + .SetValue(result, DateTime.FromOADate(startTimeAO), null); + } + + public bool IsPassed() + { + return status == TestStatus.Passed.ToString(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestResultSerializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestResultSerializer.cs.meta new file mode 100644 index 0000000..96f2960 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestResultSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 559482fe33c79e44882d3a6cedc55fb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun.meta new file mode 100644 index 0000000..6f6e8cf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8721cb2237d4a564a94a51f56243bdac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks.meta new file mode 100644 index 0000000..bb019b7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6dba53789da15814387fa5b1445e81e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs new file mode 100644 index 0000000..7efaecb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal abstract class BuildActionTaskBase : TestTaskBase + { + private string typeName; + internal IAttributeFinder attributeFinder; + internal RuntimePlatform targetPlatform = Application.platform; + internal Action logAction = Debug.Log; + internal Func logScopeProvider = () => new LogScope(); + internal Func createInstance = Activator.CreateInstance; + + protected BuildActionTaskBase(IAttributeFinder attributeFinder) + { + this.attributeFinder = attributeFinder; + typeName = typeof(T).Name; + } + + protected abstract void Action(T target); + + public override IEnumerator Execute(TestJobData testJobData) + { + if (testJobData.testTree == null) + { + throw new Exception($"Test tree is not available for {GetType().Name}."); + } + + var enumerator = ExecuteMethods(testJobData.testTree, testJobData.executionSettings.BuildNUnitFilter()); + while (enumerator.MoveNext()) + { + yield return null; + } + } + + protected IEnumerator ExecuteMethods(ITest testTree, ITestFilter testRunnerFilter) + { + var exceptions = new List(); + + foreach (var targetClassType in attributeFinder.Search(testTree, testRunnerFilter, targetPlatform)) + { + try + { + var targetClass = (T) createInstance(targetClassType); + + logAction($"Executing {typeName} for: {targetClassType.FullName}."); + + using (var logScope = logScopeProvider()) + { + Action(targetClass); + + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + + if (logScope.ExpectedLogs.Any()) + { + var expectedLogs = logScope.ExpectedLogs.First(); + throw new UnexpectedLogMessageException(expectedLogs); + } + } + } + catch (Exception ex) + { + exceptions.Add(ex); + } + + yield return null; + } + + if (exceptions.Count > 0) + { + throw new AggregateException($"One or more exceptions when executing {typeName}.", exceptions); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs.meta new file mode 100644 index 0000000..54afd57 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2441d353f9c42a44af6e224e4901b52 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs new file mode 100644 index 0000000..b66f507 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections; +using System.Linq; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class BuildTestTreeTask : TestTaskBase + { + private TestPlatform m_TestPlatform; + + public BuildTestTreeTask(TestPlatform testPlatform) + { + m_TestPlatform = testPlatform; + } + + internal IEditorLoadedTestAssemblyProvider m_testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + internal IAsyncTestAssemblyBuilder m_testAssemblyBuilder = new UnityTestAssemblyBuilder(); + internal ICallbacksDelegator m_CallbacksDelegator = CallbacksDelegator.instance; + + public override IEnumerator Execute(TestJobData testJobData) + { + if (testJobData.testTree != null) + { + yield break; + } + + var assembliesEnumerator = m_testAssemblyProvider.GetAssembliesGroupedByTypeAsync(m_TestPlatform); + while (assembliesEnumerator.MoveNext()) + { + yield return null; + } + + if (assembliesEnumerator.Current == null) + { + throw new Exception("Assemblies not retrieved."); + } + + var assemblies = assembliesEnumerator.Current.Where(pair => m_TestPlatform.IsFlagIncluded(pair.Key)).SelectMany(pair => pair.Value).Select(x => x.Assembly).ToArray(); + var buildSettings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(m_TestPlatform); + var enumerator = m_testAssemblyBuilder.BuildAsync(assemblies, Enumerable.Repeat(m_TestPlatform, assemblies.Length).ToArray(), buildSettings); + while (enumerator.MoveNext()) + { + yield return null; + } + + var testList = enumerator.Current; + if (testList== null) + { + throw new Exception("Test list not retrieved."); + } + + testList.ParseForNameDuplicates(); + testJobData.testTree = testList; + m_CallbacksDelegator.TestTreeRebuild(testList); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs.meta new file mode 100644 index 0000000..b00d7b1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0288e1c9324e824bab7e2044a72a434 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs new file mode 100644 index 0000000..cf07f4c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class CleanupVerificationTask : FileCleanupVerifierTaskBase + { + private const string k_Indent = " "; + + internal Action logAction = Debug.LogWarning; + + public override IEnumerator Execute(TestJobData testJobData) + { + var currentFiles = GetAllFilesInAssetsDirectory(); + var existingFiles = testJobData.existingFiles; + + if (currentFiles.Length != existingFiles.Length) + { + LogWarningForFilesIfAny(currentFiles.Where(file => !testJobData.existingFiles.Contains(file)).ToArray()); + } + + yield return null; + } + + private void LogWarningForFilesIfAny(string[] filePaths) + { + if (!filePaths.Any()) + { + return; + } + + var stringWriter = new StringWriter(); + stringWriter.WriteLine("Files generated by test without cleanup."); + stringWriter.WriteLine(k_Indent + "Found {0} new files.", filePaths.Length); + + foreach (var filePath in filePaths) + { + stringWriter.WriteLine(k_Indent + filePath); + } + + logAction(stringWriter.ToString()); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs.meta new file mode 100644 index 0000000..2ea7cb0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93eb6389f4fb6924987867ce0bc339ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs new file mode 100644 index 0000000..35f4aa0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs @@ -0,0 +1,14 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal abstract class FileCleanupVerifierTaskBase : TestTaskBase + { + internal Func GetAllAssetPathsAction = AssetDatabase.GetAllAssetPaths; + + protected string[] GetAllFilesInAssetsDirectory() + { + return GetAllAssetPathsAction(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs.meta new file mode 100644 index 0000000..617b92d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad7bb166069f8414e9ad26606b305e66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs new file mode 100644 index 0000000..30db267 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs @@ -0,0 +1,26 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class LegacyEditModeRunTask : TestTaskBase + { + public LegacyEditModeRunTask() : base(true) + { + + } + + public override IEnumerator Execute(TestJobData testJobData) + { + var testLauncher = new EditModeLauncher(testJobData.executionSettings.filters, TestPlatform.EditMode, testJobData.executionSettings.runSynchronously); + testJobData.editModeRunner = testLauncher.m_EditModeRunner; + testLauncher.Run(); + + while (testJobData.editModeRunner != null && !testJobData.editModeRunner.RunFinished) + { + yield return null; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs.meta new file mode 100644 index 0000000..3a65c88 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4246555189b5ee43b4857220f9fd29b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs new file mode 100644 index 0000000..b0b30df --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Linq; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class LegacyPlayModeRunTask : TestTaskBase + { + public LegacyPlayModeRunTask() : base(true) + { + + } + public override IEnumerator Execute(TestJobData testJobData) + { + var settings = PlaymodeTestsControllerSettings.CreateRunnerSettings(testJobData.executionSettings.filters.Select(filter => filter.ToRuntimeTestRunnerFilter(testJobData.executionSettings.runSynchronously)).ToArray()); + var launcher = new PlaymodeLauncher(settings); + + launcher.Run(); + + while (PlaymodeLauncher.IsRunning) + { + yield return null; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs.meta new file mode 100644 index 0000000..0a75368 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4769fe1e7475c8843b092338acbcad25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs new file mode 100644 index 0000000..3f24135 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Linq; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class LegacyPlayerRunTask : TestTaskBase + { + public override IEnumerator Execute(TestJobData testJobData) + { + var executionSettings = testJobData.executionSettings; + var settings = PlaymodeTestsControllerSettings.CreateRunnerSettings(executionSettings.filters.Select(filter => filter.ToRuntimeTestRunnerFilter(executionSettings.runSynchronously)).ToArray()); + var launcher = new PlayerLauncher(settings, executionSettings.targetPlatform, executionSettings.overloadTestRunSettings, executionSettings.playerHeartbeatTimeout); + launcher.Run(); + yield return null; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs.meta new file mode 100644 index 0000000..67eea1a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b93fe5bbea454ae438fcec241c5fa85b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs new file mode 100644 index 0000000..93878cf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class PerformUndoTask : TestTaskBase + { + private const double warningThreshold = 1000; + + internal Action RevertAllDownToGroup = Undo.RevertAllDownToGroup; + internal Action LogWarning = Debug.LogWarning; + internal Action DisplayProgressBar = EditorUtility.DisplayProgressBar; + internal Action ClearProgressBar = EditorUtility.ClearProgressBar; + internal Func TimeNow = () => DateTime.Now; + + public override IEnumerator Execute(TestJobData testJobData) + { + if (testJobData.undoGroup < 0) + { + yield break; + } + + DisplayProgressBar("Undo", "Reverting changes to the scene", 0); + + var undoStartTime = TimeNow(); + + RevertAllDownToGroup(testJobData.undoGroup); + + var timeDelta = TimeNow() - undoStartTime; + if (timeDelta.TotalMilliseconds >= warningThreshold) + { + LogWarning($"Undo after editor test run took {timeDelta.Seconds} second{(timeDelta.Seconds == 1 ? "" : "s")}."); + } + + ClearProgressBar(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs.meta new file mode 100644 index 0000000..f506742 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb1abebffd37bd4458c84e15a5d7ab04 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs new file mode 100644 index 0000000..adec2ae --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class PrebuildSetupTask : BuildActionTaskBase + { + public PrebuildSetupTask() : base(new PrebuildSetupAttributeFinder()) + { + } + + protected override void Action(IPrebuildSetup target) + { + target.Setup(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs.meta new file mode 100644 index 0000000..5a564af --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc039194235714f48a39bd364885e744 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs new file mode 100644 index 0000000..50b4cf6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs @@ -0,0 +1,13 @@ +using System.Collections; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class RegisterFilesForCleanupVerificationTask : FileCleanupVerifierTaskBase + { + public override IEnumerator Execute(TestJobData testJobData) + { + testJobData.existingFiles = GetAllFilesInAssetsDirectory(); + yield return null; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs.meta new file mode 100644 index 0000000..51eb7dd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a398fde47a0349a40a9bdf8988c392c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs new file mode 100644 index 0000000..d42f7b9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections; +using UnityEditor.SceneManagement; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class SaveModiedSceneTask : TestTaskBase + { + internal Func SaveCurrentModifiedScenesIfUserWantsTo = + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo; + public override IEnumerator Execute(TestJobData testJobData) + { + var cancelled = !SaveCurrentModifiedScenesIfUserWantsTo(); + if (cancelled) + { + throw new TestRunCanceledException(); + } + + yield break; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs.meta new file mode 100644 index 0000000..7300f3b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c321246872d389b469bd0cb86d3701ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs new file mode 100644 index 0000000..ee6de8f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal class SaveUndoIndexTask : TestTaskBase + { + internal Func GetUndoGroup = Undo.GetCurrentGroup; + public override IEnumerator Execute(TestJobData testJobData) + { + testJobData.undoGroup = GetUndoGroup(); + yield break; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs.meta new file mode 100644 index 0000000..30789a1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc0ce06a7515c044bb8db4c75db84114 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs new file mode 100644 index 0000000..81b1849 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs @@ -0,0 +1,16 @@ +using System.Collections; + +namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks +{ + internal abstract class TestTaskBase + { + public bool SupportsResumingEnumerator; + + protected TestTaskBase(bool supportsResumingEnumerator = false) + { + SupportsResumingEnumerator = supportsResumingEnumerator; + } + + public abstract IEnumerator Execute(TestJobData testJobData); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs.meta new file mode 100644 index 0000000..8b54c2e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 342d9ef4da0a19b49877f576c2deec14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobData.cs new file mode 100644 index 0000000..05ab503 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobData.cs @@ -0,0 +1,49 @@ +using System; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.TestRun +{ + [Serializable] + internal class TestJobData + { + [SerializeField] + public string guid; + + [SerializeField] + public int taskIndex; + + [SerializeField] + public int taskPC; + + [SerializeField] + public bool isRunning; + + [SerializeField] + public ExecutionSettings executionSettings; + + [SerializeField] + public string[] existingFiles; + + [SerializeField] + public int undoGroup = -1; + + [SerializeField] + public EditModeRunner editModeRunner; + + [NonSerialized] + public bool isHandledByRunner; + + public ITest testTree; + + public TestJobData(ExecutionSettings settings) + { + guid = Guid.NewGuid().ToString(); + executionSettings = settings; + isRunning = false; + taskIndex = 0; + taskPC = 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobData.cs.meta new file mode 100644 index 0000000..5da5662 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 80ac8f5b2a7fa904dbc80111be88c8be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs new file mode 100644 index 0000000..7852f73 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.TestRun +{ + internal class TestJobDataHolder : ScriptableSingleton + { + [SerializeField] + public List TestRuns = new List(); + + [InitializeOnLoadMethod] + private static void ResumeRunningJobs() + { + foreach (var testRun in instance.TestRuns.ToArray()) + { + if (testRun.isRunning) + { + var runner = new TestJobRunner(); + runner.RunJob(testRun); + } + else + { + instance.TestRuns.Remove(testRun); + } + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs.meta new file mode 100644 index 0000000..3612b80 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 612b00d793cac3c49808ab3ee5428f16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobRunner.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobRunner.cs new file mode 100644 index 0000000..8a9cd4f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobRunner.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.TestRun.Tasks; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.TestRun +{ + internal class TestJobRunner + { + private static IEnumerable GetTaskList(ExecutionSettings settings) + { + if (settings == null) + { + yield break; + } + + if (settings.EditModeIncluded() || (PlayerSettings.runPlayModeTestAsEditModeTest && settings.PlayModeInEditorIncluded())) + { + yield return new SaveModiedSceneTask(); + yield return new RegisterFilesForCleanupVerificationTask(); + yield return new SaveUndoIndexTask(); + yield return new BuildTestTreeTask(TestPlatform.EditMode); + yield return new PrebuildSetupTask(); + yield return new LegacyEditModeRunTask(); + yield return new PerformUndoTask(); + yield return new CleanupVerificationTask(); + yield break; + } + + if (settings.PlayModeInEditorIncluded() && !PlayerSettings.runPlayModeTestAsEditModeTest) + { + yield return new SaveModiedSceneTask(); + yield return new LegacyPlayModeRunTask(); + yield break; + } + + if (settings.PlayerIncluded()) + { + yield return new LegacyPlayerRunTask(); + yield break; + } + } + + internal List SavedTestJobData = TestJobDataHolder.instance.TestRuns; + internal Action SubscribeCallback = (callback) => EditorApplication.update += callback; + // ReSharper disable once DelegateSubtraction + internal Action UnsubscribeCallback = (callback) => EditorApplication.update -= callback; + internal TestCommandPcHelper PcHelper = new EditModePcHelper(); + internal Func> GetTasks = GetTaskList; + internal Action LogException = Debug.LogException; + internal Action LogError = Debug.LogError; + internal Action ReportRunFailed = CallbacksDelegator.instance.RunFailed; + + private TestJobData m_JobData; + private TestTaskBase[] Tasks; + private IEnumerator m_Enumerator = null; + + public string RunJob(TestJobData data) + { + if (data == null) + { + throw new ArgumentException(null, nameof(data)); + } + + if (m_JobData != null && m_JobData.isRunning) + { + throw new Exception("TestJobRunner is already running a job."); + } + + if (data.isHandledByRunner) + { + throw new Exception("Test job is already being handled."); + } + + m_JobData = data; + m_JobData.isHandledByRunner = true; + + if (!m_JobData.isRunning) + { + m_JobData.isRunning = true; + SavedTestJobData.Add(m_JobData); + } + + Tasks = GetTasks(data.executionSettings).ToArray(); + if (!data.executionSettings.runSynchronously) + { + SubscribeCallback(ExecuteStep); + } + else + { + while (data.isRunning) + { + ExecuteStep(); + } + } + + return data.guid; + } + + private void ExecuteStep() + { + try + { + if (m_JobData.taskIndex >= Tasks.Length) + { + StopRun(); + return; + } + + if (m_Enumerator == null) + { + var task = Tasks[m_JobData.taskIndex]; + m_Enumerator = task.Execute(m_JobData); + if (task.SupportsResumingEnumerator) + { + PcHelper.SetEnumeratorPC(m_Enumerator, m_JobData.taskPC); + } + } + + if (!m_Enumerator.MoveNext()) + { + m_JobData.taskIndex++; + m_JobData.taskPC = 0; + m_Enumerator = null; + return; + } + + if (Tasks[m_JobData.taskIndex].SupportsResumingEnumerator) + { + m_JobData.taskPC = PcHelper.GetEnumeratorPC(m_Enumerator); + } + } + catch (TestRunCanceledException) + { + StopRun(); + } + catch (AggregateException ex) + { + StopRun(); + LogError(ex.Message); + foreach (var innerException in ex.InnerExceptions) + { + LogException(innerException); + } + ReportRunFailed("Multiple unexpected errors happened while running tests."); + } + catch (Exception ex) + { + StopRun(); + LogException(ex); + ReportRunFailed("An unexpected error happened while running tests."); + } + } + + private void StopRun() + { + m_JobData.isRunning = false; + UnsubscribeCallback(ExecuteStep); + SavedTestJobData.Remove(m_JobData); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobRunner.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobRunner.cs.meta new file mode 100644 index 0000000..df11aa0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestJobRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b677ddfd54046c498a20446baa4f932 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs new file mode 100644 index 0000000..542c501 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs @@ -0,0 +1,9 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.TestRun +{ + internal class TestRunCanceledException : Exception + { + + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs.meta new file mode 100644 index 0000000..2237e64 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1d45b9d3cf85bee4f99c1492fca8438a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner.meta new file mode 100644 index 0000000..d09886b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 49d4c2ab7ff0f4442af256bad7c9d57c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks.meta new file mode 100644 index 0000000..9e611a4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d7f0d6acfced954682a89e7002c04d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs new file mode 100644 index 0000000..a22c798 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModeRunnerCallback : ScriptableObject, ITestRunnerListener + { + private EditModeLauncherContextSettings m_Settings; + public SceneSetup[] previousSceneSetup; + public EditModeRunner runner; + + private bool m_Canceled; + private ITest m_CurrentTest; + private int m_TotalTests; + + [SerializeField] + private List m_PendingTests; + [SerializeField] + private string m_LastCountedTestName; + [SerializeField] + private bool m_RunRestarted; + + public void OnDestroy() + { + CleanUp(); + } + + public void RunStarted(ITest testsToRun) + { + Setup(); + if (m_PendingTests == null) + { + m_PendingTests = GetTestsExpectedToRun(testsToRun, runner.GetFilter()); + m_TotalTests = m_PendingTests.Count; + } + } + + public void OnEnable() + { + if (m_RunRestarted) + { + Setup(); + } + } + + private void Setup() + { + m_Settings = new EditModeLauncherContextSettings(); + Application.logMessageReceivedThreaded += LogReceived; + EditorApplication.playModeStateChanged += WaitForExitPlaymode; + EditorApplication.update += DisplayProgressBar; + AssemblyReloadEvents.beforeAssemblyReload += BeforeAssemblyReload; + } + + private void BeforeAssemblyReload() + { + if (m_CurrentTest != null) + { + m_LastCountedTestName = m_CurrentTest.FullName; + m_RunRestarted = true; + } + } + + private void DisplayProgressBar() + { + if (m_CurrentTest == null) + return; + if (!m_Canceled && EditorUtility.DisplayCancelableProgressBar("Test Runner", "Running test " + m_CurrentTest.Name, Math.Min(1.0f, (float)(m_TotalTests - m_PendingTests.Count) / m_TotalTests))) + { + EditorApplication.update -= DisplayProgressBar; + m_Canceled = true; + EditorUtility.ClearProgressBar(); + runner.OnRunCancel(); + } + } + + private static void LogReceived(string message, string stacktrace, LogType type) + { + if (TestContext.Out != null) + TestContext.Out.WriteLine(message); + } + + private static void WaitForExitPlaymode(PlayModeStateChange state) + { + if (state == PlayModeStateChange.EnteredEditMode) + { + EditorApplication.playModeStateChanged -= WaitForExitPlaymode; + //because logMessage is reset on Enter EditMode + //we remove and add the callback + //because Unity + Application.logMessageReceivedThreaded -= LogReceived; + Application.logMessageReceivedThreaded += LogReceived; + } + } + + public void RunFinished(ITestResult result) + { + if (previousSceneSetup != null && previousSceneSetup.Length > 0) + { + try + { + EditorSceneManager.RestoreSceneManagerSetup(previousSceneSetup); + } + catch (ArgumentException e) + { + Debug.LogWarning(e.Message); + } + } + else + { + foreach (var obj in FindObjectsOfType()) + { + if (obj != null && obj.transform.parent != null && (obj.transform.parent.hideFlags & HideFlags.DontSaveInEditor) == HideFlags.DontSaveInEditor && obj.transform.parent.gameObject != null) + { + DestroyImmediate(obj.transform.parent.gameObject); + } + } + + EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); + } + CleanUp(); + } + + private void CleanUp() + { + m_CurrentTest = null; + EditorUtility.ClearProgressBar(); + if (m_Settings != null) + { + m_Settings.Dispose(); + } + Application.logMessageReceivedThreaded -= LogReceived; + EditorApplication.update -= DisplayProgressBar; + } + + public void TestStarted(ITest test) + { + if (test.IsSuite || !(test is TestMethod)) + { + return; + } + + m_CurrentTest = test; + + if (m_RunRestarted) + { + if (test.FullName == m_LastCountedTestName) + m_RunRestarted = false; + } + } + + public void TestFinished(ITestResult result) + { + if (result.Test is TestMethod) + { + m_PendingTests.Remove(result.Test.FullName); + } + } + + private static List GetTestsExpectedToRun(ITest test, ITestFilter filter) + { + var expectedTests = new List(); + + if (filter.Pass(test)) + { + if (test.IsSuite) + { + expectedTests.AddRange(test.Tests.SelectMany(subTest => GetTestsExpectedToRun(subTest, filter))); + } + else + { + expectedTests.Add(test.FullName); + } + } + + return expectedTests; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta new file mode 100644 index 0000000..1a0d71c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc456ba93311a3a43ad896449fee9868 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs new file mode 100644 index 0000000..a4976af --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs @@ -0,0 +1,86 @@ +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.CommandLineTest; +using UnityEditor.TestTools.TestRunner.GUI; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class RerunCallback : ScriptableObject, ICallbacks + { + public static bool useMockRunFilter = false; + public static UITestRunnerFilter mockRunFilter = null; + + public void RunFinished(ITestResultAdaptor result) + { + if (RerunCallbackData.instance.runFilters == null || RerunCallbackData.instance.runFilters.Length == 0) + RerunCallbackData.instance.runFilters = new[] {new UITestRunnerFilter()}; + + var runFilter = RerunCallbackData.instance.runFilters[0]; + + if (useMockRunFilter) + { + runFilter = mockRunFilter; + } + + runFilter.testRepetitions--; + if (runFilter.testRepetitions <= 0 || result.TestStatus != TestStatus.Passed) + { + ExitCallbacks.preventExit = false; + return; + } + + ExitCallbacks.preventExit = true; + if (EditorApplication.isPlaying) + { + EditorApplication.playModeStateChanged += WaitForExitPlaymode; + return; + } + + if (!useMockRunFilter) + { + ExecuteTestRunnerAPI(); + } + } + + private static void WaitForExitPlaymode(PlayModeStateChange state) + { + if (state == PlayModeStateChange.EnteredEditMode) + { + ExecuteTestRunnerAPI(); + } + } + + private static void ExecuteTestRunnerAPI() + { + var runFilter = RerunCallbackData.instance.runFilters[0]; + var testMode = RerunCallbackData.instance.testMode; + + var testRunnerApi = ScriptableObject.CreateInstance(); + testRunnerApi.Execute(new Api.ExecutionSettings() + { + filters = new[] + { + new Filter() + { + categoryNames = runFilter.categoryNames, + groupNames = runFilter.groupNames, + testMode = testMode, + testNames = runFilter.testNames + } + } + }); + } + + public void TestStarted(ITestAdaptor test) + { + } + + public void TestFinished(ITestResultAdaptor result) + { + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta new file mode 100644 index 0000000..6dae8f2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 34d30300ba8eb4959a74ac1f8f413c8d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs new file mode 100644 index 0000000..d6abd3f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs @@ -0,0 +1,15 @@ +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.GUI; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class RerunCallbackData : ScriptableSingleton + { + [SerializeField] + internal UITestRunnerFilter[] runFilters; + + [SerializeField] + internal TestMode testMode; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta new file mode 100644 index 0000000..8615d9b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5be0e972cb9434b7797b1d37dcd127c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs new file mode 100644 index 0000000..2260d4d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs @@ -0,0 +1,17 @@ +using UnityEngine; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner +{ + [InitializeOnLoad] + static class RerunCallbackInitializer + { + static RerunCallbackInitializer() + { + var testRunnerApi = ScriptableObject.CreateInstance(); + + var rerunCallback = ScriptableObject.CreateInstance(); + testRunnerApi.RegisterCallbacks(rerunCallback); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta new file mode 100644 index 0000000..778b8fc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9cb48d7d0e6784c81ad36cdbfe8e4b6b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs new file mode 100644 index 0000000..4234754 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs @@ -0,0 +1,37 @@ +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestRunnerCallback : ScriptableObject, ITestRunnerListener + { + public void RunStarted(ITest testsToRun) + { + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + private void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (state == PlayModeStateChange.ExitingPlayMode) + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + //We need to make sure we don't block NUnit thread in case we exit PlayMode earlier + PlaymodeTestsController.TryCleanup(); + } + } + + public void RunFinished(ITestResult testResults) + { + EditorApplication.isPlaying = false; + } + + public void TestStarted(ITest testName) + { + } + + public void TestFinished(ITestResult test) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta new file mode 100644 index 0000000..1356ff9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d44e6804bc58be84ea71a619b468f150 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs new file mode 100644 index 0000000..05465d8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs @@ -0,0 +1,59 @@ +using System.Linq; +using TestRunner.Callbacks; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class WindowResultUpdater : ICallbacks, ITestTreeRebuildCallbacks + { + public WindowResultUpdater() + { + var cachedResults = WindowResultUpdaterDataHolder.instance.CachedResults; + var testList = TestRunnerWindow.s_Instance.m_SelectedTestTypes; + foreach (var result in cachedResults) + { + testList.UpdateResult(result); + } + + cachedResults.Clear(); + + } + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public void RunFinished(ITestResultAdaptor testResults) + { + if (TestRunnerWindow.s_Instance != null) + { + TestRunnerWindow.s_Instance.RebuildUIFilter(); + } + } + + public void TestStarted(ITestAdaptor testName) + { + } + + public void TestFinished(ITestResultAdaptor test) + { + var result = new TestRunnerResult(test); + if (TestRunnerWindow.s_Instance == null) + { + WindowResultUpdaterDataHolder.instance.CachedResults.Add(result); + return; + } + + TestRunnerWindow.s_Instance.m_SelectedTestTypes.UpdateResult(result); + } + + public void TestTreeRebuild(ITestAdaptor test) + { + if (TestRunnerWindow.s_Instance == null) + { + return; + } + + TestRunnerWindow.s_Instance.m_SelectedTestTypes.UpdateTestTree(test); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta new file mode 100644 index 0000000..d9e35df --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d468ee3657be7a43a2ef2178ec14239 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs new file mode 100644 index 0000000..a1fd48d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.TestTools.TestRunner.GUI; + +namespace TestRunner.Callbacks +{ + internal class WindowResultUpdaterDataHolder : ScriptableSingleton + { + public List CachedResults = new List(); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs.meta new file mode 100644 index 0000000..aed0d8c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82075836be5e0c64bbe84e1f9436682e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs new file mode 100644 index 0000000..8776887 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System.Reflection; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditModePcHelper : TestCommandPcHelper + { + public override void SetEnumeratorPC(IEnumerator enumerator, int pc) + { + GetPCFieldInfo(enumerator).SetValue(enumerator, pc); + } + + public override int GetEnumeratorPC(IEnumerator enumerator) + { + if (enumerator == null) + { + return 0; + } + return (int)GetPCFieldInfo(enumerator).GetValue(enumerator); + } + + private FieldInfo GetPCFieldInfo(IEnumerator enumerator) + { + var field = enumerator.GetType().GetField("$PC", BindingFlags.NonPublic | BindingFlags.Instance); + if (field == null) // Roslyn + field = enumerator.GetType().GetField("<>1__state", BindingFlags.NonPublic | BindingFlags.Instance); + + return field; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta new file mode 100644 index 0000000..ce559af --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d16f2e78a356d34c9a32108929de932 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs new file mode 100644 index 0000000..28357a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs @@ -0,0 +1,438 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; +using UnityEngine; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.TestRunner; +using UnityEngine.TestTools; +using UnityEngine.TestTools.TestRunner.GUI; +using UnityEditor.Callbacks; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IUnityTestAssemblyRunnerFactory + { + IUnityTestAssemblyRunner Create(TestPlatform testPlatform, WorkItemFactory factory); + } + + internal class UnityTestAssemblyRunnerFactory : IUnityTestAssemblyRunnerFactory + { + public IUnityTestAssemblyRunner Create(TestPlatform testPlatform, WorkItemFactory factory) + { + return new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), factory); + } + } + + [Serializable] + internal class EditModeRunner : ScriptableObject, IDisposable + { + [SerializeField] + private Filter[] m_Filters; + + //The counter from the IEnumerator object + [SerializeField] + private int m_CurrentPC; + + [SerializeField] + private bool m_ExecuteOnEnable; + + [SerializeField] + private List m_AlreadyStartedTests; + + [SerializeField] + private List m_ExecutedTests; + + [SerializeField] + private List m_CallbackObjects = new List(); + + [SerializeField] + private TestStartedEvent m_TestStartedEvent = new TestStartedEvent(); + + [SerializeField] + private TestFinishedEvent m_TestFinishedEvent = new TestFinishedEvent(); + + [SerializeField] + private RunStartedEvent m_RunStartedEvent = new RunStartedEvent(); + + [SerializeField] + private RunFinishedEvent m_RunFinishedEvent = new RunFinishedEvent(); + + [SerializeField] + private TestRunnerStateSerializer m_TestRunnerStateSerializer = new TestRunnerStateSerializer(); + + [SerializeField] + private bool m_RunningTests; + + [SerializeField] + private TestPlatform m_TestPlatform; + + [SerializeField] + private object m_CurrentYieldObject; + + [SerializeField] + private BeforeAfterTestCommandState m_SetUpTearDownState; + [SerializeField] + private BeforeAfterTestCommandState m_OuterUnityTestActionState; + + [SerializeField] + public bool RunFinished = false; + + public bool RunningSynchronously { get; private set; } + + internal IUnityTestAssemblyRunner m_Runner; + + private ConstructDelegator m_ConstructDelegator; + + private IEnumerator m_RunStep; + + public IUnityTestAssemblyRunnerFactory UnityTestAssemblyRunnerFactory { get; set; } + + public void Init(Filter[] filters, TestPlatform platform, bool runningSynchronously) + { + m_Filters = filters; + m_TestPlatform = platform; + m_AlreadyStartedTests = new List(); + m_ExecutedTests = new List(); + RunningSynchronously = runningSynchronously; + InitRunner(); + } + + private void InitRunner() + { + //We give the EditMode platform here so we dont suddenly create Playmode work items in the test Runner. + m_Runner = (UnityTestAssemblyRunnerFactory ?? new UnityTestAssemblyRunnerFactory()).Create(TestPlatform.EditMode, new EditmodeWorkItemFactory()); + var testAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); + var assemblies = testAssemblyProvider.GetAssembliesGroupedByType(m_TestPlatform).Select(x => x.Assembly).ToArray(); + var loadedTests = m_Runner.Load(assemblies, TestPlatform.EditMode, + UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(m_TestPlatform)); + loadedTests.ParseForNameDuplicates(); + CallbacksDelegator.instance.TestTreeRebuild(loadedTests); + hideFlags |= HideFlags.DontSave; + EnumerableSetUpTearDownCommand.ActivePcHelper = new EditModePcHelper(); + OuterUnityTestActionCommand.ActivePcHelper = new EditModePcHelper(); + } + + public void OnEnable() + { + if (m_ExecuteOnEnable) + { + InitRunner(); + m_ExecuteOnEnable = false; + foreach (var callback in m_CallbackObjects) + { + AddListeners(callback as ITestRunnerListener); + } + m_ConstructDelegator = new ConstructDelegator(m_TestRunnerStateSerializer); + + EnumeratorStepHelper.SetEnumeratorPC(m_CurrentPC); + + UnityWorkItemDataHolder.alreadyExecutedTests = m_ExecutedTests.Select(x => x.uniqueName).ToList(); + UnityWorkItemDataHolder.alreadyStartedTests = m_AlreadyStartedTests; + Run(); + } + } + + public void TestStartedEvent(ITest test) + { + m_AlreadyStartedTests.Add(test.GetUniqueName()); + } + + public void TestFinishedEvent(ITestResult testResult) + { + m_AlreadyStartedTests.Remove(testResult.Test.GetUniqueName()); + m_ExecutedTests.Add(TestResultSerializer.MakeFromTestResult(testResult)); + } + + public void Run() + { + EditModeTestCallbacks.RestoringTestContext += OnRestoringTest; + var context = m_Runner.GetCurrentContext(); + if (m_SetUpTearDownState == null) + { + m_SetUpTearDownState = CreateInstance(); + } + context.SetUpTearDownState = m_SetUpTearDownState; + + if (m_OuterUnityTestActionState == null) + { + m_OuterUnityTestActionState = CreateInstance(); + } + context.OuterUnityTestActionState = m_OuterUnityTestActionState; + + if (!m_RunningTests) + { + m_RunStartedEvent.Invoke(m_Runner.LoadedTest); + } + + if (m_ConstructDelegator == null) + m_ConstructDelegator = new ConstructDelegator(m_TestRunnerStateSerializer); + + Reflect.ConstructorCallWrapper = m_ConstructDelegator.Delegate; + m_TestStartedEvent.AddListener(TestStartedEvent); + m_TestFinishedEvent.AddListener(TestFinishedEvent); + + AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload; + + RunningTests = true; + + EditorApplication.LockReloadAssemblies(); + + var testListenerWrapper = new TestListenerWrapper(m_TestStartedEvent, m_TestFinishedEvent); + m_RunStep = m_Runner.Run(testListenerWrapper, GetFilter()).GetEnumerator(); + m_RunningTests = true; + + if (!RunningSynchronously) + EditorApplication.update += TestConsumer; + } + + public void CompleteSynchronously() + { + while (!m_Runner.IsTestComplete) + TestConsumer(); + } + + private void OnBeforeAssemblyReload() + { + EditorApplication.update -= TestConsumer; + + if (m_ExecuteOnEnable) + { + AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload; + return; + } + + if (m_Runner != null && m_Runner.TopLevelWorkItem != null) + m_Runner.TopLevelWorkItem.ResultedInDomainReload = true; + + if (RunningTests) + { + Debug.LogError("TestRunner: Unexpected assembly reload happened while running tests"); + + EditorUtility.ClearProgressBar(); + + if (m_Runner.GetCurrentContext() != null && m_Runner.GetCurrentContext().CurrentResult != null) + { + m_Runner.GetCurrentContext().CurrentResult.SetResult(ResultState.Cancelled, "Unexpected assembly reload happened"); + } + OnRunCancel(); + } + } + + private bool RunningTests; + + private Stack StepStack = new Stack(); + + private bool MoveNextAndUpdateYieldObject() + { + var result = m_RunStep.MoveNext(); + + if (result) + { + m_CurrentYieldObject = m_RunStep.Current; + while (m_CurrentYieldObject is IEnumerator) // going deeper + { + var currentEnumerator = (IEnumerator)m_CurrentYieldObject; + + // go deeper and add parent to stack + StepStack.Push(m_RunStep); + + m_RunStep = currentEnumerator; + m_CurrentYieldObject = m_RunStep.Current; + } + + if (StepStack.Count > 0 && m_CurrentYieldObject != null) // not null and not IEnumerator, nested + { + Debug.LogError("EditMode test can only yield null, but not <" + m_CurrentYieldObject.GetType().Name + ">"); + } + + return true; + } + + if (StepStack.Count == 0) // done + return false; + + m_RunStep = StepStack.Pop(); // going up + return MoveNextAndUpdateYieldObject(); + } + + private void TestConsumer() + { + var moveNext = MoveNextAndUpdateYieldObject(); + + if (m_CurrentYieldObject != null) + { + InvokeDelegator(); + } + + if (!moveNext && !m_Runner.IsTestComplete) + { + CompleteTestRun(); + throw new IndexOutOfRangeException("There are no more elements to process and IsTestComplete is false"); + } + + if (m_Runner.IsTestComplete) + { + CompleteTestRun(); + } + } + + private void CompleteTestRun() + { + if (!RunningSynchronously) + EditorApplication.update -= TestConsumer; + + TestLauncherBase.ExecutePostBuildCleanupMethods(this.GetLoadedTests(), this.GetFilter(), Application.platform); + + m_RunFinishedEvent.Invoke(m_Runner.Result); + RunFinished = true; + + if (m_ConstructDelegator != null) + m_ConstructDelegator.DestroyCurrentTestObjectIfExists(); + Dispose(); + UnityWorkItemDataHolder.alreadyExecutedTests = null; + } + + private void OnRestoringTest() + { + var item = m_ExecutedTests.Find(t => t.fullName == UnityTestExecutionContext.CurrentContext.CurrentTest.FullName); + if (item != null) + { + item.RestoreTestResult(UnityTestExecutionContext.CurrentContext.CurrentResult); + } + } + + private static bool IsCancelled() + { + return UnityTestExecutionContext.CurrentContext.ExecutionStatus == TestExecutionStatus.AbortRequested || UnityTestExecutionContext.CurrentContext.ExecutionStatus == TestExecutionStatus.StopRequested; + } + + private void InvokeDelegator() + { + if (m_CurrentYieldObject == null) + { + return; + } + + if (IsCancelled()) + { + return; + } + + if (m_CurrentYieldObject is RestoreTestContextAfterDomainReload) + { + if (m_TestRunnerStateSerializer.ShouldRestore()) + { + m_TestRunnerStateSerializer.RestoreContext(); + } + + return; + } + + try + { + if (m_CurrentYieldObject is IEditModeTestYieldInstruction) + { + var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)m_CurrentYieldObject; + if (editModeTestYieldInstruction.ExpectDomainReload) + { + PrepareForDomainReload(); + } + return; + } + } + catch (Exception e) + { + UnityTestExecutionContext.CurrentContext.CurrentResult.RecordException(e); + return; + } + + Debug.LogError("EditMode test can only yield null"); + } + + private void CompilationFailureWatch() + { + if (EditorApplication.isCompiling) + return; + + EditorApplication.update -= CompilationFailureWatch; + + if (EditorUtility.scriptCompilationFailed) + { + EditorUtility.ClearProgressBar(); + OnRunCancel(); + } + } + + private void PrepareForDomainReload() + { + m_TestRunnerStateSerializer.SaveContext(); + m_CurrentPC = EnumeratorStepHelper.GetEnumeratorPC(TestEnumerator.Enumerator); + m_ExecuteOnEnable = true; + + RunningTests = false; + } + + public T AddEventHandler() where T : ScriptableObject, ITestRunnerListener + { + var eventHandler = CreateInstance(); + eventHandler.hideFlags |= HideFlags.DontSave; + m_CallbackObjects.Add(eventHandler); + + AddListeners(eventHandler); + + return eventHandler; + } + + private void AddListeners(ITestRunnerListener eventHandler) + { + m_TestStartedEvent.AddListener(eventHandler.TestStarted); + m_TestFinishedEvent.AddListener(eventHandler.TestFinished); + m_RunStartedEvent.AddListener(eventHandler.RunStarted); + m_RunFinishedEvent.AddListener(eventHandler.RunFinished); + } + + public void Dispose() + { + Reflect.MethodCallWrapper = null; + EditorApplication.update -= TestConsumer; + + DestroyImmediate(this); + + if (m_CallbackObjects != null) + { + foreach (var obj in m_CallbackObjects) + { + DestroyImmediate(obj); + } + m_CallbackObjects.Clear(); + } + RunningTests = false; + EditorApplication.UnlockReloadAssemblies(); + } + + public void OnRunCancel() + { + UnityWorkItemDataHolder.alreadyExecutedTests = null; + m_ExecuteOnEnable = false; + m_Runner.StopRun(); + RunFinished = true; + } + + public ITest GetLoadedTests() + { + return m_Runner.LoadedTest; + } + + public ITestFilter GetFilter() + { + return new OrFilter(m_Filters.Select(filter => filter.ToRuntimeTestRunnerFilter(RunningSynchronously).BuildNUnitFilter()).ToArray()); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta new file mode 100644 index 0000000..78c0039 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9219e99d466b7741a057132d1994f35 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs new file mode 100644 index 0000000..c2bf921 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs @@ -0,0 +1,14 @@ +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditmodeWorkItemFactory : WorkItemFactory + { + protected override UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest) + { + return new EditorEnumeratorTestWorkItem(method, filter); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta new file mode 100644 index 0000000..ab4bd45 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3dde15f260b0dd1469e60d16eaa795dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs new file mode 100644 index 0000000..acf09dd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorEnumeratorTestWorkItem : UnityWorkItem + { + private TestCommand m_Command; + public EditorEnumeratorTestWorkItem(TestMethod test, ITestFilter filter) + : base(test, null) + { + m_Command = TestCommandBuilder.BuildTestCommand(test, filter); + } + + private static IEnumerableTestMethodCommand FindFirstIEnumerableTestMethodCommand(TestCommand command) + { + if (command == null) + { + return null; + } + + if (command is IEnumerableTestMethodCommand) + { + return (IEnumerableTestMethodCommand)command; + } + + if (command is DelegatingTestCommand) + { + var delegatingTestCommand = (DelegatingTestCommand)command; + return FindFirstIEnumerableTestMethodCommand(delegatingTestCommand.GetInnerCommand()); + } + return null; + } + + protected override IEnumerable PerformWork() + { + if (IsCancelledRun()) + { + yield break; + } + + if (m_DontRunRestoringResult) + { + if (EditModeTestCallbacks.RestoringTestContext == null) + { + throw new NullReferenceException("RestoringTestContext is not set"); + } + EditModeTestCallbacks.RestoringTestContext(); + Result = Context.CurrentResult; + yield break; + } + + try + { + if (IsCancelledRun()) + { + yield break; + } + + if (m_Command is SkipCommand) + { + m_Command.Execute(Context); + Result = Context.CurrentResult; + yield break; + } + + //Check if we can execute this test + var firstEnumerableCommand = FindFirstIEnumerableTestMethodCommand(m_Command); + if (firstEnumerableCommand == null) + { + Context.CurrentResult.SetResult(ResultState.Error, "Returning IEnumerator but not using test attribute supporting this"); + yield break; + } + if (Context.TestCaseTimeout == 0) + { + Context.TestCaseTimeout = k_DefaultTimeout; + } + if (m_Command.Test.Method.ReturnType.IsType(typeof(IEnumerator))) + { + if (m_Command is ApplyChangesToContextCommand) + { + var applyChangesToContextCommand = ((ApplyChangesToContextCommand)m_Command); + applyChangesToContextCommand.ApplyChanges(Context); + m_Command = applyChangesToContextCommand.GetInnerCommand(); + } + + var innerCommand = m_Command as IEnumerableTestMethodCommand; + if (innerCommand == null) + { + Debug.Log("failed getting innerCommand"); + throw new Exception("Tests returning IEnumerator can only use test attributes handling those"); + } + + foreach (var workItemStep in innerCommand.ExecuteEnumerable(Context)) + { + if (IsCancelledRun()) + { + yield break; + } + + if (workItemStep is TestEnumerator) + { + if (EnumeratorStepHelper.UpdateEnumeratorPcIfNeeded(TestEnumerator.Enumerator)) + { + yield return new RestoreTestContextAfterDomainReload(); + } + continue; + } + + if (workItemStep is AsyncOperation) + { + var asyncOperation = (AsyncOperation)workItemStep; + while (!asyncOperation.isDone) + { + if (IsCancelledRun()) + { + yield break; + } + + yield return null; + } + continue; + } + + ResultedInDomainReload = false; + + if (workItemStep is IEditModeTestYieldInstruction) + { + var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)workItemStep; + yield return editModeTestYieldInstruction; + var enumerator = editModeTestYieldInstruction.Perform(); + while (true) + { + bool moveNext; + try + { + moveNext = enumerator.MoveNext(); + } + catch (Exception e) + { + Context.CurrentResult.RecordException(e); + break; + } + + if (!moveNext) + { + break; + } + yield return null; + } + } + else + { + yield return workItemStep; + } + } + + Result = Context.CurrentResult; + EditorApplication.isPlaying = false; + yield return null; + } + } + finally + { + WorkItemComplete(); + } + } + + private bool IsCancelledRun() + { + return Context.ExecutionStatus == TestExecutionStatus.AbortRequested || Context.ExecutionStatus == TestExecutionStatus.StopRequested; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta new file mode 100644 index 0000000..982f7ee --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ebc1994f9a3d5649a1201d3a84b38df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs new file mode 100644 index 0000000..46fc714 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Reflection; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EnumeratorStepHelper + { + private static int m_PC; + + public static void SetEnumeratorPC(int pc) + { + m_PC = pc; + } + + /// + /// Gets the current enumerator PC + /// + /// + /// The PC + /// 0 if no current Enumeration + /// + public static int GetEnumeratorPC(IEnumerator enumerator) + { + if (enumerator == null) + { + return 0; + } + return (int)GetPCFieldInfo(enumerator).GetValue(enumerator); + } + + public static bool UpdateEnumeratorPcIfNeeded(IEnumerator enumerator) + { + if (m_PC != 0) + { + GetPCFieldInfo(enumerator).SetValue(enumerator, m_PC); + m_PC = 0; + return true; + } + return false; + } + + private static FieldInfo GetPCFieldInfo(IEnumerator enumerator) + { + var field = enumerator.GetType().GetField("$PC", BindingFlags.NonPublic | BindingFlags.Instance); + if (field == null) // Roslyn + field = enumerator.GetType().GetField("<>1__state", BindingFlags.NonPublic | BindingFlags.Instance); + + return field; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta new file mode 100644 index 0000000..08662b9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 901b761c5c1e22d4e8a3ba7d95bc1f5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages.meta new file mode 100644 index 0000000..0660c63 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9682e749d3efc642af54d789d9090a6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs new file mode 100644 index 0000000..796c531 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class EnterPlayMode : IEditModeTestYieldInstruction + { + public bool ExpectDomainReload { get; } + public bool ExpectedPlaymodeState { get; private set; } + + public EnterPlayMode(bool expectDomainReload = true) + { + ExpectDomainReload = expectDomainReload; + } + + public IEnumerator Perform() + { + if (EditorApplication.isPlaying) + { + throw new Exception("Editor is already in PlayMode"); + } + if (EditorUtility.scriptCompilationFailed) + { + throw new Exception("Script compilation failed"); + } + yield return null; + ExpectedPlaymodeState = true; + + EditorApplication.UnlockReloadAssemblies(); + EditorApplication.isPlaying = true; + + while (!EditorApplication.isPlaying) + { + yield return null; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta new file mode 100644 index 0000000..fa1dc2e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bd5a110ed89025499ddee8c7e73778e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs new file mode 100644 index 0000000..2eed28b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class ExitPlayMode : IEditModeTestYieldInstruction + { + public bool ExpectDomainReload { get; } + public bool ExpectedPlaymodeState { get; private set; } + + public ExitPlayMode() + { + ExpectDomainReload = false; + ExpectedPlaymodeState = false; + } + + public IEnumerator Perform() + { + if (!EditorApplication.isPlayingOrWillChangePlaymode) + { + throw new Exception("Editor is already in EditMode"); + } + + EditorApplication.isPlaying = false; + while (EditorApplication.isPlaying) + { + yield return null; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta new file mode 100644 index 0000000..1de769d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 408674d91d506a54aac9a7f07951c018 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs new file mode 100644 index 0000000..52af5a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + public class RecompileScripts : IEditModeTestYieldInstruction + { + public RecompileScripts() : this(true) + { + } + + public RecompileScripts(bool expectScriptCompilation) : this(expectScriptCompilation, true) + { + } + + public RecompileScripts(bool expectScriptCompilation, bool expectScriptCompilationSuccess) + { + ExpectScriptCompilation = expectScriptCompilation; + ExpectScriptCompilationSuccess = expectScriptCompilationSuccess; + ExpectDomainReload = true; + } + + public bool ExpectDomainReload { get; private set; } + public bool ExpectedPlaymodeState { get; } + public bool ExpectScriptCompilation { get; private set; } + public bool ExpectScriptCompilationSuccess { get; private set; } + public static RecompileScripts Current { get; private set; } + + public IEnumerator Perform() + { + Current = this; + + // We need to yield, to give the test runner a chance to prepare for the domain reload + // If the script compilation happens very fast, then EditModeRunner.MoveNextAndUpdateYieldObject will not have a chance to set m_CurrentYieldObject + // This really should be fixed in EditModeRunner.MoveNextAndUpdateYieldObject + yield return null; + + AssetDatabase.Refresh(); + + if (ExpectScriptCompilation && !EditorApplication.isCompiling) + { + Current = null; + throw new Exception("Editor does not need to recompile scripts"); + } + + EditorApplication.UnlockReloadAssemblies(); + + while (EditorApplication.isCompiling) + { + yield return null; + } + + Current = null; + + if (ExpectScriptCompilationSuccess && EditorUtility.scriptCompilationFailed) + { + EditorApplication.LockReloadAssemblies(); + throw new Exception("Script compilation failed"); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta new file mode 100644 index 0000000..f764d6e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9202fbba95ea8294cb5e718f028f21b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs new file mode 100644 index 0000000..2b53215 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections; +using UnityEditor; +using UnityEditorInternal; + +namespace UnityEngine.TestTools +{ + public class WaitForDomainReload : IEditModeTestYieldInstruction + { + public WaitForDomainReload() + { + ExpectDomainReload = true; + } + + public bool ExpectDomainReload { get;  } + public bool ExpectedPlaymodeState { get; } + + public IEnumerator Perform() + { + EditorApplication.UnlockReloadAssemblies(); + + while (InternalEditorUtility.IsScriptReloadRequested() || EditorApplication.isCompiling) + { + yield return null; + } + + // Add this point the domain reload should have occured and stopped any further progress on the instruction. + EditorApplication.LockReloadAssemblies(); + throw new Exception( + EditorUtility.scriptCompilationFailed ? + "Script compilation failed" : + "Expected domain reload, but it did not occur"); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta new file mode 100644 index 0000000..7fa45cb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5df3c21c5237c994db89660fbdfee07d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils.meta new file mode 100644 index 0000000..78ceec0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f5bbb88ca730434483440cbc0278ef6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs new file mode 100644 index 0000000..ff540e6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class CachingTestListProvider + { + private readonly ITestListProvider m_InnerTestListProvider; + private readonly ITestListCache m_TestListCache; + private readonly ITestAdaptorFactory m_TestAdaptorFactory; + public CachingTestListProvider(ITestListProvider innerTestListProvider, ITestListCache testListCache, ITestAdaptorFactory testAdaptorFactory) + { + m_InnerTestListProvider = innerTestListProvider; + m_TestListCache = testListCache; + m_TestAdaptorFactory = testAdaptorFactory; + } + + public IEnumerator GetTestListAsync(TestPlatform platform) + { + var testFromCache = m_TestListCache.GetTestFromCacheAsync(platform); + while (testFromCache.MoveNext()) + { + yield return null; + } + + + if (testFromCache.Current != null) + { + yield return testFromCache.Current; + } + else + { + var test = m_InnerTestListProvider.GetTestListAsync(platform); + while (test.MoveNext()) + { + yield return null; + } + + test.Current.ParseForNameDuplicates(); + m_TestListCache.CacheTest(platform, test.Current); + yield return m_TestAdaptorFactory.Create(test.Current); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta new file mode 100644 index 0000000..5756623 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26f3e7301af463c4ca72fa98d59b429e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs new file mode 100644 index 0000000..bc0fe19 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs @@ -0,0 +1,13 @@ +using System.Linq; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorAssembliesProxy : IEditorAssembliesProxy + { + public IAssemblyWrapper[] loadedAssemblies + { + get { return EditorAssemblies.loadedAssemblies.OrderBy(a => a.FullName).Select(x => new EditorAssemblyWrapper(x)).ToArray(); } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta new file mode 100644 index 0000000..fdb1b6c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f96d0ea807c081145a1170ed1b6d71e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs new file mode 100644 index 0000000..804eb4b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs @@ -0,0 +1,18 @@ +using System.Reflection; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorAssemblyWrapper : AssemblyWrapper + { + public EditorAssemblyWrapper(Assembly assembly) + : base(assembly) {} + + public override AssemblyName[] GetReferencedAssemblies() + { + return Assembly.GetReferencedAssemblies(); + } + + public override string Location { get { return Assembly.Location; } } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta new file mode 100644 index 0000000..70bd58b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20cdb37e6fea6d946bbb84d2c923db85 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs new file mode 100644 index 0000000..ad0b5ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs @@ -0,0 +1,17 @@ +using UnityEditor.Scripting.ScriptCompilation; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorCompilationInterfaceProxy : IEditorCompilationInterfaceProxy + { + public ScriptAssembly[] GetAllEditorScriptAssemblies() + { + return EditorCompilationInterface.Instance.GetAllEditorScriptAssemblies(EditorCompilationInterface.GetAdditionalEditorScriptCompilationOptions()); + } + + public PrecompiledAssembly[] GetAllPrecompiledAssemblies() + { + return EditorCompilationInterface.Instance.GetAllPrecompiledAssemblies(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta new file mode 100644 index 0000000..ef5ade0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9b23632c77de204abfe8bf7168d48c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs new file mode 100644 index 0000000..8a46cbf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor.Scripting.ScriptCompilation; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class EditorLoadedTestAssemblyProvider : IEditorLoadedTestAssemblyProvider + { + private const string k_NunitAssemblyName = "nunit.framework"; + private const string k_TestRunnerAssemblyName = "UnityEngine.TestRunner"; + internal const string k_PerformanceTestingAssemblyName = "Unity.PerformanceTesting"; + + private readonly IEditorAssembliesProxy m_EditorAssembliesProxy; + private readonly ScriptAssembly[] m_AllEditorScriptAssemblies; + private readonly PrecompiledAssembly[] m_AllPrecompiledAssemblies; + + public EditorLoadedTestAssemblyProvider(IEditorCompilationInterfaceProxy compilationInterfaceProxy, IEditorAssembliesProxy editorAssembliesProxy) + { + m_EditorAssembliesProxy = editorAssembliesProxy; + m_AllEditorScriptAssemblies = compilationInterfaceProxy.GetAllEditorScriptAssemblies(); + m_AllPrecompiledAssemblies = compilationInterfaceProxy.GetAllPrecompiledAssemblies(); + } + + public List GetAssembliesGroupedByType(TestPlatform mode) + { + var assemblies = GetAssembliesGroupedByTypeAsync(mode); + while (assemblies.MoveNext()) + { + } + + return assemblies.Current.Where(pair => mode.IsFlagIncluded(pair.Key)).SelectMany(pair => pair.Value).ToList(); + } + + public IEnumerator>> GetAssembliesGroupedByTypeAsync(TestPlatform mode) + { + IAssemblyWrapper[] loadedAssemblies = m_EditorAssembliesProxy.loadedAssemblies; + + IDictionary> result = new Dictionary>() + { + {TestPlatform.EditMode, new List() }, + {TestPlatform.PlayMode, new List() } + }; + + foreach (var loadedAssembly in loadedAssemblies) + { + if (loadedAssembly.GetReferencedAssemblies().Any(x => x.Name == k_NunitAssemblyName || x.Name == k_TestRunnerAssemblyName || x.Name == k_PerformanceTestingAssemblyName)) + { + var assemblyName = new FileInfo(loadedAssembly.Location).Name; + var scriptAssemblies = m_AllEditorScriptAssemblies.Where(x => x.Filename == assemblyName).ToList(); + var precompiledAssemblies = m_AllPrecompiledAssemblies.Where(x => new FileInfo(x.Path).Name == assemblyName).ToList(); + if (scriptAssemblies.Count < 1 && precompiledAssemblies.Count < 1) + { + continue; + } + + var assemblyFlags = scriptAssemblies.Any() ? scriptAssemblies.Single().Flags : precompiledAssemblies.Single().Flags; + var assemblyType = (assemblyFlags & AssemblyFlags.EditorOnly) == AssemblyFlags.EditorOnly ? TestPlatform.EditMode : TestPlatform.PlayMode; + result[assemblyType].Add(loadedAssembly); + yield return null; + } + } + + yield return result; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta new file mode 100644 index 0000000..efba6a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 033c884ba52437d49bc55935939ef1c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs new file mode 100644 index 0000000..35ec87d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs @@ -0,0 +1,9 @@ +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IEditorAssembliesProxy + { + IAssemblyWrapper[] loadedAssemblies { get; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta new file mode 100644 index 0000000..ad00f55 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98808b11e78f6c84a841a6b4bc5a29d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs new file mode 100644 index 0000000..25defb7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs @@ -0,0 +1,10 @@ +using UnityEditor.Scripting.ScriptCompilation; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IEditorCompilationInterfaceProxy + { + ScriptAssembly[] GetAllEditorScriptAssemblies(); + PrecompiledAssembly[] GetAllPrecompiledAssemblies(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta new file mode 100644 index 0000000..2bc608b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28c8fcb831e6e734a9f564bc4f495eba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs new file mode 100644 index 0000000..d54bda7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Utils; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface IEditorLoadedTestAssemblyProvider + { + List GetAssembliesGroupedByType(TestPlatform mode); + IEnumerator>> GetAssembliesGroupedByTypeAsync(TestPlatform mode); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs.meta new file mode 100644 index 0000000..cbe4897 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 936b6288befc460409cfdff3ac92fc95 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs new file mode 100644 index 0000000..5df7a78 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestListCache + { + void CacheTest(TestPlatform platform, ITest test); + IEnumerator GetTestFromCacheAsync(TestPlatform platform); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta new file mode 100644 index 0000000..41943d4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a704c010bcdb1ec4a9f3417b3c393164 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs new file mode 100644 index 0000000..d11fe47 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestListCacheData + { + List platforms { get; } + List cachedData { get; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta new file mode 100644 index 0000000..b229c0c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7043e9a330ac2d84a80a965ada4589ad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs new file mode 100644 index 0000000..b734f53 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestListProvider + { + IEnumerator GetTestListAsync(TestPlatform platform); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta new file mode 100644 index 0000000..b62929b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64689f8b25eadac4da519e96f514b653 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs new file mode 100644 index 0000000..e69bfcb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListCache : ITestListCache + { + private readonly ITestAdaptorFactory m_TestAdaptorFactory; + private readonly IRemoteTestResultDataFactory m_TestResultDataFactory; + private readonly ITestListCacheData m_TestListCacheData; + + public TestListCache(ITestAdaptorFactory testAdaptorFactory, IRemoteTestResultDataFactory testResultDataFactory, ITestListCacheData testListCacheData) + { + m_TestAdaptorFactory = testAdaptorFactory; + m_TestResultDataFactory = testResultDataFactory; + m_TestListCacheData = testListCacheData; + } + + public void CacheTest(TestPlatform platform, ITest test) + { + var index = m_TestListCacheData.platforms.IndexOf(platform); + if (index < 0) + { + m_TestListCacheData.cachedData.Add(test); + m_TestListCacheData.platforms.Add(platform); + } + else + { + m_TestListCacheData.cachedData[index] = test; + } + } + + public IEnumerator GetTestFromCacheAsync(TestPlatform platform) + { + var index = m_TestListCacheData.platforms.IndexOf(platform); + if (index < 0) + { + yield return null; + yield break; + } + + var testData = m_TestListCacheData.cachedData[index]; + yield return m_TestAdaptorFactory.Create(testData); + } + + [Callbacks.DidReloadScripts] + private static void ScriptReloaded() + { + TestListCacheData.instance.cachedData.Clear(); + TestListCacheData.instance.platforms.Clear(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta new file mode 100644 index 0000000..ea8d096 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d685d97a1eb004f49afea0cc982ff728 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs new file mode 100644 index 0000000..175082f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using UnityEngine; +using UnityEngine.TestRunner.TestLaunchers; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListCacheData : ScriptableSingleton, ITestListCacheData + { + [SerializeField] + private List m_Platforms = new List(); + + [SerializeField] + private List m_CachedData = new List(); + + public List platforms + { + get { return m_Platforms; } + } + + public List cachedData + { + get { return m_CachedData; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta new file mode 100644 index 0000000..2ad79ac --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1b6399349763114d9361bc6dfcd025b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs new file mode 100644 index 0000000..0df60c3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListJob + { + private CachingTestListProvider m_TestListProvider; + private TestPlatform m_Platform; + private Action m_Callback; + private IEnumerator m_ResultEnumerator; + public TestListJob(CachingTestListProvider testListProvider, TestPlatform platform, Action callback) + { + m_TestListProvider = testListProvider; + m_Platform = platform; + m_Callback = callback; + } + + public void Start() + { + m_ResultEnumerator = m_TestListProvider.GetTestListAsync(m_Platform); + EditorApplication.update += EditorUpdate; + } + + private void EditorUpdate() + { + if (!m_ResultEnumerator.MoveNext()) + { + m_Callback(m_ResultEnumerator.Current); + EditorApplication.update -= EditorUpdate; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta new file mode 100644 index 0000000..a17c091 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dec9066d4afefe444be0dad3f137730d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs new file mode 100644 index 0000000..1da846e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestListProvider : ITestListProvider + { + private readonly EditorLoadedTestAssemblyProvider m_AssemblyProvider; + private readonly UnityTestAssemblyBuilder m_AssemblyBuilder; + + public TestListProvider(EditorLoadedTestAssemblyProvider assemblyProvider, UnityTestAssemblyBuilder assemblyBuilder) + { + m_AssemblyProvider = assemblyProvider; + m_AssemblyBuilder = assemblyBuilder; + } + + public IEnumerator GetTestListAsync(TestPlatform platform) + { + var assembliesTask = m_AssemblyProvider.GetAssembliesGroupedByTypeAsync(platform); + while (assembliesTask.MoveNext()) + { + yield return null; + } + + var assemblies = assembliesTask.Current.Where(pair => platform.IsFlagIncluded(pair.Key)) + .SelectMany(pair => pair.Value.Select(assemblyInfo => Tuple.Create(assemblyInfo.Assembly, pair.Key))).ToArray(); + + var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(platform); + var test = m_AssemblyBuilder.BuildAsync(assemblies.Select(a => a.Item1).ToArray(), assemblies.Select(a => a.Item2).ToArray(), settings); + while (test.MoveNext()) + { + yield return null; + } + + yield return test.Current; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta new file mode 100644 index 0000000..c0e66d5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f15cbb987069826429540d0ea0937442 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindow.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindow.cs new file mode 100644 index 0000000..35dd0b5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindow.cs @@ -0,0 +1,275 @@ +using System; +using UnityEditor.Callbacks; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.GUI; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + [Serializable] + /// + /// The TestRunnerWindow class is repsonsible for drawing the Test Runner window. + /// + public class TestRunnerWindow : EditorWindow, IHasCustomMenu + { + internal static class Styles + { + public static GUIStyle info; + public static GUIStyle testList; + + static Styles() + { + info = new GUIStyle(EditorStyles.wordWrappedLabel); + info.wordWrap = false; + info.stretchHeight = true; + info.margin.right = 15; + + testList = new GUIStyle("CN Box"); + testList.margin.top = 0; + testList.padding.left = 3; + } + } + + private readonly GUIContent m_GUIHorizontalSplit = EditorGUIUtility.TrTextContent("Horizontal layout"); + private readonly GUIContent m_GUIVerticalSplit = EditorGUIUtility.TrTextContent("Vertical layout"); + private readonly GUIContent m_GUIEnableaPlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Enable playmode tests for all assemblies"); + private readonly GUIContent m_GUIDisablePlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Disable playmode tests for all assemblies"); + private readonly GUIContent m_GUIRunPlayModeTestAsEditModeTests = EditorGUIUtility.TrTextContent("Run playmode tests as editmode tests"); + + internal static TestRunnerWindow s_Instance; + private bool m_IsBuilding; + [NonSerialized] + private bool m_Enabled; + internal TestFilterSettings filterSettings; + + [SerializeField] + private SplitterState m_Spl = new SplitterState(new float[] { 75, 25 }, new[] { 32, 32 }, null); + + private TestRunnerWindowSettings m_Settings; + + private enum TestRunnerMenuLabels + { + PlayMode = 0, + EditMode = 1 + } + [SerializeField] + private int m_TestTypeToolbarIndex = (int)TestRunnerMenuLabels.EditMode; + [SerializeField] + private PlayModeTestListGUI m_PlayModeTestListGUI; + [SerializeField] + private EditModeTestListGUI m_EditModeTestListGUI; + + internal TestListGUI m_SelectedTestTypes; + + private ITestRunnerApi m_testRunnerApi; + + private WindowResultUpdater m_WindowResultUpdater; + + [MenuItem("Window/General/Test Runner", false, 201, false)] + /// + /// Launches the Test Runner window. + /// + public static void ShowWindow() + { + s_Instance = GetWindow("Test Runner"); + s_Instance.Show(); + } + + internal static void ShowPlaymodeTestsRunnerWindowCodeBased() + { + ShowWindow(); + } + + static TestRunnerWindow() + { + InitBackgroundRunners(); + } + + private static void InitBackgroundRunners() + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + } + + [DidReloadScripts] + private static void CompilationCallback() + { + UpdateWindow(); + } + + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (s_Instance && state == PlayModeStateChange.EnteredEditMode && s_Instance.m_SelectedTestTypes.HasTreeData()) + { + //repaint message details after exit playmode + s_Instance.m_SelectedTestTypes.TestSelectionCallback(s_Instance.m_SelectedTestTypes.m_TestListState.selectedIDs.ToArray()); + s_Instance.Repaint(); + } + } + + internal void OnDestroy() + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + + private void OnEnable() + { + s_Instance = this; + SelectTestListGUI(m_TestTypeToolbarIndex); + + m_testRunnerApi = ScriptableObject.CreateInstance(); + m_WindowResultUpdater = new WindowResultUpdater(); + m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater); + } + + private void Enable() + { + m_Settings = new TestRunnerWindowSettings("UnityEditor.PlaymodeTestsRunnerWindow"); + filterSettings = new TestFilterSettings("UnityTest.IntegrationTestsRunnerWindow"); + + if (m_SelectedTestTypes == null) + { + SelectTestListGUI(m_TestTypeToolbarIndex); + } + + StartRetrieveTestList(); + m_SelectedTestTypes.Reload(); + m_Enabled = true; + } + + private void SelectTestListGUI(int testTypeToolbarIndex) + { + if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.PlayMode) + { + if (m_PlayModeTestListGUI == null) + { + m_PlayModeTestListGUI = new PlayModeTestListGUI(); + } + m_SelectedTestTypes = m_PlayModeTestListGUI; + } + else if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.EditMode) + { + if (m_EditModeTestListGUI == null) + { + m_EditModeTestListGUI = new EditModeTestListGUI(); + } + m_SelectedTestTypes = m_EditModeTestListGUI; + } + } + + private void StartRetrieveTestList() + { + if (!m_SelectedTestTypes.HasTreeData()) + { + var listToInit = m_SelectedTestTypes; + m_testRunnerApi.RetrieveTestList(m_SelectedTestTypes.TestMode, (rootTest) => + { + listToInit.Init(this, rootTest); + listToInit.Reload(); + }); + } + } + + internal void OnGUI() + { + if (!m_Enabled) + { + Enable(); + } + + if (BuildPipeline.isBuildingPlayer) + { + m_IsBuilding = true; + } + else if (m_IsBuilding) + { + m_IsBuilding = false; + Repaint(); + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + var selectedIndex = m_TestTypeToolbarIndex; + m_TestTypeToolbarIndex = GUILayout.Toolbar(m_TestTypeToolbarIndex, Enum.GetNames(typeof(TestRunnerMenuLabels)), "LargeButton", UnityEngine.GUI.ToolbarButtonSize.FitToContents); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + if (selectedIndex != m_TestTypeToolbarIndex) + { + SelectTestListGUI(m_TestTypeToolbarIndex); + StartRetrieveTestList(); + } + + EditorGUILayout.BeginVertical(); + using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode)) + { + m_SelectedTestTypes.PrintHeadPanel(); + } + EditorGUILayout.EndVertical(); + + if (m_Settings.verticalSplit) + SplitterGUILayout.BeginVerticalSplit(m_Spl); + else + SplitterGUILayout.BeginHorizontalSplit(m_Spl); + + EditorGUILayout.BeginVertical(); + EditorGUILayout.BeginVertical(Styles.testList); + m_SelectedTestTypes.RenderTestList(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndVertical(); + + m_SelectedTestTypes.RenderDetails(); + + if (m_Settings.verticalSplit) + SplitterGUILayout.EndVerticalSplit(); + else + SplitterGUILayout.EndHorizontalSplit(); + } + + /// + /// Adds additional menu items to the Test Runner window. + /// + /// The + public void AddItemsToMenu(GenericMenu menu) + { + menu.AddItem(m_GUIVerticalSplit, m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); + menu.AddItem(m_GUIHorizontalSplit, !m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); + + menu.AddSeparator(null); + + var playModeTestRunnerEnabled = PlayerSettings.playModeTestRunnerEnabled; + var currentActive = playModeTestRunnerEnabled ? m_GUIDisablePlaymodeTestsRunner : m_GUIEnableaPlaymodeTestsRunner; + + if (EditorPrefs.GetBool("InternalMode", false)) + { + menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () => + { + PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest; + }); + } + + menu.AddItem(currentActive, false, () => + { + PlayerSettings.playModeTestRunnerEnabled = !playModeTestRunnerEnabled; + EditorUtility.DisplayDialog(currentActive.text, "You need to restart the editor now", "Ok"); + }); + } + + internal void RebuildUIFilter() + { + if (m_SelectedTestTypes != null && m_SelectedTestTypes.HasTreeData()) + { + m_SelectedTestTypes.RebuildUIFilter(); + } + } + + internal static void UpdateWindow() + { + if (s_Instance != null && s_Instance.m_SelectedTestTypes != null) + { + s_Instance.m_SelectedTestTypes.Repaint(); + s_Instance.Repaint(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindow.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindow.cs.meta new file mode 100644 index 0000000..5cb0e86 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4dfcd3a631f61d248b7cc0b845d40345 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindowSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindowSettings.cs new file mode 100644 index 0000000..366df26 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindowSettings.cs @@ -0,0 +1,26 @@ +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestRunnerWindowSettings + { + public bool verticalSplit; + + private readonly string m_PrefsKey; + + public TestRunnerWindowSettings(string prefsKey) + { + m_PrefsKey = prefsKey; + verticalSplit = EditorPrefs.GetBool(m_PrefsKey + ".verticalSplit", true); + } + + public void ToggleVerticalSplit() + { + verticalSplit = !verticalSplit; + Save(); + } + + private void Save() + { + EditorPrefs.SetBool(m_PrefsKey + ".verticalSplit", verticalSplit); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta new file mode 100644 index 0000000..44bcc5a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b301b727225f1941974d69e61a55620 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings.meta new file mode 100644 index 0000000..4127631 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95b719082a664ea45bb56759eed1f271 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettings.cs new file mode 100644 index 0000000..d272037 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettings.cs @@ -0,0 +1,22 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner +{ + internal interface ITestSettings : IDisposable + { + ScriptingImplementation? scriptingBackend { get; set; } + + string Architecture { get; set; } + + ApiCompatibilityLevel? apiProfile { get; set; } + + bool? appleEnableAutomaticSigning { get; set; } + string appleDeveloperTeamID { get; set; } + ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } + string iOSManualProvisioningProfileID { get; set; } + ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } + string tvOSManualProvisioningProfileID { get; set; } + + void SetupProjectParameters(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta new file mode 100644 index 0000000..9a8563c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83eda34b7da01e04aa894f268158b0c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs new file mode 100644 index 0000000..701c91d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestSettingsDeserializer + { + ITestSettings GetSettingsFromJsonFile(string jsonFilePath); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta new file mode 100644 index 0000000..72c587e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d208a1684f8aa6a40ad91d6aa9600c14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettings.cs new file mode 100644 index 0000000..a5bdf7a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettings.cs @@ -0,0 +1,160 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner +{ + internal class TestSettings : ITestSettings + { + private readonly TestSetting[] m_Settings = + { + new TestSetting( + settings => settings.scriptingBackend, + () => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup), + implementation => PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.activeBuildTargetGroup, implementation.Value)), + new TestSetting( + settings => settings.Architecture, + () => EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android ? PlayerSettings.Android.targetArchitectures.ToString() : null, + architecture => + { + if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) + { + if (!string.IsNullOrEmpty(architecture)) + { + var targetArchitectures = (AndroidArchitecture)Enum.Parse(typeof(AndroidArchitecture), architecture, true); + PlayerSettings.Android.targetArchitectures = targetArchitectures; + } + } + }), + new TestSetting( + settings => settings.apiProfile, + () => PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup), + implementation => + { + if (Enum.IsDefined(typeof(ApiCompatibilityLevel), implementation.Value)) + { + PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.activeBuildTargetGroup, + implementation.Value); + } + }), + new TestSetting( + settings => settings.appleEnableAutomaticSigning, + () => PlayerSettings.iOS.appleEnableAutomaticSigning, + enableAutomaticSigning => + { + if (enableAutomaticSigning != null) + PlayerSettings.iOS.appleEnableAutomaticSigning = enableAutomaticSigning.Value; + }), + new TestSetting( + settings => settings.appleDeveloperTeamID, + () => PlayerSettings.iOS.appleDeveloperTeamID, + developerTeam => + { + if (developerTeam != null) + PlayerSettings.iOS.appleDeveloperTeamID = developerTeam; + }), + new TestSetting( + settings => settings.iOSManualProvisioningProfileType, + () => PlayerSettings.iOS.iOSManualProvisioningProfileType, + profileType => + { + if (profileType != null) + PlayerSettings.iOS.iOSManualProvisioningProfileType = profileType.Value; + }), + new TestSetting( + settings => settings.iOSManualProvisioningProfileID, + () => PlayerSettings.iOS.iOSManualProvisioningProfileID, + provisioningUUID => + { + if (provisioningUUID != null) + PlayerSettings.iOS.iOSManualProvisioningProfileID = provisioningUUID; + }), + new TestSetting( + settings => settings.tvOSManualProvisioningProfileType, + () => PlayerSettings.iOS.tvOSManualProvisioningProfileType, + profileType => + { + if (profileType != null) + PlayerSettings.iOS.tvOSManualProvisioningProfileType = profileType.Value; + }), + new TestSetting( + settings => settings.tvOSManualProvisioningProfileID, + () => PlayerSettings.iOS.tvOSManualProvisioningProfileID, + provisioningUUID => + { + if (provisioningUUID != null) + PlayerSettings.iOS.tvOSManualProvisioningProfileID = provisioningUUID; + }), + }; + + private bool m_Disposed; + + public ScriptingImplementation? scriptingBackend { get; set; } + + public string Architecture { get; set; } + + public ApiCompatibilityLevel? apiProfile { get; set; } + + public bool? appleEnableAutomaticSigning { get; set; } + public string appleDeveloperTeamID { get; set; } + public ProvisioningProfileType? iOSManualProvisioningProfileType { get; set; } + public string iOSManualProvisioningProfileID { get; set; } + public ProvisioningProfileType? tvOSManualProvisioningProfileType { get; set; } + public string tvOSManualProvisioningProfileID { get; set; } + + public void Dispose() + { + if (!m_Disposed) + { + foreach (var testSetting in m_Settings) + { + testSetting.Cleanup(); + } + + m_Disposed = true; + } + } + + public void SetupProjectParameters() + { + foreach (var testSetting in m_Settings) + { + testSetting.Setup(this); + } + } + + private abstract class TestSetting + { + public abstract void Setup(TestSettings settings); + public abstract void Cleanup(); + } + + private class TestSetting : TestSetting + { + private T m_ValueBeforeSetup; + private Func m_GetFromSettings; + private Func m_GetCurrentValue; + private Action m_SetValue; + + public TestSetting(Func getFromSettings, Func getCurrentValue, Action setValue) + { + m_GetFromSettings = getFromSettings; + m_GetCurrentValue = getCurrentValue; + m_SetValue = setValue; + } + + public override void Setup(TestSettings settings) + { + m_ValueBeforeSetup = m_GetCurrentValue(); + var newValue = m_GetFromSettings(settings); + if (newValue != null) + { + m_SetValue(newValue); + } + } + + public override void Cleanup() + { + m_SetValue(m_ValueBeforeSetup); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta new file mode 100644 index 0000000..23e6f5e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b32b6725087a0d4bb1670818d26996e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs new file mode 100644 index 0000000..cdba06e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + /// + /// Handles deserialization of TestSettings from a provided json file path. + /// + internal class TestSettingsDeserializer : ITestSettingsDeserializer + { + private static readonly SettingsMap[] s_SettingsMapping = + { + new SettingsMap("scriptingBackend", (settings, value) => settings.scriptingBackend = value), + new SettingsMap("architecture", (settings, value) => settings.Architecture = value), + new SettingsMap("apiProfile", (settings, value) => settings.apiProfile = value), + new SettingsMap("appleEnableAutomaticSigning", (settings, value) => settings.appleEnableAutomaticSigning = value), + new SettingsMap("appleDeveloperTeamID", (settings, value) => settings.appleDeveloperTeamID = value), + new SettingsMap("iOSManualProvisioningProfileType", (settings, value) => settings.iOSManualProvisioningProfileType = value), + new SettingsMap("iOSManualProvisioningProfileID", (settings, value) => settings.iOSManualProvisioningProfileID = value), + new SettingsMap("tvOSManualProvisioningProfileType", (settings, value) => settings.tvOSManualProvisioningProfileType = value), + new SettingsMap("tvOSManualProvisioningProfileID", (settings, value) => settings.tvOSManualProvisioningProfileID = value), + }; + + private readonly Func m_TestSettingsFactory; + public TestSettingsDeserializer(Func testSettingsFactory) + { + m_TestSettingsFactory = testSettingsFactory; + } + + public ITestSettings GetSettingsFromJsonFile(string jsonFilePath) + { + var text = File.ReadAllText(jsonFilePath); + var settingsDictionary = Json.Deserialize(text) as Dictionary; + + var testSettings = m_TestSettingsFactory(); + if (settingsDictionary == null) + { + return testSettings; + } + + foreach (var settingsMap in s_SettingsMapping) + { + if (!settingsDictionary.ContainsKey(settingsMap.Key)) + { + continue; + } + + if (settingsMap.Type.IsEnum) + { + SetEnumValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value)); + } + else + { + SetValue(settingsMap.Key, settingsDictionary[settingsMap.Key], settingsMap.Type, value => settingsMap.ApplyToSettings(testSettings, value)); + } + } + + return testSettings; + } + + private abstract class SettingsMap + { + public string Key { get; } + public Type Type { get; } + protected SettingsMap(string key, Type type) + { + Key = key; + Type = type; + } + + public abstract void ApplyToSettings(ITestSettings settings, object value); + } + + private class SettingsMap : SettingsMap + { + private Action m_Setter; + public SettingsMap(string key, Action setter) : base(key, typeof(T)) + { + m_Setter = setter; + } + + public override void ApplyToSettings(ITestSettings settings, object value) + { + m_Setter(settings, (T)value); + } + } + + private static void SetEnumValue(string key, object value, Type type, Action setter) + { + object enumValue; + if (TryGetEnum(value as string, type, out enumValue)) + { + setter(enumValue); + return; + } + + var acceptedValues = string.Join(", ", Enum.GetValues(type).OfType().Select(val => val.ToString()).ToArray()); + + Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}. Accepted values: {3}.", key, value, type.Name, acceptedValues); + } + + private static bool TryGetEnum(string value, Type type, out object enumValue) + { + try + { + enumValue = Enum.Parse(type, value, true); + return true; + } + catch (Exception) + { + enumValue = null; + return false; + } + } + + private static void SetValue(string key, object value, Type type, Action setter) + { + if (type.IsInstanceOfType(value)) + { + setter(value); + return; + } + + Debug.LogFormat("Could not convert '{0}' argument '{1}' to a valid {2}.", key, value, type.Name); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta new file mode 100644 index 0000000..4d50295 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75e7d7a9a57458841a85fe42d9c9141f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef new file mode 100644 index 0000000..efdc7cf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef @@ -0,0 +1,21 @@ +{ + "name": "UnityEditor.TestRunner", + "references": [ + "UnityEngine.TestRunner" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll", + "Mono.Cecil.dll", + "Mono.Cecil.Pdb.dll", + "Mono.Cecil.Mdb.dll", + "Mono.Cecil.Rocks.dll" + ], + "autoReferenced": false, + "defineConstraints": [] +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta new file mode 100644 index 0000000..63c0290 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0acc523941302664db1f4e527237feb3 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol.meta new file mode 100644 index 0000000..8499c83 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 936c6340f3468444ebb1785b4c311126 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs new file mode 100644 index 0000000..7f00c5b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs @@ -0,0 +1,13 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class AssemblyCompilationErrorsMessage : Message + { + public string assembly; + public string[] errors; + + public AssemblyCompilationErrorsMessage() + { + type = "AssemblyCompilationErrors"; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta new file mode 100644 index 0000000..67d5b2a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/AssemblyCompilationErrorsMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c346a7445959bba46a96de0747e77c2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs new file mode 100644 index 0000000..f7dcacf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + interface ITestRunnerApiMapper + { + string GetRunStateFromResultNunitXml(ITestResultAdaptor result); + TestState GetTestStateFromResult(ITestResultAdaptor result); + List FlattenTestNames(ITestAdaptor testsToRun); + TestPlanMessage MapTestToTestPlanMessage(ITestAdaptor testsToRun); + TestStartedMessage MapTestToTestStartedMessage(ITestAdaptor test); + TestFinishedMessage TestResultToTestFinishedMessage(ITestResultAdaptor result); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta new file mode 100644 index 0000000..75e0ba2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6de79ae237e51554da96fd28f68b66a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs new file mode 100644 index 0000000..bdb96c1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + interface IUtpLogger + { + void Log(Message msg); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta new file mode 100644 index 0000000..dbd33aa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9014630255533ed42915965b4065cde8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs new file mode 100644 index 0000000..3a9895e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal interface IUtpMessageReporter + { + void ReportAssemblyCompilationErrors(string assembly, IEnumerable errorCompilerMessages); + void ReportTestFinished(ITestResultAdaptor result); + void ReportTestRunStarted(ITestAdaptor testsToRun); + void ReportTestStarted(ITestAdaptor test); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta new file mode 100644 index 0000000..4c96a90 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 952b3dc7b47846947b37c8d3ae46579a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/Message.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/Message.cs new file mode 100644 index 0000000..d10a5e4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/Message.cs @@ -0,0 +1,29 @@ +using System; +using System.Diagnostics; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + [Serializable] + internal abstract class Message + { + public string type; + // Milliseconds since unix epoch + public ulong time; + public int version; + public string phase; + public int processId; + + protected Message() + { + version = 2; + phase = "Immediate"; + processId = Process.GetCurrentProcess().Id; + AddTimeStamp(); + } + + public void AddTimeStamp() + { + time = Convert.ToUInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta new file mode 100644 index 0000000..bfc702b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 321dc2c0720f8dd4f9396ecdc12b8746 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs new file mode 100644 index 0000000..66e18ff --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs @@ -0,0 +1,18 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestFinishedMessage : Message + { + public string name; + public TestState state; + public string message; + public ulong duration; // milliseconds + public ulong durationMicroseconds; + public string stackTrace; + + public TestFinishedMessage() + { + type = "TestStatus"; + phase = "End"; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta new file mode 100644 index 0000000..15b951b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 423fe2ef878fa1140a7e1f7f9e365815 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs new file mode 100644 index 0000000..c0a76da --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestPlanMessage : Message + { + public List tests; + + public TestPlanMessage() + { + type = "TestPlan"; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta new file mode 100644 index 0000000..c057f60 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28f79a0d7e64c2345bc46f8c4cf788f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs new file mode 100644 index 0000000..af93dba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestRunnerApiMapper : ITestRunnerApiMapper + { + public TestPlanMessage MapTestToTestPlanMessage(ITestAdaptor testsToRun) + { + var testsNames = testsToRun != null ? FlattenTestNames(testsToRun) : new List(); + + var msg = new TestPlanMessage + { + tests = testsNames + }; + + return msg; + } + + public TestStartedMessage MapTestToTestStartedMessage(ITestAdaptor test) + { + return new TestStartedMessage + { + name = test.FullName + }; + } + + public TestFinishedMessage TestResultToTestFinishedMessage(ITestResultAdaptor result) + { + return new TestFinishedMessage + { + name = result.Test.FullName, + duration = Convert.ToUInt64(result.Duration * 1000), + durationMicroseconds = Convert.ToUInt64(result.Duration * 1000000), + message = result.Message, + state = GetTestStateFromResult(result), + stackTrace = result.StackTrace + }; + } + + public string GetRunStateFromResultNunitXml(ITestResultAdaptor result) + { + var doc = new XmlDocument(); + doc.LoadXml(result.ToXml().OuterXml); + return doc.FirstChild.Attributes["runstate"].Value; + } + + public TestState GetTestStateFromResult(ITestResultAdaptor result) + { + var state = TestState.Failure; + + if (result.TestStatus == TestStatus.Passed) + { + state = TestState.Success; + + var runstate = GetRunStateFromResultNunitXml(result); + runstate = runstate ?? String.Empty; + + if (runstate.ToLowerInvariant().Equals("explicit")) + state = TestState.Skipped; + } + else if (result.TestStatus == TestStatus.Skipped) + { + state = TestState.Skipped; + + if (result.ResultState.ToLowerInvariant().EndsWith("ignored")) + state = TestState.Ignored; + } + else + { + if (result.ResultState.ToLowerInvariant().Equals("inconclusive")) + state = TestState.Inconclusive; + + if (result.ResultState.ToLowerInvariant().EndsWith("cancelled") || + result.ResultState.ToLowerInvariant().EndsWith("error")) + state = TestState.Error; + } + + return state; + } + + public List FlattenTestNames(ITestAdaptor test) + { + var results = new List(); + + if (!test.IsSuite) + results.Add(test.FullName); + + if (test.Children != null && test.Children.Any()) + foreach (var child in test.Children) + results.AddRange(FlattenTestNames(child)); + + return results; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta new file mode 100644 index 0000000..47634b9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2011a59d3f76b3d4a85cb53f945fceee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs new file mode 100644 index 0000000..c21464f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs @@ -0,0 +1,15 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class TestStartedMessage : Message + { + public string name; + public TestState state; + + public TestStartedMessage() + { + type = "TestStatus"; + phase = "Begin"; + state = TestState.Inconclusive; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta new file mode 100644 index 0000000..18b53d1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd3e81baa10021f4d877fa36382bab16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs new file mode 100644 index 0000000..223a73d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs @@ -0,0 +1,13 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + // This matches the state definitions expected by the Perl code, which in turn matches the NUnit 2 values... + internal enum TestState + { + Inconclusive = 0, + Skipped = 2, + Ignored = 3, + Success = 4, + Failure = 5, + Error = 6 + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta new file mode 100644 index 0000000..ac66641 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 77f432980bb30084299a138e15c6f571 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs new file mode 100644 index 0000000..09daf8d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs @@ -0,0 +1,35 @@ +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class UnityTestProtocolListener : ScriptableObject, ICallbacks + { + private IUtpMessageReporter m_UtpMessageReporter; + + public UnityTestProtocolListener() + { + m_UtpMessageReporter = new UtpMessageReporter(new UtpDebugLogger()); + } + + public void RunStarted(ITestAdaptor testsToRun) + { + m_UtpMessageReporter.ReportTestRunStarted(testsToRun); + } + + public void RunFinished(ITestResultAdaptor testResults) + { + // Apparently does nothing :) + } + + public void TestStarted(ITestAdaptor test) + { + m_UtpMessageReporter.ReportTestStarted(test); + } + + public void TestFinished(ITestResultAdaptor result) + { + m_UtpMessageReporter.ReportTestFinished(result); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta new file mode 100644 index 0000000..8ba29be --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 900aac3710bc14542a8d164e3f0ff820 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs new file mode 100644 index 0000000..cca2fd8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using UnityEngine.TestTools; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + [InitializeOnLoad] + internal static class UnityTestProtocolStarter + { + static UnityTestProtocolStarter() + { + var commandLineArgs = Environment.GetCommandLineArgs(); + if (commandLineArgs.Contains("-automated") && commandLineArgs.Contains("-runTests")) // wanna have it only for utr run + { + var api = ScriptableObject.CreateInstance(); + var listener = ScriptableObject.CreateInstance(); + api.RegisterCallbacks(listener); + CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished; + } + } + + public static void OnAssemblyCompilationFinished(string assembly, CompilerMessage[] messages) + { + bool checkCompileErrors = RecompileScripts.Current == null || RecompileScripts.Current.ExpectScriptCompilationSuccess; + + if (checkCompileErrors && messages.Any(x => x.type == CompilerMessageType.Error)) + { + var compilerErrorMessages = messages.Where(x => x.type == CompilerMessageType.Error); + var utpMessageReporter = new UtpMessageReporter(new UtpDebugLogger()); + utpMessageReporter.ReportAssemblyCompilationErrors(assembly, compilerErrorMessages); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta new file mode 100644 index 0000000..540b31e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ac58cb55fc8daf4abd3945a2bbbb0c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs new file mode 100644 index 0000000..e32f6d2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + class UtpDebugLogger : IUtpLogger + { + public void Log(Message msg) + { + var msgJson = JsonUtility.ToJson(msg); + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "\n##utp:{0}", msgJson); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta new file mode 100644 index 0000000..7debc23 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0abdd8cb6b29a24c8ee19626ef741b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs new file mode 100644 index 0000000..37c4ee7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal class UtpMessageReporter : IUtpMessageReporter + { + public ITestRunnerApiMapper TestRunnerApiMapper; + public IUtpLogger Logger; + + public UtpMessageReporter(IUtpLogger utpLogger) + { + TestRunnerApiMapper = new TestRunnerApiMapper(); + Logger = utpLogger; + } + + public void ReportAssemblyCompilationErrors(string assembly, IEnumerable errorCompilerMessages) + { + var compilationErrorMessage = new AssemblyCompilationErrorsMessage + { + assembly = assembly, + errors = errorCompilerMessages.Select(x => x.message).ToArray() + }; + + Logger.Log(compilationErrorMessage); + } + + public void ReportTestRunStarted(ITestAdaptor testsToRun) + { + var msg = TestRunnerApiMapper.MapTestToTestPlanMessage(testsToRun); + + Logger.Log(msg); + } + + public void ReportTestStarted(ITestAdaptor test) + { + if (test.IsSuite) + return; + + var msg = TestRunnerApiMapper.MapTestToTestStartedMessage(test); + + Logger.Log(msg); + } + + public void ReportTestFinished(ITestResultAdaptor result) + { + if (result.Test.IsSuite) + return; + + var msg = TestRunnerApiMapper.TestResultToTestFinishedMessage(result); + + Logger.Log(msg); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta new file mode 100644 index 0000000..c818d4f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebcc5f899d9277642868aeda9a17cbaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner.meta new file mode 100644 index 0000000..9589050 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 950890083f4907541a6ed06d70959e49 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/AssemblyInfo.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/AssemblyInfo.cs new file mode 100644 index 0000000..4149677 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle("UnityEngine.TestRunner")] + +[assembly: InternalsVisibleTo("UnityEditor.TestRunner")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] +[assembly: InternalsVisibleTo("Unity.PerformanceTesting")] +[assembly: InternalsVisibleTo("Unity.PerformanceTesting.Editor")] +[assembly: InternalsVisibleTo("Assembly-CSharp-testable")] +[assembly: InternalsVisibleTo("Assembly-CSharp-Editor-testable")] +[assembly: InternalsVisibleTo("UnityEngine.TestRunner.Tests")] +[assembly: InternalsVisibleTo("UnityEditor.TestRunner.Tests")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Editor")] + +[assembly: AssemblyVersion("1.0.0")] diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/AssemblyInfo.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/AssemblyInfo.cs.meta new file mode 100644 index 0000000..b499e31 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc22cc13b69c1094c85e176c008b9ef8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions.meta new file mode 100644 index 0000000..4e7bbdf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ad55f5ad04d1d045a1f287409c650dd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs new file mode 100644 index 0000000..339a090 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs @@ -0,0 +1,83 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Constraints; +using UnityEngine.Profiling; + +namespace UnityEngine.TestTools.Constraints +{ + public class AllocatingGCMemoryConstraint : Constraint + { + private class AllocatingGCMemoryResult : ConstraintResult + { + private readonly int diff; + public AllocatingGCMemoryResult(IConstraint constraint, object actualValue, int diff) : base(constraint, actualValue, diff > 0) + { + this.diff = diff; + } + + public override void WriteMessageTo(MessageWriter writer) + { + if (diff == 0) + writer.WriteMessageLine("The provided delegate did not make any GC allocations."); + else + writer.WriteMessageLine("The provided delegate made {0} GC allocation(s).", diff); + } + } + + private ConstraintResult ApplyTo(Action action, object original) + { + var recorder = Recorder.Get("GC.Alloc"); + + // The recorder was created enabled, which means it captured the creation of the Recorder object itself, etc. + // Disabling it flushes its data, so that we can retrieve the sample block count and have it correctly account + // for these initial allocations. + recorder.enabled = false; + +#if !UNITY_WEBGL + recorder.FilterToCurrentThread(); +#endif + + recorder.enabled = true; + + try + { + action(); + } + finally + { + recorder.enabled = false; +#if !UNITY_WEBGL + recorder.CollectFromAllThreads(); +#endif + } + + return new AllocatingGCMemoryResult(this, original, recorder.sampleBlockCount); + } + + public override ConstraintResult ApplyTo(object obj) + { + if (obj == null) + throw new ArgumentNullException(); + + TestDelegate d = obj as TestDelegate; + if (d == null) + throw new ArgumentException(string.Format("The actual value must be a TestDelegate but was {0}", + obj.GetType())); + + return ApplyTo(() => d.Invoke(), obj); + } + + public override ConstraintResult ApplyTo(ActualValueDelegate del) + { + if (del == null) + throw new ArgumentNullException(); + + return ApplyTo(() => del.Invoke(), del); + } + + public override string Description + { + get { return "allocates GC memory"; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta new file mode 100644 index 0000000..0933c85 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d09858396dd7adb4bbdb22ea0c8c3a37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs new file mode 100644 index 0000000..812b1f0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs @@ -0,0 +1,14 @@ +using NUnit.Framework.Constraints; + +namespace UnityEngine.TestTools.Constraints +{ + public static class ConstraintExtensions + { + public static AllocatingGCMemoryConstraint AllocatingGCMemory(this ConstraintExpression chain) + { + var constraint = new AllocatingGCMemoryConstraint(); + chain.Append(constraint); + return constraint; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta new file mode 100644 index 0000000..1343496 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68a48d1900320ed458e118415857faf6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs new file mode 100644 index 0000000..ab4ff8e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs @@ -0,0 +1,18 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class InvalidSignatureException : ResultStateException + { + public InvalidSignatureException(string message) + : base(message) + { + } + + public override ResultState ResultState + { + get { return ResultState.NotRunnable; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta new file mode 100644 index 0000000..86aee7f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9650d910fcaefb34cb45f121c1993892 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/Is.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/Is.cs new file mode 100644 index 0000000..c0871ef --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/Is.cs @@ -0,0 +1,10 @@ +namespace UnityEngine.TestTools.Constraints +{ + public class Is : NUnit.Framework.Is + { + public static AllocatingGCMemoryConstraint AllocatingGCMemory() + { + return new AllocatingGCMemoryConstraint(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/Is.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/Is.cs.meta new file mode 100644 index 0000000..23ed44a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/Is.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d5833966abeadb429de247e4316eef4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogAssert.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogAssert.cs new file mode 100644 index 0000000..51b97de --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogAssert.cs @@ -0,0 +1,39 @@ +using System.Text.RegularExpressions; +using UnityEngine.TestTools.Logging; + +namespace UnityEngine.TestTools +{ + public static class LogAssert + { + public static void Expect(LogType type, string message) + { + LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, Message = message }); + } + + public static void Expect(LogType type, Regex message) + { + LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, MessageRegex = message }); + } + + public static void NoUnexpectedReceived() + { + LogScope.Current.NoUnexpectedReceived(); + } + + public static bool ignoreFailingMessages + { + get + { + return LogScope.Current.IgnoreFailingMessages; + } + set + { + if (value != LogScope.Current.IgnoreFailingMessages) + { + Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "\nIgnoreFailingMessages:" + (value? "true":"false")); + } + LogScope.Current.IgnoreFailingMessages = value; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta new file mode 100644 index 0000000..7a278a3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c97b794b51780d349a16826a4c7898d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope.meta new file mode 100644 index 0000000..284dc6a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1d8465ba1376b148bdab58965101f47 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs new file mode 100644 index 0000000..5e73bb5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Logging +{ + internal interface ILogScope : IDisposable + { + Queue ExpectedLogs { get; set; } + List AllLogs { get; } + List FailingLogs { get; } + bool IgnoreFailingMessages { get; set; } + bool IsNUnitException { get; } + bool IsNUnitSuccessException { get; } + bool IsNUnitInconclusiveException { get; } + bool IsNUnitIgnoreException { get; } + string NUnitExceptionMessage { get; } + void AddLog(string message, string stacktrace, LogType type); + bool AnyFailingLogs(); + void ProcessExpectedLogs(); + void NoUnexpectedReceived(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta new file mode 100644 index 0000000..69e7d55 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3504aa04cda851b44a65973f9aead6f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs new file mode 100644 index 0000000..bbc805e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs @@ -0,0 +1,18 @@ +namespace UnityEngine.TestTools.Logging +{ + internal class LogEvent + { + public string Message { get; set; } + + public string StackTrace { get; set; } + + public LogType LogType { get; set; } + + public bool IsHandled { get; set; } + + public override string ToString() + { + return string.Format("[{0}] {1}", LogType, Message); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta new file mode 100644 index 0000000..66c9130 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c56471f08a0f6846afc792f0b4205b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs new file mode 100644 index 0000000..9b862d9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs @@ -0,0 +1,103 @@ +using System; +using System.Text.RegularExpressions; + +namespace UnityEngine.TestTools.Logging +{ + [Serializable] + internal class LogMatch + { + [SerializeField] + private bool m_UseRegex; + [SerializeField] + private string m_Message; + [SerializeField] + private string m_MessageRegex; + [SerializeField] + private string m_LogType; + + public string Message + { + get { return m_Message; } + set + { + m_Message = value; + m_UseRegex = false; + } + } + + public Regex MessageRegex + { + get + { + if (!m_UseRegex) + { + return null; + } + + return new Regex(m_MessageRegex); + } + set + { + if (value != null) + { + m_MessageRegex = value.ToString(); + m_UseRegex = true; + } + else + { + m_MessageRegex = null; + m_UseRegex = false; + } + } + } + + public LogType? LogType + { + get + { + if (!string.IsNullOrEmpty(m_LogType)) + { + return Enum.Parse(typeof(LogType), m_LogType) as LogType ? ; + } + + return null; + } + set + { + if (value != null) + { + m_LogType = value.Value.ToString(); + } + else + { + m_LogType = null; + } + } + } + + public bool Matches(LogEvent log) + { + if (LogType != null && LogType != log.LogType) + { + return false; + } + + if (m_UseRegex) + { + return MessageRegex.IsMatch(log.Message); + } + else + { + return Message.Equals(log.Message); + } + } + + public override string ToString() + { + if (m_UseRegex) + return string.Format("[{0}] Regex: {1}", LogType, MessageRegex); + else + return string.Format("[{0}] {1}", LogType, Message); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta new file mode 100644 index 0000000..ffc2bc3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9945ffed4692c6044b6d3acf81efd694 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs new file mode 100644 index 0000000..84957d8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.Logging +{ + sealed class LogScope : ILogScope + { + static List s_ActiveScopes = new List(); + + readonly object m_Lock = new object(); + bool m_Disposed; + bool m_NeedToProcessLogs; + + public Queue ExpectedLogs { get; set; } + public List AllLogs { get; } + public List FailingLogs { get; } + public bool IgnoreFailingMessages { get; set; } + public bool IsNUnitException { get; private set; } + public bool IsNUnitSuccessException { get; private set; } + public bool IsNUnitInconclusiveException { get; private set; } + public bool IsNUnitIgnoreException { get; private set; } + public string NUnitExceptionMessage { get; private set; } + + public static LogScope Current + { + get + { + if (s_ActiveScopes.Count == 0) + throw new InvalidOperationException("No log scope is available"); + return s_ActiveScopes[0]; + } + } + + public static bool HasCurrentLogScope() + { + return s_ActiveScopes.Count > 0; + } + + public LogScope() + { + AllLogs = new List(); + FailingLogs = new List(); + ExpectedLogs = new Queue(); + IgnoreFailingMessages = false; + Activate(); + } + + void Activate() + { + s_ActiveScopes.Insert(0, this); + RegisterScope(this); + Application.logMessageReceivedThreaded -= AddLog; + Application.logMessageReceivedThreaded += AddLog; + } + + void Deactivate() + { + Application.logMessageReceivedThreaded -= AddLog; + s_ActiveScopes.Remove(this); + UnregisterScope(this); + } + + static void RegisterScope(LogScope logScope) + { + Application.logMessageReceivedThreaded += logScope.AddLog; + } + + static void UnregisterScope(LogScope logScope) + { + Application.logMessageReceivedThreaded -= logScope.AddLog; + } + + public void AddLog(string message, string stacktrace, LogType type) + { + lock (m_Lock) + { + m_NeedToProcessLogs = true; + var log = new LogEvent + { + LogType = type, + Message = message, + StackTrace = stacktrace, + }; + + AllLogs.Add(log); + + if (IsNUnitResultStateException(stacktrace, type)) + { + if (message.StartsWith("SuccessException")) + { + IsNUnitException = true; + IsNUnitSuccessException = true; + if (message.StartsWith("SuccessException: ")) + { + NUnitExceptionMessage = message.Substring("SuccessException: ".Length); + return; + } + } + else if (message.StartsWith("InconclusiveException")) + { + IsNUnitException = true; + IsNUnitInconclusiveException = true; + if (message.StartsWith("InconclusiveException: ")) + { + NUnitExceptionMessage = message.Substring("InconclusiveException: ".Length); + return; + } + } + else if (message.StartsWith("IgnoreException")) + { + IsNUnitException = true; + IsNUnitIgnoreException = true; + if (message.StartsWith("IgnoreException: ")) + { + NUnitExceptionMessage = message.Substring("IgnoreException: ".Length); + return; + } + } + } + + if (IsFailingLog(type) && !IgnoreFailingMessages) + { + FailingLogs.Add(log); + } + } + } + + static bool IsNUnitResultStateException(string stacktrace, LogType logType) + { + if (logType != LogType.Exception) + return false; + + return string.IsNullOrEmpty(stacktrace) || stacktrace.StartsWith("NUnit.Framework.Assert."); + } + + static bool IsFailingLog(LogType type) + { + switch (type) + { + case LogType.Assert: + case LogType.Error: + case LogType.Exception: + return true; + default: + return false; + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + void Dispose(bool disposing) + { + if (m_Disposed) + { + return; + } + + m_Disposed = true; + + if (disposing) + { + Deactivate(); + } + } + + public bool AnyFailingLogs() + { + ProcessExpectedLogs(); + return FailingLogs.Any(); + } + + public void ProcessExpectedLogs() + { + lock (m_Lock) + { + if (!m_NeedToProcessLogs || !ExpectedLogs.Any()) + return; + + LogMatch expectedLog = null; + foreach (var logEvent in AllLogs) + { + if (!ExpectedLogs.Any()) + break; + if (expectedLog == null && ExpectedLogs.Any()) + expectedLog = ExpectedLogs.Peek(); + + if (expectedLog != null && expectedLog.Matches(logEvent)) + { + ExpectedLogs.Dequeue(); + logEvent.IsHandled = true; + if (FailingLogs.Any(expectedLog.Matches)) + { + var failingLog = FailingLogs.First(expectedLog.Matches); + FailingLogs.Remove(failingLog); + } + expectedLog = null; + } + } + m_NeedToProcessLogs = false; + } + } + + public void NoUnexpectedReceived() + { + lock (m_Lock) + { + ProcessExpectedLogs(); + + var unhandledLog = AllLogs.FirstOrDefault(x => !x.IsHandled); + if (unhandledLog != null) + { + throw new UnhandledLogMessageException(unhandledLog); + } + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta new file mode 100644 index 0000000..ea13dd6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bbc17b35884fdf468e4b52ae4222882 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs new file mode 100644 index 0000000..8ad39f4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs @@ -0,0 +1,29 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools.Logging; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class UnexpectedLogMessageException : ResultStateException + { + public LogMatch LogEvent; + + public UnexpectedLogMessageException(LogMatch log) + : base(BuildMessage(log)) + { + LogEvent = log; + } + + private static string BuildMessage(LogMatch log) + { + return string.Format("Expected log did not appear: {0}", log); + } + + public override ResultState ResultState + { + get { return ResultState.Failure; } + } + + public override string StackTrace { get { return null; } } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta new file mode 100644 index 0000000..7b9e611 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b2eeca598284bd4abb4a15c30df1576 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs new file mode 100644 index 0000000..9427cc8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs @@ -0,0 +1,35 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.Utils; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class UnhandledLogMessageException : ResultStateException + { + public LogEvent LogEvent; + private readonly string m_CustomStackTrace; + + public UnhandledLogMessageException(LogEvent log) + : base(BuildMessage(log)) + { + LogEvent = log; + m_CustomStackTrace = StackTraceFilter.Filter(log.StackTrace); + } + + private static string BuildMessage(LogEvent log) + { + return string.Format("Unhandled log message: '{0}'. Use UnityEngine.TestTools.LogAssert.Expect", log); + } + + public override ResultState ResultState + { + get { return ResultState.Failure; } + } + + public override string StackTrace + { + get { return m_CustomStackTrace; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta new file mode 100644 index 0000000..1019924 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8ed4063f2beecd41a234a582202f3c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs new file mode 100644 index 0000000..6e4243e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs @@ -0,0 +1,28 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class UnityTestTimeoutException : ResultStateException + { + public UnityTestTimeoutException(int timeout) + : base(BuildMessage(timeout)) + { + } + + private static string BuildMessage(int timeout) + { + return string.Format("Timeout value of {0}ms was exceeded", timeout); + } + + public override ResultState ResultState + { + get { return ResultState.Failure; } + } + + public override string StackTrace + { + get { return ""; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta new file mode 100644 index 0000000..d366ec9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ffb335140c799c4408411d81789fb05c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions.meta new file mode 100644 index 0000000..3023e52 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e8d6af343b383544ba5743d119f4062 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs new file mode 100644 index 0000000..ed8d896 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + /// + /// This class delegates actions from the NUnit thread that should be executed on the main thread. + /// NUnit thread calls Delegate which blocks the execution on the thread until the action is executed. + /// The main thread will poll for awaiting actions (HasAction) and invoke them (Execute). + /// Once the action is executed, the main thread releases the lock and executino on the NUnit thread is continued. + /// + internal class ActionDelegator : BaseDelegator + { + private Func m_Action; + public object Delegate(Action action) + { + return Delegate(() => { action(); return null; }); + } + + public object Delegate(Func action) + { + if (m_Aborted) + { + return null; + } + + AssertState(); + m_Context = UnityTestExecutionContext.CurrentContext; + + m_Signal.Reset(); + m_Action = action; + + WaitForSignal(); + + return HandleResult(); + } + + private void AssertState() + { + if (m_Action != null) + { + throw new Exception("Action not executed yet"); + } + } + + public bool HasAction() + { + return m_Action != null; + } + + public void Execute(LogScope logScope) + { + try + { + SetCurrentTestContext(); + m_Result = m_Action(); + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + if (logScope.ExpectedLogs.Any()) + throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek()); + } + catch (Exception e) + { + m_Exception = e; + } + finally + { + m_Action = null; + m_Signal.Set(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta new file mode 100644 index 0000000..5f4e2d1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f939b9e23a0946439b812551e07ac81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta new file mode 100644 index 0000000..c7cae09 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cb14878543cf3d4f8472b15f7ecf0e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs new file mode 100644 index 0000000..a8b4780 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + public class ConditionalIgnoreAttribute : NUnitAttribute, IApplyToTest + { + string m_ConditionKey; + string m_IgnoreReason; + + public ConditionalIgnoreAttribute(string conditionKey, string ignoreReason) + { + m_ConditionKey = conditionKey; + m_IgnoreReason = ignoreReason; + } + + public void ApplyToTest(Test test) + { + var key = m_ConditionKey.ToLowerInvariant(); + if (m_ConditionMap.ContainsKey(key) && m_ConditionMap[key]) + { + test.RunState = RunState.Ignored; + string skipReason = string.Format(m_IgnoreReason); + test.Properties.Add(PropertyNames.SkipReason, skipReason); + } + } + + static Dictionary m_ConditionMap = new Dictionary(); + public static void AddConditionalIgnoreMapping(string key, bool value) + { + m_ConditionMap.Add(key.ToLowerInvariant(), value); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta new file mode 100644 index 0000000..d737335 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c82a8473f4a8f7b42a004c91e06d2f2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs new file mode 100644 index 0000000..6a4ab16 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + internal class TestEnumerator + { + private readonly ITestExecutionContext m_Context; + private static IEnumerator m_TestEnumerator; + + public static IEnumerator Enumerator { get { return m_TestEnumerator; } } + + public static void Reset() + { + m_TestEnumerator = null; + } + + public TestEnumerator(ITestExecutionContext context, IEnumerator testEnumerator) + { + m_Context = context; + m_TestEnumerator = testEnumerator; + } + + public IEnumerator Execute() + { + m_Context.CurrentResult.SetResult(ResultState.Success); + + while (true) + { + object current = null; + try + { + if (!m_TestEnumerator.MoveNext()) + { + yield break; + } + + if (!m_Context.CurrentResult.ResultState.Equals(ResultState.Success)) + { + yield break; + } + + current = m_TestEnumerator.Current; + } + catch (Exception exception) + { + m_Context.CurrentResult.RecordException(exception); + yield break; + } + yield return current; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta new file mode 100644 index 0000000..6ca4f72 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 750aad009559b814dbc27001341fc1c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs new file mode 100644 index 0000000..f9232ed --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs @@ -0,0 +1,28 @@ +using System; + +namespace UnityEngine.TestTools +{ + /// + /// The presence of this attribute will cause the test runner to require that every single log is expected. By + /// default, the runner will only automatically fail on any error logs, so this adds warnings and infos as well. + /// It is the same as calling `LogAssert.NoUnexpectedReceived()` at the bottom of every affected test. + /// + /// This attribute can be applied to test assemblies (will affect every test in the assembly), fixtures (will + /// affect every test in the fixture), or on individual test methods. It is also automatically inherited from base + /// fixtures. + /// + /// The MustExpect property (on by default) lets you selectively enable or disable the higher level value. For + /// example when migrating an assembly to this more strict checking method, you might attach + /// `[assembly:TestMustExpectAllLogs]` to the assembly itself, but then whitelist failing fixtures and test methods + /// with `[TestMustExpectAllLogs(MustExpect=false)]` until they can be migrated. This also means new tests in that + /// assembly would be required to have the more strict checking. + /// + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class TestMustExpectAllLogsAttribute : Attribute + { + public TestMustExpectAllLogsAttribute(bool mustExpect = true) + => MustExpect = mustExpect; + + public bool MustExpect { get; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta new file mode 100644 index 0000000..82c5e47 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3803f736886e77842995ddbc3531afaa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs new file mode 100644 index 0000000..84f8d84 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Builders; + +namespace UnityEngine.TestTools +{ + internal class UnityCombinatorialStrategy : CombinatorialStrategy, ICombiningStrategy + { + public new IEnumerable GetTestCases(IEnumerable[] sources) + { + var testCases = base.GetTestCases(sources); + foreach (var testCase in testCases) + { + testCase.GetType().GetProperty("ExpectedResult").SetValue(testCase, new object(), null); + } + return testCases; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta new file mode 100644 index 0000000..84774ce --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7af6ac3e6b51b8d4aab04adc85b8de2f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs new file mode 100644 index 0000000..ff538ea --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] + public class UnityPlatformAttribute : NUnitAttribute, IApplyToTest + { + public RuntimePlatform[] include { get; set; } + public RuntimePlatform[] exclude { get; set; } + + private string m_skippedReason; + + public UnityPlatformAttribute() + { + include = new List().ToArray(); + exclude = new List().ToArray(); + } + + public UnityPlatformAttribute(params RuntimePlatform[] include) + : this() + { + this.include = include; + } + + public void ApplyToTest(Test test) + { + if (test.RunState == RunState.NotRunnable || test.RunState == RunState.Ignored || IsPlatformSupported(Application.platform)) + { + return; + } + test.RunState = RunState.Skipped; + test.Properties.Add("_SKIPREASON", m_skippedReason); + } + + internal bool IsPlatformSupported(RuntimePlatform testTargetPlatform) + { + if (include.Any() && !include.Any(x => x == testTargetPlatform)) + { + m_skippedReason = string.Format("Only supported on {0}", string.Join(", ", include.Select(x => x.ToString()).ToArray())); + return false; + } + + if (exclude.Any(x => x == testTargetPlatform)) + { + m_skippedReason = string.Format("Not supported on {0}", string.Join(", ", include.Select(x => x.ToString()).ToArray())); + return false; + } + return true; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta new file mode 100644 index 0000000..003e154 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5440c1153b397e14c9c7b1d6eb83b9f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs new file mode 100644 index 0000000..f51da12 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs @@ -0,0 +1,10 @@ +using System; +using NUnit.Framework; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Method)] + public class UnitySetUpAttribute : NUnitAttribute + { + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta new file mode 100644 index 0000000..ccd0d7e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc6401f13df54ba44bfd7cdc93c7d64d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs new file mode 100644 index 0000000..dec605c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs @@ -0,0 +1,10 @@ +using System; +using NUnit.Framework; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Method)] + public class UnityTearDownAttribute : NUnitAttribute + { + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta new file mode 100644 index 0000000..db19904 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 600f4b74746dbf944901257f81a8af6d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs new file mode 100644 index 0000000..5afcccc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections; +using NUnit.Framework; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Builders; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Method)] + public class UnityTestAttribute : CombiningStrategyAttribute, ISimpleTestBuilder, IImplyFixture + { + public UnityTestAttribute() : base(new UnityCombinatorialStrategy(), new ParameterDataSourceProvider()) {} + + private readonly NUnitTestCaseBuilder _builder = new NUnitTestCaseBuilder(); + + TestMethod ISimpleTestBuilder.BuildFrom(IMethodInfo method, Test suite) + { + TestCaseParameters parms = new TestCaseParameters + { + ExpectedResult = new object(), + HasExpectedResult = true + }; + + var t = _builder.BuildTestMethod(method, suite, parms); + + if (t.parms != null) + t.parms.HasExpectedResult = false; + + if (!method.ReturnType.IsType(typeof(IEnumerator))) + { + t.RunState = RunState.NotRunnable; + t.Properties.Set(PropertyNames.SkipReason, "Method marked with UnityTest must return IEnumerator."); + } + + return t; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta new file mode 100644 index 0000000..e2fcb63 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fedb0f9e5006b1943abae52f52f08a1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs new file mode 100644 index 0000000..65bcbba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs @@ -0,0 +1,58 @@ +using System; +using System.Threading; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal abstract class BaseDelegator + { + protected ManualResetEvent m_Signal = new ManualResetEvent(false); + + protected object m_Result; + protected Exception m_Exception; + protected ITestExecutionContext m_Context; + + protected bool m_Aborted; + + protected object HandleResult() + { + SetCurrentTestContext(); + if (m_Exception != null) + { + var temp = m_Exception; + m_Exception = null; + throw temp; + } + var tempResult = m_Result; + m_Result = null; + return tempResult; + } + + protected void WaitForSignal() + { + while (!m_Signal.WaitOne(100)) + { + if (m_Aborted) + { + m_Aborted = false; + Reflect.MethodCallWrapper = null; + throw new Exception(); + } + } + } + + public void Abort() + { + m_Aborted = true; + } + + protected void SetCurrentTestContext() + { + var prop = typeof(TestExecutionContext).GetProperty("CurrentContext"); + if (prop != null) + { + prop.SetValue(null, m_Context, null); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta new file mode 100644 index 0000000..613537b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37cea569bfefafe49a1513c4d7f0e9eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands.meta new file mode 100644 index 0000000..75dd09d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b72875690e0f7343911e06af3145bd5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs new file mode 100644 index 0000000..26f143b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs @@ -0,0 +1,234 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools +{ + internal abstract class BeforeAfterTestCommandBase : DelegatingTestCommand, IEnumerableTestMethodCommand + { + private string m_BeforeErrorPrefix; + private string m_AfterErrorPrefix; + private bool m_SkipYieldAfterActions; + protected BeforeAfterTestCommandBase(TestCommand innerCommand, string beforeErrorPrefix, string afterErrorPrefix, bool skipYieldAfterActions = false) + : base(innerCommand) + { + m_BeforeErrorPrefix = beforeErrorPrefix; + m_AfterErrorPrefix = afterErrorPrefix; + m_SkipYieldAfterActions = skipYieldAfterActions; + } + + internal Func GetUtcNow = () => new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(); + + protected T[] BeforeActions = new T[0]; + + protected T[] AfterActions = new T[0]; + + protected abstract IEnumerator InvokeBefore(T action, Test test, UnityTestExecutionContext context); + + protected abstract IEnumerator InvokeAfter(T action, Test test, UnityTestExecutionContext context); + + protected abstract BeforeAfterTestCommandState GetState(UnityTestExecutionContext context); + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + var unityContext = (UnityTestExecutionContext)context; + var state = GetState(unityContext); + + if (state == null) + { + // We do not expect a state to exist in playmode + state = ScriptableObject.CreateInstance(); + } + + state.ApplyTestResult(context.CurrentResult); + + while (state.NextBeforeStepIndex < BeforeActions.Length) + { + state.Timestamp = GetUtcNow(); + var action = BeforeActions[state.NextBeforeStepIndex]; + IEnumerator enumerator; + try + { + enumerator = InvokeBefore(action, Test, unityContext); + } + catch (Exception ex) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedException(m_BeforeErrorPrefix, ex); + break; + } + ActivePcHelper.SetEnumeratorPC(enumerator, state.NextBeforeStepPc); + + using (var logScope = new LogScope()) + { + while (true) + { + try + { + if (!enumerator.MoveNext()) + { + break; + } + } + catch (Exception ex) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedException(m_BeforeErrorPrefix, ex); + state.StoreTestResult(context.CurrentResult); + break; + } + + state.NextBeforeStepPc = ActivePcHelper.GetEnumeratorPC(enumerator); + state.StoreTestResult(context.CurrentResult); + if (m_SkipYieldAfterActions) + { + break; + } + else + { + yield return enumerator.Current; + } + + if (GetUtcNow() - state.Timestamp > unityContext.TestCaseTimeout) + { + context.CurrentResult.RecordPrefixedError(m_BeforeErrorPrefix, new UnityTestTimeoutException(unityContext.TestCaseTimeout).Message); + state.TestHasRun = true; + break; + } + } + + if (logScope.AnyFailingLogs()) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedError(m_BeforeErrorPrefix, new UnhandledLogMessageException(logScope.FailingLogs.First()).Message); + state.StoreTestResult(context.CurrentResult); + } + } + + state.NextBeforeStepIndex++; + state.NextBeforeStepPc = 0; + } + + if (!state.TestHasRun) + { + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + state.StoreTestResult(context.CurrentResult); + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + state.StoreTestResult(context.CurrentResult); + } + + state.TestHasRun = true; + } + + while (state.NextAfterStepIndex < AfterActions.Length) + { + state.Timestamp = GetUtcNow(); + state.TestAfterStarted = true; + var action = AfterActions[state.NextAfterStepIndex]; + IEnumerator enumerator; + try + { + enumerator = InvokeAfter(action, Test, unityContext); + } + catch (Exception ex) + { + context.CurrentResult.RecordPrefixedException(m_AfterErrorPrefix, ex); + state.StoreTestResult(context.CurrentResult); + break; + } + ActivePcHelper.SetEnumeratorPC(enumerator, state.NextAfterStepPc); + + using (var logScope = new LogScope()) + { + while (true) + { + try + { + if (!enumerator.MoveNext()) + { + break; + } + } + catch (Exception ex) + { + context.CurrentResult.RecordPrefixedException(m_AfterErrorPrefix, ex); + state.StoreTestResult(context.CurrentResult); + break; + } + + state.NextAfterStepPc = ActivePcHelper.GetEnumeratorPC(enumerator); + state.StoreTestResult(context.CurrentResult); + + if (GetUtcNow() - state.Timestamp > unityContext.TestCaseTimeout) + { + context.CurrentResult.RecordPrefixedError(m_AfterErrorPrefix, new UnityTestTimeoutException(unityContext.TestCaseTimeout).Message); + yield break; + } + + if (m_SkipYieldAfterActions) + { + break; + } + else + { + yield return enumerator.Current; + } + } + + if (logScope.AnyFailingLogs()) + { + state.TestHasRun = true; + context.CurrentResult.RecordPrefixedError(m_AfterErrorPrefix, new UnhandledLogMessageException(logScope.FailingLogs.First()).Message); + state.StoreTestResult(context.CurrentResult); + } + } + + state.NextAfterStepIndex++; + state.NextAfterStepPc = 0; + } + + state.Reset(); + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + + private static TestCommandPcHelper pcHelper; + + internal static TestCommandPcHelper ActivePcHelper + { + get + { + if (pcHelper == null) + { + pcHelper = new TestCommandPcHelper(); + } + + return pcHelper; + } + set + { + pcHelper = value; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta new file mode 100644 index 0000000..e3e4819 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cbbca1d8a0434be4bbc7f165523763ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs new file mode 100644 index 0000000..31734ee --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs @@ -0,0 +1,52 @@ +using System; +using System.Data; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + internal class BeforeAfterTestCommandState : ScriptableObject + { + public int NextBeforeStepIndex; + public int NextBeforeStepPc; + public int NextAfterStepIndex; + public int NextAfterStepPc; + public bool TestHasRun; + public TestStatus CurrentTestResultStatus; + public string CurrentTestResultLabel; + public FailureSite CurrentTestResultSite; + public string CurrentTestMessage; + public string CurrentTestStrackTrace; + public bool TestAfterStarted; + public long Timestamp; + + public void Reset() + { + NextBeforeStepIndex = 0; + NextBeforeStepPc = 0; + NextAfterStepIndex = 0; + NextAfterStepPc = 0; + TestHasRun = false; + CurrentTestResultStatus = TestStatus.Inconclusive; + CurrentTestResultLabel = null; + CurrentTestResultSite = default(FailureSite); + CurrentTestMessage = null; + CurrentTestStrackTrace = null; + TestAfterStarted = false; + } + + public void StoreTestResult(TestResult result) + { + CurrentTestResultStatus = result.ResultState.Status; + CurrentTestResultLabel = result.ResultState.Label; + CurrentTestResultSite = result.ResultState.Site; + CurrentTestMessage = result.Message; + CurrentTestStrackTrace = result.StackTrace; + } + + public void ApplyTestResult(TestResult result) + { + result.SetResult(new ResultState(CurrentTestResultStatus, CurrentTestResultLabel, CurrentTestResultSite), CurrentTestMessage, CurrentTestStrackTrace); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta new file mode 100644 index 0000000..da9bd2b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f65567c9026afb4db5de3355accc636 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs new file mode 100644 index 0000000..d452f24 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs @@ -0,0 +1,34 @@ + +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableApplyChangesToContextCommand : ApplyChangesToContextCommand, IEnumerableTestMethodCommand + { + public EnumerableApplyChangesToContextCommand(TestCommand innerCommand, IEnumerable changes) + : base(innerCommand, changes) { } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + ApplyChanges(context); + + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta new file mode 100644 index 0000000..6a955ca --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b4429eff9fcffb48b006e8edcc90338 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs new file mode 100644 index 0000000..1bdac69 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableRepeatedTestCommand : DelegatingTestCommand, IEnumerableTestMethodCommand + { + private int repeatCount; + + public EnumerableRepeatedTestCommand(RepeatAttribute.RepeatedTestCommand commandToReplace) : base(commandToReplace.GetInnerCommand()) + { + repeatCount = (int) typeof(RepeatAttribute.RepeatedTestCommand) + .GetField("repeatCount", BindingFlags.NonPublic | BindingFlags.Instance) + .GetValue(commandToReplace); + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + var unityContext = (UnityTestExecutionContext)context; + int count = unityContext.EnumerableRepeatedTestState; + + while (count < repeatCount) + { + count++; + unityContext.EnumerableRepeatedTestState = count; + + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + } + + if (context.CurrentResult.ResultState != ResultState.Success) + { + break; + } + } + + unityContext.EnumerableRepeatedTestState = 0; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta new file mode 100644 index 0000000..a738fba --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e273462feb9a65948826739f683cc9a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs new file mode 100644 index 0000000..ee82c29 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableRetryTestCommand : DelegatingTestCommand, IEnumerableTestMethodCommand + { + private int retryCount; + + public EnumerableRetryTestCommand(RetryAttribute.RetryCommand commandToReplace) : base(commandToReplace.GetInnerCommand()) + { + retryCount = (int) typeof(RetryAttribute.RetryCommand) + .GetField("_retryCount", BindingFlags.NonPublic | BindingFlags.Instance) + .GetValue(commandToReplace); + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + var unityContext = (UnityTestExecutionContext)context; + int count = unityContext.EnumerableRetryTestState; + + while (count < retryCount) + { + count++; + unityContext.EnumerableRetryTestState = count; + + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + yield return iterator; + } + } + else + { + context.CurrentResult = innerCommand.Execute(context); + } + + if (context.CurrentResult.ResultState != ResultState.Failure) + { + break; + } + } + + unityContext.EnumerableRetryTestState = 0; + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta new file mode 100644 index 0000000..56f4e14 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6de2f178a24cd2e48a0816cacd9a0583 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs new file mode 100644 index 0000000..e5bf7b8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableSetUpTearDownCommand : BeforeAfterTestCommandBase + { + public EnumerableSetUpTearDownCommand(TestCommand innerCommand) + : base(innerCommand, "SetUp", "TearDown") + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(UnitySetUpAttribute)); + AfterActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(UnityTearDownAttribute)).Reverse().ToArray(); + } + } + + private static MethodInfo[] GetMethodsWithAttributeFromFixture(Type fixtureType, Type setUpType) + { + MethodInfo[] methodsWithAttribute = Reflect.GetMethodsWithAttribute(fixtureType, setUpType, true); + return methodsWithAttribute.Where(x => x.ReturnType == typeof(IEnumerator)).ToArray(); + } + + protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context) + { + return (IEnumerator)Reflect.InvokeMethod(action, context.TestObject); + } + + protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context) + { + return (IEnumerator)Reflect.InvokeMethod(action, context.TestObject); + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return context.SetUpTearDownState; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta new file mode 100644 index 0000000..e61d049 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd85a35169d313840a0874aea1a28629 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs new file mode 100644 index 0000000..ff3017e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools +{ + internal class EnumerableTestMethodCommand : TestCommand, IEnumerableTestMethodCommand + { + private readonly TestMethod testMethod; + + public EnumerableTestMethodCommand(TestMethod testMethod) + : base(testMethod) + { + this.testMethod = testMethod; + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + yield return null; + + IEnumerator currentExecutingTestEnumerator; + try + { + currentExecutingTestEnumerator = new TestEnumeratorWrapper(testMethod).GetEnumerator(context); + } + catch (Exception ex) + { + context.CurrentResult.RecordException(ex); + yield break; + } + + if (currentExecutingTestEnumerator != null) + { + var testEnumeraterYieldInstruction = new TestEnumerator(context, currentExecutingTestEnumerator); + + yield return testEnumeraterYieldInstruction; + + var enumerator = testEnumeraterYieldInstruction.Execute(); + + var executingEnumerator = ExecuteEnumerableAndRecordExceptions(enumerator, context); + while (executingEnumerator.MoveNext()) + { + yield return executingEnumerator.Current; + } + } + else + { + if (context.CurrentResult.ResultState != ResultState.Ignored) + { + context.CurrentResult.SetResult(ResultState.Success); + } + } + } + + private static IEnumerator ExecuteEnumerableAndRecordExceptions(IEnumerator enumerator, ITestExecutionContext context) + { + while (true) + { + try + { + if (!enumerator.MoveNext()) + { + break; + } + } + catch (Exception ex) + { + context.CurrentResult.RecordException(ex); + break; + } + + if (enumerator.Current is IEnumerator) + { + var current = (IEnumerator)enumerator.Current; + yield return ExecuteEnumerableAndRecordExceptions(current, context); + } + else + { + yield return enumerator.Current; + } + } + } + + public override TestResult Execute(ITestExecutionContext context) + { + throw new NotImplementedException("Use ExecuteEnumerable"); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta new file mode 100644 index 0000000..4631e40 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19a6f000f81e24c4a826c1abd43e77c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs new file mode 100644 index 0000000..ae1b7b7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class ImmediateEnumerableCommand : DelegatingTestCommand + { + public ImmediateEnumerableCommand(TestCommand innerCommand) + : base(innerCommand) { } + + public override TestResult Execute(ITestExecutionContext context) + { + if (innerCommand is IEnumerableTestMethodCommand) + { + var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context); + foreach (var iterator in executeEnumerable) + { + if (iterator != null) + { + throw new Exception("Only null can be yielded at this point."); + } + } + return context.CurrentResult; + } + + return innerCommand.Execute(context); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta new file mode 100644 index 0000000..e650b54 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8349e42a2b30c7a4abd8678c203428ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs new file mode 100644 index 0000000..a0646f1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class OuterUnityTestActionCommand : BeforeAfterTestCommandBase + { + public OuterUnityTestActionCommand(TestCommand innerCommand) + : base(innerCommand, "BeforeTest", "AfterTest") + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetUnityTestActionsFromMethod(Test.Method.MethodInfo); + AfterActions = BeforeActions; + } + } + + private static IOuterUnityTestAction[] GetUnityTestActionsFromMethod(MethodInfo method) + { + var attributes = method.GetCustomAttributes(false); + List actions = new List(); + foreach (var attribute in attributes) + { + if (attribute is IOuterUnityTestAction) + actions.Add(attribute as IOuterUnityTestAction); + } + return actions.ToArray(); + } + + protected override IEnumerator InvokeBefore(IOuterUnityTestAction action, Test test, UnityTestExecutionContext context) + { + return action.BeforeTest(test); + } + + protected override IEnumerator InvokeAfter(IOuterUnityTestAction action, Test test, UnityTestExecutionContext context) + { + return action.AfterTest(test); + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return context.OuterUnityTestActionState; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta new file mode 100644 index 0000000..6415872 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d4fc309a0784294c8ab658b53b12320 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs new file mode 100644 index 0000000..c6ff0d9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class SetUpTearDownCommand : BeforeAfterTestCommandBase + { + public SetUpTearDownCommand(TestCommand innerCommand) + : base(innerCommand, "SetUp", "TearDown", true) + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(SetUpAttribute)); + AfterActions = GetMethodsWithAttributeFromFixture(Test.TypeInfo.Type, typeof(TearDownAttribute)).Reverse().ToArray(); + } + } + + private static MethodInfo[] GetMethodsWithAttributeFromFixture(Type fixtureType, Type setUpType) + { + MethodInfo[] methodsWithAttribute = Reflect.GetMethodsWithAttribute(fixtureType, setUpType, true); + return methodsWithAttribute.Where(x => x.ReturnType == typeof(void)).ToArray(); + } + + protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context) + { + Reflect.InvokeMethod(action, context.TestObject); + yield return null; + } + + protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context) + { + Reflect.InvokeMethod(action, context.TestObject); + yield return null; + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return null; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta new file mode 100644 index 0000000..28b84ac --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e0db3f3921670cd4ca2e925737c3fba4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs new file mode 100644 index 0000000..9b99dd0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestTools +{ + internal class TestActionCommand : BeforeAfterTestCommandBase + { + public TestActionCommand(TestCommand innerCommand) + : base(innerCommand, "BeforeTest", "AfterTest", true) + { + if (Test.TypeInfo.Type != null) + { + BeforeActions = GetTestActionsFromMethod(Test.Method.MethodInfo); + AfterActions = BeforeActions; + } + } + + private static ITestAction[] GetTestActionsFromMethod(MethodInfo method) + { + var attributes = method.GetCustomAttributes(false); + List actions = new List(); + foreach (var attribute in attributes) + { + if (attribute is ITestAction) + actions.Add(attribute as ITestAction); + } + return actions.ToArray(); + } + + protected override IEnumerator InvokeBefore(ITestAction action, Test test, UnityTestExecutionContext context) + { + action.BeforeTest(test); + yield return null; + } + + protected override IEnumerator InvokeAfter(ITestAction action, Test test, UnityTestExecutionContext context) + { + action.AfterTest(test); + yield return null; + } + + protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context) + { + return null; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta new file mode 100644 index 0000000..3f44e9d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2de8ba3b840049641897e0da7ce1d5cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs new file mode 100644 index 0000000..26eb4b0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections; + +namespace UnityEngine.TestTools +{ + internal class TestCommandPcHelper + { + public virtual void SetEnumeratorPC(IEnumerator enumerator, int pc) + { + // Noop implementation used in playmode. + } + + public virtual int GetEnumeratorPC(IEnumerator enumerator) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta new file mode 100644 index 0000000..1dbd4f4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33e6b78c96bb0694e96383e3c56b7b54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs new file mode 100644 index 0000000..dd7fbc2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs @@ -0,0 +1,141 @@ +using System; +using System.Linq; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + /// + /// Specialization of BaseDelegator that makes sure objects are created on the MainThread. + /// It also deals with ScriptableObjects so that tests can survive assembly reload. + /// + internal class ConstructDelegator + { + private Type m_RequestedType; + private object[] m_Arguments; + + private ScriptableObject m_CurrentRunningTest; + private readonly IStateSerializer m_StateSerializer; + + protected Exception m_Exception; + protected object m_Result; + protected ITestExecutionContext m_Context; + + public ConstructDelegator(IStateSerializer stateSerializer) + { + m_StateSerializer = stateSerializer; + } + + protected object HandleResult() + { + SetCurrentTestContext(); + if (m_Exception != null) + { + var temp = m_Exception; + m_Exception = null; + throw temp; + } + var tempResult = m_Result; + m_Result = null; + return tempResult; + } + + protected void SetCurrentTestContext() + { + var prop = typeof(UnityTestExecutionContext).GetProperty("CurrentContext"); + if (prop != null) + { + prop.SetValue(null, m_Context, null); + } + } + + public object Delegate(Type type, object[] arguments) + { + AssertState(); + m_Context = UnityTestExecutionContext.CurrentContext; + + m_RequestedType = type; + m_Arguments = arguments; + + using (var logScope = new LogScope()) + { + Execute(logScope); + } + + return HandleResult(); + } + + private void AssertState() + { + if (m_RequestedType != null) + { + throw new Exception("Constructor not executed yet"); + } + } + + public bool HasAction() + { + return m_RequestedType != null; + } + + public void Execute(LogScope logScope) + { + try + { + if (typeof(ScriptableObject).IsAssignableFrom(m_RequestedType)) + { + if (m_CurrentRunningTest != null && m_RequestedType != m_CurrentRunningTest.GetType()) + { + DestroyCurrentTestObjectIfExists(); + } + if (m_CurrentRunningTest == null) + { + if (m_StateSerializer.CanRestoreFromScriptableObject(m_RequestedType)) + { + m_CurrentRunningTest = m_StateSerializer.RestoreScriptableObjectInstance(); + } + else + { + m_CurrentRunningTest = ScriptableObject.CreateInstance(m_RequestedType); + } + } + m_Result = m_CurrentRunningTest; + } + else + { + DestroyCurrentTestObjectIfExists(); + m_Result = Activator.CreateInstance(m_RequestedType, m_Arguments); + if (m_StateSerializer.CanRestoreFromJson(m_RequestedType)) + { + m_StateSerializer.RestoreClassFromJson(ref m_Result); + } + } + if (logScope.AnyFailingLogs()) + { + var failingLog = logScope.FailingLogs.First(); + throw new UnhandledLogMessageException(failingLog); + } + if (logScope.ExpectedLogs.Any()) + throw new UnexpectedLogMessageException(LogScope.Current.ExpectedLogs.Peek()); + } + catch (Exception e) + { + m_Exception = e; + } + finally + { + m_RequestedType = null; + m_Arguments = null; + } + } + + public void DestroyCurrentTestObjectIfExists() + { + if (m_CurrentRunningTest == null) + return; + Object.DestroyImmediate(m_CurrentRunningTest); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta new file mode 100644 index 0000000..cb04fc8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b42e1db66fe9c634798674cb9e1df2ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters.meta new file mode 100644 index 0000000..a0aa994 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3de99f9efc582a48995bc8e8c2df418 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs new file mode 100644 index 0000000..d53a2d0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs @@ -0,0 +1,25 @@ +using System; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; + +namespace UnityEngine.TestRunner.NUnitExtensions.Filters +{ + internal class AssemblyNameFilter : ValueMatchFilter + { + public AssemblyNameFilter(string assemblyName) : base(assemblyName) {} + + public override bool Match(ITest test) + { + string assemblyName = string.Empty; + //Assembly fullname is in the format "Assembly-name, meta data ...", so extract the name by looking for the comma + if (test.TypeInfo != null && test.TypeInfo.Assembly != null && test.TypeInfo.FullName != null) + assemblyName = test.TypeInfo.Assembly.FullName.Substring(0, test.TypeInfo.Assembly.FullName.IndexOf(',')).TrimEnd(','); + return ExpectedValue.Equals(assemblyName, StringComparison.OrdinalIgnoreCase); + } + + protected override string ElementName + { + get { return "id"; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta new file mode 100644 index 0000000..2b89745 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91319408591cec1478efd3c62f9f418a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs new file mode 100644 index 0000000..58430e8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; + +namespace UnityEngine.TestRunner.NUnitExtensions.Filters +{ + internal class CategoryFilterExtended : CategoryFilter + { + public static string k_DefaultCategory = "Uncategorized"; + + public CategoryFilterExtended(string name) : base(name) + { + } + + public override bool Match(ITest test) + { + IList testCategories = test.Properties[PropertyNames.Category].Cast().ToList(); + + if (test is TestMethod) + { + // Do not count tests with no attribute as Uncategorized if test fixture class has at least one attribute + // The test inherits the attribute from the test fixture + IList fixtureCategories = test.Parent.Properties[PropertyNames.Category].Cast().ToList(); + if (fixtureCategories.Count > 0) + return false; + } + + if (testCategories.Count == 0 && ExpectedValue == k_DefaultCategory && test is TestMethod) + return true; + + return base.Match(test); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta new file mode 100644 index 0000000..a115cd2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebeedaa04bb53e24ba2e7fb6745e3fd3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs new file mode 100644 index 0000000..6bc1593 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Reflection; +using NUnit.Framework.Api; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal interface IAsyncTestAssemblyBuilder : ITestAssemblyBuilder + { + IEnumerator BuildAsync(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary options); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs.meta new file mode 100644 index 0000000..64283a3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3aa5c3d59b94854e843f10b75b3ad63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs new file mode 100644 index 0000000..951d079 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs @@ -0,0 +1,12 @@ +using System; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal interface IStateSerializer + { + ScriptableObject RestoreScriptableObjectInstance(); + void RestoreClassFromJson(ref object instance); + bool CanRestoreFromJson(Type requestedType); + bool CanRestoreFromScriptableObject(Type requestedType); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta new file mode 100644 index 0000000..1d32715 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f875a14565308a40a5262d2504da705 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner.meta new file mode 100644 index 0000000..1604cb5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37888acc09d9ee848bf9559f06645c45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs new file mode 100644 index 0000000..260e3cf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class CompositeWorkItem : UnityWorkItem + { + private readonly TestSuite _suite; + private readonly TestSuiteResult _suiteResult; + private readonly ITestFilter _childFilter; + private TestCommand _setupCommand; + private TestCommand _teardownCommand; + + public List Children { get; private set; } + + private int _countOrder; + + private CountdownEvent _childTestCountdown; + + public CompositeWorkItem(TestSuite suite, ITestFilter childFilter, WorkItemFactory factory) + : base(suite, factory) + { + _suite = suite; + _suiteResult = Result as TestSuiteResult; + _childFilter = childFilter; + _countOrder = 0; + } + + protected override IEnumerable PerformWork() + { + InitializeSetUpAndTearDownCommands(); + + if (UnityTestExecutionContext.CurrentContext != null && m_DontRunRestoringResult && EditModeTestCallbacks.RestoringTestContext != null) + { + EditModeTestCallbacks.RestoringTestContext(); + } + + if (!CheckForCancellation()) + if (Test.RunState == RunState.Explicit && !_childFilter.IsExplicitMatch(Test)) + SkipFixture(ResultState.Explicit, GetSkipReason(), null); + else + switch (Test.RunState) + { + default: + case RunState.Runnable: + case RunState.Explicit: + Result.SetResult(ResultState.Success); + + CreateChildWorkItems(); + + if (Children.Count > 0) + { + if (!m_DontRunRestoringResult) + { + //This is needed to give the editor a chance to go out of playmode if needed before creating objects. + //If we do not, the objects could be automatically destroyed when exiting playmode and could result in errors later on + yield return null; + PerformOneTimeSetUp(); + } + + if (!CheckForCancellation()) + { + switch (Result.ResultState.Status) + { + case TestStatus.Passed: + foreach (var child in RunChildren()) + { + if (CheckForCancellation()) + { + yield break; + } + + yield return child; + } + break; + case TestStatus.Skipped: + case TestStatus.Inconclusive: + case TestStatus.Failed: + SkipChildren(_suite, Result.ResultState.WithSite(FailureSite.Parent), "OneTimeSetUp: " + Result.Message); + break; + } + } + + if (Context.ExecutionStatus != TestExecutionStatus.AbortRequested && !m_DontRunRestoringResult) + { + PerformOneTimeTearDown(); + } + } + break; + + case RunState.Skipped: + SkipFixture(ResultState.Skipped, GetSkipReason(), null); + break; + + case RunState.Ignored: + SkipFixture(ResultState.Ignored, GetSkipReason(), null); + break; + + case RunState.NotRunnable: + SkipFixture(ResultState.NotRunnable, GetSkipReason(), GetProviderStackTrace()); + break; + } + if (!ResultedInDomainReload) + { + WorkItemComplete(); + } + } + + private bool CheckForCancellation() + { + if (Context.ExecutionStatus != TestExecutionStatus.Running) + { + Result.SetResult(ResultState.Cancelled, "Test cancelled by user"); + return true; + } + + return false; + } + + private void InitializeSetUpAndTearDownCommands() + { + List setUpTearDownItems = _suite.TypeInfo != null + ? CommandBuilder.BuildSetUpTearDownList(_suite.TypeInfo.Type, typeof(OneTimeSetUpAttribute), typeof(OneTimeTearDownAttribute)) + : new List(); + + var actionItems = new List(); + foreach (ITestAction action in Actions) + { + bool applyToSuite = (action.Targets & ActionTargets.Suite) == ActionTargets.Suite + || action.Targets == ActionTargets.Default && !(Test is ParameterizedMethodSuite); + + bool applyToTest = (action.Targets & ActionTargets.Test) == ActionTargets.Test + && !(Test is ParameterizedMethodSuite); + + if (applyToSuite) + actionItems.Add(new TestActionItem(action)); + + if (applyToTest) + Context.UpstreamActions.Add(action); + } + + _setupCommand = CommandBuilder.MakeOneTimeSetUpCommand(_suite, setUpTearDownItems, actionItems); + _teardownCommand = CommandBuilder.MakeOneTimeTearDownCommand(_suite, setUpTearDownItems, actionItems); + } + + private void PerformOneTimeSetUp() + { + var logScope = new LogScope(); + try + { + _setupCommand.Execute(Context); + } + catch (Exception ex) + { + if (ex is NUnitException || ex is TargetInvocationException) + ex = ex.InnerException; + + Result.RecordException(ex, FailureSite.SetUp); + } + + if (logScope.AnyFailingLogs()) + { + Result.RecordException(new UnhandledLogMessageException(logScope.FailingLogs.First())); + } + logScope.Dispose(); + } + + private IEnumerable RunChildren() + { + int childCount = Children.Count; + if (childCount == 0) + throw new InvalidOperationException("RunChildren called but item has no children"); + + _childTestCountdown = new CountdownEvent(childCount); + + foreach (UnityWorkItem child in Children) + { + if (CheckForCancellation()) + { + yield break; + } + + var unityTestExecutionContext = new UnityTestExecutionContext(Context); + child.InitializeContext(unityTestExecutionContext); + + var enumerable = child.Execute().GetEnumerator(); + + while (true) + { + if (!enumerable.MoveNext()) + { + break; + } + ResultedInDomainReload |= child.ResultedInDomainReload; + yield return enumerable.Current; + } + + _suiteResult.AddResult(child.Result); + childCount--; + } + + if (childCount > 0) + { + while (childCount-- > 0) + CountDownChildTest(); + } + } + + private void CreateChildWorkItems() + { + Children = new List(); + var testSuite = _suite; + + foreach (ITest test in testSuite.Tests) + { + if (_childFilter.Pass(test)) + { + var child = m_Factory.Create(test, _childFilter); + + if (test.Properties.ContainsKey(PropertyNames.Order)) + { + Children.Insert(0, child); + _countOrder++; + } + else + { + Children.Add(child); + } + } + } + + if (_countOrder != 0) SortChildren(); + } + + private class UnityWorkItemOrderComparer : IComparer + { + public int Compare(UnityWorkItem x, UnityWorkItem y) + { + var xKey = int.MaxValue; + var yKey = int.MaxValue; + + if (x.Test.Properties.ContainsKey(PropertyNames.Order)) + xKey = (int)x.Test.Properties[PropertyNames.Order][0]; + + if (y.Test.Properties.ContainsKey(PropertyNames.Order)) + yKey = (int)y.Test.Properties[PropertyNames.Order][0]; + + return xKey.CompareTo(yKey); + } + } + + private void SortChildren() + { + Children.Sort(0, _countOrder, new UnityWorkItemOrderComparer()); + } + + private void SkipFixture(ResultState resultState, string message, string stackTrace) + { + Result.SetResult(resultState.WithSite(FailureSite.SetUp), message, StackFilter.Filter(stackTrace)); + SkipChildren(_suite, resultState.WithSite(FailureSite.Parent), "OneTimeSetUp: " + message); + } + + private void SkipChildren(TestSuite suite, ResultState resultState, string message) + { + foreach (Test child in suite.Tests) + { + if (_childFilter.Pass(child)) + { + Context.Listener.TestStarted(child); + TestResult childResult = child.MakeTestResult(); + childResult.SetResult(resultState, message); + _suiteResult.AddResult(childResult); + + if (child.IsSuite) + SkipChildren((TestSuite)child, resultState, message); + + Context.Listener.TestFinished(childResult); + } + } + } + + private void PerformOneTimeTearDown() + { + _teardownCommand.Execute(Context); + } + + private string GetSkipReason() + { + return (string)Test.Properties.Get(PropertyNames.SkipReason); + } + + private string GetProviderStackTrace() + { + return (string)Test.Properties.Get(PropertyNames.ProviderStackTrace); + } + + private void CountDownChildTest() + { + _childTestCountdown.Signal(); + if (_childTestCountdown.CurrentCount == 0) + { + if (Context.ExecutionStatus != TestExecutionStatus.AbortRequested) + PerformOneTimeTearDown(); + + foreach (var childResult in _suiteResult.Children) + if (childResult.ResultState == ResultState.Cancelled) + { + this.Result.SetResult(ResultState.Cancelled, "Cancelled by user"); + break; + } + + WorkItemComplete(); + } + } + + public override void Cancel(bool force) + { + if (Children == null) + return; + + foreach (var child in Children) + { + var ctx = child.Context; + if (ctx != null) + ctx.ExecutionStatus = force ? TestExecutionStatus.AbortRequested : TestExecutionStatus.StopRequested; + + if (child.State == WorkItemState.Running) + child.Cancel(force); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta new file mode 100644 index 0000000..355dd71 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 110d5035a36a6a34580fb65bb40cd78f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs new file mode 100644 index 0000000..666a8dd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools.Utils; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class CoroutineTestWorkItem : UnityWorkItem + { + private static MonoBehaviour m_MonoBehaviourCoroutineRunner; + private TestCommand m_Command; + + public static MonoBehaviour monoBehaviourCoroutineRunner + { + get + { + if (m_MonoBehaviourCoroutineRunner == null) + { + throw new NullReferenceException("MonoBehaviour coroutine runner not set"); + } + return m_MonoBehaviourCoroutineRunner; + } + set { m_MonoBehaviourCoroutineRunner = value; } + } + + public CoroutineTestWorkItem(TestMethod test, ITestFilter filter) + : base(test, null) + { + m_Command = m_Command = TestCommandBuilder.BuildTestCommand(test, filter); + } + + protected override IEnumerable PerformWork() + { + if (m_Command is SkipCommand) + { + m_Command.Execute(Context); + Result = Context.CurrentResult; + WorkItemComplete(); + yield break; + } + + if (m_Command is ApplyChangesToContextCommand) + { + var applyChangesToContextCommand = (ApplyChangesToContextCommand)m_Command; + applyChangesToContextCommand.ApplyChanges(Context); + m_Command = applyChangesToContextCommand.GetInnerCommand(); + } + + var enumerableTestMethodCommand = (IEnumerableTestMethodCommand)m_Command; + try + { + var executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(Context).GetEnumerator(); + + var coroutineRunner = new CoroutineRunner(monoBehaviourCoroutineRunner, Context); + yield return coroutineRunner.HandleEnumerableTest(executeEnumerable); + + if (coroutineRunner.HasFailedWithTimeout()) + { + Context.CurrentResult.SetResult(ResultState.Failure, string.Format("Test exceeded Timeout value of {0}ms", Context.TestCaseTimeout)); + } + + while (executeEnumerable.MoveNext()) {} + + Result = Context.CurrentResult; + } + finally + { + WorkItemComplete(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta new file mode 100644 index 0000000..f5eb998 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b557515fff172984e8c4400b43f1c631 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs new file mode 100644 index 0000000..6690ecc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools; +using SetUpTearDownCommand = NUnit.Framework.Internal.Commands.SetUpTearDownCommand; +using TestActionCommand = NUnit.Framework.Internal.Commands.TestActionCommand; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class EditModeTestCallbacks + { + public static Action RestoringTestContext { get; set; } + } + + internal class DefaultTestWorkItem : UnityWorkItem + { + private TestCommand _command; + public DefaultTestWorkItem(TestMethod test, ITestFilter filter) + : base(test, null) + { + _command = TestCommandBuilder.BuildTestCommand(test, filter); + } + + protected override IEnumerable PerformWork() + { + if (m_DontRunRestoringResult && EditModeTestCallbacks.RestoringTestContext != null) + { + EditModeTestCallbacks.RestoringTestContext(); + Result = Context.CurrentResult; + yield break; + } + + try + { + if (_command is SkipCommand || _command is FailCommand) + { + Result = _command.Execute(Context); + yield break; + } + + if (!(_command is IEnumerableTestMethodCommand)) + { + Debug.LogError("Cannot perform work on " + _command.GetType().Name); + yield break; + } + if (Context.TestCaseTimeout == 0) + { + Context.TestCaseTimeout = k_DefaultTimeout; + } + foreach (var workItemStep in ((IEnumerableTestMethodCommand)_command).ExecuteEnumerable(Context)) + { + ResultedInDomainReload = false; + + if (workItemStep is IEditModeTestYieldInstruction) + { + var editModeTestYieldInstruction = (IEditModeTestYieldInstruction)workItemStep; + yield return editModeTestYieldInstruction; + var enumerator = editModeTestYieldInstruction.Perform(); + while (true) + { + bool moveNext; + try + { + moveNext = enumerator.MoveNext(); + } + catch (Exception e) + { + Context.CurrentResult.RecordException(e); + break; + } + + if (!moveNext) + { + break; + } + + yield return null; + } + } + else + { + yield return workItemStep; + } + } + + Result = Context.CurrentResult; + } + finally + { + WorkItemComplete(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta new file mode 100644 index 0000000..a843b77 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7cfda246e604b945b12b7afedb094ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs new file mode 100644 index 0000000..a01769d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs @@ -0,0 +1,34 @@ + +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class FailCommand : TestCommand, IEnumerableTestMethodCommand + { + private ResultState m_ResultState; + private string m_Message; + + public FailCommand(Test test, ResultState resultState, string message) + : base(test) + { + m_ResultState = resultState; + m_Message = message; + } + + public override TestResult Execute(ITestExecutionContext context) + { + context.CurrentResult.SetResult(m_ResultState, m_Message); + return context.CurrentResult; + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + context.CurrentResult.SetResult(m_ResultState, m_Message); + yield return null; + } + } + +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta new file mode 100644 index 0000000..921cc0a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68e5dc8bfd5d72647a93b7f2e1da831a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs new file mode 100644 index 0000000..758e295 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs @@ -0,0 +1,10 @@ +using System.Collections; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal interface IEnumerableTestMethodCommand + { + IEnumerable ExecuteEnumerable(ITestExecutionContext context); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta new file mode 100644 index 0000000..4434337 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dbd43d8a3b8122d4e89b055f53382b11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs new file mode 100644 index 0000000..5d32f26 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs @@ -0,0 +1,13 @@ +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class PlaymodeWorkItemFactory : WorkItemFactory + { + protected override UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest) + { + return new CoroutineTestWorkItem(method, filter); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta new file mode 100644 index 0000000..9c2a8ed --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ef6801a8b664544aa9f2ab1bc1f8b60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs new file mode 100644 index 0000000..e05910a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs @@ -0,0 +1,4 @@ +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class RestoreTestContextAfterDomainReload {} +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta new file mode 100644 index 0000000..640354d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26721f9940339264fb14bdbfe1290e21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs new file mode 100644 index 0000000..0a0c1c3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestTools; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal static class TestCommandBuilder + { + public static TestCommand BuildTestCommand(TestMethod test, ITestFilter filter) + { + if (test.RunState != RunState.Runnable && + !(test.RunState == RunState.Explicit && filter.IsExplicitMatch(test))) + { + return new SkipCommand(test); + } + + var testReturnsIEnumerator = test.Method.ReturnType.Type == typeof(IEnumerator); + + TestCommand command; + if (!testReturnsIEnumerator) + { + command = new TestMethodCommand(test); + } + else + { + command = new EnumerableTestMethodCommand(test); + } + + command = new UnityLogCheckDelegatingCommand(command); + foreach (var wrapper in test.Method.GetCustomAttributes(true)) + { + command = wrapper.Wrap(command); + if (command == null) + { + var message = String.Format("IWrapTestMethod implementation '{0}' returned null as command.", + wrapper.GetType().FullName); + return new FailCommand(test, ResultState.Failure, message); + } + + if (testReturnsIEnumerator && !(command is IEnumerableTestMethodCommand)) + { + command = TryReplaceWithEnumerableCommand(command); + if (command != null) + { + continue; + } + + var message = String.Format("'{0}' is not supported on {1} as it does not handle returning IEnumerator.", + wrapper.GetType().FullName, + GetTestBuilderName(test)); + return new FailCommand(test, ResultState.Failure, message); + } + } + + command = new UnityEngine.TestTools.TestActionCommand(command); + command = new UnityEngine.TestTools.SetUpTearDownCommand(command); + + if (!testReturnsIEnumerator) + { + command = new ImmediateEnumerableCommand(command); + } + + foreach (var wrapper in test.Method.GetCustomAttributes(true)) + { + command = wrapper.Wrap(command); + if (command == null) + { + var message = String.Format("IWrapSetUpTearDown implementation '{0}' returned null as command.", + wrapper.GetType().FullName); + return new FailCommand(test, ResultState.Failure, message); + } + + if (testReturnsIEnumerator && !(command is IEnumerableTestMethodCommand)) + { + command = TryReplaceWithEnumerableCommand(command); + if (command != null) + { + continue; + } + + var message = String.Format("'{0}' is not supported on {1} as it does not handle returning IEnumerator.", + wrapper.GetType().FullName, + GetTestBuilderName(test)); + return new FailCommand(test, ResultState.Failure, message); + } + } + + command = new EnumerableSetUpTearDownCommand(command); + command = new OuterUnityTestActionCommand(command); + + IApplyToContext[] changes = test.Method.GetCustomAttributes(true); + if (changes.Length > 0) + { + command = new EnumerableApplyChangesToContextCommand(command, changes); + } + + return command; + } + + private static string GetTestBuilderName(TestMethod testMethod) + { + return new[] + { + testMethod.Method.GetCustomAttributes(true).Select(attribute => attribute.GetType().Name), + testMethod.Method.GetCustomAttributes(true).Select(attribute => attribute.GetType().Name) + }.SelectMany(v => v).FirstOrDefault(); + } + + private static TestCommand TryReplaceWithEnumerableCommand(TestCommand command) + { + switch (command.GetType().Name) + { + case nameof(RepeatAttribute.RepeatedTestCommand): + return new EnumerableRepeatedTestCommand(command as RepeatAttribute.RepeatedTestCommand); + case nameof(RetryAttribute.RetryCommand): + return new EnumerableRetryTestCommand(command as RetryAttribute.RetryCommand); + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta new file mode 100644 index 0000000..769bce6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f40df9c8cf926b241b093a37028d8815 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs new file mode 100644 index 0000000..05b725a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Commands; +using UnityEngine.TestTools; +using UnityEngine.TestTools.Logging; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + class UnityLogCheckDelegatingCommand : DelegatingTestCommand, IEnumerableTestMethodCommand + { + static Dictionary s_AttributeCache = new Dictionary(); + + public UnityLogCheckDelegatingCommand(TestCommand innerCommand) + : base(innerCommand) {} + + public override TestResult Execute(ITestExecutionContext context) + { + using (var logScope = new LogScope()) + { + if (ExecuteAndCheckLog(logScope, context.CurrentResult, () => innerCommand.Execute(context))) + PostTestValidation(logScope, innerCommand, context.CurrentResult); + } + + return context.CurrentResult; + } + + public IEnumerable ExecuteEnumerable(ITestExecutionContext context) + { + if (!(innerCommand is IEnumerableTestMethodCommand enumerableTestMethodCommand)) + { + Execute(context); + yield break; + } + + using (var logScope = new LogScope()) + { + IEnumerable executeEnumerable = null; + + if (!ExecuteAndCheckLog(logScope, context.CurrentResult, + () => executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(context))) + yield break; + + foreach (var step in executeEnumerable) + { + // do not check expected logs here - we want to permit expecting and receiving messages to run + // across frames. (but we do always want to catch a fail immediately.) + if (!CheckFailingLogs(logScope, context.CurrentResult)) + yield break; + + yield return step; + } + + if (!CheckLogs(context.CurrentResult, logScope)) + yield break; + + PostTestValidation(logScope, innerCommand, context.CurrentResult); + } + } + + static bool CaptureException(TestResult result, Action action) + { + try + { + action(); + return true; + } + catch (Exception e) + { + result.RecordException(e); + return false; + } + } + + static bool ExecuteAndCheckLog(LogScope logScope, TestResult result, Action action) + => CaptureException(result, action) && CheckLogs(result, logScope); + + static void PostTestValidation(LogScope logScope, TestCommand command, TestResult result) + { + if (MustExpect(command.Test.Method.MethodInfo)) + CaptureException(result, logScope.NoUnexpectedReceived); + } + + static bool CheckLogs(TestResult result, LogScope logScope) + => CheckFailingLogs(logScope, result) && CheckExpectedLogs(logScope, result); + + static bool CheckFailingLogs(LogScope logScope, TestResult result) + { + if (!logScope.AnyFailingLogs()) + return true; + + var failingLog = logScope.FailingLogs.First(); + result.RecordException(new UnhandledLogMessageException(failingLog)); + return false; + } + + static bool CheckExpectedLogs(LogScope logScope, TestResult result) + { + if (!logScope.ExpectedLogs.Any()) + return true; + + var expectedLog = logScope.ExpectedLogs.Peek(); + result.RecordException(new UnexpectedLogMessageException(expectedLog)); + return false; + } + + static bool MustExpect(MemberInfo method) + { + // method + + var methodAttr = method.GetCustomAttributes(true).FirstOrDefault(); + if (methodAttr != null) + return methodAttr.MustExpect; + + // fixture + + var fixture = method.DeclaringType; + if (!s_AttributeCache.TryGetValue(fixture, out var mustExpect)) + { + var fixtureAttr = fixture.GetCustomAttributes(true).FirstOrDefault(); + mustExpect = s_AttributeCache[fixture] = fixtureAttr?.MustExpect; + } + + if (mustExpect != null) + return mustExpect.Value; + + // assembly + + var assembly = fixture.Assembly; + if (!s_AttributeCache.TryGetValue(assembly, out mustExpect)) + { + var assemblyAttr = assembly.GetCustomAttributes().FirstOrDefault(); + mustExpect = s_AttributeCache[assembly] = assemblyAttr?.MustExpect; + } + + return mustExpect == true; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta new file mode 100644 index 0000000..86d9d9e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48230e4e90fb4d14a9d56bddea898413 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs new file mode 100644 index 0000000..96ed23a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs @@ -0,0 +1,98 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestTools; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal interface IUnityTestAssemblyRunner + { + ITest LoadedTest { get; } + ITestResult Result { get; } + bool IsTestLoaded { get; } + bool IsTestRunning { get; } + bool IsTestComplete { get; } + UnityWorkItem TopLevelWorkItem { get; set; } + UnityTestExecutionContext GetCurrentContext(); + ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary settings); + IEnumerable Run(ITestListener listener, ITestFilter filter); + void StopRun(); + } + + internal class UnityTestAssemblyRunner : IUnityTestAssemblyRunner + { + private readonly UnityTestAssemblyBuilder unityBuilder; + private readonly WorkItemFactory m_Factory; + + protected UnityTestExecutionContext Context { get; set; } + + public UnityTestExecutionContext GetCurrentContext() + { + return UnityTestExecutionContext.CurrentContext; + } + + protected IDictionary Settings { get; set; } + public ITest LoadedTest { get; protected set; } + + public ITestResult Result + { + get { return TopLevelWorkItem == null ? null : TopLevelWorkItem.Result; } + } + + public bool IsTestLoaded + { + get { return LoadedTest != null; } + } + + public bool IsTestRunning + { + get { return TopLevelWorkItem != null && TopLevelWorkItem.State == NUnit.Framework.Internal.Execution.WorkItemState.Running; } + } + public bool IsTestComplete + { + get { return TopLevelWorkItem != null && TopLevelWorkItem.State == NUnit.Framework.Internal.Execution.WorkItemState.Complete; } + } + + public UnityTestAssemblyRunner(UnityTestAssemblyBuilder builder, WorkItemFactory factory) + { + unityBuilder = builder; + m_Factory = factory; + Context = new UnityTestExecutionContext(); + } + + public ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary settings) + { + Settings = settings; + + if (settings.ContainsKey(FrameworkPackageSettings.RandomSeed)) + Randomizer.InitialSeed = (int)settings[FrameworkPackageSettings.RandomSeed]; + + return LoadedTest = unityBuilder.Build(assemblies, Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings); + } + + public IEnumerable Run(ITestListener listener, ITestFilter filter) + { + TopLevelWorkItem = m_Factory.Create(LoadedTest, filter); + TopLevelWorkItem.InitializeContext(Context); + UnityTestExecutionContext.CurrentContext = Context; + Context.Listener = listener; + + return TopLevelWorkItem.Execute(); + } + + public UnityWorkItem TopLevelWorkItem { get; set; } + + public void StopRun() + { + if (IsTestRunning) + { + TopLevelWorkItem.Cancel(false); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta new file mode 100644 index 0000000..96179c5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 874e40a588dbb1e48bc128d686337d4e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs new file mode 100644 index 0000000..08bd03d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using NUnit.Framework; +using NUnit.Framework.Constraints; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Execution; +using UnityEngine.TestTools; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class UnityTestExecutionContext : ITestExecutionContext + { + private readonly UnityTestExecutionContext _priorContext; + private TestResult _currentResult; + private int _assertCount; + + public static UnityTestExecutionContext CurrentContext { get; set; } + + public UnityTestExecutionContext Context { get; private set; } + + public Test CurrentTest { get; set; } + public DateTime StartTime { get; set; } + public long StartTicks { get; set; } + public TestResult CurrentResult + { + get { return _currentResult; } + set + { + _currentResult = value; + if (value != null) + OutWriter = value.OutWriter; + } + } + + public object TestObject { get; set; } + public string WorkDirectory { get; set; } + + + private TestExecutionStatus _executionStatus; + public TestExecutionStatus ExecutionStatus + { + get + { + // ExecutionStatus may have been set to StopRequested or AbortRequested + // in a prior context. If so, reflect the same setting in this context. + if (_executionStatus == TestExecutionStatus.Running && _priorContext != null) + _executionStatus = _priorContext.ExecutionStatus; + + return _executionStatus; + } + set + { + _executionStatus = value; + + // Push the same setting up to all prior contexts + if (_priorContext != null) + _priorContext.ExecutionStatus = value; + } + } + + public List UpstreamActions { get; private set; } + public int TestCaseTimeout { get; set; } + public CultureInfo CurrentCulture { get; set; } + public CultureInfo CurrentUICulture { get; set; } + public ITestListener Listener { get; set; } + + public UnityTestExecutionContext() + { + UpstreamActions = new List(); + CurrentContext = this; + } + + public UnityTestExecutionContext(UnityTestExecutionContext other) + { + _priorContext = other; + + CurrentTest = other.CurrentTest; + CurrentResult = other.CurrentResult; + TestObject = other.TestObject; + WorkDirectory = other.WorkDirectory; + Listener = other.Listener; + TestCaseTimeout = other.TestCaseTimeout; + UpstreamActions = new List(other.UpstreamActions); + SetUpTearDownState = other.SetUpTearDownState; + OuterUnityTestActionState = other.OuterUnityTestActionState; + + TestContext.CurrentTestExecutionContext = this; + + CurrentCulture = other.CurrentCulture; + CurrentUICulture = other.CurrentUICulture; + CurrentContext = this; + } + + public TextWriter OutWriter { get; private set; } + public bool StopOnError { get; set; } + + public IWorkItemDispatcher Dispatcher { get; set; } + + public ParallelScope ParallelScope { get; set; } + public string WorkerId { get; private set; } + public Randomizer RandomGenerator { get; private set; } + public ValueFormatter CurrentValueFormatter { get; private set; } + public bool IsSingleThreaded { get; set; } + public BeforeAfterTestCommandState SetUpTearDownState { get; set; } + public BeforeAfterTestCommandState OuterUnityTestActionState { get; set; } + public int EnumerableRepeatedTestState { get; set; } + public int EnumerableRetryTestState { get; set; } + + internal int AssertCount + { + get + { + return _assertCount; + } + } + + public void IncrementAssertCount() + { + _assertCount += 1; + } + + public void AddFormatter(ValueFormatterFactory formatterFactory) + { + throw new NotImplementedException(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta new file mode 100644 index 0000000..33d323b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59ff995fabb3bac45afa0f96f333e5dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs new file mode 100644 index 0000000..9a3a46b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Execution; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal abstract class UnityWorkItem + { + protected readonly WorkItemFactory m_Factory; + protected bool m_ExecuteTestStartEvent; + protected bool m_DontRunRestoringResult; + protected const int k_DefaultTimeout = 1000 * 180; + public event EventHandler Completed; + + public bool ResultedInDomainReload { get; internal set; } + + public UnityTestExecutionContext Context { get; private set; } + + public Test Test { get; private set; } + + public TestResult Result { get; protected set; } + + public WorkItemState State { get; private set; } + + public List Actions { get; private set; } + + protected UnityWorkItem(Test test, WorkItemFactory factory) + { + m_Factory = factory; + Test = test; + Actions = new List(); + Result = test.MakeTestResult(); + State = WorkItemState.Ready; + m_ExecuteTestStartEvent = ShouldExecuteStartEvent(); + m_DontRunRestoringResult = ShouldRestore(test); + } + + protected static bool ShouldRestore(ITest loadedTest) + { + return UnityWorkItemDataHolder.alreadyExecutedTests != null && + UnityWorkItemDataHolder.alreadyExecutedTests.Contains(loadedTest.GetUniqueName()); + } + + protected bool ShouldExecuteStartEvent() + { + return UnityWorkItemDataHolder.alreadyStartedTests != null && + UnityWorkItemDataHolder.alreadyStartedTests.All(x => x != Test.GetUniqueName()) && + !ShouldRestore(Test); + } + + protected abstract IEnumerable PerformWork(); + + public void InitializeContext(UnityTestExecutionContext context) + { + Context = context; + + if (Test is TestAssembly) + Actions.AddRange(ActionsHelper.GetActionsFromTestAssembly((TestAssembly)Test)); + else if (Test is ParameterizedMethodSuite) + Actions.AddRange(ActionsHelper.GetActionsFromTestMethodInfo(Test.Method)); + else if (Test.TypeInfo != null) + Actions.AddRange(ActionsHelper.GetActionsFromTypesAttributes(Test.TypeInfo.Type)); + } + + public virtual IEnumerable Execute() + { + Context.CurrentTest = this.Test; + Context.CurrentResult = this.Result; + + if (m_ExecuteTestStartEvent) + { + Context.Listener.TestStarted(Test); + } + + Context.StartTime = DateTime.UtcNow; + Context.StartTicks = Stopwatch.GetTimestamp(); + + State = WorkItemState.Running; + + return PerformWork(); + } + + protected void WorkItemComplete() + { + State = WorkItemState.Complete; + + Result.StartTime = Context.StartTime; + Result.EndTime = DateTime.UtcNow; + + long tickCount = Stopwatch.GetTimestamp() - Context.StartTicks; + double seconds = (double)tickCount / Stopwatch.Frequency; + Result.Duration = seconds; + + //Result.AssertCount += Context.AssertCount; + + Context.Listener.TestFinished(Result); + + if (Completed != null) + Completed(this, EventArgs.Empty); + + Context.TestObject = null; + Test.Fixture = null; + } + + public virtual void Cancel(bool force) + { + Result.SetResult(ResultState.Cancelled, "Cancelled by user"); + Context.Listener.TestFinished(Result); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta new file mode 100644 index 0000000..48b9f92 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79ced2556f0af814a840b86232613ff1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs new file mode 100644 index 0000000..d9fb700 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class UnityWorkItemDataHolder + { + public static List alreadyStartedTests = new List(); + public static List alreadyExecutedTests; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta new file mode 100644 index 0000000..6d90872 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b3e90046c38f1d4dad2e0d5a79e871c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs new file mode 100644 index 0000000..94d9c0f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs @@ -0,0 +1,28 @@ +using System.Collections; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal abstract class WorkItemFactory + { + public UnityWorkItem Create(ITest loadedTest, ITestFilter filter) + { + TestSuite suite = loadedTest as TestSuite; + if (suite != null) + { + return new CompositeWorkItem(suite, filter, this); + } + + var testMethod = (TestMethod)loadedTest; + if (testMethod.Method.ReturnType.Type != typeof(IEnumerator)) + { + return new DefaultTestWorkItem(testMethod, filter); + } + + return Create(testMethod, filter, loadedTest); + } + + protected abstract UnityWorkItem Create(TestMethod method, ITestFilter filter, ITest loadedTest); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta new file mode 100644 index 0000000..e5f0377 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c15bf0966eb95847a4260d830a30d30 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs new file mode 100644 index 0000000..7e74030 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs @@ -0,0 +1,153 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Filters; + +namespace UnityEngine.TestRunner.NUnitExtensions +{ + internal static class TestExtensions + { + private static IEnumerable GetTestCategories(this ITest test) + { + var categories = test.Properties[PropertyNames.Category].Cast().ToList(); + if (categories.Count == 0 && test is TestMethod) + { + // only mark tests as Uncategorized if the test fixture doesn't have a category, + // otherwise the test inherits the Fixture category + var fixtureCategories = test.Parent.Properties[PropertyNames.Category].Cast().ToList(); + if (fixtureCategories.Count == 0) + categories.Add(CategoryFilterExtended.k_DefaultCategory); + } + return categories; + } + + public static bool HasCategory(this ITest test, string[] categoryFilter) + { + var categories = test.GetAllCategoriesFromTest().Distinct(); + return categoryFilter.Any(c => categories.Any(r => r == c)); + } + + public static List GetAllCategoriesFromTest(this ITest test) + { + if (test.Parent == null) + return test.GetTestCategories().ToList(); + + var categories = GetAllCategoriesFromTest(test.Parent); + categories.AddRange(test.GetTestCategories()); + return categories; + } + + public static void ParseForNameDuplicates(this ITest test) + { + var duplicates = new Dictionary(); + for (var i = 0; i < test.Tests.Count; i++) + { + var child = test.Tests[i]; + int count; + if (duplicates.TryGetValue(child.FullName, out count)) + { + count++; + child.Properties.Add("childIndex", count); + duplicates[child.FullName] = count; + } + else + { + duplicates.Add(child.FullName, 1); + } + ParseForNameDuplicates(child); + } + } + + public static int GetChildIndex(this ITest test) + { + var index = test.Properties["childIndex"]; + return (int)index[0]; + } + + public static bool HasChildIndex(this ITest test) + { + var index = test.Properties["childIndex"]; + return index.Count > 0; + } + + static string GetAncestorPath(ITest test) + { + var path = ""; + var testParent = test.Parent; + + while (testParent != null && testParent.Parent != null && !string.IsNullOrEmpty(testParent.Name)) + { + path = testParent.Name + "/" + path; + testParent = testParent.Parent; + } + + return path; + } + + public static string GetUniqueName(this ITest test) + { + var id = GetAncestorPath(test) + GetFullName(test); + if (test.HasChildIndex()) + { + var index = test.GetChildIndex(); + if (index >= 0) + id += index; + } + if (test.IsSuite) + { + id += "[suite]"; + } + return id; + } + + public static string GetFullName(ITest test) + { + var typeInfo = test.TypeInfo ?? test.Parent?.TypeInfo ?? test.Tests.FirstOrDefault()?.TypeInfo; + if (typeInfo == null) + { + return "[" + test.Name + "]"; + } + + var assemblyId = typeInfo.Assembly.GetName().Name; + if (assemblyId == test.Name) + { + return $"[{test.Name}]"; + } + + return string.Format("[{0}][{1}]", assemblyId, test.FullName); + } + + public static string GetSkipReason(this ITest test) + { + if (test.Properties.ContainsKey(PropertyNames.SkipReason)) + return (string)test.Properties.Get(PropertyNames.SkipReason); + + return null; + } + + public static string GetParentId(this ITest test) + { + if (test.Parent != null) + return test.Parent.Id; + + return null; + } + + public static string GetParentFullName(this ITest test) + { + if (test.Parent != null) + return test.Parent.FullName; + + return null; + } + + public static string GetParentUniqueName(this ITest test) + { + if (test.Parent != null) + return GetUniqueName(test.Parent); + + return null; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta new file mode 100644 index 0000000..3230eb4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bc74398aa3944646ade4ee78cd57484 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs new file mode 100644 index 0000000..d79072b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs @@ -0,0 +1,77 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestRunner.NUnitExtensions +{ + internal static class TestResultExtensions + { + public static void RecordPrefixedException(this TestResult testResult, string prefix, Exception ex, ResultState resultState = null) + + { + if (ex is NUnitException) + { + ex = ex.InnerException; + } + + if (resultState == null) + { + resultState = testResult.ResultState == ResultState.Cancelled + ? ResultState.Cancelled + : ResultState.Error; + } + + var exceptionMessage = ExceptionHelper.BuildMessage(ex); + string stackTrace = "--" + prefix + NUnit.Env.NewLine + ExceptionHelper.BuildStackTrace(ex); + if (testResult.StackTrace != null) + { + stackTrace = testResult.StackTrace + NUnit.Env.NewLine + stackTrace; + } + + if (testResult.Test.IsSuite) + { + resultState = resultState.WithSite(FailureSite.TearDown); + } + + if (ex is ResultStateException) + { + exceptionMessage = ex.Message; + resultState = ((ResultStateException)ex).ResultState; + stackTrace = StackFilter.Filter(ex.StackTrace); + } + + string message = (string.IsNullOrEmpty(prefix) ? "" : (prefix + " : ")) + exceptionMessage; + if (testResult.Message != null) + { + message = testResult.Message + NUnit.Env.NewLine + message; + } + + testResult.SetResult(resultState, message, stackTrace); + } + + public static void RecordPrefixedError(this TestResult testResult, string prefix, string error, ResultState resultState = null) + + { + if (resultState == null) + { + resultState = testResult.ResultState == ResultState.Cancelled + ? ResultState.Cancelled + : ResultState.Error; + } + + if (testResult.Test.IsSuite) + { + resultState = resultState.WithSite(FailureSite.TearDown); + } + + string message = (string.IsNullOrEmpty(prefix) ? "" : (prefix + " : ")) + error; + if (testResult.Message != null) + { + message = testResult.Message + NUnit.Env.NewLine + message; + } + + testResult.SetResult(resultState, message); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta new file mode 100644 index 0000000..ff97b17 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65fb6da362a78334ab360a125cfafdaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs new file mode 100644 index 0000000..79f4aa5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using NUnit; +using NUnit.Framework.Api; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.NUnitExtensions +{ + internal class UnityTestAssemblyBuilder : DefaultTestAssemblyBuilder, IAsyncTestAssemblyBuilder + { + private readonly string m_ProductName; + public UnityTestAssemblyBuilder() + { + m_ProductName = Application.productName; + } + + public ITest Build(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary options) + { + var test = BuildAsync(assemblies, testPlatforms, options); + while (test.MoveNext()) + { + } + + return test.Current; + } + + public IEnumerator BuildAsync(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary options) + { + var productName = string.Join("_", m_ProductName.Split(Path.GetInvalidFileNameChars())); + var suite = new TestSuite(productName); + for (var index = 0; index < assemblies.Length; index++) + { + var assembly = assemblies[index]; + var platform = testPlatforms[index]; + + var assemblySuite = Build(assembly, options) as TestSuite; + if (assemblySuite != null && assemblySuite.HasChildren) + { + assemblySuite.Properties.Set("platform", platform); + suite.Add(assemblySuite); + } + + yield return null; + } + + yield return suite; + } + + public static Dictionary GetNUnitTestBuilderSettings(TestPlatform testPlatform) + { + var emptySettings = new Dictionary(); + emptySettings.Add(FrameworkPackageSettings.TestParameters, "platform=" + testPlatform); + return emptySettings; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta new file mode 100644 index 0000000..f0fdf17 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98ba0396e4b4ee8498a8f097affcfddf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner.meta new file mode 100644 index 0000000..e44f879 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ddb9e1c877ea80479d1eab4ddaa5d0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks.meta new file mode 100644 index 0000000..899ce79 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61e236e8570a95e4eb754fb291e102e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs new file mode 100644 index 0000000..d792687 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs @@ -0,0 +1,47 @@ +using NUnit.Framework; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + [AddComponentMenu("")] + internal class PlayModeRunnerCallback : MonoBehaviour, ITestRunnerListener + { + private TestResultRenderer m_ResultRenderer; + + public void RunFinished(ITestResult testResults) + { + Application.logMessageReceivedThreaded -= LogRecieved; + if (Camera.main == null) + { + gameObject.AddComponent(); + } + m_ResultRenderer = new TestResultRenderer(testResults); + m_ResultRenderer.ShowResults(); + } + + public void TestFinished(ITestResult result) + { + } + + public void OnGUI() + { + if (m_ResultRenderer != null) + m_ResultRenderer.Draw(); + } + + public void RunStarted(ITest testsToRun) + { + Application.logMessageReceivedThreaded += LogRecieved; + } + + public void TestStarted(ITest test) + { + } + + private void LogRecieved(string message, string stacktrace, LogType type) + { + if (TestContext.Out != null) + TestContext.Out.WriteLine(message); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta new file mode 100644 index 0000000..15706d5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3cf5cb9e1ef590c48b1f919f2a7bd895 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs new file mode 100644 index 0000000..267048c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs @@ -0,0 +1,43 @@ +using NUnit.Framework.Interfaces; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + internal class PlayerQuitHandler : MonoBehaviour, ITestRunnerListener + { + public void Start() + { + PlayerConnection.instance.Register(PlayerConnectionMessageIds.quitPlayerMessageId, ProcessPlayerQuiteMessage); + } + + private void ProcessPlayerQuiteMessage(MessageEventArgs arg0) + { + //Some platforms don't quit, so we need to disconnect to make sure they will not connect to another editor instance automatically. + PlayerConnection.instance.DisconnectAll(); + + //XBOX has an error when quitting + if (Application.platform == RuntimePlatform.XboxOne) + { + return; + } + Application.Quit(); + } + + public void RunStarted(ITest testsToRun) + { + } + + public void RunFinished(ITestResult testResults) + { + } + + public void TestStarted(ITest test) + { + } + + public void TestFinished(ITestResult result) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs.meta new file mode 100644 index 0000000..9d84990 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f8ed0b11850145c4995dd76170bb2500 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs new file mode 100644 index 0000000..755ac83 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework.Interfaces; +using UnityEngine.Networking.PlayerConnection; +using UnityEngine.TestRunner.TestLaunchers; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + [AddComponentMenu("")] + internal class RemoteTestResultSender : MonoBehaviour, ITestRunnerListener + { + private class QueueData + { + public Guid id { get; set; } + public byte[] data { get; set; } + } + + private const int k_aliveMessageFrequency = 120; + private float m_NextliveMessage = k_aliveMessageFrequency; + private readonly Queue m_SendQueue = new Queue(); + private readonly object m_LockQueue = new object(); + private readonly IRemoteTestResultDataFactory m_TestResultDataFactory = new RemoteTestResultDataFactory(); + + public void Start() + { + StartCoroutine(SendDataRoutine()); + } + + private byte[] SerializeObject(object objectToSerialize) + { + return Encoding.UTF8.GetBytes(JsonUtility.ToJson(objectToSerialize)); + } + + public void RunStarted(ITest testsToRun) + { + var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(testsToRun)); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData + { + id = PlayerConnectionMessageIds.runStartedMessageId, + data = data + }); + } + } + + public void RunFinished(ITestResult testResults) + { + var data = SerializeObject(m_TestResultDataFactory.CreateFromTestResult(testResults)); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData { id = PlayerConnectionMessageIds.runFinishedMessageId, data = data, }); + } + } + + public void TestStarted(ITest test) + { + var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(test)); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData + { + id = PlayerConnectionMessageIds.testStartedMessageId, + data = data + }); + } + } + + public void TestFinished(ITestResult result) + { + var testRunnerResultForApi = m_TestResultDataFactory.CreateFromTestResult(result); + var resultData = SerializeObject(testRunnerResultForApi); + lock (m_LockQueue) + { + m_SendQueue.Enqueue(new QueueData + { + id = PlayerConnectionMessageIds.testFinishedMessageId, + data = resultData, + }); + } + } + + public IEnumerator SendDataRoutine() + { + while (!PlayerConnection.instance.isConnected) + { + yield return new WaitForSeconds(1); + } + + while (true) + { + lock (m_LockQueue) + { + if (PlayerConnection.instance.isConnected && m_SendQueue.Count > 0) + { + ResetNextPlayerAliveMessageTime(); + var queueData = m_SendQueue.Dequeue(); + PlayerConnection.instance.Send(queueData.id, queueData.data); + yield return null; + } + + //This is needed so we dont stall the player totally + if (!m_SendQueue.Any()) + { + SendAliveMessageIfNeeded(); + yield return new WaitForSeconds(0.02f); + } + } + } + } + + private void SendAliveMessageIfNeeded() + { + if (Time.timeSinceLevelLoad < m_NextliveMessage) + { + return; + } + + Debug.Log("Sending player alive message back to editor."); + ResetNextPlayerAliveMessageTime(); + PlayerConnection.instance.Send(PlayerConnectionMessageIds.playerAliveHeartbeat, new byte[0]); + } + + private void ResetNextPlayerAliveMessageTime() + { + m_NextliveMessage = Time.timeSinceLevelLoad + k_aliveMessageFrequency; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta new file mode 100644 index 0000000..cbb4d40 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20793418366caf14293b29c55df5e9ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs new file mode 100644 index 0000000..3d59430 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + internal class TestResultRenderer + { + private static class Styles + { + public static readonly GUIStyle SucceedLabelStyle; + public static readonly GUIStyle FailedLabelStyle; + public static readonly GUIStyle FailedMessagesStyle; + + static Styles() + { + SucceedLabelStyle = new GUIStyle("label"); + SucceedLabelStyle.normal.textColor = Color.green; + SucceedLabelStyle.fontSize = 48; + + FailedLabelStyle = new GUIStyle("label"); + FailedLabelStyle.normal.textColor = Color.red; + FailedLabelStyle.fontSize = 32; + + FailedMessagesStyle = new GUIStyle("label"); + FailedMessagesStyle.wordWrap = false; + FailedMessagesStyle.richText = true; + } + } + + private readonly List m_FailedTestCollection; + + private bool m_ShowResults; + private Vector2 m_ScrollPosition; + + public TestResultRenderer(ITestResult testResults) + { + m_FailedTestCollection = new List(); + GetFailedTests(testResults); + } + + private void GetFailedTests(ITestResult testResults) + { + if (testResults is TestCaseResult) + { + if (testResults.ResultState.Status == TestStatus.Failed) + m_FailedTestCollection.Add(testResults); + } + else if (testResults.HasChildren) + { + foreach (var testResultsChild in testResults.Children) + { + GetFailedTests(testResultsChild); + } + } + } + + private const int k_MaxStringLength = 15000; + + public void ShowResults() + { + m_ShowResults = true; + Cursor.visible = true; + } + + public void Draw() + { + if (!m_ShowResults) return; + if (m_FailedTestCollection.Count == 0) + { + GUILayout.Label("All test(s) succeeded", Styles.SucceedLabelStyle, GUILayout.Width(600)); + } + else + { + int count = m_FailedTestCollection.Count; + GUILayout.Label(count + " tests failed!", Styles.FailedLabelStyle); + + m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.ExpandWidth(true)); + var text = ""; + + text += "Code-based tests\n"; + text += string.Join("\n", m_FailedTestCollection + .Select(result => result.Name + " " + result.ResultState + "\n" + result.Message) + .ToArray()); + + if (text.Length > k_MaxStringLength) + text = text.Substring(0, k_MaxStringLength); + + GUILayout.TextArea(text, Styles.FailedMessagesStyle); + GUILayout.EndScrollView(); + } + if (GUILayout.Button("Close")) + Application.Quit(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta new file mode 100644 index 0000000..02cca20 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ebb87899ca30b743bb4274bc00c02b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs new file mode 100644 index 0000000..b5d23f7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs @@ -0,0 +1,36 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner.Callbacks +{ + internal class TestResultRendererCallback : MonoBehaviour, ITestRunnerListener + { + private TestResultRenderer m_ResultRenderer; + public void RunStarted(ITest testsToRun) + { + } + + public void RunFinished(ITestResult testResults) + { + if (Camera.main == null) + { + gameObject.AddComponent(); + } + m_ResultRenderer = new TestResultRenderer(testResults); + m_ResultRenderer.ShowResults(); + } + + public void OnGUI() + { + if (m_ResultRenderer != null) + m_ResultRenderer.Draw(); + } + + public void TestStarted(ITest test) + { + } + + public void TestFinished(ITestResult result) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta new file mode 100644 index 0000000..deaa0ae --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dfc336f10b83bd74eaded16a658275c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs new file mode 100644 index 0000000..6a2fa5b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs @@ -0,0 +1,26 @@ +using System; +using NUnit.Framework.Interfaces; +using UnityEngine.Events; + +namespace UnityEngine.TestTools.TestRunner +{ + internal interface ITestRunnerListener + { + void RunStarted(ITest testsToRun); + void RunFinished(ITestResult testResults); + void TestStarted(ITest test); + void TestFinished(ITestResult result); + } + + [Serializable] + internal class TestFinishedEvent : UnityEvent {} + + [Serializable] + internal class TestStartedEvent : UnityEvent {} + + [Serializable] + internal class RunFinishedEvent : UnityEvent {} + + [Serializable] + internal class RunStartedEvent : UnityEvent {} +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta new file mode 100644 index 0000000..848ab3d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1b534518943030499685344fd1d476d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages.meta new file mode 100644 index 0000000..5ab167c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 256a0ca37fa972840bce7fca446e75e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs new file mode 100644 index 0000000..df7acb2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs @@ -0,0 +1,12 @@ +using System.Collections; + +namespace UnityEngine.TestTools +{ + public interface IEditModeTestYieldInstruction + { + bool ExpectDomainReload { get; } + bool ExpectedPlaymodeState { get; } + + IEnumerator Perform(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta new file mode 100644 index 0000000..f61c35a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 898bc38486fc899428fbe5bd6adfe473 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs new file mode 100644 index 0000000..87091ca --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.SceneManagement; +using UnityEngine.TestRunner.NUnitExtensions; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.NUnitExtensions; +using UnityEngine.TestTools.Utils; + +namespace UnityEngine.TestTools.TestRunner +{ + [Serializable] + [AddComponentMenu("")] + internal class PlaymodeTestsController : MonoBehaviour + { + private IEnumerator m_TestSteps; + + [SerializeField] + private List m_AssembliesWithTests; + public List AssembliesWithTests + { + get + { + return m_AssembliesWithTests; + } + set + { + m_AssembliesWithTests = value; + } + } + + [SerializeField] + internal TestStartedEvent testStartedEvent = new TestStartedEvent(); + [SerializeField] + internal TestFinishedEvent testFinishedEvent = new TestFinishedEvent(); + [SerializeField] + internal RunStartedEvent runStartedEvent = new RunStartedEvent(); + [SerializeField] + internal RunFinishedEvent runFinishedEvent = new RunFinishedEvent(); + + internal const string kPlaymodeTestControllerName = "Code-based tests runner"; + + [SerializeField] + public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings(); + + internal UnityTestAssemblyRunner m_Runner; + + public IEnumerator Start() + { + //Skip 2 frame because Unity. + yield return null; + yield return null; + StartCoroutine(Run()); + } + + internal static bool IsControllerOnScene() + { + return GameObject.Find(kPlaymodeTestControllerName) != null; + } + + internal static PlaymodeTestsController GetController() + { + return GameObject.Find(kPlaymodeTestControllerName).GetComponent(); + } + + public IEnumerator TestRunnerCoroutine() + { + while (m_TestSteps.MoveNext()) + { + yield return m_TestSteps.Current; + } + + if (m_Runner.IsTestComplete) + { + runFinishedEvent.Invoke(m_Runner.Result); + Cleanup(); + + yield return null; + } + } + + public IEnumerator Run() + { + CoroutineTestWorkItem.monoBehaviourCoroutineRunner = this; + gameObject.hideFlags |= HideFlags.DontSave; + + if (settings.sceneBased) + { + SceneManager.LoadScene(1, LoadSceneMode.Additive); + yield return null; + } + + var testListUtil = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), m_AssembliesWithTests); + m_Runner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), new PlaymodeWorkItemFactory()); + + var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode)); + loadedTests.ParseForNameDuplicates(); + runStartedEvent.Invoke(m_Runner.LoadedTest); + + var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent); + m_TestSteps = m_Runner.Run(testListenerWrapper, settings.BuildNUnitFilter()).GetEnumerator(); + + yield return TestRunnerCoroutine(); + } + + public void Cleanup() + { + if (m_Runner != null) + { + m_Runner.StopRun(); + m_Runner = null; + } + if (Application.isEditor) + { + Destroy(gameObject); + } + } + + public static void TryCleanup() + { + var controller = GetController(); + if (controller != null) + { + controller.Cleanup(); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta new file mode 100644 index 0000000..9693778 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 102e512f651ee834f951a2516c1ea3b8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs new file mode 100644 index 0000000..cb6bb54 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEngine.TestTools.TestRunner +{ + [Serializable] + internal class PlaymodeTestsControllerSettings + { + [SerializeField] + public RuntimeTestRunnerFilter[] filters; + public bool sceneBased; + public string originalScene; + public string bootstrapScene; + + public static PlaymodeTestsControllerSettings CreateRunnerSettings(RuntimeTestRunnerFilter[] filters) + { + var settings = new PlaymodeTestsControllerSettings + { + filters = filters, + sceneBased = false, + originalScene = SceneManager.GetActiveScene().path, + bootstrapScene = null + }; + return settings; + } + + internal ITestFilter BuildNUnitFilter() + { + return new OrFilter(filters.Select(f => f.BuildNUnitFilter()).ToArray()); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta new file mode 100644 index 0000000..06448a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2799eb4c84e72e54092a292cf626936b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta new file mode 100644 index 0000000..d23c0a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91c20d2c22b8b3a4cb6c816bd225591a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs new file mode 100644 index 0000000..fffba29 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs @@ -0,0 +1,11 @@ +using System; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + internal interface IRemoteTestResultDataFactory + { + RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result); + RemoteTestResultDataWithTestData CreateFromTest(ITest test); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta new file mode 100644 index 0000000..3bc8e30 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 874c0713cdc44f549b0161750b48d2c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs new file mode 100644 index 0000000..162ad0b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs @@ -0,0 +1,14 @@ +using System; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + internal static class PlayerConnectionMessageIds + { + public static Guid runStartedMessageId { get { return new Guid("6a7f53dd-4672-461d-a7b5-9467e9393fd3"); } } + public static Guid runFinishedMessageId { get { return new Guid("ffb622fc-34ad-4901-8d7b-47fb04b0bdd4"); } } + public static Guid testStartedMessageId { get { return new Guid("b54d241e-d88d-4dba-8c8f-ee415d11c030"); } } + public static Guid testFinishedMessageId { get { return new Guid("72f7b7f4-6829-4cd1-afde-78872b9d5adc"); } } + public static Guid quitPlayerMessageId { get { return new Guid("ab44bfe0-bb50-4ee6-9977-69d2ea6bb3a0"); } } + public static Guid playerAliveHeartbeat { get { return new Guid("8c0c307b-f7fd-4216-8623-35b4b3f55fb6"); } } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta new file mode 100644 index 0000000..bf86f7e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 41d60936b62cc6d4ca7fe628b22b0e40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs new file mode 100644 index 0000000..6559b45 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs @@ -0,0 +1,56 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestData + { + public string id; + public string name; + public string fullName; + public int testCaseCount; + public int ChildIndex; + public bool hasChildren; + public bool isSuite; + public string[] childrenIds; + public int testCaseTimeout; + public string[] Categories; + public bool IsTestAssembly; + public RunState RunState; + public string Description; + public string SkipReason; + public string ParentId; + public string UniqueName; + public string ParentUniqueName; + public string ParentFullName; + + internal RemoteTestData(ITest test) + { + id = test.Id; + name = test.Name; + fullName = test.FullName; + testCaseCount = test.TestCaseCount; + ChildIndex = -1; + if (test.Properties["childIndex"].Count > 0) + { + ChildIndex = (int)test.Properties["childIndex"][0]; + } + hasChildren = test.HasChildren; + isSuite = test.IsSuite; + childrenIds = test.Tests.Select(t => t.Id).ToArray(); + Categories = test.GetAllCategoriesFromTest().ToArray(); + IsTestAssembly = test is TestAssembly; + RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString()); + Description = (string)test.Properties.Get(PropertyNames.Description); + SkipReason = test.GetSkipReason(); + ParentId = test.GetParentId(); + UniqueName = test.GetUniqueName(); + ParentUniqueName = test.GetParentUniqueName(); + ParentFullName = test.GetParentFullName(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta new file mode 100644 index 0000000..0c286dc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b135ec222fdcd11468014c90d11d6821 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs new file mode 100644 index 0000000..90f82a4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestResultData + { + public string testId; + public string name; + public string fullName; + public string resultState; + public TestStatus testStatus; + public double duration; + public DateTime startTime; + public DateTime endTime; + public string message; + public string stackTrace; + public int assertCount; + public int failCount; + public int passCount; + public int skipCount; + public int inconclusiveCount; + public bool hasChildren; + public string output; + public string xml; + public string[] childrenIds; + + internal RemoteTestResultData(ITestResult result) + { + testId = result.Test.Id; + name = result.Name; + fullName = result.FullName; + resultState = result.ResultState.ToString(); + testStatus = result.ResultState.Status; + duration = result.Duration; + startTime = result.StartTime; + endTime = result.EndTime; + message = result.Message; + stackTrace = result.StackTrace; + assertCount = result.AssertCount; + failCount = result.FailCount; + passCount = result.PassCount; + skipCount = result.SkipCount; + inconclusiveCount = result.InconclusiveCount; + hasChildren = result.HasChildren; + output = result.Output; + xml = result.ToXml(true).OuterXml; + childrenIds = result.Children.Select(child => child.Test.Id).ToArray(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta new file mode 100644 index 0000000..a213e6b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03e4d63665d06f04c8a6cf68133c1592 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs new file mode 100644 index 0000000..0b3cd03 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + internal class RemoteTestResultDataFactory : IRemoteTestResultDataFactory + { + public RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result) + { + var tests = CreateTestDataList(result.Test); + tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout; + return new RemoteTestResultDataWithTestData() + { + results = CreateTestResultDataList(result), + tests = tests + }; + } + + public RemoteTestResultDataWithTestData CreateFromTest(ITest test) + { + var tests = CreateTestDataList(test); + if (UnityTestExecutionContext.CurrentContext != null) + { + tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout; + } + + return new RemoteTestResultDataWithTestData() + { + tests = tests + }; + } + + private RemoteTestData[] CreateTestDataList(ITest test) + { + var list = new List(); + list.Add(new RemoteTestData(test)); + list.AddRange(test.Tests.SelectMany(CreateTestDataList)); + return list.ToArray(); + } + + private static RemoteTestResultData[] CreateTestResultDataList(ITestResult result) + { + var list = new List(); + list.Add(new RemoteTestResultData(result)); + list.AddRange(result.Children.SelectMany(CreateTestResultDataList)); + return list.ToArray(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta new file mode 100644 index 0000000..bc0dd7c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 826b6becaef90fb458eedebe4c2f3664 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs new file mode 100644 index 0000000..36124cc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestRunner.NUnitExtensions.Runner; + +namespace UnityEngine.TestRunner.TestLaunchers +{ + [Serializable] + internal class RemoteTestResultDataWithTestData + { + public RemoteTestResultData[] results; + public RemoteTestData[] tests; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta new file mode 100644 index 0000000..ffab8f6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 475e3699f219c854f8581a9838135002 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs new file mode 100644 index 0000000..0adca0a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Filters; +using UnityEngine.TestRunner.NUnitExtensions.Filters; + +namespace UnityEngine.TestTools.TestRunner.GUI +{ + [Serializable] + internal class RuntimeTestRunnerFilter + { + public string[] assemblyNames; + public string[] groupNames; + public string[] categoryNames; + public string[] testNames; + public bool synchronousOnly = false; + + public ITestFilter BuildNUnitFilter() + { + var filters = new List(); + + AddFilters(filters, testNames, (s) => new FullNameFilter(s)); + AddFilters(filters, groupNames, (s) => new FullNameFilter(s) {IsRegex = true}); + AddFilters(filters, assemblyNames, (s) => new AssemblyNameFilter(s)); + AddFilters(filters, categoryNames, (s) => new CategoryFilterExtended(s) {IsRegex = true}); + + if (synchronousOnly) + { + filters.Add(new SynchronousFilter()); + } + + return filters.Count == 0 ? TestFilter.Empty : new AndFilter(filters.ToArray()); + } + + private static void AddFilters(List filters, string[] values, Func builder) + { + if (values == null || values.Length == 0) + { + return; + } + + var inclusionFilters = values.Where(v => !v.StartsWith("!")).Select(v => builder(v) as ITestFilter).ToArray(); + var exclusionFilters = values.Where(v => v.StartsWith("!")) + .Select(v => new NotFilter(builder(v.Substring(1))) as ITestFilter) + .ToArray(); + if (inclusionFilters.Length > 0 && exclusionFilters.Length > 0) + { + filters.Add(new AndFilter(new OrFilter(inclusionFilters), new AndFilter(exclusionFilters))); + } + else if (inclusionFilters.Length > 0) + { + filters.Add(new OrFilter(inclusionFilters)); + } + else // Only exclusionFilters + { + filters.Add(new AndFilter(exclusionFilters)); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs.meta new file mode 100644 index 0000000..5f9aa3b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a025ba7ee40d0104db8d08b1d9eabb0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs new file mode 100644 index 0000000..525da47 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.TestRunner.GUI +{ + class SynchronousFilter : ITestFilter + { + public TNode ToXml(bool recursive) + { + return new TNode("synchronousOnly"); + } + + public TNode AddToXml(TNode parentNode, bool recursive) + { + return parentNode.AddElement("synchronousOnly"); + } + + public bool Pass(ITest test) + { + if (test.Method == null) + return true; + + if (test.Method.ReturnType.Type == typeof(IEnumerator)) + return false; + + if (test.Method.GetCustomAttributes(true).Any()) + return false; + + if (test.TypeInfo?.Type != null) + { + if (Reflect.GetMethodsWithAttribute(test.TypeInfo.Type, typeof(UnitySetUpAttribute), true) + .Any(mi => mi.ReturnType == typeof(System.Collections.IEnumerator))) + return false; + + if (Reflect.GetMethodsWithAttribute(test.TypeInfo.Type, typeof(UnityTearDownAttribute), true) + .Any(mi => mi.ReturnType == typeof(System.Collections.IEnumerator))) + return false; + } + + return true; + } + + public bool IsExplicitMatch(ITest test) + { + return Pass(test); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta new file mode 100644 index 0000000..08c6010 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9aec9d3b0a86466ab4647d01e8fc87d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs new file mode 100644 index 0000000..5ed2ec8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections; +using System.Reflection; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class TestEnumeratorWrapper + { + private readonly TestMethod m_TestMethod; + + public TestEnumeratorWrapper(TestMethod testMethod) + { + m_TestMethod = testMethod; + } + + public IEnumerator GetEnumerator(ITestExecutionContext context) + { + if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerator)) + { + return HandleEnumerableTest(context); + } + var message = string.Format("Return type {0} of {1} in {2} is not supported.", + m_TestMethod.Method.ReturnType, m_TestMethod.Method.Name, m_TestMethod.Method.TypeInfo.FullName); + if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerable)) + { + message += "\nDid you mean IEnumerator?"; + } + throw new InvalidSignatureException(message); + } + + private IEnumerator HandleEnumerableTest(ITestExecutionContext context) + { + try + { + return m_TestMethod.Method.MethodInfo.Invoke(context.TestObject, m_TestMethod.parms != null ? m_TestMethod.parms.OriginalArguments : null) as IEnumerator; + } + catch (TargetInvocationException e) + { + if (e.InnerException is IgnoreException) + { + context.CurrentResult.SetResult(ResultState.Ignored, e.InnerException.Message); + return null; + } + throw; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta new file mode 100644 index 0000000..f19ee3e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ad0b0c865b01af4ca1b414689e71259 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs new file mode 100644 index 0000000..ffa23de --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs @@ -0,0 +1,30 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.TestRunner +{ + internal class TestListenerWrapper : ITestListener + { + private readonly TestFinishedEvent m_TestFinishedEvent; + private readonly TestStartedEvent m_TestStartedEvent; + + public TestListenerWrapper(TestStartedEvent testStartedEvent, TestFinishedEvent testFinishedEvent) + { + m_TestStartedEvent = testStartedEvent; + m_TestFinishedEvent = testFinishedEvent; + } + + public void TestStarted(ITest test) + { + m_TestStartedEvent.Invoke(test); + } + + public void TestFinished(ITestResult result) + { + m_TestFinishedEvent.Invoke(result); + } + + public void TestOutput(TestOutput output) + { + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta new file mode 100644 index 0000000..aefe039 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73deb9b8722aa284eab27c4dc90956c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestPlatform.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestPlatform.cs new file mode 100644 index 0000000..21a6ec2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestPlatform.cs @@ -0,0 +1,21 @@ +using System; + +namespace UnityEngine.TestTools +{ + [Flags] + [Serializable] + public enum TestPlatform : byte + { + All = 0xFF, + EditMode = 1 << 1, + PlayMode = 1 << 2 + } + + internal static class TestPlatformEnumExtensions + { + public static bool IsFlagIncluded(this TestPlatform flags, TestPlatform flag) + { + return (flags & flag) == flag; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta new file mode 100644 index 0000000..6eb087a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 743879b4db4bc1a4b829aae4386f4acf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef new file mode 100644 index 0000000..6dc17da --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef @@ -0,0 +1,13 @@ +{ + "name": "UnityEngine.TestRunner", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [] +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta new file mode 100644 index 0000000..a2002fd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 27619889b8ba8c24980f49ee34dbb44a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils.meta new file mode 100644 index 0000000..d9503ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb32bccaf32a6db448d1c0cc99c78688 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider.meta new file mode 100644 index 0000000..a8326f0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51557afa652635743b264a309f0a5c60 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs new file mode 100644 index 0000000..9edc517 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs @@ -0,0 +1,12 @@ +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal class AssemblyLoadProxy : IAssemblyLoadProxy + { + public IAssemblyWrapper Load(string assemblyString) + { + return new AssemblyWrapper(Assembly.Load(assemblyString)); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta new file mode 100644 index 0000000..8bb527d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb593906b7b6d824087dcaebf6c082e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs new file mode 100644 index 0000000..cb46f1b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs @@ -0,0 +1,30 @@ +using System; +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal class AssemblyWrapper : IAssemblyWrapper + { + public AssemblyWrapper(Assembly assembly) + { + Assembly = assembly; + } + + public Assembly Assembly { get; } + + public virtual string Location + { + get + { + //Some platforms dont support this + throw new NotImplementedException(); + } + } + + public virtual AssemblyName[] GetReferencedAssemblies() + { + //Some platforms dont support this + throw new NotImplementedException(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta new file mode 100644 index 0000000..1e4a718 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e3b9bbf2c1a3cd4f88883ca32882ec6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs new file mode 100644 index 0000000..feffa62 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools.Utils +{ + internal interface IAssemblyLoadProxy + { + IAssemblyWrapper Load(string assemblyString); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta new file mode 100644 index 0000000..284d33b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12dfd4bdbb5c8e6419432fbc54ef25d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs new file mode 100644 index 0000000..145c682 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs @@ -0,0 +1,11 @@ +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal interface IAssemblyWrapper + { + Assembly Assembly { get; } + string Location { get; } + AssemblyName[] GetReferencedAssemblies(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta new file mode 100644 index 0000000..486888d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c5afe945b715e149a70113a4be7b32a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs new file mode 100644 index 0000000..0dc2b7f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools.Utils +{ + internal interface IScriptingRuntimeProxy + { + string[] GetAllUserAssemblies(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta new file mode 100644 index 0000000..85ae985 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe4aef60e4ace544c8430da8ef8acba2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs new file mode 100644 index 0000000..74f2769 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs @@ -0,0 +1,10 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools.Utils +{ + internal interface ITestAssemblyProvider + { + ITest GetTestsWithNUnit(); + IAssemblyWrapper[] GetUserAssemblies(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta new file mode 100644 index 0000000..d7e856b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c5acba6181d845c4e92146009bd4480f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs new file mode 100644 index 0000000..bb0aa94 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework.Interfaces; +using UnityEngine.TestTools.NUnitExtensions; + +namespace UnityEngine.TestTools.Utils +{ + internal class PlayerTestAssemblyProvider + { + private IAssemblyLoadProxy m_AssemblyLoadProxy; + private readonly List m_AssembliesToLoad; + + //Cached until domain reload + private static List m_LoadedAssemblies; + + internal PlayerTestAssemblyProvider(IAssemblyLoadProxy assemblyLoadProxy, List assembliesToLoad) + { + m_AssemblyLoadProxy = assemblyLoadProxy; + m_AssembliesToLoad = assembliesToLoad; + LoadAssemblies(); + } + + public ITest GetTestsWithNUnit() + { + return BuildTests(TestPlatform.PlayMode, m_LoadedAssemblies.ToArray()); + } + + public List GetUserAssemblies() + { + return m_LoadedAssemblies; + } + + protected static ITest BuildTests(TestPlatform testPlatform, IAssemblyWrapper[] assemblies) + { + var settings = UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(testPlatform); + var builder = new UnityTestAssemblyBuilder(); + return builder.Build(assemblies.Select(a => a.Assembly).ToArray(), Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings); + } + + private void LoadAssemblies() + { + if (m_LoadedAssemblies != null) + { + return; + } + + m_LoadedAssemblies = new List(); + + foreach (var userAssembly in m_AssembliesToLoad) + { + IAssemblyWrapper a; + try + { + a = m_AssemblyLoadProxy.Load(userAssembly); + } + catch (FileNotFoundException) + { + continue; + } + if (a != null) + m_LoadedAssemblies.Add(a); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta new file mode 100644 index 0000000..ffee12c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 43a3aec217baa9644a7cf34b5f93fed9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs new file mode 100644 index 0000000..0f1eb2b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs @@ -0,0 +1,10 @@ +namespace UnityEngine.TestTools.Utils +{ + internal class ScriptingRuntimeProxy : IScriptingRuntimeProxy + { + public string[] GetAllUserAssemblies() + { + return ScriptingRuntime.GetAllUserAssemblies(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta new file mode 100644 index 0000000..7b16cb9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3a361a6ad1aff14ba8f48976e94ad76 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AttributeHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AttributeHelper.cs new file mode 100644 index 0000000..7d710cb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AttributeHelper.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using System.Linq; + +namespace UnityEngine.TestTools +{ + internal static class AttributeHelper + { + internal static Type GetTargetClassFromName(string targetClassName, Type attributeInterface) + { + Type targetClass = null; + foreach (var assemblyName in ScriptingRuntime.GetAllUserAssemblies()) + { + // we need to pass the assembly name without the .dll extension, so removing that first + var name = Path.GetFileNameWithoutExtension(assemblyName); + targetClass = Type.GetType(targetClassName + "," + name); + if (targetClass != null) + break; + } + + if (targetClass == null) + { + Debug.LogWarningFormat("Class type not found: " + targetClassName); + return null; + } + + ValidateTargetClass(targetClass, attributeInterface); + return targetClass; + } + + private static void ValidateTargetClass(Type targetClass, Type attributeInterface) + { + var constructorInfos = targetClass.GetConstructors(); + if (constructorInfos.All(constructor => constructor.GetParameters().Length != 0)) + { + Debug.LogWarningFormat("{0} does not implement default constructor", targetClass.Name); + } + + if (!attributeInterface.IsAssignableFrom(targetClass)) + { + Debug.LogWarningFormat("{0} does not implement {1}", targetClass.Name, attributeInterface.Name); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta new file mode 100644 index 0000000..cc47e6f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae8ce3ffe04ac2c42945fd27e0291fc3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs new file mode 100644 index 0000000..073aa08 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class ColorEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.01f; + private readonly float AllowedError; + + + private static readonly ColorEqualityComparer m_Instance = new ColorEqualityComparer(); + public static ColorEqualityComparer Instance { get { return m_Instance; } } + + private ColorEqualityComparer() : this(k_DefaultError) + { + } + + public ColorEqualityComparer(float error) + { + this.AllowedError = error; + } + + public bool Equals(Color expected, Color actual) + { + return Utils.AreFloatsEqualAbsoluteError(expected.r, actual.r, AllowedError) && + Utils.AreFloatsEqualAbsoluteError(expected.g, actual.g, AllowedError) && + Utils.AreFloatsEqualAbsoluteError(expected.b, actual.b, AllowedError) && + Utils.AreFloatsEqualAbsoluteError(expected.a, actual.a, AllowedError); + } + + public int GetHashCode(Color color) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta new file mode 100644 index 0000000..42da075 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6105bc8cf5ce544487daca4cbc62583 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/CoroutineRunner.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/CoroutineRunner.cs new file mode 100644 index 0000000..8e7170f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/CoroutineRunner.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections; +using NUnit.Framework.Internal; +using UnityEngine.TestRunner.NUnitExtensions.Runner; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestTools.Utils +{ + internal class CoroutineRunner + { + private bool m_Running; + private bool m_TestFailed; + private bool m_Timeout; + private readonly MonoBehaviour m_Controller; + private readonly UnityTestExecutionContext m_Context; + private Coroutine m_TimeOutCoroutine; + private IEnumerator m_TestCoroutine; + + internal const int k_DefaultTimeout = 1000 * 180; + + public CoroutineRunner(MonoBehaviour playmodeTestsController, UnityTestExecutionContext context) + { + m_Controller = playmodeTestsController; + m_Context = context; + } + + public IEnumerator HandleEnumerableTest(IEnumerator testEnumerator) + { + if (m_Context.TestCaseTimeout == 0) + { + m_Context.TestCaseTimeout = k_DefaultTimeout; + } + do + { + if (!m_Running) + { + m_Running = true; + m_TestCoroutine = ExMethod(testEnumerator, m_Context.TestCaseTimeout); + m_Controller.StartCoroutine(m_TestCoroutine); + } + if (m_TestFailed) + { + StopAllRunningCoroutines(); + m_Context.CurrentResult.RecordException(new UnityTestTimeoutException(m_Context.TestCaseTimeout)); + yield break; + } + + if (m_Context.ExecutionStatus == TestExecutionStatus.StopRequested || m_Context.ExecutionStatus == TestExecutionStatus.AbortRequested) + { + StopAllRunningCoroutines(); + yield break; + } + yield return null; + } + while (m_Running); + } + + private void StopAllRunningCoroutines() + { + if (m_TimeOutCoroutine != null) + { + m_Controller.StopCoroutine(m_TimeOutCoroutine); + } + + if (m_TestCoroutine != null) + { + m_Controller.StopCoroutine(m_TestCoroutine); + } + } + + private IEnumerator ExMethod(IEnumerator e, int timeout) + { + m_TimeOutCoroutine = m_Controller.StartCoroutine(StartTimer(e, timeout, + () => + { + m_TestFailed = true; + m_Timeout = true; + m_Running = false; + })); + + yield return m_Controller.StartCoroutine(e); + m_Controller.StopCoroutine(m_TimeOutCoroutine); + m_Running = false; + } + + private IEnumerator StartTimer(IEnumerator coroutineToBeKilled, int timeout, Action onTimeout) + { + yield return new WaitForSecondsRealtime(timeout / 1000f); + if (coroutineToBeKilled != null) + m_Controller.StopCoroutine(coroutineToBeKilled); + if (onTimeout != null) + onTimeout(); + } + + public bool HasFailedWithTimeout() + { + return m_Timeout; + } + + public int GetDefaultTimeout() + { + return k_DefaultTimeout; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta new file mode 100644 index 0000000..756d54e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24a158219395ebf44a60547b97784ddc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs new file mode 100644 index 0000000..58438a7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class FloatEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly FloatEqualityComparer m_Instance = new FloatEqualityComparer(); + public static FloatEqualityComparer Instance { get { return m_Instance; } } + + private FloatEqualityComparer() : this(k_DefaultError) {} + + public FloatEqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + public bool Equals(float expected, float actual) + { + return Utils.AreFloatsEqual(expected, actual, AllowedError); + } + + public int GetHashCode(float value) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta new file mode 100644 index 0000000..7497131 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af5042802f06c804c8abddd544b77a4a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs new file mode 100644 index 0000000..ff0fe77 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs @@ -0,0 +1,19 @@ +using System.Collections; +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestTools +{ + /// + /// When implemented by an attribute, this interface implemented to provide actions to execute before setup and after teardown of tests. + /// + public interface IOuterUnityTestAction + { + /// Executed before each test is run + /// The test that is going to be run. + IEnumerator BeforeTest(ITest test); + + /// Executed after each test is run + /// The test that has just been run. + IEnumerator AfterTest(ITest test); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta new file mode 100644 index 0000000..93429d4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9c2a6302985d3846b7b9f6fd9e2da9a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs new file mode 100644 index 0000000..489357c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools +{ + public interface IPostBuildCleanup + { + void Cleanup(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta new file mode 100644 index 0000000..f1cb9a9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff67c526455160f4690a44f74dee4cbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs new file mode 100644 index 0000000..3920b0b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools +{ + public interface IPrebuildSetup + { + void Setup(); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta new file mode 100644 index 0000000..77dff87 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: acc16f0c684508f44813662a300c574b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ITestRunCallback.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ITestRunCallback.cs new file mode 100644 index 0000000..d2944fc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ITestRunCallback.cs @@ -0,0 +1,12 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner +{ + public interface ITestRunCallback + { + void RunStarted(ITest testsToRun); + void RunFinished(ITestResult testResults); + void TestStarted(ITest test); + void TestFinished(ITestResult result); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta new file mode 100644 index 0000000..09f6f53 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38d0b8a87b967304da08a2ae9b955066 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta new file mode 100644 index 0000000..5da2eb9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce8da628f68c7594b8b9a597fa52db7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs new file mode 100644 index 0000000..334da4c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools +{ + public interface IMonoBehaviourTest + { + bool IsTestFinished {get; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta new file mode 100644 index 0000000..9af4004 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a002d3737b873954395b7cf862873ab8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs new file mode 100644 index 0000000..e0b6372 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs @@ -0,0 +1,23 @@ +namespace UnityEngine.TestTools +{ + public class MonoBehaviourTest : CustomYieldInstruction where T : MonoBehaviour, IMonoBehaviourTest + { + public T component { get; } + public GameObject gameObject { get { return component.gameObject; } } + + public MonoBehaviourTest(bool dontDestroyOnLoad = true) + { + var go = new GameObject("MonoBehaviourTest: " + typeof(T).FullName); + component = go.AddComponent(); + if (dontDestroyOnLoad) + { + Object.DontDestroyOnLoad(go); + } + } + + public override bool keepWaiting + { + get { return !component.IsTestFinished; } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta new file mode 100644 index 0000000..c727f85 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 164c9b1458eaab743a4b45c37a4d720d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs new file mode 100644 index 0000000..2b91efb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class PostBuildCleanupAttribute : Attribute + { + public PostBuildCleanupAttribute(Type targetClass) + { + TargetClass = targetClass; + } + + public PostBuildCleanupAttribute(string targetClassName) + { + TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPostBuildCleanup)); + } + + internal Type TargetClass { get; private set; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta new file mode 100644 index 0000000..b45a7a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 621fd19bcb071b64aa1d68f0271aa780 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs new file mode 100644 index 0000000..86326fb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace UnityEngine.TestTools +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class PrebuildSetupAttribute : Attribute + { + public PrebuildSetupAttribute(Type targetClass) + { + TargetClass = targetClass; + } + + public PrebuildSetupAttribute(string targetClassName) + { + TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPrebuildSetup)); + } + + internal Type TargetClass { get; private set; } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta new file mode 100644 index 0000000..7b6ae4a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1b7ce919aa8864409412e809073cf96 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs new file mode 100644 index 0000000..220f1aa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class QuaternionEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.00001f; + private readonly float AllowedError; + + private static readonly QuaternionEqualityComparer m_Instance = new QuaternionEqualityComparer(); + public static QuaternionEqualityComparer Instance { get { return m_Instance; } } + + + private QuaternionEqualityComparer() : this(k_DefaultError) {} + + public QuaternionEqualityComparer(float allowedError) + { + AllowedError = allowedError; + } + + public bool Equals(Quaternion expected, Quaternion actual) + { + return Mathf.Abs(Quaternion.Dot(expected, actual)) > (1.0f - AllowedError); + } + + public int GetHashCode(Quaternion quaternion) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta new file mode 100644 index 0000000..31faf0c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b28913f21577de429da928d6d05219f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/StacktraceFilter.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/StacktraceFilter.cs new file mode 100644 index 0000000..af431f3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/StacktraceFilter.cs @@ -0,0 +1,43 @@ +using System.Linq; +using System.Text; + +namespace UnityEngine.TestTools.Utils +{ + internal static class StackTraceFilter + { + private static readonly string[] s_FilteredLogMessages = + { + @"UnityEngine.DebugLogHandler:Internal_Log", + @"UnityEngine.DebugLogHandler:Log", + @"UnityEngine.Logger:Log", + @"UnityEngine.Debug" + }; + + private static readonly string[] s_LastMessages = + { + @"System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)", + @"UnityEditor.TestTools.TestRunner.EditModeRunner:InvokeDelegator" + }; + + public static string Filter(string inputStackTrace) + { + int idx; + foreach (var lastMessage in s_LastMessages) + { + idx = inputStackTrace.IndexOf(lastMessage); + if (idx != -1) + inputStackTrace = inputStackTrace.Substring(0, idx); + } + + var inputStackTraceLines = inputStackTrace.Split('\n'); + var result = new StringBuilder(); + foreach (var line in inputStackTraceLines) + { + if (s_FilteredLogMessages.Any(s => line.StartsWith(s))) + continue; + result.AppendLine(line); + } + return result.ToString(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta new file mode 100644 index 0000000..4f837a1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc748d99f1f0d484a811a566fc7915ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs new file mode 100644 index 0000000..48561ed --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace UnityEngine.TestRunner +{ + [AttributeUsage(AttributeTargets.Assembly)] + public class TestRunCallbackAttribute : Attribute + { + private Type m_Type; + public TestRunCallbackAttribute(Type type) + { + var interfaceType = typeof(ITestRunCallback); + if (!interfaceType.IsAssignableFrom(type)) + { + throw new ArgumentException(string.Format("Type provided to {0} does not implement {1}", this.GetType().Name, interfaceType.Name)); + } + m_Type = type; + } + + internal ITestRunCallback ConstructCallback() + { + return Activator.CreateInstance(m_Type) as ITestRunCallback; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta new file mode 100644 index 0000000..06b2018 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76b3a3296de548f48b0c3d088fb4b490 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs new file mode 100644 index 0000000..d4a8c40 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine.TestTools.TestRunner; + +namespace UnityEngine.TestRunner.Utils +{ + internal class TestRunCallbackListener : ScriptableObject, ITestRunnerListener + { + private ITestRunCallback[] m_Callbacks; + public void RunStarted(ITest testsToRun) + { + InvokeAllCallbacks(callback => callback.RunStarted(testsToRun)); + } + + private static ITestRunCallback[] GetAllCallbacks() + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + allAssemblies = allAssemblies.Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEngine.TestRunner")).ToArray(); + var attributes = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(TestRunCallbackAttribute), true).OfType()).ToArray(); + return attributes.Select(attribute => attribute.ConstructCallback()).ToArray(); + } + + private void InvokeAllCallbacks(Action invoker) + { + if (m_Callbacks == null) + { + m_Callbacks = GetAllCallbacks(); + } + + foreach (var testRunCallback in m_Callbacks) + { + try + { + invoker(testRunCallback); + } + catch (Exception e) + { + Debug.LogException(e); + throw; + } + } + } + + public void RunFinished(ITestResult testResults) + { + InvokeAllCallbacks(callback => callback.RunFinished(testResults)); + } + + public void TestStarted(ITest test) + { + InvokeAllCallbacks(callback => callback.TestStarted(test)); + } + + public void TestFinished(ITestResult result) + { + InvokeAllCallbacks(callback => callback.TestFinished(result)); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta new file mode 100644 index 0000000..77f82ee --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68f09f0f82599b5448579854e622a4c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Utils.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Utils.cs new file mode 100644 index 0000000..bc8b617 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Utils.cs @@ -0,0 +1,40 @@ +using System; + +namespace UnityEngine.TestTools.Utils +{ + public static class Utils + { + public static bool AreFloatsEqual(float expected, float actual, float epsilon) + { + // special case for infinity + if (expected == Mathf.Infinity || actual == Mathf.Infinity || expected == Mathf.NegativeInfinity || actual == Mathf.NegativeInfinity) + return expected == actual; + + // we cover both relative and absolute tolerance with this check + // which is better than just relative in case of small (in abs value) args + // please note that "usually" approximation is used [i.e. abs(x)+abs(y)+1] + // but we speak about test code so we dont care that much about performance + // but we do care about checks being more precise + return Math.Abs(actual - expected) <= epsilon * Mathf.Max(Mathf.Max(Mathf.Abs(actual), Mathf.Abs(expected)), 1.0f); + } + + public static bool AreFloatsEqualAbsoluteError(float expected, float actual, float allowedAbsoluteError) + { + return Math.Abs(actual - expected) <= allowedAbsoluteError; + } + + /// + /// Analogous to GameObject.CreatePrimitive, but creates a primitive mesh renderer with fast shader instead of a default builtin shader. + /// Optimized for testing performance. + /// + /// A GameObject with primitive mesh renderer and collider. + public static GameObject CreatePrimitive(PrimitiveType type) + { + var prim = GameObject.CreatePrimitive(type); + var renderer = prim.GetComponent(); + if (renderer) + renderer.sharedMaterial = new Material(Shader.Find("VertexLit")); + return prim; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Utils.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Utils.cs.meta new file mode 100644 index 0000000..63b9c66 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Utils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9502550ba4785e3499d6c9251fa2114b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs new file mode 100644 index 0000000..081a8bb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector2ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector2ComparerWithEqualsOperator m_Instance = new Vector2ComparerWithEqualsOperator(); + public static Vector2ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector2ComparerWithEqualsOperator() {} + + public bool Equals(Vector2 expected, Vector2 actual) + { + return expected == actual; + } + + public int GetHashCode(Vector2 vec2) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta new file mode 100644 index 0000000..07662bb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65701ebe8bada6b4785e9c7afe7f5bee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs new file mode 100644 index 0000000..c0cca3f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector2EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector2EqualityComparer m_Instance = new Vector2EqualityComparer(); + public static Vector2EqualityComparer Instance { get { return m_Instance; } } + + private Vector2EqualityComparer() : this(k_DefaultError) + { + } + + public Vector2EqualityComparer(float error) + { + this.AllowedError = error; + } + + public bool Equals(Vector2 expected, Vector2 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError); + } + + public int GetHashCode(Vector2 vec2) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta new file mode 100644 index 0000000..ed2951a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58ad09607a0d62d458a78d7174665566 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs new file mode 100644 index 0000000..ed665c0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector3ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector3ComparerWithEqualsOperator m_Instance = new Vector3ComparerWithEqualsOperator(); + public static Vector3ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector3ComparerWithEqualsOperator() {} + + public bool Equals(Vector3 expected, Vector3 actual) + { + return expected == actual; + } + + public int GetHashCode(Vector3 vec3) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta new file mode 100644 index 0000000..01662a4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b994928117e3db418da69c821da7e19 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs new file mode 100644 index 0000000..47fac4b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + + +namespace UnityEngine.TestTools.Utils +{ + public class Vector3EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector3EqualityComparer m_Instance = new Vector3EqualityComparer(); + public static Vector3EqualityComparer Instance { get { return m_Instance; } } + + private Vector3EqualityComparer() : this(k_DefaultError) {} + public Vector3EqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + public bool Equals(Vector3 expected, Vector3 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError) && + Utils.AreFloatsEqual(expected.z, actual.z, AllowedError); + } + + public int GetHashCode(Vector3 vec3) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta new file mode 100644 index 0000000..37e0a03 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bd2bc28ff24d5c488844851cb785db0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs new file mode 100644 index 0000000..1f8d106 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector4ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector4ComparerWithEqualsOperator m_Instance = new Vector4ComparerWithEqualsOperator(); + public static Vector4ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector4ComparerWithEqualsOperator() {} + + public bool Equals(Vector4 expected, Vector4 actual) + { + return expected == actual; + } + + public int GetHashCode(Vector4 vec4) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta new file mode 100644 index 0000000..a23cf66 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44100f5f60f351348b9719b46d46cebe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs new file mode 100644 index 0000000..7047242 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + public class Vector4EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector4EqualityComparer m_Instance = new Vector4EqualityComparer(); + public static Vector4EqualityComparer Instance { get { return m_Instance; } } + + private Vector4EqualityComparer() : this(k_DefaultError) {} + public Vector4EqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + public bool Equals(Vector4 expected, Vector4 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError) && + Utils.AreFloatsEqual(expected.z, actual.z, AllowedError) && + Utils.AreFloatsEqual(expected.w, actual.w, AllowedError); + } + + public int GetHashCode(Vector4 vec4) + { + return 0; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta new file mode 100644 index 0000000..149157d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 32da81683c22faf458026716a2b821aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/package.json b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/package.json new file mode 100644 index 0000000..c4d3ede --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/package.json @@ -0,0 +1,29 @@ +{ + "name": "com.unity.test-framework", + "displayName": "Test Framework", + "version": "1.1.19", + "unity": "2019.2", + "unityRelease": "0a10", + "description": "Test framework for running Edit mode and Play mode tests in Unity.", + "keywords": [ + "Test", + "TestFramework" + ], + "category": "Unity Test Framework", + "repository": { + "url": "https://github.com/Unity-Technologies/com.unity.test-framework.git", + "type": "git", + "revision": "83583c7273ee961612200215e8989039bbce8748" + }, + "dependencies": { + "com.unity.ext.nunit": "1.0.5", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "relatedPackages": { + "com.unity.test-framework.tests": "1.1.19" + }, + "upmCi": { + "footprint": "4ed8fa0a17af25873219feb3cca20aac7c1cbecb" + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/package.json.meta b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/package.json.meta new file mode 100644 index 0000000..63170c3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.test-framework@1.1.19/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d6a2e6e4803de7b43baacdc355fc144d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md new file mode 100644 index 0000000..594a0e2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md @@ -0,0 +1,449 @@ +# Changelog +These are the release notes for the TextMesh Pro UPM package which was first introduced with Unity 2018.1. Please see the following link for the Release Notes for prior versions of TextMesh Pro. http://digitalnativestudios.com/forum/index.php?topic=1363.0 + +## [2.1.1] - 2020-07-26 +## [1.5.1] +## [3.0.1] +### Changes +- Addressed compiler warning related to the new virtual event OnPreRenderText. +- Added one additional layer of missing character search where in the even the missing glyph character \u0000 or space character \u0020 is not available in any font asset or potential fallbacks, the End of Text (ETX) \u0003 will be used instead. +- Input Field Integer or Decimal validation will now take into account the current culture. See [forum post](https://forum.unity.com/threads/currentculture-decimal-separator-in-input-fields.908999/) for details. +- Added Editor only font asset post processor to handle font assets being modified outside of the Unity Editor. +- Fixed potential Array Out of Bounds error that could occur when using </style> without first using a valid <style>. Case #1263787 and See [forum post](https://forum.unity.com/threads/missingreferenceexception-occurs-on-selecting-a-tmp-dropdown-in-the-hierarchy-after-a-play-occurs.728018/#post-6094317) for details. +- Fixed potential issue when using multiple <font> tag in the same text object where these referencing several font assets derived from the same font file. Since their Default Material all have the same name, this was causing an issue in the Material Reference Manager. See [forum post](https://forum.unity.com/threads/argumentexception-on-v2-1-0-unity-2019-4-4f1-identified-bug.934789/) for details. Case #1264596. + +## [2.1.0] - 2020-06-30 +## [1.5.0] +## [3.0.0] +### Changes +- Added support to control if a text object is Maskable and affected by UI Mask components. The new setting is found in the Extra Settings section of the <TextMeshProUGUI> component inspector. +- Fixed potential Null Reference Exception when trying to add characters and / or glyphs to a font asset via scripting and before it has been initialized or ReadFontAssetDefinition() has been called. +- Fixed incorrect preferred width values when using alternative font weight font assets. Case #1255336 +- Enabling or disabling the Mesh Renderer of a <TextMeshPro> text object should now also mirror that state on any sub text object renderers as well. +- Fixed <sprite> incorrect position when this sprite is the only character in the text and when the sprite asset face info has not been defined. +- Fixed potential Null Reference Exception related to culling when entering play mode. +- Added OnPreRenderText event delegate to allow potential modification of the text geometry before it is uploaded to the mesh and rendered. +- Fixed missing warning when the requested character is missing from the font asset or any potential fallbacks. Case #1256879 +- Fixed potential issue with Underline and StrikeThrough when using alternative typeface. Case #1255336 +- Fixed potential errors in the Text StyleSheet Inspector when adding or removing Text Styles after resetting the asset. Case #1254602 +- Fixed text Margin property values not being draggable in the Extra Settings section of the text inspector. Case #1253447 +- It will no longer be possible to create Editor Presets for the TMP_FontAsset, TMP_SpriteAsset, TMP_StyleSheet, TMP_ColorGradient and TMP_Settings as these are persistent and runtime assets. Case #1251229 + +## [2.1.0-preview.14] - 2020-06-08 +## [1.5.0-preview.14] +## [3.0.0-preview.14] +### Changes +- Fixed sprite character and sprite glyph scale not being reflected in the text layout. See [forum post](https://forum.unity.com/threads/glyph-scale-dont-change-line-height.898817/) for details. +- Fixed potential null reference exception in the CrossFadeColor or CrossFadeAlpha functions. See [forum post](https://forum.unity.com/threads/version-1-5-0-2-1-0-3-0-0-preview-13-now-available-for-testing.753587/page-4#post-5885075) for details. +- Minor improvements to the Sprite Asset Importer to improve allocations and address potential error encountered when creating multiple sprite assets. +- TMP GUID Remapping Tool - Removed "UnityEditor.Animations.AnimatorController" from the exclusion search list. +- Fixed potential culling issue when dynamically updating the content of child text objects of RectMask2D components. Case #1253625 +- Fixed InvalidOperationException that could occur when changing text Overflow linked components via code. Case #1251283 + +## [2.1.0-preview.13] - 2020-05-22 +## [1.5.0-preview.13] +## [3.0.0-preview.13] +### Changes +- Fixed potential issue where the Font Asset Creator could get stuck in the packing phase of the atlas generation process. See [forum post](https://forum.unity.com/threads/font-asset-creator-stuck-at-packing-glyphs-pass-8.811863/) for details. +- Fixed issue potentially affecting text layout as a result of the width of the RectTransform being incorrectly reported. See [forum post](https://forum.unity.com/threads/textmesh-pro-forcemeshupdate-true-not-working-when-object-inactive.524507/#post-5798515) for details. +- Previously created prefabs containing sub text objects will now have their HideFlags updated to HideFlags.DontSave to be consistent with newly created prefabs whose sub text objects are no longer serialized. Case #1247184 +- Fixed culling issue where lossy scale was not considered in the determination of the bounds of the text geometry. + +## [2.1.0-preview.12] - 2020-05-09 +## [1.5.0-preview.12] +## [3.0.0-preview.12] +### Changes +- Added synchronization of the RaycastTarget property of the parent <TextMeshProUGUI> with potential child sub text objects. Case #1240784 +- Fixed Font Asset Bold Spacing adjustment scaling based on the text object point size instead of current point size. Case #1241132 +- Improved text alignment when using RTL in conjunction with character, word and other spacing adjustments. +- Fixed TMP Input Field caret potentially not being visible when reaching the right side of the viewport. See [forum post](https://forum.unity.com/threads/inputfield-bug-2.879244/) for more details. +- Fixed TMP Input Field incorrect text RectTransform horizontal adjustment when using the Backspace key. See [forum post](https://forum.unity.com/threads/inputfield-bug4-delete-and-backspace-bug.879283/) for more details. +- Fixed potential null reference in the TextMeshProUGUI.Cull function when using a workflow that involves enabling / disabling Canvases in the scene. +- Fixed ArgumentOutOfRangeException when using the "Update Sprite Asset" inspector option on a sprite asset that does not contain any sprites. Case #1242936 +- Fixed incorrect culling of the text geometry by the RectMask2D component on newly created text objects. Case #1245445 +- It is now possible to use the Material Context Menu options to Copy / Paste Material Properties or Atlas Texture originally created for TMP with all other non TMP specific materials. Case #1242671 +- Fixed NullReferenceException when setting the Atlas Texture to None in the Debug Settings of the Material Inspector of a text object. Case #1245104 + +## [2.1.0-preview.11] - 2020-04-22 +## [1.5.0-preview.11] +## [3.0.0-preview.11] +### Changes +- Fixed incorrect culling of text object by RectMask2D component when the parent Canvas Render Mode is set to Screen Space - Camera or World Space. Case #1240595 +- Added special handling to ForceMeshUpdate() when the parent Canvas is disabled. + +## [2.1.0-preview.10] - 2020-04-21 +## [1.5.0-preview.10] +## [3.0.0-preview.10] +### Changes +- Revised caching of Preferred Width and Height to further reduce the amount of time it has to be recomputed when using a complex structure of Layout components. +- Fixed potential issue when using Text Overflow Ellipsis and Truncate modes when the text contains characters using superscript, subscript or using the <voffset> tag. +- Revised culling of text objects when using a RectMask2D where the bounds of the text geometry instead of the RectTransform define the culling rect. +- Added HDR support to material preset colors. +- Fixed various formatting issues in this ChangeLog. +- Added the ability to define a unicode value for a missing sprite character in the TMP Settings. +- Added support for displaying a missing sprite character when the requested sprite character is not present in the sprite asset or potential fallback(s). This new functionality is only available when trying to reference a sprite by name. +- Sprite Characters will now have a default Unicode value of 0xFFFE (Private NonCharacter) instead of a Unicode value of 0x0 (default unicode value for missing character). +- Using the sprite asset context menu option "Update Sprite Asset" will now remap sprite characters with unicode value of 0x0 to 0xFFFE in addition to its currently functionality. +- Updating TMP Essential Resources via the "Window - TextMeshPro - Import TMP Essential Resources" menu option will no longer override existing TMP Settings. +- Minor optimization where SDF Scale on some text objects could be unnecessarily updated due to floating point rounding errors in their lossy scale. Case #1230799 +- Fixed minor issue where text objects created before importing the required TMP Essential Resources would have no default text. +- Improvements to line breaking for CJK and mixed Latin and CJK characters. See the following [forum post](https://forum.unity.com/threads/tmp-bug.852733/#post-5688274) for more details. +- Fixed potential NullReferenceException that could occur in the TMP InputField on some platforms if the InputSystem reference is null. Case #1232433 +- Added small padding to bitmap character geometry to prevent potential clipping. +- Added optimization to ignore very small RectTransform pivot changes that are usually the result of rounding errors when using Layout Components. Case #1237700 +- Sorting Layer ID and Sorting Order properties located in the Extra Settings of <TextMeshPro> text objects will now serialized when creating Editor Presets. Case #1215750 +- TextMeshProUGUI sub text objects will now be set as first sibling of their parent to prevent them from being rendered over other non text object child in the scene hierarchy. +- Fixed text objects becoming visible when set to empty or null as a result of a scale change. Case #1238408 +- Fixed useMaxVisibleDescender property now getting set properly via scripting. Case #1218526 +- Fixed SortingLayerID and SortingOrder not getting set correctly when multiple <TextMeshPro> objects are selected. Case #1171272 +- Fixed default settings getting applied to disabled text objects in the scene hierarchy whose text property was set to null. Case #1151621 +- Fixed mouse cursor flickering when hovering the Text Input Box of a text prefab with RTL enabled. Case #1206395 + +## [2.1.0-preview.8] - 2020-03-14 +## [1.5.0-preview.8] +## [3.0.0-preview.8] +### Changes +- Fixed a minor issue where the preferred width of a text object can be incorrect when using multiple font assets, fallbacks and sprites in the same line of text. +- Added Alpha Fade Speed property to the TMP_DropDown inspector. +- Minor improvements to the LogWarning related to missing characters in a font asset or fallback being replaced by a space character. +- Fixed text object geometry not getting clipped when object is outside of RectMask2D. +- Improved search for potential missing character to include the primary font asset and potential fallbacks when the current font asset is not the primary. +- Ignorable / Synthesized characters in font assets will only be created if they do not exist in the source font file. +- Trying to use Text Overflow Ellipsis mode when no Ellipsis character is available in the primary font asset or potential fallbacks will now issue a warning and switch Text Overflow mode to Truncate. +- Added <color=lightblue> and <color=grey> to pre-defined rich text tag colors. +- Fixed compatibility issue when using TexturePacker - JSON (Array) mode and the TMP Sprite Asset Importer to create SpriteAssets. +- Simple fix to prevent the underline rich text tag becoming visible in the TMP Input Field when in IME composition mode with Rich Text disabled on the TMP Input Field. This is a temporary fix until a more robust and flexible solution is implemented. Case #1219969 +- Sub Text Objects which are created when the text requires the use of a fallback font asset or sprite asset will now use HideFlags.DontSave to prevent them from being save with Prefabs as they are created on demand. +- Fix incorrect material reference when current font asset is not the primary or a fallback that is missing a character which is present in the primary font asset. + +## [2.1.0-preview.7] - 2020-03-07 +## [1.5.0-preview.7] +## [3.0.0-preview.7] +### Changes +- Reverted recent change to the TMP_SubMeshUI OnDisable() function that could result in a Missing Reference Exception in the GraphicRaycaster.cs script. See the following [forum post](https://forum.unity.com/threads/version-1-5-0-2-1-0-preview-5-now-available-for-testing.753587/page-2#post-5523412). +- Added support for Stadia for Unity 2019.3 or newer. +- Addressed warning that would appear in the console in Unity 2019.3 related to recent Preset API changes. Case #1223257 +- Fixed glyph drawing issue in the Font Asset Inspector Glyph Adjustment Table when Multi Atlas Texture is enabled and the glyph is not located in the main atlas texture or at atlasTextures[0]. +- Added support for <ZWSP> tag which is internally replaced by a zero width space or \u200B. +- Improved line breaking handling when using <NBSP> and / or <NOBR> tags where instead of breaking these line segments per character, they will break at any possible soft breaking space when these segments exceed the width of the text container. +- Improved PreferredHeight calculations and handling when using Text Auto Size. +- Fixed incorrect color being applied to the underline or strikethrough line segments when using and / or tags along with a tag while at the same time applying an Underline or Strikethrough font style on the whole text object. +- Fixed SDF Scale not getting updated when using SetText() with StringBuilder when the lossyScale of the text object changes. Case #1216007 +- Added Non Breaking Space \u00A0 and Soft Hyphen \u00AD to list of synthesized characters in the event they are not present in the source font file. +- Fixed stack overflow issue when using TMP_FontAsset.HasCharacter and TMP_FontAsset.HasCharacters function on font assets that have circular fallback references. Case #1222574 +- Fixed atlas texture not getting set correctly to IsReadable when switching a static font asset to dynamic in the Generation Settings of the Font Asset Inspector. +- Added check for RectTransform.sizeDelta change when OnRectTransformDimensionsChange() is called by the Canvas system to get around potential rounding error that erroneously trigger this callback when the RectTransform is using Stretch Anchor mode. +- As requested by a few users, TMP_FontAsset.faceInfo setter is now public instead of internal. + +## [2.1.0-preview.5] - 2020-02-25 +## [1.5.0-preview.5] +## [3.0.0-preview.5] +### Changes +- Revised SetText function formatting options to including ability to specify padding for integral part of the value. Revised format is as follows: {Arg Index:Integral Padding.Decimal Precision} Example: TMP_Text.SetText("Value = {0:000.00}", 10.375f); result in "Value = 010.38". +- Fixed issue where text objects isTextObjectScaleStatic property would be ignored when OnCanvasHierarchyChanged() is called. +- Added a Character, Glyph and Record count to those respective tables in the Font Asset Inspector. +- Fixed potential Null Reference Exception that would occur when using text Overflow Ellipsis mode with a primary font asset that doesn't contain the Ellipsis character. Case #1209771 +- Fixed a potential Editor lockup when using text Overflow Page mode. Case #1219055 +- Fixed Input Field incorrect caret vertical alignment when using the Midline / Vertical Geometry alignment option. +- Added initial / minimal support for the New Input System. Please use with caution and report any issues. +- Changes to Font Asset Generation Settings via the Font Asset Inspector will now update the existing glyphs and characters for the new settings instead of clearing them. +- Text object InternalUpdate() used to handle potential scale changes of text objects now uses willRenderCanvases event instead of onPreCull. This avoids a potential one frame delay in updating of objects and no impact on objects. Case #1216007 + +## [2.1.0-preview.4] - 2020-01-31 +## [1.5.0-preview.4] +## [3.0.0-preview.4] +### Changes +- Fixed Input Field issue where scrolling events could prevent OnEndEdit event from firing. See [forum post](https://forum.unity.com/threads/mouse-wheel-on-multiline-input-field-with-no-scrollbar-hangs-input-field-stops-event-firing.794607/) for details. +- Improved Input Field handling of Vertical Scrollbar in conjunction with the ResetOnDeActivation property. Using the Vertical Scrollbar no longer triggers OnEndEdit event. +- Fixed MissingReferenceException when deleting a TMP prefab that is part of a nested prefab. Case #1207793 +- Improved handling of allocations of newly created text objects with large amount of text. As a result of these revisions, allocations will potentially be reduce by 10X. See #1205923 +- Fixed potential Null Reference Exception with the TMP DropDown that could occur when using the experimental Editor "Enter Play Mode" feature. Case #1207915 +- Fixed potential issue with the assignment of sub text object materials. +- Add support for hiding the soft keyboard for Switch in the TMP Input Field. +- Fixed incorrect Preferred Height when Word Wrapping is disabled on text objects. See [forum post](https://forum.unity.com/threads/incorrect-wordwrapping-preferredsize-textmespro-2-1-preview-3.812376/) for details. +- Added support for the new Selected state and color to the TMP Input Field. Case #1210496 +- Fixed additional instances of TMP Resource Importer window being created when deleting the "TextMesh Pro" folder just after having imported them. Case #1205848 +- Added public ITextPreprocessor textPreprocessor; property to allow setting the text preprocessor for a given text component. + +## [2.1.0-preview.3] - 2019-12-16 +## [1.5.0-preview.3] +### Changes +- Fixed potential issue with TMP Dropdown where calling Show() and Hide() in very short interval could result in additional Blockers. Case #1194114 +- Fixed potential issues that could occur when upgrading to version 1.5.0-preview.2 or newer of the TMP package without also updating the TMP Essential Resources in the project. +- Added check and warning when trying to create a font asset whose source font file has "Incl. Font Data" disabled in the Font Import Settings. Case #1198587 and #1198112 +- Fixed Ellipsis overflow mode issue when using small caps. Case #1198392 +- Fixed potential layout issue when adding a Layout Group to the text object itself. Case #1197614 +- Fixed Font Asset Creator issue where too many adjustment records with adjustment value of zero were added to the font asset. +- Added support for Line Separator \u2028 and Paragraph Separator \u2029. +- TMP shaders have been moved from "TextMesh Pro/Resources/Shaders" folder to "TextMesh Pro/Shaders" folder. See the following [post](https://forum.unity.com/threads/version-1-5-0-2-1-0-preview-2-now-available-for-testing.753587/#post-5206853) for details. +- Added new experimental SDF and Mobile SDF Shaders that use Screen Space Derivatives (SSD) where these shaders no longer require SDF Scale to be passed via Vertex Attributes. These shaders have higher performance overhead but are more flexible. This overhead should only be noticeable on mobile platforms. +- Fixed potential text alignment issue where upgrading from package version 1.4.1 to 1.5.0-preview.2 would result in incorrect alignment on prefabs. Case #1198833 +- Added \u061C Arabic Letter Mark, \u200E Left-to-Right Mark and \u200F Right-to-Left Mark to list of control and non renderable characters. +- Fixed Missing Reference Exception that would appear when expanding the Extra Settings of a TextMeshPro Preset asset. Case #1201072 +- Fixed Missing Reference Exception that would appear when editing the Vertex Color or Color Gradient of a TMP component Preset asset. Case #1201069 +- Fixed Inspector layout issue preventing enabling or disabling the Outline, Underlay, Lighting and Glow features when selecting a Preset asset material. Case #1196963 +- Revised the Create Material Preset context menu option to issue a warning and ignore materials outside the project. Case #1200109 +- Added experimental ITextPreprocessor interface to allow users to create custom components to handle text preprocessing and shaping. This interface includes a PreprocessText(string text) function that is called when the object contains a component that inherits from this interface. +- Added support for Unity Presets in the Editor for both and components. Case #1191793 +- Optimization to ensure the TMP Update Manager only rebuilds text objects once per frame regardless of the number of cameras in the scene. + +## [2.1.0-preview.2] - 2019-10-30 +## [1.5.0-preview.2] +### Changes +- Fixed Input Field issue when Read Only flag is set preventing the initial setting of the text. Also fixed Read Only flag not being respected when using IME input. +- Fixed potential infinite loop when using text overflow mode ScrollRect. See Case #1188867 +- Fixed Input Field culling related issue(s) where text would be incorrectly culled. See https://forum.unity.com/threads/version-1-5-0-2-1-0-preview-1-now-available-for-testing.753587/#post-5023700 +- Revised handling and referencing of the CanvasRenderer in anticipation of an incoming change to the MaskableGraphic class where it will no longer automatically add a CanvasRenderer to components inheriting from it. As a result, objects will no longer have a CanvasRenderer. +- Fixed potential NRE when using Overflow Truncate mode with sprites. See https://forum.unity.com/threads/tmpro-stackoverflow-caused-by-tmpro-textmeshprougui-generatetextmesh.750398/page-2#post-5042822 +- Fixed issue when using font weights in combination of font styles in the editor. +- Fixed for potential incorrect preferred height. +- Improved handling of StyleSheet options to reorder, add or delete styles. +- Fixed Input Field Caret & Selection Highlight potential culling issue when the object was instantiated outside the culling region. +- Fixed potential issue with registration of text objects in the TMP_UpdateManager. +- Optimization to suppress callback to InternalUpdate when parent Canvas is disabled. Case #1189820 +- Fixed Fallback material not getting updated correctly when changing Generation Settings on the Fallback Font Asset. +- Fixed a typo in the Font Weight section of the Font Asset Editor. +- Fixed potential ArgumentOutOfRangeException in the Input Field when using Hide Mobile Input and deleting a long string. Case #1162514 +- Added "Is Scale Static" option in the Extra Settings to exclude text objects from InternalUpdate callbacks to improve performance when the object's scale is static. This InternalUpdate callback is used to track potential changes to the scale of text objects to update their SDF Scale. +- Added the ability to control culling modes for the TMP Shaders. This new option is available in the Debug section of the Material Inspector. New feature requires updating the TMP Essential Resources. See the following post https://forum.unity.com/threads/not-see-textmeshpro-rendering-from-the-back.767510/#post-5112461. +- Fixed Material Inspector issue when toggling the Record button in the Animation window. Case #1174960 +- Improved Line Breaking handling for CJK. This also addresses a few reported issues. Case #1171603 +- Added support for <NBSP> tag which is internally replaced by a non-breaking space or \u00A0. +- Improved performance when retrieving glyph adjustment records when using dynamic font assets. +- Fixed potential Null Reference Exception in the Editor when assigning new font asset to disabled game object when no previous font asset was assigned. + +## [2.1.0-preview.1] - 2019-09-30 +## [1.5.0-preview.1] +### Changes +- Fixed an issue when using Overflow Ellipsis mode where the Ellipsis character would not be displayed correctly when the preceding character is a sprite. +- Added the ability to define the Resource path for Style Sheets in the TMP Settings. +- TMP Style Sheets can now be assigned to text objects in the Extra Settings section of the text object inspector. +- Added the ability to assign a Style to text objects using the new Text Style property in the text object inspector. A new public property TMP_Text.textStyle was also added. +- Improved Style Sheet editor to allow sorting of styles in the style sheet. +- Improved handling of nested styles. +- Added public TMP_Style GetStyle(string name) to get the potential style by name. +- Revised the ForceMeshUpdate() function as follows: public void ForceMeshUpdate(bool ignoreActiveState = false, bool forceTextReparsing = false). +- Fixed SubMeshUI objects text disappearing when saving a scene. +- Creating Material Presets via the Material Context menu with multi selection will now work as expected and assign the newly created material preset to all selected text objects. +- Fixed minor issue when changing Material Preset in prefab isolation mode with multiple text objects selected where the new material preset would not be assigned to disabled text objects. +- Revised Character, Word, Line and Paragraph spacing adjustments to be in font units (em) where a value of 1 represents 1/100 em. +- Added TMP_Text.onFontAssetRequest and TMP_Text.onSpriteAssetRequest events to allow users to implement custom asset loading when using the <font="Font Asset Name"> and <sprite="Sprite Asset Name"> tags. +- Additional Shader Channels on the Canvas will be set to TexCoord1, Normal and Tangents or Mixed when using TMP Surface Shaders. Otherwise it will be set to TexCoord1 only. Case #1100696 +- Added new attribute to the <mark> tag to allow users to define a padding value for the mark / highlight region. Example: <mark color=#FFFF0080 padding="1.0,1.0,0.0,0.0"> where padding="Left, Right, Top, Bottom". +- Fixed an issue which could result in out of range exception when referencing sprites contained in fallback sprite assets using unicode values. +- Fixed an issue in the Font Asset Creator where the source font file property of the newly created font asset was not getting set. +- Added .blend files to exclusion asset scan list of the Project GUID Remapping tool. +- Fixed issue where Caret position would be incorrect when using IME. Case #1146626 +- Clamped Outline Softness to a value of 0-1 in the TMP Distance Field shader which makes it consistent with other SDF Shaders. Case #1136161 +- Text Auto-Sizing Min and Max values are now clamped between 0 and 32767. Case #1067717 +- Text Font Size Min and Max values are now clamped between 0 and 32767. Case #1164407 +- Rich Text Tag values are now limited to a maximum value of 32767. +- Added Placeholder option to TMP Dropdown. Placeholder text is displayed when selection value is -1. Also added example scene in the TMP Examples & Extras. +- Added the ability to define Face Info metrics per Sprite Assets. This will provide for more consistent scaling of the sprites regardless of the font asset used. Sprite Assets with undefined Face Info will continue to inherit the Face Info metrics of the current font asset. +- Added Update Sprite Asset option in the header of the Sprite Asset inspector. This increases the discoverability of this option already available via the Sprite Asset Context Menu. +- Revised the text auto-sizing handling in regards to maximum iteration threshold which could result in a crash on some Android devices. Case #1141328 +- Font Asset Generation Settings are now disabled in the inspector if the Source Font File is missing or if the Atlas Population Mode is set to static. +- Fixed vertical alignment issue when using Overflow Page mode. +- Improved handling of text auto-size line adjustment spacing resulting in fewer iterations and more accurate resulting point size. +- Added support for Layout Elements to the TMP Input Field. += Fixed text alignment issue with TMP Input Field when using Center alignment on the underlying text component. +- Setting ContentType.Custom on the TMP Input Field will no longer hide the Soft Keyboard. The Soft Keyboard can now be control independently via the shouldHideSoftKeyboard property. +- Added new Font Asset Context Menu option "Force Upgrade To Version 1.1.0" for convenience purposes in case a font asset didn't get upgraded automatically when migrating from version 1.3.0 to 1.4.x or 2.0.x. +- The <gradient> tag now as an optional attribute "tint=0" or "tint=1" controlling whether or not the gradient will be affect by vertex color. The alpha of the gradient will continue to be affected by the vertex color alpha. +- Added new angle=x attribute to the <i> tag where the value of x define the italic slant angle. +- Since the legacy TextContainer used by TMP has been deprecated, it was removed from the Layout Context Menu options. +- Improved character positioning when using italic text where large angle / slant would potentially result in uneven spacing between normal and italic blocks of text. +- Fixed an issue where <mspace> and <cspace> tags would not be handled correctly in conjunction with word wrapping. +- Fixed issue in the TMP_Dropdown.cs that was affecting navigation. Case 1162600. See https://forum.unity.com/threads/huge-bug-missing-a-code-line-since-1-4-0.693421/ +- Fixed an issue related to kerning where the glyph adjustment values did not account for the upsampling of the legacy SDF modes like SDF8 / SDF16 and SDF32. +- Made the TMP_Text.text property virtual. +- Fixed Material Preset of fallback materials getting modified when the TMP Settings Match Material Preset option is disabled. +- Added ShaderUtilities.ID_GlowInner to list of material property IDs. +- Fixed potential null reference exception when creating new text objects when no default font asset has been assigned in the TMP Settings and the LiberationSans SDF font asset has been deleted from the project. Case #1161120 +- Fixed import TMP Essential Resources button being disabled when importing the TMP Examples & Extras first. Case #1163979 +- Fixed potential ArgumentOutOfRangeException when Hide Mobile Input is enabled and deleting the last character in the text. Case #1162514 +- Improved handling of manual addition of glyph positional adjustment pairs for both dynamic and static font assets. Case #1165763 +- Fixed issue where text in the TMP_InputField would disappear due to incorrect culling. Case #1164096 +- Fixed potential IndexOutOfRangeException that could be thrown when using the Pinyin IME interface and typing very fast to enter Chinese text. Case #1164383 +- Added support for Vertical Tab \v which inserts a line break but not a paragraph break. +- Added support for Shift Enter in the TMP Input Field which inserts a Vertical Tab in the text in Multi Line mode. +- Fixed text horizontal alignment when lines of text only contain the Ellipsis \u2026 Unicode character. Case #1162685 +- Text alignment is now serialized into separate fields for horizontal and vertical alignment and can now be get / set independently via TMP_Text.horizontalAlignment and TMP_Text.verticalAlignment. The TMP_Text.alignment property remains and uses the new serialized fields for horizontal and vertical alignment. +- Improved handling of Soft Hyphens when using Text Auto-Size. +- Fixed Null character being passed to Validate method of the TMP_InputField. Case #1172102 +- Fixed an issue where the Preferred Width and Height were not correct when using Tabs. +- The Cull Transparent Mesh flag on TMP_SubMeshUI objects will now mirror the settings on the parent text object's CanvasRenderer. +- Updated Sprite Importer to improve compatibility with Texture Packer Json Array export format. +- Newly created StyleSheets will be pinged in the project tab. Case #1182117 +- Added new option in the TMP Settings to control line breaking rules for Hangul to enabled Modern line breaking or traditional line breaking. +- Fixed potential issue related to SDF Scaling when the scale of the text object is negative. See https://forum.unity.com/threads/version-1-4-1-preview-1-with-dynamic-sdf-for-unity-2018-3-now-available.622420/page-5#post-4958240 for details. +- Added validation check for Sprite Data Source file in the Sprite Asset Importer. Case #1186620 +- Added warning when using Create - TextMeshPro - Sprite Asset menu when no valid texture is selected. Case #1163982 +- Fixed potential cosmetic issue in the text component inspector when using Overflow Linked mode. Case #1177640 + +## [1.4.1] - 2019-04-12 +### Changes +- Improved handling of font asset automatic upgrade to version 1.1.0 which is required to support the new Dynamic SDF system. +- Made release compatible with .Net 3.5 scripting runtime. + +## [1.4.0] - 2019-03-07 +### Changes +- Same release as 1.4.0-preview.3a. + +## [1.4.0-preview.3a] - 2019-02-28 +### Changes +- Improved performance of the Project Files GUID Remapping Tool. +- Fixed an issue with the TMP_FontAsset.TryAddCharacters() functions which was resulting in an error when added characters exceeded the capacity of the atlas texture. +- Updated TMP_FontAsset.TryAddCharacters functions to add new overloads returning list of characters that could not be added. +- Added function in OnEnable of FontAsset Editor's to clean up Fallback list to remove any null / empty entries. +- Added support for Stereo rendering to the TMP Distance Field and Mobile Distance Field shaders. + +## [1.4.0-preview.2a] - 2019-02-14 +### Changes +- Fixed an issue with SDF Scale handling where the text object would not render correctly after the object scale had been set to zero. +- Fixed an issue with the TMP_UpdateManager where text objects were not getting unregistered correctly. +- Any changes to Font Asset Creation Settings' padding, atlas width and / or atlas height will now result in all Material Presets for the given font asset to also be updated. +- Added new section in the TMP Settings related to the new Dynamic Font System. +- Added new property in the Dynamic Font System section to determine if OpenType Font Features will be retrieved from source font files at runtime as new characters are added to font assets. Glyph Adjustment Data (Kerning) is the only feature currently supported. +- Fix an issue where font assets created at runtime were not getting their asset version number set to "1.1.0". +- Improved parsing of the text file used in the Font Asset Creator and "Characters from File" option to handle UTF16 "\u" and UTF32 "\U" escape character sequences. +- Fixed a Null Reference Error (NRE) that could occur when using the <font> tag with an invalid font name followed by the <sprite> tag. +- The Glyph Adjustment Table presentation and internal data structure has been changed to facilitate the future addition of OpenType font features. See https://forum.unity.com/threads/version-1-4-0-preview-with-dynamic-sdf-for-unity-2018-3-now-available.622420/#post-4206595 for more details. +- Fixed an issue with the <rotate> tag incorrectly affecting character spacing. + +## [1.4.0-preview.1] - 2019-01-30 +### Changes +- Renamed TMPro_FontUtilities to TMP_FontAssetCommon to more accurately reflect the content of this file. +- Accessing the TextMesh Pro Settings via the new Edit - Settings menu when TMP Essential Resources have not yet been imported in the project will no longer open a new window to provide the options to import these resources. +- Fixed an issue where using int.MaxValue, int.MinValue, float.MaxValue and float.MinValue in conjunction with SetText() would display incorrect numerical values. Case #1078521. +- Added public setter to the TMP Settings' missingGlyphCharacter to allow changing which character will be used for missing characters via scripting. +- Fixed a potential Null Reference Exception related to loading the Default Style Sheet. +- Added compiler conditional to TMP_UpdateManager.cs to address changes to SRP. +- Improved the <margin> tag to make it possible to define both left and right margin values. Example: <margin left=10% right=10px>. +- Added new menu option to allow the quick creation of a UI Button using TMP. New menu option is located in Create - UI - Button (TextMeshPro). +- Renamed TMP related create menu options. +- Fixed TMP object creation handling when using Prefab isolation mode. Case #1077392 +- Fixed another issue related to Prefabs where some serialized properties of the text object would incorrectly show up in the Overrides prefab options. Case #1093101 +- Fixed issue where changing the Sorting Layer or Sorting Order of a object would not dirty the scene. Case #1069776 +- Fixed a text alignment issue when setting text alignment on disabled text objects. Case #1047771 +- Fixed an issue where text object bounds were not set correctly on newly created text objects or in some cases when setting the text to null or string.empty. Case #1093388 +- Fixed an issue in the IntToString() function that could result in Index Out Of Bounds error. Case #1102007 +- Changed the TMP_InputField IsValidChar function to protected virtual. +- The "Allow Rich Text Editing" property of the TMP_InputField is now set to false by default. +- Added new option to the Sprite Asset context menu to make it easier to update sprite glyphs edited via the Unity Sprite Editor. +- Added new Sharpness slider in the Debug section of the SDF Material inspector. +- Fixed an error that would occur when using the context menu Reset on text component. Case #1044726 +- Fixed issue where CharacterInfo.index would be incorrect as a result of using Surrogate Pairs in the text. Case #1037828 +- The TMP_EditorPanel and TMP_UiEditorPanel now have their "UseForChildren" flag set to true to enable user / custom inspectors to inherit from them. +- Fixed an issue where rich text tags using pixel (px) or font units (em) were not correctly accounting for orthographic camera mode. This change only affects the normal TMP text component. +- Fixed an inspector issue related to changes to the margin in the TMP Extra Settings panel. Case #1114253 +- Added new property to Glyph Adjustment Pairs which determines if Character Spacing Adjustments should affect the given pair. +- Updated the Glyph Adjustment Table where ID now represents the unicode (hex) value for the character instead of its decimal value. +- Added new SetValueWithoutNotify() function to TMP_DropDown and SetTextWithoutNotify() function to TMP_InputField allowing these to be set without triggering OnValueChanged event. +- Geometry buffer deallocation which normally takes place when current allocations exceed those of the new text by more than 256 characters will no longer occur if the new text is set to null or string.empty. +- Fixed a minor issue where the underline SDF scale would be incorrect when the underline text sequence contained normal size characters and ended with a subscript or superscript character. +- Fixed an error that would occur when using the Reset Context menu on a Material using the SDF Surface or Mobile SDF Surface Shaders. Case #1122279 +- Resolved a Null Reference Error that would appear when cycling through the text overflow modes. Case #1121624 + +## [1.3.0] - 2018-08-09 +### Changes +- Revamped UI to conform to Unity Human Interface Guidelines. +- Updated the title text on the Font Asset Creator window tab to "Font Asset Creator". +- Using TMP_Text.SetCharArray() with an empty char[] array will now clear the text. +- Made a small improvement to the TMP Input Field when using nested 2d RectMasks. +- Renamed symbol defines used by TMP to append TMP_ in front of the define to avoid potential conflicts with user defines. +- Improved the Project Files GUID Remapping tool to allow specifying a target folder to scan. +- Added the ability to cancel the scanning process used by the Project Files GUID Remapping tool. +- Moved TMP Settings to universal settings window in 2018.3 and above. +- Changing style sheet in the TMP Settings will now be reflected automatically on existing text objects in the editor. +- Added new function TMP_StyleSheet.UpdateStyleSheet() to update the internal reference to which style sheet text objects should be using in conjunction with the style tag. + +## [1.2.4] - 2018-06-10 +### Changes +- Fixed a minor issue when using Justified and Flush alignment in conjunction with \u00A0. +- The Font Asset creationSettings field is no longer an Editor only serialized field. + +## [1.2.3] - 2018-05-29 +### Changes +- Added new bitmap shader with support for Custom Font Atlas texture. This shader also includes a new property "Padding" to provide control over the geometry padding to closely fit a modified / custom font atlas texture. +- Fixed an issue with ForceMeshUpdate(bool ignoreActiveState) not being handled correctly. +- Cleaned up memory allocations from repeated use of the Font Asset Creator. +- Sprites are now scaled based on the current font instead of the primary font asset assigned to the text object. +- It is now possible to recall the most recent settings used when creating a font asset in the Font Asset Creator. +- Newly created font assets now contain the settings used when they were last created. This will make the process of updating / regenerating font assets much easier. +- New context menu "Update Font Asset" was added to the Font Asset inspector which will open the Font Asset Creator with the most recently used settings for that font asset. +- New Context Menu "Create Font Asset" was added to the Font inspector panel which will open the Font Asset Creator with this source font file already selected. +- Fixed 3 compiler warnings that would appear when using .Net 4.x. +- Modified the TMP Settings to place the Missing Glyph options in their own section. +- Renamed a symbol used for internal debugging to avoid potential conflicts with other user project defines. +- TMP Sprite Importer "Create Sprite Asset" and "Save Sprite Asset" options are disabled unless a Sprite Data Source, Import Format and Sprite Texture Atlas are provided. +- Improved the performance of the Project Files GUID Remapping tool. +- Users will now be prompted to import the TMP Essential Resources when using the Font Asset Creator if such resources have not already been imported. + +## [1.2.2] - 2018-03-28 +### Changes +- Calling SetAllDirty() on a TMP text component will now force a regeneration of the text object including re-parsing of the text. +- Fixed potential Null Reference Exception that could occur when assigning a new fallback font asset. +- Removed public from test classes. +- Fixed an issue where using nested links (which doesn't make sense conceptually) would result in an error. Should accidental use of nested links occurs, the last / most nested ends up being used. +- Fixed a potential text alignment issue where an hyphen at the end of a line followed by a new line containing a single word too long to fit the text container would result in miss alignment of the hyphen. +- Updated package license. +- Non-Breaking Space character (0xA0) will now be excluded from word spacing adjustments when using Justified or Flush text alignment. +- Improved handling of Underline, Strikethrough and Mark tag with regards to vertex color and Color tag alpha. +- Improved TMP_FontAsset.HasCharacter(char character, bool searchFallbacks) to include a recursive search of fallbacks as well as TMP Settings fallback list and default font asset. +- The <gradient> tag will now also apply to sprites provided the sprite tint attribute is set to a value of 1. Ex. <sprite="Sprite Asset" index=0 tint=1>. +- Updated Font Asset Creator Plugin to allow for cancellation of the font asset generation process. +- Added callback to support the Scriptable Render Pipeline (SRP) with the normal TextMeshPro component. +- Improved handling of some non-breaking space characters which should not be ignored at the end of a line. +- Sprite Asset fallbacks will now be searched when using the <sprite> tag and referencing a sprite by Unicode or by Name. +- Updated EmojiOne samples from https://www.emojione.com/ and added attribution. +- Removed the 32bit versions of the TMP Plugins used by the Font Asset Creator since the Unity Editor is now only available as 64bit. +- The isTextTruncated property is now serialized. +- Added new event handler to the TMP_TextEventHandler.cs script included in Example 12a to allow tracking of interactions with Sprites. + +## [1.2.1] - 2018-02-14 +### Changes +- Package is now backwards compatible with Unity 2018.1. +- Renamed Assembly Definitions (.asmdef) to new UPM package conventions. +- Added DisplayName for TMP UPM package. +- Revised Editor and Playmode tests to ignore / skip over the tests if the required resources are not present in the project. +- Revised implementation of Font Asset Creator progress bar to use Unity's EditorGUI.ProgressBar instead of custom texture. +- Fixed an issue where using the material tag in conjunction with fallback font assets was not handled correctly. +- Fixed an issue where changing the fontStyle property in conjunction with using alternative typefaces / font weights would not correctly trigger a regeneration of the text object. + +## [1.2.0] - 2018-01-23 +### Changes +- Package version # increased to 1.2.0 which is the first release for Unity 2018.2. + +## [1.1.0] - 2018-01-23 +### Changes +- Package version # increased to 1.1.0 which is the first release for Unity 2018.1. + +## [1.0.27] - 2018-01-16 +### Changes +- Fixed an issue where setting the TMP_InputField.text property to null would result in an error. +- Fixed issue with Raycast Target state not getting serialized properly when saving / reloading a scene. +- Changed reference to PrefabUtility.GetPrefabParent() to PrefabUtility.GetCorrespondingObjectFromSource() to reflect public API change in 2018.2 +- Option to import package essential resources will only be presented to users when accessing a TMP component or the TMP Settings file via the project menu. + +## [1.0.26] - 2018-01-10 +### Added +- Removed Tizen player references in the TMP_InputField as the Tizen player is no longer supported as of Unity 2018.1. + +## [1.0.25] - 2018-01-05 +### Added +- Fixed a minor issue with PreferredValues calculation in conjunction with using text auto-sizing. +- Improved Kerning handling where it is now possible to define positional adjustments for the first and second glyph in the pair. +- Renamed Kerning Info Table to Glyph Adjustment Table to better reflect the added functionality of this table. +- Added Search toolbar to the Glyph Adjustment Table. +- Fixed incorrect detection / handling of Asset Serialization mode in the Project Conversion Utility. +- Removed SelectionBase attribute from TMP components. +- Revised TMP Shaders to support the new UNITY_UI_CLIP_RECT shader keyword which can provide a performance improvement of up to 30% on some devices. +- Added TMP_PRESENT define as per the request of several third party asset publishers. + +## [1.0.23] - 2017-11-14 +### Added +- New menu option added to Import Examples and additional content like Font Assets, Materials Presets, etc for TextMesh Pro. This new menu option is located in "Window -> TextMeshPro -> Import Examples and Extra Content". +- New menu option added to Convert existing project files and assets created with either the Source Code or DLL only version of TextMesh Pro. Please be sure to backup your project before using this option. The new menu option is located in "Window -> TextMeshPro -> Project Files GUID Remapping Tool". +- Added Assembly Definitions for the TMP Runtime and Editor scripts. +- Added support for the UI DirtyLayoutCallback, DirtyVerticesCallback and DirtyMaterialCallback. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md.meta new file mode 100644 index 0000000..edf5c32 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 22464cf7ab0243a6bf9c79851183b002 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md new file mode 100644 index 0000000..8f8c092 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md @@ -0,0 +1,35 @@ +# **_TextMesh Pro User Guide_** + +#### **Overview** +This User Guide was designed to provide first time users of TextMesh Pro with a basic overview of the features and functionality of the tool. + +#### **Installation** +The TextMesh Pro UPM package is already included with the Unity Editor and as such does not require installation. TextMesh Pro "TMP" does however require adding resources to your project which are essential for using TextMesh Pro. + +To import the "*TMP Essential Resources*", please use the "*Window -> TextMeshPro -> Import TMP Essential Resources*" menu option. These resources will be added at the root of your project in the "*TextMesh Pro*" folder. + +The TextMesh Pro package also includes additional resources and examples that will make discovering and learning about TextMesh Pro's powerful features easier. It is strongly recommended that first time users import these additional resources. + +To import the "*TMP Examples & Extras*", please use the "*Window -> TextMeshPro -> Import TMP Examples & Extras*" menu option. These resources will also be added in the same "*TextMesh Pro*" folder inside your project. + + +#### **Quick Start** +There are two TextMesh Pro components available. The first TMP text component is of type <TextMeshPro> and designed to work with the MeshRenderer. This component is an ideal replacement for the legacy TextMesh component. + +To add a new <TextMeshPro> text object, go to: *GameObject->3D Object->TextMeshPro Text*. + +The second TMP text component is of type <TextMeshProUGUI> and designed to work with the CanvasRenderer and Canvas system. This component is an ideal replacement for the UI.Text component. + +To add a new <TextMeshProUGUI> text object, go to: *GameObject->UI->TextMeshPro Text*. + +You may also wish to watch this [Getting Started](https://youtu.be/olnxlo-Wri4) short video which covers this topic. + +We strongly recommend that you also watch the [Font Asset Creation](https://youtu.be/qzJNIGCFFtY) video as well as the [Working with Material Presets](https://youtu.be/d2MARbDNeaA) as these two topics is also key to working and getting the most out of TextMesh Pro. + +As mentionned in the Installation section of this guide, it is recommended that you import the "*TMP Examples & Extras*" and take the time to explore each of the examples as they provide a great overview of the functionality of the tool and the many text layout and [rich text tags](http://digitalnativestudios.com/textmeshpro/docs/rich-text/) available in TextMesh Pro. + +#### **Support & API Documentation** +Should you have questions or require assistance, please visit the [Unity UI & TextMesh Pro](https://forum.unity.com/forums/unity-ui-textmesh-pro.60/) section of the Unity forum as well as the [TextMesh Pro User Forum](http://digitalnativestudios.com/forum/index.php) where you will find additional information, [Video Tutorials](http://digitalnativestudios.com/forum/index.php?board=4.0) and [FAQ](http://digitalnativestudios.com/forum/index.php?topic=890.0). In the event you are unable to find the information you seek, always feel free to post on the [Unity UI & TextMesh Pro](https://forum.unity.com/forums/unity-ui-textmesh-pro.60/) section user forum. + +[Online Documentation](http://digitalnativestudios.com/textmeshpro/docs/) is also available on TextMesh Pro including Rich Text tags, Shaders, Scripting API and more. + diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md.meta new file mode 100644 index 0000000..8c72f72 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ca77d26d10b9455ca5a4b22c93be2a31 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources.meta new file mode 100644 index 0000000..7c07b00 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1a0a27327b54c3bac52a08929c33f81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos.meta new file mode 100644 index 0000000..f2596c7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e93ec7eb6de342aabd156833e253f838 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd new file mode 100644 index 0000000..93f5a2c Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta new file mode 100644 index 0000000..7bdb473 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: a7ec9e7ad8b847b7ae4510af83c5d868 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 7 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -2 + maxTextureSize: 128 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: 2 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Windows Store Apps + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 1 + pSDShowRemoveMatteOption: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd new file mode 100644 index 0000000..2fb1164 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta new file mode 100644 index 0000000..bd64ad7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: ee148e281f3c41c5b4ff5f8a5afe5a6c +timeCreated: 1463559213 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd new file mode 100644 index 0000000..f0360d3 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta new file mode 100644 index 0000000..eb2e1ce --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 3ee40aa79cd242a5b53b0b0ca4f13f0f +timeCreated: 1457860876 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd new file mode 100644 index 0000000..7036296 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta new file mode 100644 index 0000000..a22cdf1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: ec7c645d93308c04d8840982af12101e +timeCreated: 1463559213 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd new file mode 100644 index 0000000..3cc4163 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta new file mode 100644 index 0000000..623993d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 2fd6421f253b4ef1a19526541f9ffc0c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders.meta new file mode 100644 index 0000000..95efe2b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2da27f5fe80a3a549ac7331d9f52f5f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc new file mode 100644 index 0000000..2e96258 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc @@ -0,0 +1,85 @@ +// UI Editable properties +uniform sampler2D _FaceTex; // Alpha : Signed Distance +uniform float _FaceUVSpeedX; +uniform float _FaceUVSpeedY; +uniform fixed4 _FaceColor; // RGBA : Color + Opacity +uniform float _FaceDilate; // v[ 0, 1] +uniform float _OutlineSoftness; // v[ 0, 1] + +uniform sampler2D _OutlineTex; // RGBA : Color + Opacity +uniform float _OutlineUVSpeedX; +uniform float _OutlineUVSpeedY; +uniform fixed4 _OutlineColor; // RGBA : Color + Opacity +uniform float _OutlineWidth; // v[ 0, 1] + +uniform float _Bevel; // v[ 0, 1] +uniform float _BevelOffset; // v[-1, 1] +uniform float _BevelWidth; // v[-1, 1] +uniform float _BevelClamp; // v[ 0, 1] +uniform float _BevelRoundness; // v[ 0, 1] + +uniform sampler2D _BumpMap; // Normal map +uniform float _BumpOutline; // v[ 0, 1] +uniform float _BumpFace; // v[ 0, 1] + +uniform samplerCUBE _Cube; // Cube / sphere map +uniform fixed4 _ReflectFaceColor; // RGB intensity +uniform fixed4 _ReflectOutlineColor; +//uniform float _EnvTiltX; // v[-1, 1] +//uniform float _EnvTiltY; // v[-1, 1] +uniform float3 _EnvMatrixRotation; +uniform float4x4 _EnvMatrix; + +uniform fixed4 _SpecularColor; // RGB intensity +uniform float _LightAngle; // v[ 0,Tau] +uniform float _SpecularPower; // v[ 0, 1] +uniform float _Reflectivity; // v[ 5, 15] +uniform float _Diffuse; // v[ 0, 1] +uniform float _Ambient; // v[ 0, 1] + +uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity +uniform float _UnderlayOffsetX; // v[-1, 1] +uniform float _UnderlayOffsetY; // v[-1, 1] +uniform float _UnderlayDilate; // v[-1, 1] +uniform float _UnderlaySoftness; // v[ 0, 1] + +uniform fixed4 _GlowColor; // RGBA : Color + Intesity +uniform float _GlowOffset; // v[-1, 1] +uniform float _GlowOuter; // v[ 0, 1] +uniform float _GlowInner; // v[ 0, 1] +uniform float _GlowPower; // v[ 1, 1/(1+4*4)] + +// API Editable properties +uniform float _ShaderFlags; +uniform float _WeightNormal; +uniform float _WeightBold; + +uniform float _ScaleRatioA; +uniform float _ScaleRatioB; +uniform float _ScaleRatioC; + +uniform float _VertexOffsetX; +uniform float _VertexOffsetY; + +//uniform float _UseClipRect; +uniform float _MaskID; +uniform sampler2D _MaskTex; +uniform float4 _MaskCoord; +uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w) +//uniform float _MaskWipeControl; +//uniform float _MaskEdgeSoftness; +//uniform fixed4 _MaskEdgeColor; +//uniform bool _MaskInverse; + +uniform float _MaskSoftnessX; +uniform float _MaskSoftnessY; + +// Font Atlas properties +uniform sampler2D _MainTex; +uniform float _TextureWidth; +uniform float _TextureHeight; +uniform float _GradientScale; +uniform float _ScaleX; +uniform float _ScaleY; +uniform float _PerspectiveFilter; +uniform float _Sharpness; diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc.meta new file mode 100644 index 0000000..e6dcc0a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3c6c403084eacec478a1129ce20061ea +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader new file mode 100644 index 0000000..baf4501 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader @@ -0,0 +1,75 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "Hidden/TMP/Internal/Editor/Distance Field SSD" { + + Properties{ + _FaceColor("Face Color", Color) = (1,1,1,1) + _FaceDilate("Face Dilate", Range(-1,1)) = 0 + + _OutlineColor("Outline Color", Color) = (0,0,0,1) + _OutlineWidth("Outline Thickness", Range(0,1)) = 0 + _OutlineSoftness("Outline Softness", Range(0,1)) = 0 + + _UnderlayColor("Border Color", Color) = (0,0,0,.5) + _UnderlayOffsetX("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness("Border Softness", Range(0,1)) = 0 + + _WeightNormal("Weight Normal", float) = 0 + _WeightBold("Weight Bold", float) = .5 + + _ShaderFlags("Flags", float) = 0 + _ScaleRatioA("Scale RatioA", float) = 1 + _ScaleRatioB("Scale RatioB", float) = 1 + _ScaleRatioC("Scale RatioC", float) = 1 + + _MainTex("Font Atlas", 2D) = "white" {} + _TextureWidth("Texture Width", float) = 1024 + _TextureHeight("Texture Height", float) = 1024 + _GradientScale("Gradient Scale", float) = 1 + _ScaleX("Scale X", float) = 1 + _ScaleY("Scale Y", float) = 1 + _PerspectiveFilter("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX("Vertex OffsetX", float) = 0 + _VertexOffsetY("Vertex OffsetY", float) = 0 + } + + SubShader + { + Tags + { + "ForceSupported" = "True" + } + + Lighting Off + Blend One OneMinusSrcAlpha + Cull Off + ZWrite Off + ZTest Always + + Pass + { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ OUTLINE_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMP_Properties.cginc" + + #include "TMP_SDF_SSD.cginc" + + ENDCG + } + } + + CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader.meta new file mode 100644 index 0000000..5ba708d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9c442dc870b456e48b615cd8add0e9ef +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc new file mode 100644 index 0000000..0f587bd --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc @@ -0,0 +1,132 @@ +struct vertex_t +{ + float4 position : POSITION; + float3 normal : NORMAL; + float4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; +}; + +struct pixel_t +{ + float4 position : SV_POSITION; + float4 faceColor : COLOR; + float4 outlineColor : COLOR1; + float2 texcoord0 : TEXCOORD0; + float4 param : TEXCOORD1; // weight, scaleRatio + float2 clipUV : TEXCOORD2; + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 texcoord2 : TEXCOORD3; + float4 underlayColor : COLOR2; + #endif +}; + +sampler2D _GUIClipTexture; +uniform float4x4 unity_GUIClipTextureMatrix; +float4 _MainTex_TexelSize; + +float4 SRGBToLinear(float4 rgba) +{ + return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a); +} + +pixel_t VertShader(vertex_t input) +{ + pixel_t output; + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.position; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + float4 vPosition = UnityObjectToClipPos(vert); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + // Generate UV for the Clip Texture + float3 eyePos = UnityObjectToViewPos(input.position); + float2 clipUV = mul(unity_GUIClipTextureMatrix, float4(eyePos.xy, 0, 1.0)); + + float4 color = input.color; + #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA) + color = SRGBToLinear(input.color); + #endif + + float opacity = color.a; + #if (UNDERLAY_ON | UNDERLAY_INNER) + opacity = 1.0; + #endif + + float4 faceColor = float4(color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + float4 outlineColor = _OutlineColor; + outlineColor.a *= opacity; + outlineColor.rgb *= outlineColor.a; + + output.position = vPosition; + output.faceColor = faceColor; + output.outlineColor = outlineColor; + output.texcoord0 = float2(input.texcoord0.xy); + output.param = float4(0.5 - weight, 1.3333 * _GradientScale * (_Sharpness + 1) / _MainTex_TexelSize.z , _OutlineWidth * _ScaleRatioA * 0.5, 0); + output.clipUV = clipUV; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 underlayColor = _UnderlayColor; + underlayColor.rgb *= underlayColor.a; + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _MainTex_TexelSize.z; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _MainTex_TexelSize.w; + + output.texcoord2 = float4(input.texcoord0 + float2(x, y), input.color.a, 0); + output.underlayColor = underlayColor; + #endif + + return output; +} + +float4 PixShader(pixel_t input) : SV_Target +{ + float d = tex2D(_MainTex, input.texcoord0.xy).a; + + float2 UV = input.texcoord0.xy; + float scale = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y))) * input.param.y; + + #if (UNDERLAY_ON | UNDERLAY_INNER) + float layerScale = scale; + layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); + float layerBias = input.param.x * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); + #endif + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + + float4 faceColor = input.faceColor * saturate((d - input.param.x) * scale + 0.5); + + #ifdef OUTLINE_ON + float4 outlineColor = lerp(input.faceColor, input.outlineColor, sqrt(min(1.0, input.param.z * scale * 2))); + faceColor = lerp(outlineColor, input.faceColor, saturate((d - input.param.x - input.param.z) * scale + 0.5)); + faceColor *= saturate((d - input.param.x + input.param.z) * scale + 0.5); + #endif + + #if UNDERLAY_ON + d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale; + faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - layerBias) * (1 - faceColor.a); + #endif + + #if UNDERLAY_INNER + float bias = input.param.x * scale - 0.5; + float sd = saturate(d * scale - bias - input.param.z); + d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale; + faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd * (1 - faceColor.a); + #endif + + #if (UNDERLAY_ON | UNDERLAY_INNER) + faceColor *= input.texcoord2.z; + #endif + + faceColor *= tex2D(_GUIClipTexture, input.clipUV).a; + + return faceColor; +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc.meta new file mode 100644 index 0000000..3d0b3bf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: abe6991365a27d341a10580f3b7c0f44 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures.meta new file mode 100644 index 0000000..d6754b0 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f8e6a2d47aba4c6c9b3c5a72d9f48da5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd new file mode 100644 index 0000000..8ebaa27 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta new file mode 100644 index 0000000..ed7250a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: fb5730e24283d0c489e5c7d0bee023d9 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd new file mode 100644 index 0000000..e598e6d Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd.meta new file mode 100644 index 0000000..1e747b2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: e3b0f810fdea84e40ab4ba20f256f7e8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd new file mode 100644 index 0000000..3da358a Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta new file mode 100644 index 0000000..09deb3c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 8bc445bb79654bf496c92d0407840a92 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd new file mode 100644 index 0000000..cf49b6c Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta new file mode 100644 index 0000000..78e14cb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 18775b51e3bd42299fd30bd036ea982f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd new file mode 100644 index 0000000..1f35779 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd.meta new file mode 100644 index 0000000..8e79b48 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ca51b19024094d1b87f3e07edb0a75fb +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd new file mode 100644 index 0000000..d8af55b Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta new file mode 100644 index 0000000..9c9a6fc --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 585b70cb75dd43efbfead809c30a1731 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd new file mode 100644 index 0000000..7eefe6b Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta new file mode 100644 index 0000000..0455a2f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 0d9a36012a224080966c7b55896aa0f9 +timeCreated: 1467964791 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd new file mode 100644 index 0000000..f08bb6c Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta new file mode 100644 index 0000000..dfd05a1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 49679f302ac6408697f6b9314a38985c +timeCreated: 1467964413 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd new file mode 100644 index 0000000..939bc6d Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd.meta new file mode 100644 index 0000000..d189fc2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 81ed8c76d2bc4a4c95d092c98af4e58f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd new file mode 100644 index 0000000..f9ce9a8 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta new file mode 100644 index 0000000..555bb1b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: c76700ea0062413d9f69409b4e9e151b +timeCreated: 1484171296 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd new file mode 100644 index 0000000..e37b2e2 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta new file mode 100644 index 0000000..044d0c2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 35ff0937876540d3bd4b6a941df62a92 +timeCreated: 1484171296 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd new file mode 100644 index 0000000..7274887 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta new file mode 100644 index 0000000..d98d377 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 6ace62d30f494c948b71d5594afce11d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd new file mode 100644 index 0000000..eeeea67 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd.meta new file mode 100644 index 0000000..84ed28c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 691475c57a824010be0c6f474caeb7e1 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd new file mode 100644 index 0000000..b69f6a2 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta new file mode 100644 index 0000000..b9e6124 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 64b9fad609434c489c32b1cdf2004a1c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd new file mode 100644 index 0000000..3ce55c4 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd.meta new file mode 100644 index 0000000..f8a90b4 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 92027f7f8cfc4feaa477da0dc38d3d46 +timeCreated: 1472535271 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd new file mode 100644 index 0000000..d7fd5c8 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta new file mode 100644 index 0000000..e5b5aa8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: fa6bd40a216346b783a4cce741d277a5 +timeCreated: 1472535778 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd new file mode 100644 index 0000000..fc7e10b Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd.meta new file mode 100644 index 0000000..8023379 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 9288066c33474b94b6ee5465f4df1cc0 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd new file mode 100644 index 0000000..5522c37 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta new file mode 100644 index 0000000..aaa8b81 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 12736c98af174f91827a26b66d2b01b9 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd new file mode 100644 index 0000000..14d28a2 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta new file mode 100644 index 0000000..e481463 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: c2f7f6a88b4c4f20a53deb72f3d9144c +timeCreated: 1426240649 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd new file mode 100644 index 0000000..c4483db Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta new file mode 100644 index 0000000..d1ec528 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 41b96614b2e6494ba995ddcd252d11ae +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd new file mode 100644 index 0000000..4263bf9 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta new file mode 100644 index 0000000..7cda20b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 066619c9c9c84f89acb1b48c11a7efe2 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd new file mode 100644 index 0000000..a5bed37 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta new file mode 100644 index 0000000..6fabec5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: bb42b2d967d6427983c901a4ffc8ecd9 +timeCreated: 1426240650 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd new file mode 100644 index 0000000..4ef1998 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd.meta new file mode 100644 index 0000000..cf5c764 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 342a0f8aca7f4f0691338912faec0494 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd new file mode 100644 index 0000000..bdeff41 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta new file mode 100644 index 0000000..dab7997 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: e05ace3bd15740cda0bad60d89092a5b +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd new file mode 100644 index 0000000..b00d458 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd.meta new file mode 100644 index 0000000..74931bf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 48d034c499ee4697af9dd6e327110249 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd new file mode 100644 index 0000000..84f0e61 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta new file mode 100644 index 0000000..bbd509d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ed041e68439749a69d0efa0e3d896c2e +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md new file mode 100644 index 0000000..37d0615 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md @@ -0,0 +1,5 @@ +TextMesh Pro copyright © 2014-2019 Unity Technologies ApS + +Licensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). + +Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md.meta new file mode 100644 index 0000000..1df9555 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0d2d0f36e67d4518a07df76235e91f9a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources.meta new file mode 100644 index 0000000..e8a96b8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ec95f4d5b2d1f14e9ff8682562553f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage new file mode 100644 index 0000000..aa27eb5 Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage.meta new file mode 100644 index 0000000..bc49ab3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ce4ff17ca867d2b48b5c8a4181611901 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage new file mode 100644 index 0000000..ea3a62b Binary files /dev/null and b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage differ diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage.meta new file mode 100644 index 0000000..aaf21f7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bc00e25696e4132499f56528d3fed2e3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json new file mode 100644 index 0000000..05c193e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json @@ -0,0 +1,654 @@ +{ + "assetRecords": [ + { + "referencedResource": "Blue to Purple - Vertical.asset", + "target": "guid: 1e643bbd7e13d46418da3774e72bef60", + "replacement": "guid: 479a66fa4b094512a62b0a8e553ad95a" + }, + { + "referencedResource": "Dark to Light Green - Vertical.asset", + "target": "guid: 90c9133b254e2184b8084dea4f392337", + "replacement": "guid: 4c86a3366cd840348ebe8dc438570ee4" + }, + { + "referencedResource": "Light to Dark Green - Vertical.asset", + "target": "guid: 33c745f0979f3984182a138bcc6e57ec", + "replacement": "guid: 5cf8ae092ca54931b443bec5148f3c59" + }, + { + "referencedResource": "Yellow to Orange - Vertical.asset", + "target": "guid: e002cb2a36d9e4a439a062867fa24e1e", + "replacement": "guid: 69a525efa7e6472eab268f6ea605f06e" + }, + { + "referencedResource": "Crate - Surface Shader Scene.mat", + "target": "guid: e177c46c2a091564d88df2c2ca9dcf97", + "replacement": "guid: e6b9b44320f4448d9d5e0ee634259966" + }, + { + "referencedResource": "Ground - Logo Scene.mat", + "target": "guid: 504ae362e57fc464b847f1e9fd0e4035", + "replacement": "guid: c719e38f25a9480abd2480ab621a2949" + }, + { + "referencedResource": "Ground - Surface Shader Scene.mat", + "target": "guid: 9ed9aa864ec2d7f4dad266b9534c6d85", + "replacement": "guid: aadd5a709a48466c887296bb5b1b8110" + }, + { + "referencedResource": "Small Crate_diffuse.mat", + "target": "guid: 92f161029a6d3c54a92d9d283352a135", + "replacement": "guid: 22262639920f43d6be32430e4e58350d" + }, + { + "referencedResource": "Text Popup.prefab", + "target": "guid: c879e892866c8db4f8930b25672233ac", + "replacement": "guid: b06f0e6c1dfa4356ac918da1bb32c603" + }, + { + "referencedResource": "TextMeshPro - Prefab 1.prefab", + "target": "guid: a6a60659abb4d9d4b934feebd3dcc952", + "replacement": "guid: a6e39ced0ea046bcb636c3f0b2e2a745" + }, + { + "referencedResource": "TextMeshPro - Prefab 2.prefab", + "target": "guid: 1b190e3e0ab4c8e4881656b9160c59c2", + "replacement": "guid: fdad9d952ae84cafb74c63f2e694d042" + }, + { + "referencedResource": "Anton SDF.asset", + "target": "guid: f76ef802b8b940c46a31f9027f2b0158", + "replacement": "guid: 8a89fa14b10d46a99122fd4f73fca9a2" + }, + { + "referencedResource": "Anton SDF - Drop Shadow.mat", + "target": "guid: 250a1a103b3b4914c9707e6a423446d6", + "replacement": "guid: 749b9069dc4742c5bfa5c74644049926" + }, + { + "referencedResource": "Anton SDF - Outline.mat", + "target": "guid: e077dc203e948b740859c1c0ca8b9691", + "replacement": "guid: a00013af81304728b2be1f4309ee2433" + }, + { + "referencedResource": "Bangers SDF.asset", + "target": "guid: 808aa8f1ab804104aa7d0c337a6c1481", + "replacement": "guid: 125cb55b44b24c4393181402bc6200e6" + }, + { + "referencedResource": "Bangers SDF - Drop Shadow.mat", + "target": "guid: c26f698d4eee19e4a8b8f42cd299bab5", + "replacement": "guid: f2dcf029949142e28b974630369c8b4e" + }, + { + "referencedResource": "Bangers SDF - Outline.mat", + "target": "guid: db7f2cfbf23d6d54ca4e74a9abd55326", + "replacement": "guid: f629c6e43dba4bf38cb74d8860150664" + }, + { + "referencedResource": "Bangers SDF Glow.mat", + "target": "guid: 7dd7006c58d8a3148a73aa211d8c13d0", + "replacement": "guid: d75b8f41e959450c84ac6e967084d3e1" + }, + { + "referencedResource": "Bangers SDF Logo.mat", + "target": "guid: 4fb51aa7001a2244395ddf6a15d37389", + "replacement": "guid: f4e195ac1e204eff960149d1cb34e18c" + }, + { + "referencedResource": "Electronic Highway Sign SDF.asset", + "target": "guid: 163292f6f226d954593d45b079f8aae0", + "replacement": "guid: dc36b3fdc14f47ebb36fd484a67e268a" + }, + { + "referencedResource": "LiberationSans SDF - Drop Shadow.mat", + "target": "guid: 33db60c37b63f08448ded4b385e74e38", + "replacement": "guid: e73a58f6e2794ae7b1b7e50b7fb811b0" + }, + { + "referencedResource": "LiberationSans SDF - Metalic Green.mat", + "target": "guid: 4f9843c79516ed1468b9b5a4f32e67e3", + "replacement": "guid: 8b29aaa3eec7468097ff07adfcf29ac9" + }, + { + "referencedResource": "LiberationSans SDF - Outline.mat", + "target": "guid: 83a1b0fe6c3dbac44b66f09c82e1d509", + "replacement": "guid: 79459efec17a4d00a321bdcc27bbc385" + }, + { + "referencedResource": "LiberationSans SDF - Overlay.mat", + "target": "guid: 55eb086ae18c76e4bb6cc7106d0dd6e2", + "replacement": "guid: 9ad269c99dcf42b7aedefd83dd5a7b9d" + }, + { + "referencedResource": "LiberationSans SDF - Soft Mask.mat", + "target": "guid: 74e06d99c1657fc4abd33f20685ea9ff", + "replacement": "guid: 42df1c7856584b6b8db9a509b6b10074" + }, + { + "referencedResource": "Oswald Bold SDF.asset", + "target": "guid: 09641b029dfa78843902b548a9de7553", + "replacement": "guid: 0161d805a3764c089bef00bfe00793f5" + }, + { + "referencedResource": "Roboto-Bold SDF.asset", + "target": "guid: d62a573c923f5cb47b8ff65261033b90", + "replacement": "guid: 5302535af1044152a457ed104f1f4b91" + }, + { + "referencedResource": "Roboto-Bold SDF - Drop Shadow.mat", + "target": "guid: 102e7c5c5e3b1f3468518cb166967d77", + "replacement": "guid: b246c4190f4e46ec9352fe15a7b09ce0" + }, + { + "referencedResource": "Roboto-Bold SDF - Surface.mat", + "target": "guid: e2da38ead8f8238449c54a1ef49e080f", + "replacement": "guid: e6b276ec991f467aa14ef1f3cc665993" + }, + { + "referencedResource": "DropCap Numbers.asset", + "target": "guid: c4fd2a959a50b584b92dedfefec1ffda", + "replacement": "guid: 14aa93acbb234d16aaef0e8b46814db6" + }, + { + "referencedResource": "Benchmark01.cs", + "target": "guid: c5fb1b5c24460f745be29cc0eb06a58c", + "replacement": "guid: f970ea55f9f84bf79b05dab180b8c125" + }, + { + "referencedResource": "Benchmark01_UGUI.cs", + "target": "guid: 5e6abf300e36c0a4eb43969c3f2172f8", + "replacement": "guid: 8ef7be1c625941f7ba8ed7cc71718c0d" + }, + { + "referencedResource": "Benchmark02.cs", + "target": "guid: 3467f4170568a484d8b57e2051a27363", + "replacement": "guid: e8538afcddc14efbb5d9e94b7ae50197" + }, + { + "referencedResource": "Benchmark03.cs", + "target": "guid: e6e9d20624a23da4c8b2b6fb7608bb9a", + "replacement": "guid: a73109742c8d47ac822895a473300c29" + }, + { + "referencedResource": "Benchmark04.cs", + "target": "guid: 481dd67bdedc3104ea2156ed49f3acd5", + "replacement": "guid: dc20866c0d5e413ab7559440e15333ae" + }, + { + "referencedResource": "CameraController.cs", + "target": "guid: a9f0e07aefca0cc459134ff9df622278", + "replacement": "guid: 2d687537154440a3913a9a3c7977978c" + }, + { + "referencedResource": "ChatController.cs", + "target": "guid: eba5a4db2591a5844aea5f6f3ad8548e", + "replacement": "guid: 53d91f98a2664f5cb9af11de72ac54ec" + }, + { + "referencedResource": "EnvMapAnimator.cs", + "target": "guid: 7e69f3f28c520ce4d9ab9964b2895b1a", + "replacement": "guid: a4b6f99e8bc54541bbd149b014ff441c" + }, + { + "referencedResource": "ObjectSpin.cs", + "target": "guid: 5e7872ff51989434dabf7807265ada3c", + "replacement": "guid: 4f19c7f94c794c5097d8bd11e39c750d" + }, + { + "referencedResource": "ShaderPropAnimator.cs", + "target": "guid: c56cf968fb6a5b6488e709242718845d", + "replacement": "guid: 2787a46a4dc848c1b4b7b9307b614bfd" + }, + { + "referencedResource": "SimpleScript.cs", + "target": "guid: c64808ff5137c9044a583750e5b0468a", + "replacement": "guid: 9eff140b25d64601aabc6ba32245d099" + }, + { + "referencedResource": "SkewTextExample.cs", + "target": "guid: 48d40dfeb33b717488f55ddbf676643a", + "replacement": "guid: d412675cfb3441efa3bf8dcd9b7624dc" + }, + { + "referencedResource": "TeleType.cs", + "target": "guid: 9094c5c777af3f14489e8947748e86e6", + "replacement": "guid: e32c266ee6204b21a427753cb0694c81" + }, + { + "referencedResource": "TextConsoleSimulator.cs", + "target": "guid: 45757dcc8f119454dac6365e8fd15e8b", + "replacement": "guid: 43bcd35a1c0c40ccb6d472893fe2093f" + }, + { + "referencedResource": "TextMeshProFloatingText.cs", + "target": "guid: dd0e4b969aa70504382a89d2f208ae6c", + "replacement": "guid: a4d4c76e63944cba8c7d00f56334b98c" + }, + { + "referencedResource": "TextMeshSpawner.cs", + "target": "guid: 385939aed18e82d41894437798c30ed8", + "replacement": "guid: 76c11bbcfddf44e0ba17d6c2751c8d84" + }, + { + "referencedResource": "TMP_ExampleScript_01.cs", + "target": "guid: 36bafabb5572c6347923b971425ab3be", + "replacement": "guid: 6f2c5b59b6874405865e2616e4ec276a" + }, + { + "referencedResource": "TMP_FrameRateCounter.cs", + "target": "guid: c0357609254b68d4881cab18f04dd4dc", + "replacement": "guid: 686ec78b56aa445795335fbadafcfaa4" + }, + { + "referencedResource": "TMP_TextEventCheck.cs", + "target": "guid: ba181bda76b7f6047ba2188e94bf0894", + "replacement": "guid: d736ce056cf444ca96e424f4d9c42b76" + }, + { + "referencedResource": "TMP_TextEventHandler.cs", + "target": "guid: 48a2fdbd95acd794caf78a85a0b6926a", + "replacement": "guid: 1312ae25639a4bae8e25ae223209cc50" + }, + { + "referencedResource": "TMP_TextInfoDebugTool.cs", + "target": "guid: 5eeee4467ee5b6a4884a1ec94812d93e", + "replacement": "guid: 21256c5b62f346f18640dad779911e20" + }, + { + "referencedResource": "TMP_TextSelector_A.cs", + "target": "guid: 68baf2864c88f4a43a50f16709de8717", + "replacement": "guid: 103e0a6a1d404693b9fb1a5173e0e979" + }, + { + "referencedResource": "TMP_TextSelector_B.cs", + "target": "guid: f499ff45b9a3d0840a0df48d01b2877b", + "replacement": "guid: a05dcd8be7ec4ccbb35c26219884aa37" + }, + { + "referencedResource": "TMP_UiFrameRateCounter.cs", + "target": "guid: dc33b7a34d20d5e4e8d54b6867ce81e3", + "replacement": "guid: 24b0dc2d1d494adbbec1f4db26b4cf83" + }, + { + "referencedResource": "TMPro_InstructionOverlay.cs", + "target": "guid: 53b866620ba77504eaf52cab7dbd95c9", + "replacement": "guid: c3c1afeda5e545e0b19add5373896d2e" + }, + { + "referencedResource": "VertexColorCycler.cs", + "target": "guid: c8d54cdd5913d4e4bb7b655d7d16835b", + "replacement": "guid: 91b8ba3d52e041fab2d0e0f169855539" + }, + { + "referencedResource": "VertexJitter.cs", + "target": "guid: e4769cb37968ea948a763a9a89f9e583", + "replacement": "guid: 2ed57967c52645d390a89dcf8f61ba73" + }, + { + "referencedResource": "VertexShakeA.cs", + "target": "guid: eaa12d191e718c945ac55da73fa469db", + "replacement": "guid: f7cfa58e417a46ea8889989684c2522e" + }, + { + "referencedResource": "VertexShakeB.cs", + "target": "guid: 32c83a5d3ba42b84aa26386eac47566b", + "replacement": "guid: e4e0d9ccee5f4950be8979268c9014e0" + }, + { + "referencedResource": "VertexZoom.cs", + "target": "guid: 5305493000edc7d4ea4302757dc19a99", + "replacement": "guid: 52ec835d14bd486f900952b77698b7eb" + }, + { + "referencedResource": "WarpTextExample.cs", + "target": "guid: f3eef864a10f51045a7530e2afe7c179", + "replacement": "guid: 790744c462254b7ba8038e6ed28b3db2" + }, + { + "referencedResource": "DropCap Numbers.psd", + "target": "guid: 28b41fef228d6814f90e541deaf9f262", + "replacement": "guid: fd09957580ac4326916010f1f260975b" + }, + { + "referencedResource": "Brushed Metal 3.jpg", + "target": "guid: c30270e41dccf9441ab56d94261bdcfa", + "replacement": "guid: f88677df267a41d6be1e7a6133e7d227" + }, + { + "referencedResource": "Engraved Wall.jpg", + "target": "guid: 93d6f74f2ef358e41989d4152b195f88", + "replacement": "guid: e0f91e6569da4934a48d85bf8d3063f0" + }, + { + "referencedResource": "Engraved Wall Normal.jpg", + "target": "guid: 1edd0950293e8664094053a041548c23", + "replacement": "guid: 20f91c93e7fb490f9496609c52ef3904" + }, + { + "referencedResource": "Floor Cement.jpg", + "target": "guid: ac5a0a5373b36e049bb7f98f88dbc244", + "replacement": "guid: 283f897e4925411ebbaa758b4cb13fc2" + }, + { + "referencedResource": "Floor Tiles 1 - diffuse.jpg", + "target": "guid: 7bbfb8818476e4641ba3e75f5225eb69", + "replacement": "guid: 85ac55597b97403c82fc6601a93cf241" + }, + { + "referencedResource": "Floor Tiles 1 - normal.jpg", + "target": "guid: e00d5a9a0944134448432ccacf221b95", + "replacement": "guid: c45cd05946364f32aba704f0853a975b" + }, + { + "referencedResource": "Fruit Jelly (B&W).jpg", + "target": "guid: 74d8c208a0193e14ca6916bea88a2c52", + "replacement": "guid: 1cdc5b506b1a4a33a53c30669ced1f51" + }, + { + "referencedResource": "Gradient Diagonal (Color).jpg", + "target": "guid: 2421a4955e71725448211e6bfbc7d7fb", + "replacement": "guid: 2ce5c55e85304b819a1826ecbc839aa5" + }, + { + "referencedResource": "Gradient Horizontal (Color).jpg", + "target": "guid: 0bbb43aff4f7811419ffceb1b16cf3d6", + "replacement": "guid: 6eb184de103d4b3f812b38561065192f" + }, + { + "referencedResource": "Gradient Vertical (Color).jpg", + "target": "guid: 3359915af07779e4e9a966df9eed764f", + "replacement": "guid: 03d0538de6e24c0f819bfc9ce084dfa9" + }, + { + "referencedResource": "Mask Zig-n-Zag.psd", + "target": "guid: 04eb87e72b3c1c648ba47a869ee00505", + "replacement": "guid: bb8dfcd263ad4eb383a33d74a720be6f" + }, + { + "referencedResource": "Sand Normal Map.jpg", + "target": "guid: 89e1b1c005d29cf4598ea861deb35a80", + "replacement": "guid: 8b8c8a10edf94ddc8cc4cc4fcd5696a9" + }, + { + "referencedResource": "Small Crate_diffuse.jpg", + "target": "guid: 64734c9bc6df32149a0c9cb0b18693e1", + "replacement": "guid: 602cb87b6a29443b8636370ea0751574" + }, + { + "referencedResource": "Small Crate_normal.jpg", + "target": "guid: 81b50d9cb6f3104448ec54c00a80101a", + "replacement": "guid: 8878a782f4334ecbbcf683b3ac780966" + }, + { + "referencedResource": "Stainless 03.png", + "target": "guid: 40d7f27f614cc1043a1f7e19074f461c", + "replacement": "guid: 83cb272f9ee046f6ab6636ca38af8db4" + }, + { + "referencedResource": "Text Overflow - Linked Text Image 1.png", + "target": "guid: 1fd8c568b1fcdbe43be65c1619cf3293", + "replacement": "guid: 4ccf43d26c4748c792174516f4a8fcef" + }, + { + "referencedResource": "Text Overflow - Linked Text UI Screenshot.png", + "target": "guid: 7983d2ec0427c114a916ae3c4769dc10", + "replacement": "guid: c76d18757a194d618355f05f815cb0a1" + }, + { + "referencedResource": "Wipe Pattern - Circle.psd", + "target": "guid: 6f5e9497d22a7a84193ec825e2eb41ac", + "replacement": "guid: 10c49fcd9c64421db7c0133e61e55f97" + }, + { + "referencedResource": "Wipe Pattern - Diagonal.psd", + "target": "guid: 8ee4d366b96418044aa9f94b3e2de645", + "replacement": "guid: ed5290d8df18488780e2996b9b882f01" + }, + { + "referencedResource": "Wipe Pattern - Radial Double.psd", + "target": "guid: 3e0e22da7c9570b498205179ef58ef38", + "replacement": "guid: 7631f4eff8f74ed38eb3eb9db17134e1" + }, + { + "referencedResource": "Wipe Pattern - Radial Quad.psd", + "target": "guid: 05ffd580f33f74644a6025ec196860af", + "replacement": "guid: 2b5e9ae96c5644d8bae932f8b4ca68a2" + }, + { + "referencedResource": "LiberationSans SDF.asset", + "target": "guid: 715b80e429c437e40867928a4e1fc975", + "replacement": "guid: 8f586378b4e144a9851e7b34d9b748ee" + }, + { + "referencedResource": "LineBreaking Following Characters.txt", + "target": "guid: 312ba5b9e90627940866e19549a788cf", + "replacement": "guid: fade42e8bc714b018fac513c043d323b" + }, + { + "referencedResource": "LineBreaking Leading Characters.txt", + "target": "guid: 8d713940fcbede142ae4a33ea0062b33", + "replacement": "guid: d82c1b31c7e74239bff1220585707d2b" + }, + { + "referencedResource": "TMP_Bitmap.shader", + "target": "guid: edfcf888cd11d9245b91d2883049a57e", + "replacement": "guid: 128e987d567d4e2c824d754223b3f3b0" + }, + { + "referencedResource": "TMP_Bitmap-Mobile.shader", + "target": "guid: d1cf17907700cb647aa3ea423ba38f2e", + "replacement": "guid: 1e3b057af24249748ff873be7fafee47" + }, + { + "referencedResource": "TMP_SDF.shader", + "target": "guid: dca26082f9cb439469295791d9f76fe5", + "replacement": "guid: 68e6db2ebdc24f95958faec2be5558d6" + }, + { + "referencedResource": "TMP_SDF Overlay.shader", + "target": "guid: 4a7755d6b5b67874f89c85f56f95fe97", + "replacement": "guid: dd89cf5b9246416f84610a006f916af7" + }, + { + "referencedResource": "TMP_SDF-Mobile.shader", + "target": "guid: cafd18099dfc0114896e0a8b277b81b6", + "replacement": "guid: fe393ace9b354375a9cb14cdbbc28be4" + }, + { + "referencedResource": "TMP_SDF-Mobile Masking.shader", + "target": "guid: afc255f7c2be52e41973a3d10a2e632d", + "replacement": "guid: bc1ede39bf3643ee8e493720e4259791" + }, + { + "referencedResource": "TMP_SDF-Mobile Overlay.shader", + "target": "guid: 9ecb3fe313cb5f7478141eba4a2d54ed", + "replacement": "guid: a02a7d8c237544f1962732b55a9aebf1" + }, + { + "referencedResource": "TMP_SDF-Surface.shader", + "target": "guid: 8e6b9842dbb1a5a4887378afab854e63", + "replacement": "guid: f7ada0af4f174f0694ca6a487b8f543d" + }, + { + "referencedResource": "TMP_SDF-Surface-Mobile.shader", + "target": "guid: 3c2ea7753c1425145a74d106ec1cd852", + "replacement": "guid: 85187c2149c549c5b33f0cdb02836b17" + }, + { + "referencedResource": "TMP_Sprite.shader", + "target": "guid: 3a1c68c8292caf046bd21158886c5e40", + "replacement": "guid: cf81c85f95fe47e1a27f6ae460cf182c" + }, + { + "referencedResource": "Default Sprite Asset.asset", + "target": "guid: 273ca6c80b4b5d746b5e548f532bffd8", + "replacement": "guid: fbef3c704dce48f08a44612d6c856c8d" + }, + { + "referencedResource": "EmojiOne.asset", + "target": "guid: 9a952e2781ef26940ae089f1053ef4ef", + "replacement": "guid: c41005c129ba4d66911b75229fd70b45" + }, + { + "referencedResource": "TMP Default Style Sheet.asset", + "target": "guid: 54d1085f9a2fdea4587fcfc7dddcd4bc", + "replacement": "guid: f952c082cb03451daed3ee968ac6c63e" + }, + { + "referencedResource": "TMP Settings.asset", + "target": "guid: 69ed5bac41eebaa4c97e9d2a4168c54f", + "replacement": "guid: 3f5b5dff67a942289a9defa416b206f3" + }, + { + "referencedResource": "TextContainer.cs", + "target": "guid: 3b34fc186f40e8043b977d4fa70db8c5", + "replacement": "guid: 32d40088a6124c578ad6b428df586e2e" + }, + { + "referencedResource": "TextContainer.cs", + "target": "fileID: 311004786, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 32d40088a6124c578ad6b428df586e2e" + }, + { + "referencedResource": "TextMeshPro.cs", + "target": "guid: 1a1578b9753d2604f98d608cb4239e2f", + "replacement": "guid: 9541d86e2fd84c1d9990edf0852d74ab" + }, + { + "referencedResource": "TextMeshPro.cs", + "target": "fileID: -806885394, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab" + }, + { + "referencedResource": "TextMeshProUGUI.cs", + "target": "guid: 496f2e385b0c62542b5c739ccfafd8da", + "replacement": "guid: f4688fdb7df04437aeb418b961361dc5" + }, + { + "referencedResource": "TextMeshProUGUI.cs", + "target": "fileID: 1453722849, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5" + }, + { + "referencedResource": "TMP_Asset.cs", + "target": "guid: e2c4405608b405a4680436e183e53c45", + "replacement": "guid: 3bda1886f58f4e0ab1139400b160c3ee" + }, + { + "referencedResource": "TMP_Asset.cs", + "target": "fileID: -659140726, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 3bda1886f58f4e0ab1139400b160c3ee" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "guid: e90e18dd4a044ff4394833216e6bf4d2", + "replacement": "guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "fileID: 2108210716, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_Dropdown.cs", + "target": "guid: 44cb1d34ddab9d449a05fc3747876be1", + "replacement": "guid: 7b743370ac3e4ec2a1668f5455a8ef8a" + }, + { + "referencedResource": "TMP_Dropdown.cs", + "target": "fileID: 1148083418, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a" + }, + { + "referencedResource": "TMP_FontAsset.cs", + "target": "guid: 74dfce233ddb29b4294c3e23c1d3650d", + "replacement": "guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "TMP_FontAsset.cs", + "target": "fileID: -667331979, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "TMP_InputField.cs", + "target": "guid: 7b85855a3deaa2e44ac6741a6bbc85f6", + "replacement": "guid: 2da0c512f12947e489f739169773d7ca" + }, + { + "referencedResource": "TMP_InputField.cs", + "target": "fileID: -1620774994, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "guid: aafc3c7b9e915d64e8ec3d2c88b3a231", + "replacement": "guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "fileID: -395462249, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "guid: 90940d439ca0ef746af0b48419b92d2e", + "replacement": "guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "fileID: 2019389346, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "guid: 13259b4ce497b194eb52a33d8eda0bdc", + "replacement": "guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "fileID: -1936749209, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP_SubMesh.cs", + "target": "guid: bd950677b2d06c74494b1c1118584fff", + "replacement": "guid: 07994bfe8b0e4adb97d706de5dea48d5" + }, + { + "referencedResource": "TMP_SubMesh.cs", + "target": "fileID: 1330537494, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 07994bfe8b0e4adb97d706de5dea48d5" + }, + { + "referencedResource": "TMP_SubMeshUI.cs", + "target": "guid: a5378e1f14d974d419f811d6b0861f20", + "replacement": "guid: 058cba836c1846c3aa1c5fd2e28aea77" + }, + { + "referencedResource": "TMP_SubMeshUI.cs", + "target": "fileID: 1908110080, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 058cba836c1846c3aa1c5fd2e28aea77" + }, + { + "referencedResource": "TMP_Text.cs", + "target": "guid: 9ec8dc9c3fa2e5d41b939b5888d2f1e8", + "replacement": "guid: 5143f58107604835ab1a5efa2d8818fd" + }, + { + "referencedResource": "TMP_Text.cs", + "target": "fileID: -1385168320, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 5143f58107604835ab1a5efa2d8818fd" + }, + { + "referencedResource": "Default Sprite Asset.png", + "target": "guid: 5b32c2d36abe44540bed74c1f787033b", + "replacement": "guid: a0fc465d6cf04254a2938578735e2383" + }, + { + "referencedResource": "EmojiOne.png", + "target": "guid: 6ec706981a919c3489f0b061a40054e2", + "replacement": "guid: dffef66376be4fa480fb02b19edbe903" + } + ] +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json.meta new file mode 100644 index 0000000..a7a2790 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 05f5bfd584002f948982a1498890f9a9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json new file mode 100644 index 0000000..f07aa23 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json @@ -0,0 +1,184 @@ +{ + "assetRecords": [ + { + "referencedResource": "TMP_FontAsset.cs", + "target": "guid: 74dfce233ddb29b4294c3e23c1d3650d", + "replacement": "guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "TMP_FontAsset.cs", + "target": "fileID: -667331979, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04" + }, + { + "referencedResource": "Anton SDF.asset", + "target": "guid: f76ef802b8b940c46a31f9027f2b0158", + "replacement": "guid: 8a89fa14b10d46a99122fd4f73fca9a2" + }, + { + "referencedResource": "Bangers SDF.asset", + "target": "guid: 808aa8f1ab804104aa7d0c337a6c1481", + "replacement": "guid: 125cb55b44b24c4393181402bc6200e6" + }, + { + "referencedResource": "Electronic Highway Sign SDF.asset", + "target": "guid: 163292f6f226d954593d45b079f8aae0", + "replacement": "guid: dc36b3fdc14f47ebb36fd484a67e268a" + }, + { + "referencedResource": "Oswald Bold SDF.asset", + "target": "guid: 09641b029dfa78843902b548a9de7553", + "replacement": "guid: 0161d805a3764c089bef00bfe00793f5" + }, + { + "referencedResource": "Roboto-Bold SDF.asset", + "target": "guid: d62a573c923f5cb47b8ff65261033b90", + "replacement": "guid: 5302535af1044152a457ed104f1f4b91" + }, + { + "referencedResource": "LiberationSans SDF.asset", + "target": "guid: 715b80e429c437e40867928a4e1fc975", + "replacement": "guid: 8f586378b4e144a9851e7b34d9b748ee" + }, + { + "referencedResource": "TMP_Bitmap.shader", + "target": "guid: edfcf888cd11d9245b91d2883049a57e", + "replacement": "guid: 128e987d567d4e2c824d754223b3f3b0" + }, + { + "referencedResource": "TMP_Bitmap-Mobile.shader", + "target": "guid: d1cf17907700cb647aa3ea423ba38f2e", + "replacement": "guid: 1e3b057af24249748ff873be7fafee47" + }, + { + "referencedResource": "TMP_SDF.shader", + "target": "guid: dca26082f9cb439469295791d9f76fe5", + "replacement": "guid: 68e6db2ebdc24f95958faec2be5558d6" + }, + { + "referencedResource": "TMP_SDF Overlay.shader", + "target": "guid: 4a7755d6b5b67874f89c85f56f95fe97", + "replacement": "guid: dd89cf5b9246416f84610a006f916af7" + }, + { + "referencedResource": "TMP_SDF-Mobile.shader", + "target": "guid: cafd18099dfc0114896e0a8b277b81b6", + "replacement": "guid: fe393ace9b354375a9cb14cdbbc28be4" + }, + { + "referencedResource": "TMP_SDF-Mobile Masking.shader", + "target": "guid: afc255f7c2be52e41973a3d10a2e632d", + "replacement": "guid: bc1ede39bf3643ee8e493720e4259791" + }, + { + "referencedResource": "TMP_SDF-Mobile Overlay.shader", + "target": "guid: 9ecb3fe313cb5f7478141eba4a2d54ed", + "replacement": "guid: a02a7d8c237544f1962732b55a9aebf1" + }, + { + "referencedResource": "TMP_SDF-Surface.shader", + "target": "guid: 8e6b9842dbb1a5a4887378afab854e63", + "replacement": "guid: f7ada0af4f174f0694ca6a487b8f543d" + }, + { + "referencedResource": "TMP_SDF-Surface-Mobile.shader", + "target": "guid: 3c2ea7753c1425145a74d106ec1cd852", + "replacement": "guid: 85187c2149c549c5b33f0cdb02836b17" + }, + { + "referencedResource": "TMP_Sprite.shader", + "target": "guid: 3a1c68c8292caf046bd21158886c5e40", + "replacement": "guid: cf81c85f95fe47e1a27f6ae460cf182c" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "guid: e90e18dd4a044ff4394833216e6bf4d2", + "replacement": "guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_ColorGradient.cs", + "target": "fileID: 2108210716, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "guid: aafc3c7b9e915d64e8ec3d2c88b3a231", + "replacement": "guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP_Settings.cs", + "target": "fileID: -395462249, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391" + }, + { + "referencedResource": "TMP Settings.asset", + "target": "guid: 69ed5bac41eebaa4c97e9d2a4168c54f", + "replacement": "guid: 3f5b5dff67a942289a9defa416b206f3" + }, + { + "referencedResource": "LineBreaking Following Characters.txt", + "target": "guid: 312ba5b9e90627940866e19549a788cf", + "replacement": "guid: fade42e8bc714b018fac513c043d323b" + }, + { + "referencedResource": "LineBreaking Leading Characters.txt", + "target": "guid: 8d713940fcbede142ae4a33ea0062b33", + "replacement": "guid: d82c1b31c7e74239bff1220585707d2b" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "guid: 13259b4ce497b194eb52a33d8eda0bdc", + "replacement": "guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP_StyleSheet.cs", + "target": "fileID: -1936749209, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410" + }, + { + "referencedResource": "TMP Default Style Sheet.asset", + "target": "guid: 54d1085f9a2fdea4587fcfc7dddcd4bc", + "replacement": "guid: f952c082cb03451daed3ee968ac6c63e" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "guid: 90940d439ca0ef746af0b48419b92d2e", + "replacement": "guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "TMP_SpriteAsset.cs", + "target": "fileID: 2019389346, guid: 89f0137620f6af44b9ba852b4190e64e", + "replacement": "fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281" + }, + { + "referencedResource": "Default Sprite Asset.asset", + "target": "guid: 273ca6c80b4b5d746b5e548f532bffd8", + "replacement": "guid: fbef3c704dce48f08a44612d6c856c8d" + }, + { + "referencedResource": "Default Sprite Asset.png", + "target": "guid: 5b32c2d36abe44540bed74c1f787033b", + "replacement": "guid: a0fc465d6cf04254a2938578735e2383" + }, + { + "referencedResource": "EmojiOne.asset", + "target": "guid: 9a952e2781ef26940ae089f1053ef4ef", + "replacement": "guid: c41005c129ba4d66911b75229fd70b45" + }, + { + "referencedResource": "EmojiOne.png", + "target": "guid: 6ec706981a919c3489f0b061a40054e2", + "replacement": "guid: dffef66376be4fa480fb02b19edbe903" + }, + { + "referencedResource": "DropCap Numbers.asset", + "target": "guid: c4fd2a959a50b584b92dedfefec1ffda", + "replacement": "guid: 14aa93acbb234d16aaef0e8b46814db6" + }, + { + "referencedResource": "DropCap Numbers.psd", + "target": "guid: 28b41fef228d6814f90e541deaf9f262", + "replacement": "guid: fd09957580ac4326916010f1f260975b" + } + ] +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json.meta new file mode 100644 index 0000000..f534ac1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0e0afa652c0031c48896a97b424d027b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts.meta new file mode 100644 index 0000000..3c2e4cf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6a1d1e3d2384453a7371b4a07a41ca4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor.meta new file mode 100644 index 0000000..af509a3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5d6c28ed7b94775be9e2560f300247c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs new file mode 100644 index 0000000..2b7dc85 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs @@ -0,0 +1,60 @@ +using UnityEditorInternal; +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + [CustomPropertyDrawer(typeof(TMP_Dropdown.OptionDataList), true)] + class DropdownOptionListDrawer : PropertyDrawer + { + private ReorderableList m_ReorderableList; + + private void Init(SerializedProperty property) + { + if (m_ReorderableList != null) + return; + + SerializedProperty array = property.FindPropertyRelative("m_Options"); + + m_ReorderableList = new ReorderableList(property.serializedObject, array); + m_ReorderableList.drawElementCallback = DrawOptionData; + m_ReorderableList.drawHeaderCallback = DrawHeader; + m_ReorderableList.elementHeight += 16; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + Init(property); + + m_ReorderableList.DoList(position); + } + + private void DrawHeader(Rect rect) + { + GUI.Label(rect, "Options"); + } + + private void DrawOptionData(Rect rect, int index, bool isActive, bool isFocused) + { + SerializedProperty itemData = m_ReorderableList.serializedProperty.GetArrayElementAtIndex(index); + SerializedProperty itemText = itemData.FindPropertyRelative("m_Text"); + SerializedProperty itemImage = itemData.FindPropertyRelative("m_Image"); + + RectOffset offset = new RectOffset(0, 0, -1, -3); + rect = offset.Add(rect); + rect.height = EditorGUIUtility.singleLineHeight; + + EditorGUI.PropertyField(rect, itemText, GUIContent.none); + rect.y += EditorGUIUtility.singleLineHeight; + EditorGUI.PropertyField(rect, itemImage, GUIContent.none); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + Init(property); + + return m_ReorderableList.GetHeight(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta new file mode 100644 index 0000000..f7f4c56 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9545c9eb3bf94265810463794fec8334 +timeCreated: 1464818008 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs new file mode 100644 index 0000000..0936dc7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs @@ -0,0 +1,61 @@ +/* +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_Glyph))] + public class GlyphInfoDrawer : PropertyDrawer + { + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_id = property.FindPropertyRelative("id"); + SerializedProperty prop_x = property.FindPropertyRelative("x"); + SerializedProperty prop_y = property.FindPropertyRelative("y"); + SerializedProperty prop_width = property.FindPropertyRelative("width"); + SerializedProperty prop_height = property.FindPropertyRelative("height"); + SerializedProperty prop_xOffset = property.FindPropertyRelative("xOffset"); + SerializedProperty prop_yOffset = property.FindPropertyRelative("yOffset"); + SerializedProperty prop_xAdvance = property.FindPropertyRelative("xAdvance"); + SerializedProperty prop_scale = property.FindPropertyRelative("scale"); + + + // We get Rect since a valid position may not be provided by the caller. + Rect rect = GUILayoutUtility.GetRect(position.width, 48); + rect.y -= 15; + + //GUI.enabled = false; + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 45f; + + bool prevGuiState = GUI.enabled; + GUI.enabled = true; + EditorGUI.LabelField(new Rect(rect.x + 5f, rect.y, 80f, 18), new GUIContent("Ascii: " + prop_id.intValue + ""), TMP_UIStyleManager.label); + EditorGUI.LabelField(new Rect(rect.x + 90f, rect.y, 80f, 18), new GUIContent("Hex: " + prop_id.intValue.ToString("X") + ""), TMP_UIStyleManager.label); + EditorGUI.LabelField(new Rect(rect.x + 170f, rect.y, 80, 18), "Char: [ " + (char)prop_id.intValue + " ]", TMP_UIStyleManager.label); + GUI.enabled = prevGuiState; + + EditorGUIUtility.labelWidth = 35f; + EditorGUIUtility.fieldWidth = 10f; + + float width = (rect.width - 5f) / 4; + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 0, rect.y + 22, width - 5f, 18), prop_x, new GUIContent("X:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 1, rect.y + 22, width - 5f, 18), prop_y, new GUIContent("Y:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 2, rect.y + 22, width - 5f, 18), prop_width, new GUIContent("W:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 3, rect.y + 22, width - 5f, 18), prop_height, new GUIContent("H:")); + + //GUI.enabled = true; + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 0, rect.y + 44, width - 5f, 18), prop_xOffset, new GUIContent("OX:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 1, rect.y + 44, width - 5f, 18), prop_yOffset, new GUIContent("OY:")); + //GUI.enabled = true; + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 2, rect.y + 44, width - 5f, 18), prop_xAdvance, new GUIContent("ADV:")); + EditorGUI.PropertyField(new Rect(rect.x + 5f + width * 3, rect.y + 44, width - 5f, 18), prop_scale, new GUIContent("SF:")); + } + + } +} +*/ \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs.meta new file mode 100644 index 0000000..10ed151 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 900f1a451c764dc3bdcc0de815a15935 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs new file mode 100644 index 0000000..bcd25a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(GlyphMetrics))] + public class GlyphMetricsPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_Width = property.FindPropertyRelative("m_Width"); + SerializedProperty prop_Height = property.FindPropertyRelative("m_Height"); + SerializedProperty prop_HoriBearingX = property.FindPropertyRelative("m_HorizontalBearingX"); + SerializedProperty prop_HoriBearingY = property.FindPropertyRelative("m_HorizontalBearingY"); + SerializedProperty prop_HoriAdvance = property.FindPropertyRelative("m_HorizontalAdvance"); + + // We get Rect since a valid position may not be provided by the caller. + Rect rect = new Rect(position.x, position.y, position.width, 49); + + EditorGUI.LabelField(new Rect(rect.x, rect.y - 2.5f, rect.width, 18), new GUIContent("Glyph Metrics")); + + EditorGUIUtility.labelWidth = 50f; + EditorGUIUtility.fieldWidth = 15f; + + //GUI.enabled = false; + float width = (rect.width - 75f) / 2; + EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 20, width - 5f, 18), prop_Width, new GUIContent("W:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 20, width - 5f, 18), prop_Height, new GUIContent("H:")); + + //GUI.enabled = true; + + width = (rect.width - 75f) / 3; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 40, width - 5f, 18), prop_HoriBearingX, new GUIContent("BX:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 40, width - 5f, 18), prop_HoriBearingY, new GUIContent("BY:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 2, rect.y + 40, width - 5f, 18), prop_HoriAdvance, new GUIContent("AD:")); + if (EditorGUI.EndChangeCheck()) + { + + } + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 65f; + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta new file mode 100644 index 0000000..d91f579 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3882522a08b6f5459b4dea6f8791278 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs new file mode 100644 index 0000000..c9be74e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs @@ -0,0 +1,44 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(GlyphRect))] + public class GlyphRectPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + //EditorGUI.BeginProperty(position, label, property); + + SerializedProperty prop_X = property.FindPropertyRelative("m_X"); + SerializedProperty prop_Y = property.FindPropertyRelative("m_Y"); + SerializedProperty prop_Width = property.FindPropertyRelative("m_Width"); + SerializedProperty prop_Height = property.FindPropertyRelative("m_Height"); + + // We get Rect since a valid position may not be provided by the caller. + Rect rect = new Rect(position.x, position.y, position.width, 49); + EditorGUI.LabelField(new Rect(rect.x, rect.y - 2.5f, rect.width, 18), new GUIContent("Glyph Rect")); + + EditorGUIUtility.labelWidth = 50f; + EditorGUIUtility.fieldWidth = 20f; + + //GUI.enabled = false; + float width = (rect.width - 75f) / 4; + EditorGUI.PropertyField(new Rect(rect.x + width * 0, rect.y + 20, width - 5f, 18), prop_X, new GUIContent("X:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 1, rect.y + 20, width - 5f, 18), prop_Y, new GUIContent("Y:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 2, rect.y + 20, width - 5f, 18), prop_Width, new GUIContent("W:")); + EditorGUI.PropertyField(new Rect(rect.x + width * 3, rect.y + 20, width - 5f, 18), prop_Height, new GUIContent("H:")); + + //EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 45f; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta new file mode 100644 index 0000000..9323279 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bc2b083b068f3546a9509c805e0541c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs new file mode 100644 index 0000000..5896c33 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs @@ -0,0 +1,1336 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; + + +namespace TMPro.EditorUtilities +{ + public abstract class TMP_BaseEditorPanel : Editor + { + //Labels and Tooltips + static readonly GUIContent k_RtlToggleLabel = new GUIContent("Enable RTL Editor", "Reverses text direction and allows right to left editing."); + //static readonly GUIContent k_MainSettingsLabel = new GUIContent("Main Settings"); + static readonly GUIContent k_FontAssetLabel = new GUIContent("Font Asset", "The Font Asset containing the glyphs that can be rendered for this text."); + static readonly GUIContent k_MaterialPresetLabel = new GUIContent("Material Preset", "The material used for rendering. Only materials created from the Font Asset can be used."); + static readonly GUIContent k_StyleLabel = new GUIContent("Text Style", "The style from a style sheet to be applied to the text."); + static readonly GUIContent k_AutoSizeLabel = new GUIContent("Auto Size", "Auto sizes the text to fit the available space."); + static readonly GUIContent k_FontSizeLabel = new GUIContent("Font Size", "The size the text will be rendered at in points."); + static readonly GUIContent k_AutoSizeOptionsLabel = new GUIContent("Auto Size Options"); + static readonly GUIContent k_MinLabel = new GUIContent("Min", "The minimum font size."); + static readonly GUIContent k_MaxLabel = new GUIContent("Max", "The maximum font size."); + static readonly GUIContent k_WdLabel = new GUIContent("WD%", "Compresses character width up to this value before reducing font size."); + static readonly GUIContent k_LineLabel = new GUIContent("Line", "Negative value only. Compresses line height down to this value before reducing font size."); + static readonly GUIContent k_FontStyleLabel = new GUIContent("Font Style", "Styles to apply to the text such as Bold or Italic."); + + static readonly GUIContent k_BoldLabel = new GUIContent("B", "Bold"); + static readonly GUIContent k_ItalicLabel = new GUIContent("I", "Italic"); + static readonly GUIContent k_UnderlineLabel = new GUIContent("U", "Underline"); + static readonly GUIContent k_StrikethroughLabel = new GUIContent("S", "Strikethrough"); + static readonly GUIContent k_LowercaseLabel = new GUIContent("ab", "Lowercase"); + static readonly GUIContent k_UppercaseLabel = new GUIContent("AB", "Uppercase"); + static readonly GUIContent k_SmallcapsLabel = new GUIContent("SC", "Smallcaps"); + + static readonly GUIContent k_ColorModeLabel = new GUIContent("Color Mode", "The type of gradient to use."); + static readonly GUIContent k_BaseColorLabel = new GUIContent("Vertex Color", "The base color of the text vertices."); + static readonly GUIContent k_ColorPresetLabel = new GUIContent("Color Preset", "A Color Preset which override the local color settings."); + static readonly GUIContent k_ColorGradientLabel = new GUIContent("Color Gradient", "The gradient color applied over the Vertex Color. Can be locally set or driven by a Gradient Asset."); + static readonly GUIContent k_CorenerColorsLabel = new GUIContent("Colors", "The color composition of the gradient."); + static readonly GUIContent k_OverrideTagsLabel = new GUIContent("Override Tags", "Whether the color settings override the tag."); + + static readonly GUIContent k_SpacingOptionsLabel = new GUIContent("Spacing Options (em)", "Spacing adjustments between different elements of the text. Values are in font units where a value of 1 equals 1/100em."); + static readonly GUIContent k_CharacterSpacingLabel = new GUIContent("Character"); + static readonly GUIContent k_WordSpacingLabel = new GUIContent("Word"); + static readonly GUIContent k_LineSpacingLabel = new GUIContent("Line"); + static readonly GUIContent k_ParagraphSpacingLabel = new GUIContent("Paragraph"); + + static readonly GUIContent k_AlignmentLabel = new GUIContent("Alignment", "Horizontal and vertical aligment of the text within its container."); + static readonly GUIContent k_WrapMixLabel = new GUIContent("Wrap Mix (W <-> C)", "How much to favor words versus characters when distributing the text."); + + static readonly GUIContent k_WrappingLabel = new GUIContent("Wrapping", "Wraps text to the next line when reaching the edge of the container."); + static readonly GUIContent[] k_WrappingOptions = { new GUIContent("Disabled"), new GUIContent("Enabled") }; + static readonly GUIContent k_OverflowLabel = new GUIContent("Overflow", "How to display text which goes past the edge of the container."); + + static readonly GUIContent k_MarginsLabel = new GUIContent("Margins", "The space between the text and the edge of its container."); + static readonly GUIContent k_GeometrySortingLabel = new GUIContent("Geometry Sorting", "The order in which text geometry is sorted. Used to adjust the way overlapping characters are displayed."); + static readonly GUIContent k_IsTextObjectScaleStatic = new GUIContent("Is Scale Static", "Controls whether a text object will be excluded from the InteralUpdate callback to handle scale changes of the text object or its parent(s)."); + static readonly GUIContent k_RichTextLabel = new GUIContent("Rich Text", "Enables the use of rich text tags such as and ."); + static readonly GUIContent k_EscapeCharactersLabel = new GUIContent("Parse Escape Characters", "Whether to display strings such as \"\\n\" as is or replace them by the character they represent."); + static readonly GUIContent k_VisibleDescenderLabel = new GUIContent("Visible Descender", "Compute descender values from visible characters only. Used to adjust layout behavior when hiding and revealing characters dynamically."); + static readonly GUIContent k_SpriteAssetLabel = new GUIContent("Sprite Asset", "The Sprite Asset used when NOT specifically referencing one using ."); + static readonly GUIContent k_StyleSheetAssetLabel = new GUIContent("Style Sheet Asset", "The Style Sheet Asset used by this text object."); + + static readonly GUIContent k_HorizontalMappingLabel = new GUIContent("Horizontal Mapping", "Horizontal UV mapping when using a shader with a texture face option."); + static readonly GUIContent k_VerticalMappingLabel = new GUIContent("Vertical Mapping", "Vertical UV mapping when using a shader with a texture face option."); + static readonly GUIContent k_LineOffsetLabel = new GUIContent("Line Offset", "Adds an horizontal offset to each successive line. Used for slanted texturing."); + + static readonly GUIContent k_KerningLabel = new GUIContent("Kerning", "Enables character specific spacing between pairs of characters."); + static readonly GUIContent k_PaddingLabel = new GUIContent("Extra Padding", "Adds some padding between the characters and the edge of the text mesh. Can reduce graphical errors when displaying small text."); + + static readonly GUIContent k_LeftLabel = new GUIContent("Left"); + static readonly GUIContent k_TopLabel = new GUIContent("Top"); + static readonly GUIContent k_RightLabel = new GUIContent("Right"); + static readonly GUIContent k_BottomLabel = new GUIContent("Bottom"); + + protected static readonly GUIContent k_ExtraSettingsLabel = new GUIContent("Extra Settings"); + protected static string[] k_UiStateLabel = new string[] { "(Click to collapse) ", "(Click to expand) " }; + + static Dictionary k_AvailableStyles = new Dictionary(); + protected Dictionary m_TextStyleIndexLookup = new Dictionary(); + + protected struct Foldout + { + // Track Inspector foldout panel states, globally. + public static bool extraSettings = false; + public static bool materialInspector = true; + } + + protected static int s_EventId; + + public int selAlignGridA; + public int selAlignGridB; + + protected SerializedProperty m_TextProp; + + protected SerializedProperty m_IsRightToLeftProp; + protected string m_RtlText; + + protected SerializedProperty m_FontAssetProp; + + protected SerializedProperty m_FontSharedMaterialProp; + protected Material[] m_MaterialPresets; + protected GUIContent[] m_MaterialPresetNames; + protected Dictionary m_MaterialPresetIndexLookup = new Dictionary(); + protected int m_MaterialPresetSelectionIndex; + protected bool m_IsPresetListDirty; + + protected List m_Styles = new List(); + protected GUIContent[] m_StyleNames; + protected int m_StyleSelectionIndex; + + protected SerializedProperty m_FontStyleProp; + + protected SerializedProperty m_FontColorProp; + protected SerializedProperty m_EnableVertexGradientProp; + protected SerializedProperty m_FontColorGradientProp; + protected SerializedProperty m_FontColorGradientPresetProp; + protected SerializedProperty m_OverrideHtmlColorProp; + + protected SerializedProperty m_FontSizeProp; + protected SerializedProperty m_FontSizeBaseProp; + + protected SerializedProperty m_AutoSizingProp; + protected SerializedProperty m_FontSizeMinProp; + protected SerializedProperty m_FontSizeMaxProp; + + protected SerializedProperty m_LineSpacingMaxProp; + protected SerializedProperty m_CharWidthMaxAdjProp; + + protected SerializedProperty m_CharacterSpacingProp; + protected SerializedProperty m_WordSpacingProp; + protected SerializedProperty m_LineSpacingProp; + protected SerializedProperty m_ParagraphSpacingProp; + + protected SerializedProperty m_TextAlignmentProp; + + protected SerializedProperty m_HorizontalAlignmentProp; + protected SerializedProperty m_VerticalAlignmentProp; + + protected SerializedProperty m_HorizontalMappingProp; + protected SerializedProperty m_VerticalMappingProp; + protected SerializedProperty m_UvLineOffsetProp; + + protected SerializedProperty m_EnableWordWrappingProp; + protected SerializedProperty m_WordWrappingRatiosProp; + protected SerializedProperty m_TextOverflowModeProp; + protected SerializedProperty m_PageToDisplayProp; + protected SerializedProperty m_LinkedTextComponentProp; + protected SerializedProperty m_ParentLinkedTextComponentProp; + + protected SerializedProperty m_EnableKerningProp; + + protected SerializedProperty m_IsRichTextProp; + + protected SerializedProperty m_HasFontAssetChangedProp; + + protected SerializedProperty m_EnableExtraPaddingProp; + protected SerializedProperty m_CheckPaddingRequiredProp; + protected SerializedProperty m_EnableEscapeCharacterParsingProp; + protected SerializedProperty m_UseMaxVisibleDescenderProp; + protected SerializedProperty m_GeometrySortingOrderProp; + protected SerializedProperty m_IsTextObjectScaleStaticProp; + + protected SerializedProperty m_SpriteAssetProp; + + protected SerializedProperty m_StyleSheetAssetProp; + protected SerializedProperty m_TextStyleHashCodeProp; + + protected SerializedProperty m_MarginProp; + + protected SerializedProperty m_ColorModeProp; + + protected bool m_HavePropertiesChanged; + + protected TMP_Text m_TextComponent; + protected TMP_Text m_PreviousLinkedTextComponent; + protected RectTransform m_RectTransform; + + protected Material m_TargetMaterial; + + protected Vector3[] m_RectCorners = new Vector3[4]; + protected Vector3[] m_HandlePoints = new Vector3[4]; + + protected virtual void OnEnable() + { + m_TextProp = serializedObject.FindProperty("m_text"); + m_IsRightToLeftProp = serializedObject.FindProperty("m_isRightToLeft"); + m_FontAssetProp = serializedObject.FindProperty("m_fontAsset"); + m_FontSharedMaterialProp = serializedObject.FindProperty("m_sharedMaterial"); + + m_FontStyleProp = serializedObject.FindProperty("m_fontStyle"); + + m_FontSizeProp = serializedObject.FindProperty("m_fontSize"); + m_FontSizeBaseProp = serializedObject.FindProperty("m_fontSizeBase"); + + m_AutoSizingProp = serializedObject.FindProperty("m_enableAutoSizing"); + m_FontSizeMinProp = serializedObject.FindProperty("m_fontSizeMin"); + m_FontSizeMaxProp = serializedObject.FindProperty("m_fontSizeMax"); + + m_LineSpacingMaxProp = serializedObject.FindProperty("m_lineSpacingMax"); + m_CharWidthMaxAdjProp = serializedObject.FindProperty("m_charWidthMaxAdj"); + + // Colors & Gradient + m_FontColorProp = serializedObject.FindProperty("m_fontColor"); + m_EnableVertexGradientProp = serializedObject.FindProperty("m_enableVertexGradient"); + m_FontColorGradientProp = serializedObject.FindProperty("m_fontColorGradient"); + m_FontColorGradientPresetProp = serializedObject.FindProperty("m_fontColorGradientPreset"); + m_OverrideHtmlColorProp = serializedObject.FindProperty("m_overrideHtmlColors"); + + m_CharacterSpacingProp = serializedObject.FindProperty("m_characterSpacing"); + m_WordSpacingProp = serializedObject.FindProperty("m_wordSpacing"); + m_LineSpacingProp = serializedObject.FindProperty("m_lineSpacing"); + m_ParagraphSpacingProp = serializedObject.FindProperty("m_paragraphSpacing"); + + m_TextAlignmentProp = serializedObject.FindProperty("m_textAlignment"); + m_HorizontalAlignmentProp = serializedObject.FindProperty("m_HorizontalAlignment"); + m_VerticalAlignmentProp = serializedObject.FindProperty("m_VerticalAlignment"); + + m_HorizontalMappingProp = serializedObject.FindProperty("m_horizontalMapping"); + m_VerticalMappingProp = serializedObject.FindProperty("m_verticalMapping"); + m_UvLineOffsetProp = serializedObject.FindProperty("m_uvLineOffset"); + + m_EnableWordWrappingProp = serializedObject.FindProperty("m_enableWordWrapping"); + m_WordWrappingRatiosProp = serializedObject.FindProperty("m_wordWrappingRatios"); + m_TextOverflowModeProp = serializedObject.FindProperty("m_overflowMode"); + m_PageToDisplayProp = serializedObject.FindProperty("m_pageToDisplay"); + m_LinkedTextComponentProp = serializedObject.FindProperty("m_linkedTextComponent"); + m_ParentLinkedTextComponentProp = serializedObject.FindProperty("parentLinkedComponent"); + + m_EnableKerningProp = serializedObject.FindProperty("m_enableKerning"); + + m_EnableExtraPaddingProp = serializedObject.FindProperty("m_enableExtraPadding"); + m_IsRichTextProp = serializedObject.FindProperty("m_isRichText"); + m_CheckPaddingRequiredProp = serializedObject.FindProperty("checkPaddingRequired"); + m_EnableEscapeCharacterParsingProp = serializedObject.FindProperty("m_parseCtrlCharacters"); + m_UseMaxVisibleDescenderProp = serializedObject.FindProperty("m_useMaxVisibleDescender"); + + m_GeometrySortingOrderProp = serializedObject.FindProperty("m_geometrySortingOrder"); + m_IsTextObjectScaleStaticProp = serializedObject.FindProperty("m_IsTextObjectScaleStatic"); + + m_SpriteAssetProp = serializedObject.FindProperty("m_spriteAsset"); + + m_StyleSheetAssetProp = serializedObject.FindProperty("m_StyleSheet"); + m_TextStyleHashCodeProp = serializedObject.FindProperty("m_TextStyleHashCode"); + + m_MarginProp = serializedObject.FindProperty("m_margin"); + + m_HasFontAssetChangedProp = serializedObject.FindProperty("m_hasFontAssetChanged"); + + m_ColorModeProp = serializedObject.FindProperty("m_colorMode"); + + m_TextComponent = (TMP_Text)target; + m_RectTransform = m_TextComponent.rectTransform; + + // Restore Previous Linked Text Component + m_PreviousLinkedTextComponent = m_TextComponent.linkedTextComponent; + + // Create new Material Editor if one does not exists + m_TargetMaterial = m_TextComponent.fontSharedMaterial; + + // Set material inspector visibility + if (m_TargetMaterial != null) + UnityEditorInternal.InternalEditorUtility.SetIsInspectorExpanded(m_TargetMaterial, Foldout.materialInspector); + + // Find all Material Presets matching the current Font Asset Material + m_MaterialPresetNames = GetMaterialPresets(); + + // Get Styles from Style Sheet + if (!m_TextComponent.m_isWaitingOnResourceLoad) + m_StyleNames = GetStyleNames(); + + // Register to receive events when style sheets are modified. + TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Add(ON_TEXT_STYLE_CHANGED); + + // Initialize the Event Listener for Undo Events. + Undo.undoRedoPerformed += OnUndoRedo; + } + + protected virtual void OnDisable() + { + // Set material inspector visibility + if (m_TargetMaterial != null) + Foldout.materialInspector = UnityEditorInternal.InternalEditorUtility.GetIsInspectorExpanded(m_TargetMaterial); + + if (Undo.undoRedoPerformed != null) + Undo.undoRedoPerformed -= OnUndoRedo; + + // Unregister from style sheet related events. + TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Remove(ON_TEXT_STYLE_CHANGED); + } + + // Event received when Text Styles are changed. + void ON_TEXT_STYLE_CHANGED(bool isChanged) + { + m_StyleNames = GetStyleNames(); + } + + public override void OnInspectorGUI() + { + // Make sure Multi selection only includes TMP Text objects. + if (IsMixSelectionTypes()) return; + + serializedObject.Update(); + + DrawTextInput(); + + DrawMainSettings(); + + DrawExtraSettings(); + + EditorGUILayout.Space(); + + if (serializedObject.ApplyModifiedProperties() || m_HavePropertiesChanged) + { + m_TextComponent.havePropertiesChanged = true; + m_HavePropertiesChanged = false; + EditorUtility.SetDirty(target); + } + } + + public void OnSceneGUI() + { + if (IsMixSelectionTypes()) return; + + // Margin Frame & Handles + m_RectTransform.GetWorldCorners(m_RectCorners); + Vector4 marginOffset = m_TextComponent.margin; + Vector3 lossyScale = m_RectTransform.lossyScale; + + m_HandlePoints[0] = m_RectCorners[0] + m_RectTransform.TransformDirection(new Vector3(marginOffset.x * lossyScale.x, marginOffset.w * lossyScale.y, 0)); + m_HandlePoints[1] = m_RectCorners[1] + m_RectTransform.TransformDirection(new Vector3(marginOffset.x * lossyScale.x, -marginOffset.y * lossyScale.y, 0)); + m_HandlePoints[2] = m_RectCorners[2] + m_RectTransform.TransformDirection(new Vector3(-marginOffset.z * lossyScale.x, -marginOffset.y * lossyScale.y, 0)); + m_HandlePoints[3] = m_RectCorners[3] + m_RectTransform.TransformDirection(new Vector3(-marginOffset.z * lossyScale.x, marginOffset.w * lossyScale.y, 0)); + + Handles.DrawSolidRectangleWithOutline(m_HandlePoints, new Color32(255, 255, 255, 0), new Color32(255, 255, 0, 255)); + + // Draw & process FreeMoveHandles + + // LEFT HANDLE + Vector3 oldLeft = (m_HandlePoints[0] + m_HandlePoints[1]) * 0.5f; + Vector3 newLeft = Handles.FreeMoveHandle(oldLeft, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + bool hasChanged = false; + if (oldLeft != newLeft) + { + float delta = oldLeft.x - newLeft.x; + marginOffset.x += -delta / lossyScale.x; + //Debug.Log("Left Margin H0:" + handlePoints[0] + " H1:" + handlePoints[1]); + hasChanged = true; + } + + // TOP HANDLE + Vector3 oldTop = (m_HandlePoints[1] + m_HandlePoints[2]) * 0.5f; + Vector3 newTop = Handles.FreeMoveHandle(oldTop, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + if (oldTop != newTop) + { + float delta = oldTop.y - newTop.y; + marginOffset.y += delta / lossyScale.y; + //Debug.Log("Top Margin H1:" + handlePoints[1] + " H2:" + handlePoints[2]); + hasChanged = true; + } + + // RIGHT HANDLE + Vector3 oldRight = (m_HandlePoints[2] + m_HandlePoints[3]) * 0.5f; + Vector3 newRight = Handles.FreeMoveHandle(oldRight, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + if (oldRight != newRight) + { + float delta = oldRight.x - newRight.x; + marginOffset.z += delta / lossyScale.x; + hasChanged = true; + //Debug.Log("Right Margin H2:" + handlePoints[2] + " H3:" + handlePoints[3]); + } + + // BOTTOM HANDLE + Vector3 oldBottom = (m_HandlePoints[3] + m_HandlePoints[0]) * 0.5f; + Vector3 newBottom = Handles.FreeMoveHandle(oldBottom, Quaternion.identity, HandleUtility.GetHandleSize(m_RectTransform.position) * 0.05f, Vector3.zero, Handles.DotHandleCap); + if (oldBottom != newBottom) + { + float delta = oldBottom.y - newBottom.y; + marginOffset.w += -delta / lossyScale.y; + hasChanged = true; + //Debug.Log("Bottom Margin H0:" + handlePoints[0] + " H3:" + handlePoints[3]); + } + + if (hasChanged) + { + Undo.RecordObjects(new Object[] {m_RectTransform, m_TextComponent }, "Margin Changes"); + m_TextComponent.margin = marginOffset; + EditorUtility.SetDirty(target); + } + } + + protected void DrawTextInput() + { + EditorGUILayout.Space(); + + Rect rect = EditorGUILayout.GetControlRect(false, 22); + GUI.Label(rect, new GUIContent("Text Input"), TMP_UIStyleManager.sectionHeader); + + EditorGUI.indentLevel = 0; + + // If the text component is linked, disable the text input box. + if (m_ParentLinkedTextComponentProp.objectReferenceValue != null) + { + EditorGUILayout.HelpBox("The Text Input Box is disabled due to this text component being linked to another.", MessageType.Info); + } + else + { + // Display RTL Toggle + float labelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 110f; + + m_IsRightToLeftProp.boolValue = EditorGUI.Toggle(new Rect(rect.width - 120, rect.y + 3, 130, 20), k_RtlToggleLabel, m_IsRightToLeftProp.boolValue); + + EditorGUIUtility.labelWidth = labelWidth; + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_TextProp, GUIContent.none); + + if (EditorGUI.EndChangeCheck()) + { + m_TextComponent.m_inputSource = TMP_Text.TextInputSources.Text; + m_TextComponent.m_isInputParsingRequired = true; + m_HavePropertiesChanged = true; + } + + if (m_IsRightToLeftProp.boolValue) + { + // Copy source text to RTL string + m_RtlText = string.Empty; + string sourceText = m_TextProp.stringValue; + + // Reverse Text displayed in Text Input Box + for (int i = 0; i < sourceText.Length; i++) + m_RtlText += sourceText[sourceText.Length - i - 1]; + + GUILayout.Label("RTL Text Input"); + + EditorGUI.BeginChangeCheck(); + m_RtlText = EditorGUILayout.TextArea(m_RtlText, TMP_UIStyleManager.wrappingTextArea, GUILayout.Height(EditorGUI.GetPropertyHeight(m_TextProp) - EditorGUIUtility.singleLineHeight), GUILayout.ExpandWidth(true)); + + if (EditorGUI.EndChangeCheck()) + { + // Convert RTL input + sourceText = string.Empty; + + // Reverse Text displayed in Text Input Box + for (int i = 0; i < m_RtlText.Length; i++) + sourceText += m_RtlText[m_RtlText.Length - i - 1]; + + m_TextProp.stringValue = sourceText; + } + } + + // TEXT STYLE + if (m_StyleNames != null) + { + rect = EditorGUILayout.GetControlRect(false, 17); + + m_TextStyleIndexLookup.TryGetValue(m_TextStyleHashCodeProp.intValue, out m_StyleSelectionIndex); + + EditorGUI.BeginChangeCheck(); + m_StyleSelectionIndex = EditorGUI.Popup(rect, k_StyleLabel, m_StyleSelectionIndex, m_StyleNames); + if (EditorGUI.EndChangeCheck()) + { + m_TextStyleHashCodeProp.intValue = m_Styles[m_StyleSelectionIndex].hashCode; + m_TextComponent.m_TextStyle = m_Styles[m_StyleSelectionIndex]; + m_HavePropertiesChanged = true; + } + } + } + } + + protected void DrawMainSettings() + { + // MAIN SETTINGS SECTION + GUILayout.Label(new GUIContent("Main Settings"), TMP_UIStyleManager.sectionHeader); + + //EditorGUI.indentLevel += 1; + + DrawFont(); + + DrawColor(); + + DrawSpacing(); + + DrawAlignment(); + + DrawWrappingOverflow(); + + DrawTextureMapping(); + + //EditorGUI.indentLevel -= 1; + } + + void DrawFont() + { + bool isFontAssetDirty = false; + + // FONT ASSET + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_FontAssetProp, k_FontAssetLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_HasFontAssetChangedProp.boolValue = true; + + // Get new Material Presets for the new font asset + m_MaterialPresetNames = GetMaterialPresets(); + m_MaterialPresetSelectionIndex = 0; + + isFontAssetDirty = true; + } + + Rect rect; + + // MATERIAL PRESET + if (m_MaterialPresetNames != null && !isFontAssetDirty ) + { + EditorGUI.BeginChangeCheck(); + rect = EditorGUILayout.GetControlRect(false, 17); + + float oldHeight = EditorStyles.popup.fixedHeight; + EditorStyles.popup.fixedHeight = rect.height; + + int oldSize = EditorStyles.popup.fontSize; + EditorStyles.popup.fontSize = 11; + + if (m_FontSharedMaterialProp.objectReferenceValue != null) + m_MaterialPresetIndexLookup.TryGetValue(m_FontSharedMaterialProp.objectReferenceValue.GetInstanceID(), out m_MaterialPresetSelectionIndex); + + m_MaterialPresetSelectionIndex = EditorGUI.Popup(rect, k_MaterialPresetLabel, m_MaterialPresetSelectionIndex, m_MaterialPresetNames); + if (EditorGUI.EndChangeCheck()) + { + m_FontSharedMaterialProp.objectReferenceValue = m_MaterialPresets[m_MaterialPresetSelectionIndex]; + m_HavePropertiesChanged = true; + } + + EditorStyles.popup.fixedHeight = oldHeight; + EditorStyles.popup.fontSize = oldSize; + } + + // FONT STYLE + EditorGUI.BeginChangeCheck(); + + int v1, v2, v3, v4, v5, v6, v7; + + if (EditorGUIUtility.wideMode) + { + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f); + + EditorGUI.PrefixLabel(rect, k_FontStyleLabel); + + int styleValue = m_FontStyleProp.intValue; + + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + + rect.width = Mathf.Max(25f, rect.width / 7f); + + v1 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 1) == 1, k_BoldLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 1 : 0; // Bold + rect.x += rect.width; + v2 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 2) == 2, k_ItalicLabel, TMP_UIStyleManager.alignmentButtonMid) ? 2 : 0; // Italics + rect.x += rect.width; + v3 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 4) == 4, k_UnderlineLabel, TMP_UIStyleManager.alignmentButtonMid) ? 4 : 0; // Underline + rect.x += rect.width; + v7 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 64) == 64, k_StrikethroughLabel, TMP_UIStyleManager.alignmentButtonRight) ? 64 : 0; // Strikethrough + rect.x += rect.width; + + int selected = 0; + + EditorGUI.BeginChangeCheck(); + v4 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 8) == 8, k_LowercaseLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 8 : 0; // Lowercase + if (EditorGUI.EndChangeCheck() && v4 > 0) + { + selected = v4; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v5 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 16) == 16, k_UppercaseLabel, TMP_UIStyleManager.alignmentButtonMid) ? 16 : 0; // Uppercase + if (EditorGUI.EndChangeCheck() && v5 > 0) + { + selected = v5; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v6 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 32) == 32, k_SmallcapsLabel, TMP_UIStyleManager.alignmentButtonRight) ? 32 : 0; // Smallcaps + if (EditorGUI.EndChangeCheck() && v6 > 0) + { + selected = v6; + } + + if (selected > 0) + { + v4 = selected == 8 ? 8 : 0; + v5 = selected == 16 ? 16 : 0; + v6 = selected == 32 ? 32 : 0; + } + } + else + { + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f); + + EditorGUI.PrefixLabel(rect, k_FontStyleLabel); + + int styleValue = m_FontStyleProp.intValue; + + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + rect.width = Mathf.Max(25f, rect.width / 4f); + + v1 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 1) == 1, k_BoldLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 1 : 0; // Bold + rect.x += rect.width; + v2 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 2) == 2, k_ItalicLabel, TMP_UIStyleManager.alignmentButtonMid) ? 2 : 0; // Italics + rect.x += rect.width; + v3 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 4) == 4, k_UnderlineLabel, TMP_UIStyleManager.alignmentButtonMid) ? 4 : 0; // Underline + rect.x += rect.width; + v7 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 64) == 64, k_StrikethroughLabel, TMP_UIStyleManager.alignmentButtonRight) ? 64 : 0; // Strikethrough + + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight + 2f); + + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + + rect.width = Mathf.Max(25f, rect.width / 4f); + + int selected = 0; + + EditorGUI.BeginChangeCheck(); + v4 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 8) == 8, k_LowercaseLabel, TMP_UIStyleManager.alignmentButtonLeft) ? 8 : 0; // Lowercase + if (EditorGUI.EndChangeCheck() && v4 > 0) + { + selected = v4; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v5 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 16) == 16, k_UppercaseLabel, TMP_UIStyleManager.alignmentButtonMid) ? 16 : 0; // Uppercase + if (EditorGUI.EndChangeCheck() && v5 > 0) + { + selected = v5; + } + rect.x += rect.width; + EditorGUI.BeginChangeCheck(); + v6 = TMP_EditorUtility.EditorToggle(rect, (styleValue & 32) == 32, k_SmallcapsLabel, TMP_UIStyleManager.alignmentButtonRight) ? 32 : 0; // Smallcaps + if (EditorGUI.EndChangeCheck() && v6 > 0) + { + selected = v6; + } + + if (selected > 0) + { + v4 = selected == 8 ? 8 : 0; + v5 = selected == 16 ? 16 : 0; + v6 = selected == 32 ? 32 : 0; + } + } + + if (EditorGUI.EndChangeCheck()) + { + m_FontStyleProp.intValue = v1 + v2 + v3 + v4 + v5 + v6 + v7; + m_HavePropertiesChanged = true; + } + + // FONT SIZE + EditorGUI.BeginChangeCheck(); + + EditorGUI.BeginDisabledGroup(m_AutoSizingProp.boolValue); + EditorGUILayout.PropertyField(m_FontSizeProp, k_FontSizeLabel, GUILayout.MaxWidth(EditorGUIUtility.labelWidth + 50f)); + EditorGUI.EndDisabledGroup(); + + if (EditorGUI.EndChangeCheck()) + { + float fontSize = Mathf.Clamp(m_FontSizeProp.floatValue, 0, 32767); + + m_FontSizeProp.floatValue = fontSize; + m_FontSizeBaseProp.floatValue = fontSize; + m_HavePropertiesChanged = true; + } + + EditorGUI.indentLevel += 1; + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_AutoSizingProp, k_AutoSizeLabel); + if (EditorGUI.EndChangeCheck()) + { + if (m_AutoSizingProp.boolValue == false) + m_FontSizeProp.floatValue = m_FontSizeBaseProp.floatValue; + + m_HavePropertiesChanged = true; + } + + // Show auto sizing options + if (m_AutoSizingProp.boolValue) + { + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); + + EditorGUI.PrefixLabel(rect, k_AutoSizeOptionsLabel); + + int previousIndent = EditorGUI.indentLevel; + + EditorGUI.indentLevel = 0; + + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 4f; + rect.x += EditorGUIUtility.labelWidth; + + EditorGUIUtility.labelWidth = 24; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, m_FontSizeMinProp, k_MinLabel); + if (EditorGUI.EndChangeCheck()) + { + float minSize = m_FontSizeMinProp.floatValue; + + minSize = Mathf.Max(0, minSize); + + m_FontSizeMinProp.floatValue = Mathf.Min(minSize, m_FontSizeMaxProp.floatValue); + m_HavePropertiesChanged = true; + } + rect.x += rect.width; + + EditorGUIUtility.labelWidth = 27; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, m_FontSizeMaxProp, k_MaxLabel); + if (EditorGUI.EndChangeCheck()) + { + float maxSize = Mathf.Clamp(m_FontSizeMaxProp.floatValue, 0, 32767); + + m_FontSizeMaxProp.floatValue = Mathf.Max(m_FontSizeMinProp.floatValue, maxSize); + m_HavePropertiesChanged = true; + } + rect.x += rect.width; + + EditorGUI.BeginChangeCheck(); + EditorGUIUtility.labelWidth = 36; + EditorGUI.PropertyField(rect, m_CharWidthMaxAdjProp, k_WdLabel); + rect.x += rect.width; + EditorGUIUtility.labelWidth = 28; + EditorGUI.PropertyField(rect, m_LineSpacingMaxProp, k_LineLabel); + + EditorGUIUtility.labelWidth = 0; + + if (EditorGUI.EndChangeCheck()) + { + m_CharWidthMaxAdjProp.floatValue = Mathf.Clamp(m_CharWidthMaxAdjProp.floatValue, 0, 50); + m_LineSpacingMaxProp.floatValue = Mathf.Min(0, m_LineSpacingMaxProp.floatValue); + m_HavePropertiesChanged = true; + } + + EditorGUI.indentLevel = previousIndent; + } + + EditorGUI.indentLevel -= 1; + + + + EditorGUILayout.Space(); + } + + void DrawColor() + { + // FACE VERTEX COLOR + EditorGUI.BeginChangeCheck(); + Color vertexColor = EditorGUILayout.ColorField(k_BaseColorLabel, m_FontColorProp.colorValue, false, true, false); + if (EditorGUI.EndChangeCheck()) + { + m_FontColorProp.colorValue = vertexColor; + m_HavePropertiesChanged = true; + } + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableVertexGradientProp, k_ColorGradientLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + EditorGUIUtility.fieldWidth = 0; + + if (m_EnableVertexGradientProp.boolValue) + { + EditorGUI.indentLevel += 1; + + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_FontColorGradientPresetProp, k_ColorPresetLabel); + + SerializedObject obj = null; + + SerializedProperty colorMode; + + SerializedProperty topLeft; + SerializedProperty topRight; + SerializedProperty bottomLeft; + SerializedProperty bottomRight; + + if (m_FontColorGradientPresetProp.objectReferenceValue == null) + { + colorMode = m_ColorModeProp; + topLeft = m_FontColorGradientProp.FindPropertyRelative("topLeft"); + topRight = m_FontColorGradientProp.FindPropertyRelative("topRight"); + bottomLeft = m_FontColorGradientProp.FindPropertyRelative("bottomLeft"); + bottomRight = m_FontColorGradientProp.FindPropertyRelative("bottomRight"); + } + else + { + obj = new SerializedObject(m_FontColorGradientPresetProp.objectReferenceValue); + colorMode = obj.FindProperty("colorMode"); + topLeft = obj.FindProperty("topLeft"); + topRight = obj.FindProperty("topRight"); + bottomLeft = obj.FindProperty("bottomLeft"); + bottomRight = obj.FindProperty("bottomRight"); + } + + EditorGUILayout.PropertyField(colorMode, k_ColorModeLabel); + + var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + + EditorGUI.PrefixLabel(rect, k_CorenerColorsLabel); + + rect.x += EditorGUIUtility.labelWidth; + rect.width = rect.width - EditorGUIUtility.labelWidth; + + switch ((ColorMode)colorMode.enumValueIndex) + { + case ColorMode.Single: + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + topRight.colorValue = topLeft.colorValue; + bottomLeft.colorValue = topLeft.colorValue; + bottomRight.colorValue = topLeft.colorValue; + break; + case ColorMode.HorizontalGradient: + rect.width /= 2f; + + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + rect.x += rect.width; + + TMP_EditorUtility.DrawColorProperty(rect, topRight); + + bottomLeft.colorValue = topLeft.colorValue; + bottomRight.colorValue = topRight.colorValue; + break; + case ColorMode.VerticalGradient: + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + + TMP_EditorUtility.DrawColorProperty(rect, bottomLeft); + + topRight.colorValue = topLeft.colorValue; + bottomRight.colorValue = bottomLeft.colorValue; + break; + case ColorMode.FourCornersGradient: + rect.width /= 2f; + + TMP_EditorUtility.DrawColorProperty(rect, topLeft); + + rect.x += rect.width; + + TMP_EditorUtility.DrawColorProperty(rect, topRight); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + + TMP_EditorUtility.DrawColorProperty(rect, bottomLeft); + + rect.x += rect.width; + + TMP_EditorUtility.DrawColorProperty(rect, bottomRight); + break; + } + + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + if (obj != null) + { + obj.ApplyModifiedProperties(); + TMPro_EventManager.ON_COLOR_GRADIENT_PROPERTY_CHANGED(m_FontColorGradientPresetProp.objectReferenceValue as TMP_ColorGradient); + } + } + + EditorGUI.indentLevel -= 1; + } + + EditorGUILayout.PropertyField(m_OverrideHtmlColorProp, k_OverrideTagsLabel); + + EditorGUILayout.Space(); + } + + void DrawSpacing() + { + // CHARACTER, LINE & PARAGRAPH SPACING + EditorGUI.BeginChangeCheck(); + + Rect rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); + + EditorGUI.PrefixLabel(rect, k_SpacingOptionsLabel); + + int oldIndent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth - 3f) / 2f; + + EditorGUIUtility.labelWidth = Mathf.Min(rect.width * 0.55f, 80f); + + EditorGUI.PropertyField(rect, m_CharacterSpacingProp, k_CharacterSpacingLabel); + rect.x += rect.width + 3f; + EditorGUI.PropertyField(rect, m_WordSpacingProp, k_WordSpacingLabel); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight); + EditorGUIUtility.labelWidth = 0; + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth -3f) / 2f; + EditorGUIUtility.labelWidth = Mathf.Min(rect.width * 0.55f, 80f); + + EditorGUI.PropertyField(rect, m_LineSpacingProp, k_LineSpacingLabel); + rect.x += rect.width + 3f; + EditorGUI.PropertyField(rect, m_ParagraphSpacingProp, k_ParagraphSpacingLabel); + + EditorGUIUtility.labelWidth = 0; + EditorGUI.indentLevel = oldIndent; + + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + EditorGUILayout.Space(); + } + + void DrawAlignment() + { + // TEXT ALIGNMENT + EditorGUI.BeginChangeCheck(); + + Rect rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.currentViewWidth > 504 ? 20 : 40 + 3); + + EditorGUI.PrefixLabel(rect, k_AlignmentLabel); + rect.x += EditorGUIUtility.labelWidth; + + EditorGUI.PropertyField(rect, m_HorizontalAlignmentProp, GUIContent.none); + EditorGUI.PropertyField(rect, m_VerticalAlignmentProp, GUIContent.none); + + // WRAPPING RATIOS shown if Justified mode is selected. + if (((HorizontalAlignmentOptions)m_HorizontalAlignmentProp.intValue & HorizontalAlignmentOptions.Justified) == HorizontalAlignmentOptions.Justified || ((HorizontalAlignmentOptions)m_HorizontalAlignmentProp.intValue & HorizontalAlignmentOptions.Flush) == HorizontalAlignmentOptions.Flush) + DrawPropertySlider(k_WrapMixLabel, m_WordWrappingRatiosProp); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + void DrawWrappingOverflow() + { + // TEXT WRAPPING + EditorGUI.BeginChangeCheck(); + int wrapSelection = EditorGUILayout.Popup(k_WrappingLabel, m_EnableWordWrappingProp.boolValue ? 1 : 0, k_WrappingOptions); + if (EditorGUI.EndChangeCheck()) + { + m_EnableWordWrappingProp.boolValue = wrapSelection == 1; + m_HavePropertiesChanged = true; + m_TextComponent.m_isInputParsingRequired = true; + } + + // TEXT OVERFLOW + EditorGUI.BeginChangeCheck(); + + if ((TextOverflowModes)m_TextOverflowModeProp.enumValueIndex == TextOverflowModes.Linked) + { + EditorGUILayout.BeginHorizontal(); + + float fieldWidth = EditorGUIUtility.fieldWidth; + EditorGUIUtility.fieldWidth = 65; + EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel); + EditorGUIUtility.fieldWidth = fieldWidth; + + EditorGUILayout.PropertyField(m_LinkedTextComponentProp, GUIContent.none); + + EditorGUILayout.EndHorizontal(); + + if (GUI.changed) + { + TMP_Text linkedComponent = m_LinkedTextComponentProp.objectReferenceValue as TMP_Text; + + if (linkedComponent == null) + { + m_LinkedTextComponentProp.objectReferenceValue = null; + + if (m_PreviousLinkedTextComponent != null) + m_TextComponent.ReleaseLinkedTextComponent(m_PreviousLinkedTextComponent); + } + else if (m_TextComponent.IsSelfOrLinkedAncestor(linkedComponent)) + { + m_LinkedTextComponentProp.objectReferenceValue = m_PreviousLinkedTextComponent; + } + else + { + if (m_PreviousLinkedTextComponent != null) + m_TextComponent.ReleaseLinkedTextComponent(m_PreviousLinkedTextComponent); + + m_LinkedTextComponentProp.objectReferenceValue = linkedComponent; + linkedComponent.parentLinkedComponent = m_TextComponent; + m_PreviousLinkedTextComponent = linkedComponent; + } + } + } + else if ((TextOverflowModes)m_TextOverflowModeProp.enumValueIndex == TextOverflowModes.Page) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel); + EditorGUILayout.PropertyField(m_PageToDisplayProp, GUIContent.none); + EditorGUILayout.EndHorizontal(); + + if (m_PreviousLinkedTextComponent) + { + m_TextComponent.ReleaseLinkedTextComponent(m_PreviousLinkedTextComponent); + + m_TextComponent.linkedTextComponent = null; + } + } + else + { + EditorGUILayout.PropertyField(m_TextOverflowModeProp, k_OverflowLabel); + + if (m_PreviousLinkedTextComponent) + { + m_TextComponent.ReleaseLinkedTextComponent(m_PreviousLinkedTextComponent); + + m_TextComponent.linkedTextComponent = null; + } + } + + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_TextComponent.m_isInputParsingRequired = true; + } + + EditorGUILayout.Space(); + } + + protected abstract void DrawExtraSettings(); + + protected void DrawMargins() + { + EditorGUI.BeginChangeCheck(); + DrawMarginProperty(m_MarginProp, k_MarginsLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + EditorGUILayout.Space(); + } + + protected void DrawGeometrySorting() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_GeometrySortingOrderProp, k_GeometrySortingLabel); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawIsTextObjectScaleStatic() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_IsTextObjectScaleStaticProp, k_IsTextObjectScaleStatic); + + if (EditorGUI.EndChangeCheck()) + { + m_TextComponent.isTextObjectScaleStatic = m_IsTextObjectScaleStaticProp.boolValue; + m_HavePropertiesChanged = true; + } + + EditorGUILayout.Space(); + } + + + protected void DrawRichText() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_IsRichTextProp, k_RichTextLabel); + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + } + + protected void DrawParsing() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableEscapeCharacterParsingProp, k_EscapeCharactersLabel); + EditorGUILayout.PropertyField(m_UseMaxVisibleDescenderProp, k_VisibleDescenderLabel); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawSpriteAsset() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_SpriteAssetProp, k_SpriteAssetLabel, true); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawStyleSheet() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_StyleSheetAssetProp, k_StyleSheetAssetLabel, true); + + if (EditorGUI.EndChangeCheck()) + { + m_StyleNames = GetStyleNames(); + m_HavePropertiesChanged = true; + } + + EditorGUILayout.Space(); + } + + protected void DrawTextureMapping() + { + // TEXTURE MAPPING OPTIONS + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_HorizontalMappingProp, k_HorizontalMappingLabel); + EditorGUILayout.PropertyField(m_VerticalMappingProp, k_VerticalMappingLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + + // UV OPTIONS + if (m_HorizontalMappingProp.enumValueIndex > 0) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_UvLineOffsetProp, k_LineOffsetLabel, GUILayout.MinWidth(70f)); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + } + + EditorGUILayout.Space(); + } + + protected void DrawKerning() + { + // KERNING + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableKerningProp, k_KerningLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + } + } + + protected void DrawPadding() + { + // EXTRA PADDING + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_EnableExtraPaddingProp, k_PaddingLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_CheckPaddingRequiredProp.boolValue = true; + } + } + + /// + /// Method to retrieve the material presets that match the currently selected font asset. + /// + protected GUIContent[] GetMaterialPresets() + { + TMP_FontAsset fontAsset = m_FontAssetProp.objectReferenceValue as TMP_FontAsset; + if (fontAsset == null) return null; + + m_MaterialPresets = TMP_EditorUtility.FindMaterialReferences(fontAsset); + m_MaterialPresetNames = new GUIContent[m_MaterialPresets.Length]; + + m_MaterialPresetIndexLookup.Clear(); + + for (int i = 0; i < m_MaterialPresetNames.Length; i++) + { + m_MaterialPresetNames[i] = new GUIContent(m_MaterialPresets[i].name); + + m_MaterialPresetIndexLookup.Add(m_MaterialPresets[i].GetInstanceID(), i); + + //if (m_TargetMaterial.GetInstanceID() == m_MaterialPresets[i].GetInstanceID()) + // m_MaterialPresetSelectionIndex = i; + } + + m_IsPresetListDirty = false; + + return m_MaterialPresetNames; + } + + protected GUIContent[] GetStyleNames() + { + k_AvailableStyles.Clear(); + m_TextStyleIndexLookup.Clear(); + m_Styles.Clear(); + + // First style on the list is always the Normal default style. + TMP_Style styleNormal = TMP_Style.NormalStyle; + + m_Styles.Add(styleNormal); + m_TextStyleIndexLookup.Add(styleNormal.hashCode, 0); + + k_AvailableStyles.Add(styleNormal.hashCode, styleNormal); + + // Get styles from Style Sheet potentially assigned to the text object. + TMP_StyleSheet localStyleSheet = (TMP_StyleSheet)m_StyleSheetAssetProp.objectReferenceValue; + + if (localStyleSheet != null) + { + int styleCount = localStyleSheet.styles.Count; + + for (int i = 0; i < styleCount; i++) + { + TMP_Style style = localStyleSheet.styles[i]; + + if (k_AvailableStyles.ContainsKey(style.hashCode) == false) + { + k_AvailableStyles.Add(style.hashCode, style); + m_Styles.Add(style); + m_TextStyleIndexLookup.Add(style.hashCode, m_TextStyleIndexLookup.Count); + } + } + } + + // Get styles from TMP Settings' default style sheet. + TMP_StyleSheet globalStyleSheet = TMP_Settings.defaultStyleSheet; + + if (globalStyleSheet != null) + { + int styleCount = globalStyleSheet.styles.Count; + + for (int i = 0; i < styleCount; i++) + { + TMP_Style style = globalStyleSheet.styles[i]; + + if (k_AvailableStyles.ContainsKey(style.hashCode) == false) + { + k_AvailableStyles.Add(style.hashCode, style); + m_Styles.Add(style); + m_TextStyleIndexLookup.Add(style.hashCode, m_TextStyleIndexLookup.Count); + } + } + } + + // Create array that will contain the list of available styles. + GUIContent[] styleNames = k_AvailableStyles.Values.Select(item => new GUIContent(item.name)).ToArray(); + + // Set text style index + m_TextStyleIndexLookup.TryGetValue(m_TextStyleHashCodeProp.intValue, out m_StyleSelectionIndex); + + return styleNames; + } + + // DRAW MARGIN PROPERTY + protected void DrawMarginProperty(SerializedProperty property, GUIContent label) + { + Rect rect = EditorGUILayout.GetControlRect(false, 2 * 18); + + EditorGUI.BeginProperty(rect, label, property); + + Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width - 15, 18); + + float width = rect.width + 3; + pos0.width = EditorGUIUtility.labelWidth; + EditorGUI.PrefixLabel(pos0, label); + + Vector4 margins = property.vector4Value; + + float widthB = width - EditorGUIUtility.labelWidth; + float fieldWidth = widthB / 4; + pos0.width = Mathf.Max(fieldWidth - 5, 45f); + + // Labels + pos0.x = EditorGUIUtility.labelWidth + 15; + margins.x = DrawMarginField(pos0, "Left", margins.x); + + pos0.x += fieldWidth; + margins.y = DrawMarginField(pos0, "Top", margins.y); + + pos0.x += fieldWidth; + margins.z = DrawMarginField(pos0, "Right", margins.z); + + pos0.x += fieldWidth; + margins.w = DrawMarginField(pos0, "Bottom", margins.w); + + property.vector4Value = margins; + + EditorGUI.EndProperty(); + } + + float DrawMarginField(Rect position, string label, float value) + { + int controlId = GUIUtility.GetControlID(FocusType.Keyboard, position); + EditorGUI.PrefixLabel(position, controlId, new GUIContent(label)); + + Rect dragZone = new Rect(position.x, position.y, position.width, position.height); + position.y += EditorGUIUtility.singleLineHeight; + + return EditorGUI.DoFloatField(EditorGUI.s_RecycledEditor, position, dragZone, controlId, value, EditorGUI.kFloatFieldFormatString, EditorStyles.numberField, true); + } + + protected void DrawPropertySlider(GUIContent label, SerializedProperty property) + { + Rect rect = EditorGUILayout.GetControlRect(false, 17); + + GUIContent content = label ?? GUIContent.none; + EditorGUI.Slider(new Rect(rect.x, rect.y, rect.width, rect.height), property, 0.0f, 1.0f, content); + } + + protected abstract bool IsMixSelectionTypes(); + + // Special Handling of Undo / Redo Events. + protected abstract void OnUndoRedo(); + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta new file mode 100644 index 0000000..87bd739 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 91950f78729ab144aa36e94690b28fad +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs new file mode 100644 index 0000000..5fd33ce --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs @@ -0,0 +1,551 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + /// Base class for TextMesh Pro shader GUIs. + public abstract class TMP_BaseShaderGUI : ShaderGUI + { + /// Representation of a #pragma shader_feature. + /// It is assumed that the first feature option is for no keyword (underscores). + protected class ShaderFeature + { + public string undoLabel; + + public GUIContent label; + + /// The keyword labels, for display. Include the no-keyword as the first option. + public GUIContent[] keywordLabels; + + /// The shader keywords. Exclude the no-keyword option. + public string[] keywords; + + int m_State; + + public bool Active + { + get { return m_State >= 0; } + } + + public int State + { + get { return m_State; } + } + + public void ReadState(Material material) + { + for (int i = 0; i < keywords.Length; i++) + { + if (material.IsKeywordEnabled(keywords[i])) + { + m_State = i; + return; + } + } + + m_State = -1; + } + + public void SetActive(bool active, Material material) + { + m_State = active ? 0 : -1; + SetStateKeywords(material); + } + + public void DoPopup(MaterialEditor editor, Material material) + { + EditorGUI.BeginChangeCheck(); + int selection = EditorGUILayout.Popup(label, m_State + 1, keywordLabels); + if (EditorGUI.EndChangeCheck()) + { + m_State = selection - 1; + editor.RegisterPropertyChangeUndo(undoLabel); + SetStateKeywords(material); + } + } + + void SetStateKeywords(Material material) + { + for (int i = 0; i < keywords.Length; i++) + { + if (i == m_State) + { + material.EnableKeyword(keywords[i]); + } + else + { + material.DisableKeyword(keywords[i]); + } + } + } + } + + static GUIContent s_TempLabel = new GUIContent(); + + protected static bool s_DebugExtended; + + static int s_UndoRedoCount, s_LastSeenUndoRedoCount; + + static float[][] s_TempFloats = + { + null, new float[1], new float[2], new float[3], new float[4] + }; + + protected static GUIContent[] s_XywhVectorLabels = + { + new GUIContent("X"), + new GUIContent("Y"), + new GUIContent("W", "Width"), + new GUIContent("H", "Height") + }; + + protected static GUIContent[] s_LbrtVectorLabels = + { + new GUIContent("L", "Left"), + new GUIContent("B", "Bottom"), + new GUIContent("R", "Right"), + new GUIContent("T", "Top") + }; + + protected static GUIContent[] s_CullingTypeLabels = + { + new GUIContent("Off"), + new GUIContent("Front"), + new GUIContent("Back") + }; + + static TMP_BaseShaderGUI() + { + // Keep track of how many undo/redo events happened. + Undo.undoRedoPerformed += () => s_UndoRedoCount += 1; + } + + bool m_IsNewGUI = true; + + float m_DragAndDropMinY; + + protected MaterialEditor m_Editor; + + protected Material m_Material; + + protected MaterialProperty[] m_Properties; + + void PrepareGUI() + { + m_IsNewGUI = false; + ShaderUtilities.GetShaderPropertyIDs(); + + // New GUI just got constructed. This happens in response to a selection, + // but also after undo/redo events. + if (s_LastSeenUndoRedoCount != s_UndoRedoCount) + { + // There's been at least one undo/redo since the last time this GUI got constructed. + // Maybe the undo/redo was for this material? Assume that is was. + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, m_Material as Material); + } + + s_LastSeenUndoRedoCount = s_UndoRedoCount; + } + + public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) + { + m_Editor = materialEditor; + m_Material = materialEditor.target as Material; + this.m_Properties = properties; + + if (m_IsNewGUI) + { + PrepareGUI(); + } + + DoDragAndDropBegin(); + EditorGUI.BeginChangeCheck(); + DoGUI(); + if (EditorGUI.EndChangeCheck()) + { + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, m_Material); + } + + DoDragAndDropEnd(); + } + + /// Override this method to create the specific shader GUI. + protected abstract void DoGUI(); + + static string[] s_PanelStateLabel = new string[] { "\t- Click to collapse -", "\t- Click to expand -" }; + + protected bool BeginPanel(string panel, bool expanded) + { + EditorGUI.indentLevel = 0; + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + Rect r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 18)); + r.x += 20; + r.width += 6; + + bool enabled = GUI.enabled; + GUI.enabled = true; + expanded = TMP_EditorUtility.EditorToggle(r, expanded, new GUIContent(panel), TMP_UIStyleManager.panelTitle); + r.width -= 30; + EditorGUI.LabelField(r, new GUIContent(expanded ? s_PanelStateLabel[0] : s_PanelStateLabel[1]), TMP_UIStyleManager.rightLabel); + GUI.enabled = enabled; + + EditorGUI.indentLevel += 1; + EditorGUI.BeginDisabledGroup(false); + + return expanded; + } + + protected bool BeginPanel(string panel, ShaderFeature feature, bool expanded, bool readState = true) + { + EditorGUI.indentLevel = 0; + + if (readState) + { + feature.ReadState(m_Material); + } + + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.BeginHorizontal(); + + Rect r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 20, GUILayout.Width(20f))); + bool active = EditorGUI.Toggle(r, feature.Active); + + if (EditorGUI.EndChangeCheck()) + { + m_Editor.RegisterPropertyChangeUndo(feature.undoLabel); + feature.SetActive(active, m_Material); + } + + r = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(20, 18)); + r.width += 6; + + bool enabled = GUI.enabled; + GUI.enabled = true; + expanded = TMP_EditorUtility.EditorToggle(r, expanded, new GUIContent(panel), TMP_UIStyleManager.panelTitle); + r.width -= 10; + EditorGUI.LabelField(r, new GUIContent(expanded ? s_PanelStateLabel[0] : s_PanelStateLabel[1]), TMP_UIStyleManager.rightLabel); + GUI.enabled = enabled; + + GUILayout.EndHorizontal(); + + EditorGUI.indentLevel += 1; + EditorGUI.BeginDisabledGroup(!active); + + return expanded; + } + + public void EndPanel() + { + EditorGUI.EndDisabledGroup(); + EditorGUI.indentLevel -= 1; + EditorGUILayout.EndVertical(); + } + + MaterialProperty BeginProperty(string name) + { + MaterialProperty property = FindProperty(name, m_Properties); + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = property.hasMixedValue; + m_Editor.BeginAnimatedCheck(Rect.zero, property); + + return property; + } + + bool EndProperty() + { + m_Editor.EndAnimatedCheck(); + EditorGUI.showMixedValue = false; + return EditorGUI.EndChangeCheck(); + } + + protected void DoPopup(string name, string label, GUIContent[] options) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + int index = EditorGUILayout.Popup(s_TempLabel, (int)property.floatValue, options); + if (EndProperty()) + { + property.floatValue = index; + } + } + + protected void DoCubeMap(string name, string label) + { + DoTexture(name, label, typeof(Cubemap)); + } + + protected void DoTexture2D(string name, string label, bool withTilingOffset = false, string[] speedNames = null) + { + DoTexture(name, label, typeof(Texture2D), withTilingOffset, speedNames); + } + + void DoTexture(string name, string label, System.Type type, bool withTilingOffset = false, string[] speedNames = null) + { + MaterialProperty property = FindProperty(name, m_Properties); + m_Editor.BeginAnimatedCheck(Rect.zero, property); + + Rect rect = EditorGUILayout.GetControlRect(true, 60f); + float totalWidth = rect.width; + rect.width = EditorGUIUtility.labelWidth + 60f; + s_TempLabel.text = label; + + EditorGUI.BeginChangeCheck(); + Object tex = EditorGUI.ObjectField(rect, s_TempLabel, property.textureValue, type, false); + if (EditorGUI.EndChangeCheck()) + { + property.textureValue = tex as Texture; + } + + rect.x += rect.width + 4f; + rect.width = totalWidth - rect.width - 4f; + rect.height = EditorGUIUtility.singleLineHeight; + + if (withTilingOffset) + { + DoTilingOffset(rect, property); + rect.y += (rect.height + 2f) * 2f; + } + + m_Editor.EndAnimatedCheck(); + + if (speedNames != null) + { + DoUVSpeed(rect, speedNames); + } + } + + void DoTilingOffset(Rect rect, MaterialProperty property) + { + float labelWidth = EditorGUIUtility.labelWidth; + int indentLevel = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + EditorGUIUtility.labelWidth = Mathf.Min(40f, rect.width * 0.20f); + + Vector4 vector = property.textureScaleAndOffset; + + bool changed = false; + float[] values = s_TempFloats[2]; + + s_TempLabel.text = "Tiling"; + Rect vectorRect = EditorGUI.PrefixLabel(rect, s_TempLabel); + values[0] = vector.x; + values[1] = vector.y; + + EditorGUI.BeginChangeCheck(); + EditorGUI.MultiFloatField(vectorRect, s_XywhVectorLabels, values); + if (EditorGUI.EndChangeCheck()) + { + vector.x = values[0]; + vector.y = values[1]; + changed = true; + } + + rect.y += rect.height + 2f; + s_TempLabel.text = "Offset"; + vectorRect = EditorGUI.PrefixLabel(rect, s_TempLabel); + values[0] = vector.z; + values[1] = vector.w; + + EditorGUI.BeginChangeCheck(); + EditorGUI.MultiFloatField(vectorRect, s_XywhVectorLabels, values); + if (EditorGUI.EndChangeCheck()) + { + vector.z = values[0]; + vector.w = values[1]; + changed = true; + } + + if (changed) + { + property.textureScaleAndOffset = vector; + } + + EditorGUIUtility.labelWidth = labelWidth; + EditorGUI.indentLevel = indentLevel; + } + + protected void DoUVSpeed(Rect rect, string[] names) + { + float labelWidth = EditorGUIUtility.labelWidth; + int indentLevel = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + EditorGUIUtility.labelWidth = Mathf.Min(40f, rect.width * 0.20f); + + s_TempLabel.text = "Speed"; + rect = EditorGUI.PrefixLabel(rect, s_TempLabel); + + EditorGUIUtility.labelWidth = 13f; + rect.width = rect.width * 0.5f - 1f; + DoFloat(rect, names[0], "X"); + rect.x += rect.width + 2f; + DoFloat(rect, names[1], "Y"); + EditorGUIUtility.labelWidth = labelWidth; + EditorGUI.indentLevel = indentLevel; + } + + protected void DoToggle(string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + bool value = EditorGUILayout.Toggle(s_TempLabel, property.floatValue == 1f); + if (EndProperty()) + { + property.floatValue = value ? 1f : 0f; + } + } + + protected void DoFloat(string name, string label) + { + MaterialProperty property = BeginProperty(name); + Rect rect = EditorGUILayout.GetControlRect(); + rect.width = EditorGUIUtility.labelWidth + 55f; + s_TempLabel.text = label; + float value = EditorGUI.FloatField(rect, s_TempLabel, property.floatValue); + if (EndProperty()) + { + property.floatValue = value; + } + } + + protected void DoColor(string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + Color value = EditorGUI.ColorField(EditorGUILayout.GetControlRect(), s_TempLabel, property.colorValue, false, true, true); + if (EndProperty()) + { + property.colorValue = value; + } + } + + void DoFloat(Rect rect, string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + float value = EditorGUI.FloatField(rect, s_TempLabel, property.floatValue); + if (EndProperty()) + { + property.floatValue = value; + } + } + + protected void DoSlider(string name, string label) + { + MaterialProperty property = BeginProperty(name); + Vector2 range = property.rangeLimits; + s_TempLabel.text = label; + float value = EditorGUI.Slider( + EditorGUILayout.GetControlRect(), s_TempLabel, property.floatValue, range.x, range.y + ); + if (EndProperty()) + { + property.floatValue = value; + } + } + + protected void DoVector3(string name, string label) + { + MaterialProperty property = BeginProperty(name); + s_TempLabel.text = label; + Vector4 value = EditorGUILayout.Vector3Field(s_TempLabel, property.vectorValue); + if (EndProperty()) + { + property.vectorValue = value; + } + } + + protected void DoVector(string name, string label, GUIContent[] subLabels) + { + MaterialProperty property = BeginProperty(name); + Rect rect = EditorGUILayout.GetControlRect(); + s_TempLabel.text = label; + rect = EditorGUI.PrefixLabel(rect, s_TempLabel); + Vector4 vector = property.vectorValue; + + float[] values = s_TempFloats[subLabels.Length]; + for (int i = 0; i < subLabels.Length; i++) + { + values[i] = vector[i]; + } + + EditorGUI.MultiFloatField(rect, subLabels, values); + if (EndProperty()) + { + for (int i = 0; i < subLabels.Length; i++) + { + vector[i] = values[i]; + } + + property.vectorValue = vector; + } + } + + void DoDragAndDropBegin() + { + m_DragAndDropMinY = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)).y; + } + + void DoDragAndDropEnd() + { + Rect rect = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + Event evt = Event.current; + if (evt.type == EventType.DragUpdated) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Generic; + evt.Use(); + } + else if ( + evt.type == EventType.DragPerform && + Rect.MinMaxRect(rect.xMin, m_DragAndDropMinY, rect.xMax, rect.yMax).Contains(evt.mousePosition) + ) + { + DragAndDrop.AcceptDrag(); + evt.Use(); + Material droppedMaterial = DragAndDrop.objectReferences[0] as Material; + if (droppedMaterial && droppedMaterial != m_Material) + { + PerformDrop(droppedMaterial); + } + } + } + + void PerformDrop(Material droppedMaterial) + { + Texture droppedTex = droppedMaterial.GetTexture(ShaderUtilities.ID_MainTex); + if (!droppedTex) + { + return; + } + + Texture currentTex = m_Material.GetTexture(ShaderUtilities.ID_MainTex); + TMP_FontAsset requiredFontAsset = null; + if (droppedTex != currentTex) + { + requiredFontAsset = TMP_EditorUtility.FindMatchingFontAsset(droppedMaterial); + if (!requiredFontAsset) + { + return; + } + } + + foreach (GameObject o in Selection.gameObjects) + { + if (requiredFontAsset) + { + TMP_Text textComponent = o.GetComponent(); + if (textComponent) + { + Undo.RecordObject(textComponent, "Font Asset Change"); + textComponent.font = requiredFontAsset; + } + } + + TMPro_EventManager.ON_DRAG_AND_DROP_MATERIAL_CHANGED(o, m_Material, droppedMaterial); + EditorUtility.SetDirty(o); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta new file mode 100644 index 0000000..f07bd85 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 438efd46088d408d8a53f707fa68d976 +timeCreated: 1469844810 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs new file mode 100644 index 0000000..be39959 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs @@ -0,0 +1,93 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + public class TMP_BitmapShaderGUI : TMP_BaseShaderGUI + { + static bool s_Face = true; + + protected override void DoGUI() + { + s_Face = BeginPanel("Face", s_Face); + if (s_Face) + { + DoFacePanel(); + } + + EndPanel(); + + s_DebugExtended = BeginPanel("Debug Settings", s_DebugExtended); + if (s_DebugExtended) + { + DoDebugPanel(); + } + + EndPanel(); + } + + void DoFacePanel() + { + EditorGUI.indentLevel += 1; + if (m_Material.HasProperty(ShaderUtilities.ID_FaceTex)) + { + DoColor("_FaceColor", "Color"); + DoTexture2D("_FaceTex", "Texture", true); + } + else + { + DoColor("_Color", "Color"); + DoSlider("_DiffusePower", "Diffuse Power"); + } + + EditorGUI.indentLevel -= 1; + + EditorGUILayout.Space(); + } + + void DoDebugPanel() + { + EditorGUI.indentLevel += 1; + DoTexture2D("_MainTex", "Font Atlas"); + if (m_Material.HasProperty(ShaderUtilities.ID_VertexOffsetX)) + { + if (m_Material.HasProperty(ShaderUtilities.ID_Padding)) + { + EditorGUILayout.Space(); + DoFloat("_Padding", "Padding"); + } + + EditorGUILayout.Space(); + DoFloat("_VertexOffsetX", "Offset X"); + DoFloat("_VertexOffsetY", "Offset Y"); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_MaskSoftnessX)) + { + EditorGUILayout.Space(); + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_StencilID)) + { + EditorGUILayout.Space(); + DoFloat("_Stencil", "Stencil ID"); + DoFloat("_StencilComp", "Stencil Comp"); + } + + if (m_Material.HasProperty(ShaderUtilities.ShaderTag_CullMode)) + { + EditorGUILayout.Space(); + DoPopup("_CullMode", "Cull Mode", s_CullingTypeLabels); + } + + EditorGUILayout.Space(); + + EditorGUI.indentLevel -= 1; + + EditorGUILayout.Space(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta new file mode 100644 index 0000000..6d0e052 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 806de5a9211448c8b65c8435ebb48dd4 +timeCreated: 1469998850 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs new file mode 100644 index 0000000..98f32c7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs @@ -0,0 +1,235 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + [CustomPropertyDrawer(typeof(TMP_Character))] + public class TMP_CharacterPropertyDrawer : PropertyDrawer + { + private string k_ColorProperty = "_Color"; + + int m_GlyphSelectedForEditing = -1; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_Unicode = property.FindPropertyRelative("m_Unicode"); + SerializedProperty prop_GlyphIndex = property.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_Scale = property.FindPropertyRelative("m_Scale"); + + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 50; + + Rect rect = new Rect(position.x + 50, position.y, position.width, 49); + + // Display non-editable fields + if (GUI.enabled == false) + { + int unicode = prop_Unicode.intValue; + EditorGUI.LabelField(new Rect(rect.x, rect.y, 120f, 18), new GUIContent("Unicode: 0x" + unicode.ToString("X") + ""), style); + EditorGUI.LabelField(new Rect(rect.x + 115, rect.y, 120f, 18), unicode <= 0xFFFF ? new GUIContent("UTF16: \\u" + unicode.ToString("X4") + "") : new GUIContent("UTF32: \\U" + unicode.ToString("X8") + ""), style); + EditorGUI.LabelField(new Rect(rect.x, rect.y + 18, 120, 18), new GUIContent("Glyph ID: " + prop_GlyphIndex.intValue + ""), style); + EditorGUI.LabelField(new Rect(rect.x, rect.y + 36, 80, 18), new GUIContent("Scale: " + prop_Scale.floatValue + ""), style); + + // Draw Glyph (if exists) + DrawGlyph(position, property); + } + else // Display editable fields + { + EditorGUIUtility.labelWidth = 55f; + GUI.SetNextControlName("Unicode Input"); + EditorGUI.BeginChangeCheck(); + string unicode = EditorGUI.TextField(new Rect(rect.x, rect.y, 120, 18), "Unicode:", prop_Unicode.intValue.ToString("X")); + + if (GUI.GetNameOfFocusedControl() == "Unicode Input") + { + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F')) + { + Event.current.character = '\0'; + } + } + + if (EditorGUI.EndChangeCheck()) + { + // Update Unicode value + prop_Unicode.intValue = TMP_TextUtilities.StringHexToInt(unicode); + } + + // Cache current glyph index in case it needs to be restored if the new glyph index is invalid. + int currentGlyphIndex = prop_GlyphIndex.intValue; + + EditorGUIUtility.labelWidth = 59f; + EditorGUI.BeginChangeCheck(); + EditorGUI.DelayedIntField(new Rect(rect.x, rect.y + 18, 100, 18), prop_GlyphIndex, new GUIContent("Glyph ID:")); + if (EditorGUI.EndChangeCheck()) + { + // Get a reference to the font asset + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + // Make sure new glyph index is valid. + int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == prop_GlyphIndex.intValue); + + if (elementIndex == -1) + prop_GlyphIndex.intValue = currentGlyphIndex; + else + fontAsset.IsFontAssetLookupTablesDirty = true; + } + + int glyphIndex = prop_GlyphIndex.intValue; + + // Reset glyph selection if new character has been selected. + if (GUI.enabled && m_GlyphSelectedForEditing != glyphIndex) + m_GlyphSelectedForEditing = -1; + + // Display button to edit the glyph data. + if (GUI.Button(new Rect(rect.x + 120, rect.y + 18, 75, 18), new GUIContent("Edit Glyph"))) + { + if (m_GlyphSelectedForEditing == -1) + m_GlyphSelectedForEditing = glyphIndex; + else + m_GlyphSelectedForEditing = -1; + + // Button clicks should not result in potential change. + GUI.changed = false; + } + + // Show the glyph property drawer if selected + if (glyphIndex == m_GlyphSelectedForEditing && GUI.enabled) + { + // Get a reference to the font asset + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset != null) + { + // Get the index of the glyph in the font asset glyph table. + int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == glyphIndex); + + if (elementIndex != -1) + { + SerializedProperty prop_GlyphTable = property.serializedObject.FindProperty("m_GlyphTable"); + SerializedProperty prop_Glyph = prop_GlyphTable.GetArrayElementAtIndex(elementIndex); + + SerializedProperty prop_GlyphMetrics = prop_Glyph.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = prop_Glyph.FindPropertyRelative("m_GlyphRect"); + + Rect newRect = EditorGUILayout.GetControlRect(false, 115); + EditorGUI.DrawRect(new Rect(newRect.x + 52, newRect.y - 20, newRect.width - 52, newRect.height - 5), new Color(0.1f, 0.1f, 0.1f, 0.45f)); + EditorGUI.DrawRect(new Rect(newRect.x + 53, newRect.y - 19, newRect.width - 54, newRect.height - 7), new Color(0.3f, 0.3f, 0.3f, 0.8f)); + + // Display GlyphRect + newRect.x += 55; + newRect.y -= 18; + newRect.width += 5; + EditorGUI.PropertyField(newRect, prop_GlyphRect); + + // Display GlyphMetrics + newRect.y += 45; + EditorGUI.PropertyField(newRect, prop_GlyphMetrics); + + rect.y += 120; + } + } + } + + EditorGUIUtility.labelWidth = 39f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 36, 80, 18), prop_Scale, new GUIContent("Scale:")); + + // Draw Glyph (if exists) + DrawGlyph(position, property); + } + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 58; + } + + void DrawGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the atlas texture + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset == null) + return; + + // Get a reference to the Glyph Table + SerializedProperty prop_GlyphTable = property.serializedObject.FindProperty("m_GlyphTable"); + int glyphIndex = property.FindPropertyRelative("m_GlyphIndex").intValue; + int elementIndex = fontAsset.glyphTable.FindIndex(item => item.index == glyphIndex); + + // Return if we can't find the glyph + if (elementIndex == -1) + return; + + SerializedProperty prop_Glyph = prop_GlyphTable.GetArrayElementAtIndex(elementIndex); + + // Get reference to atlas texture. + int atlasIndex = prop_Glyph.FindPropertyRelative("m_AtlasIndex").intValue; + Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null; + + if (atlasTexture == null) + return; + + Material mat; + if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + mat = TMP_FontAssetEditor.internalBitmapMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetColor(k_ColorProperty, Color.white); + } + else + { + mat = TMP_FontAssetEditor.internalSDFMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1); + } + + // Draw glyph + Rect glyphDrawPosition = new Rect(position.x, position.y, 48, 58); + + SerializedProperty glyphRectProperty = prop_Glyph.FindPropertyRelative("m_GlyphRect"); + + int padding = fontAsset.atlasPadding; + + int glyphOriginX = glyphRectProperty.FindPropertyRelative("m_X").intValue - padding; + int glyphOriginY = glyphRectProperty.FindPropertyRelative("m_Y").intValue - padding; + int glyphWidth = glyphRectProperty.FindPropertyRelative("m_Width").intValue + padding * 2; + int glyphHeight = glyphRectProperty.FindPropertyRelative("m_Height").intValue + padding * 2; + + float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine; + float scale = glyphDrawPosition.width / normalizedHeight; + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height); + + if (Event.current.type == EventType.Repaint) + { + glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2; + glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2; + glyphDrawPosition.width = glyphWidth * scale; + glyphDrawPosition.height = glyphHeight * scale; + + // Could switch to using the default material of the font asset which would require passing scale to the shader. + Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat); + } + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta new file mode 100644 index 0000000..3bf7892 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 01ada73c4792aba4c937ff5d92cce866 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs new file mode 100644 index 0000000..d7ca885 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs @@ -0,0 +1,50 @@ +using UnityEditor; +using UnityEngine; +using System.IO; +using System.Collections; + + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_ColorGradientAssetMenu + { + [MenuItem("Assets/Create/TextMeshPro/Color Gradient", false, 115)] + public static void CreateColorGradient(MenuCommand context) + { + string filePath; + + if (Selection.assetGUIDs.Length == 0) + filePath = "Assets/New TMP Color Gradient.asset"; + else + filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); + + if (Directory.Exists(filePath)) + { + filePath += "/New TMP Color Gradient.asset"; + } + else + { + filePath = Path.GetDirectoryName(filePath) + "/New TMP Color Gradient.asset"; + } + + filePath = AssetDatabase.GenerateUniqueAssetPath(filePath); + + // Create new Color Gradient Asset. + TMP_ColorGradient colorGradient = ScriptableObject.CreateInstance(); + + // Create Asset + AssetDatabase.CreateAsset(colorGradient, filePath); + + //EditorUtility.SetDirty(colorGradient); + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(colorGradient)); + + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(colorGradient); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta new file mode 100644 index 0000000..a2201ee --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d9647b571c5e44729b71d756b3d55317 +timeCreated: 1468187791 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs new file mode 100644 index 0000000..ca79435 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs @@ -0,0 +1,146 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_ColorGradient))] + public class TMP_ColorGradientEditor : Editor + { + SerializedProperty m_ColorMode; + SerializedProperty m_TopLeftColor; + SerializedProperty m_TopRightColor; + SerializedProperty m_BottomLeftColor; + SerializedProperty m_BottomRightColor; + + void OnEnable() + { + m_ColorMode = serializedObject.FindProperty("colorMode"); + m_TopLeftColor = serializedObject.FindProperty("topLeft"); + m_TopRightColor = serializedObject.FindProperty("topRight"); + m_BottomLeftColor = serializedObject.FindProperty("bottomLeft"); + m_BottomRightColor = serializedObject.FindProperty("bottomRight"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_ColorMode, new GUIContent("Color Mode")); + if (EditorGUI.EndChangeCheck()) + { + switch ((ColorMode)m_ColorMode.enumValueIndex) + { + case ColorMode.Single: + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_TopLeftColor.colorValue; + break; + case ColorMode.HorizontalGradient: + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_TopRightColor.colorValue; + break; + case ColorMode.VerticalGradient: + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_BottomLeftColor.colorValue; + break; + } + } + Rect rect; + switch ((ColorMode)m_ColorMode.enumValueIndex) + { + case ColorMode.Single: + EditorGUI.BeginChangeCheck(); + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f); + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + m_BottomRightColor.colorValue = m_TopLeftColor.colorValue; + } + break; + + case ColorMode.HorizontalGradient: + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_BottomLeftColor.colorValue = m_TopLeftColor.colorValue; + } + + rect.x += rect.width; + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_TopRightColor); + if (EditorGUI.EndChangeCheck()) + { + m_BottomRightColor.colorValue = m_TopRightColor.colorValue; + } + break; + + case ColorMode.VerticalGradient: + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f); + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_TopRightColor.colorValue = m_TopLeftColor.colorValue; + } + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / (EditorGUIUtility.wideMode ? 1f : 2f); + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + EditorGUI.BeginChangeCheck(); + TMP_EditorUtility.DrawColorProperty(rect, m_BottomLeftColor); + if (EditorGUI.EndChangeCheck()) + { + m_BottomRightColor.colorValue = m_BottomLeftColor.colorValue; + } + break; + + case ColorMode.FourCornersGradient: + rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + EditorGUI.PrefixLabel(rect, new GUIContent("Colors")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + TMP_EditorUtility.DrawColorProperty(rect, m_TopLeftColor); + rect.x += rect.width; + TMP_EditorUtility.DrawColorProperty(rect, m_TopRightColor); + + rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2)); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + rect.height = EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2); + + TMP_EditorUtility.DrawColorProperty(rect, m_BottomLeftColor); + rect.x += rect.width; + TMP_EditorUtility.DrawColorProperty(rect, m_BottomRightColor); + break; + } + + if (serializedObject.ApplyModifiedProperties()) + TMPro_EventManager.ON_COLOR_GRADIENT_PROPERTY_CHANGED(target as TMP_ColorGradient); + + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta new file mode 100644 index 0000000..dc58116 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fcc60c1d6bb544d9b712b652f418ff3a +timeCreated: 1468400050 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs new file mode 100644 index 0000000..48f8e2b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs @@ -0,0 +1,57 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.UI; +using UnityEngine.UI; + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_Dropdown), true)] + [CanEditMultipleObjects] + public class DropdownEditor : SelectableEditor + { + SerializedProperty m_Template; + SerializedProperty m_CaptionText; + SerializedProperty m_CaptionImage; + SerializedProperty m_Placeholder; + SerializedProperty m_ItemText; + SerializedProperty m_ItemImage; + SerializedProperty m_OnSelectionChanged; + SerializedProperty m_Value; + SerializedProperty m_AlphaFadeSpeed; + SerializedProperty m_Options; + + protected override void OnEnable() + { + base.OnEnable(); + m_Template = serializedObject.FindProperty("m_Template"); + m_CaptionText = serializedObject.FindProperty("m_CaptionText"); + m_CaptionImage = serializedObject.FindProperty("m_CaptionImage"); + m_Placeholder = serializedObject.FindProperty("m_Placeholder"); + m_ItemText = serializedObject.FindProperty("m_ItemText"); + m_ItemImage = serializedObject.FindProperty("m_ItemImage"); + m_OnSelectionChanged = serializedObject.FindProperty("m_OnValueChanged"); + m_Value = serializedObject.FindProperty("m_Value"); + m_AlphaFadeSpeed = serializedObject.FindProperty("m_AlphaFadeSpeed"); + m_Options = serializedObject.FindProperty("m_Options"); + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + EditorGUILayout.Space(); + + serializedObject.Update(); + EditorGUILayout.PropertyField(m_Template); + EditorGUILayout.PropertyField(m_CaptionText); + EditorGUILayout.PropertyField(m_CaptionImage); + EditorGUILayout.PropertyField(m_Placeholder); + EditorGUILayout.PropertyField(m_ItemText); + EditorGUILayout.PropertyField(m_ItemImage); + EditorGUILayout.PropertyField(m_Value); + EditorGUILayout.PropertyField(m_AlphaFadeSpeed); + EditorGUILayout.PropertyField(m_Options); + EditorGUILayout.PropertyField(m_OnSelectionChanged); + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs.meta new file mode 100644 index 0000000..75030cf --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6dbcf248c987476181a37f01a1814975 +timeCreated: 1446377461 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs new file mode 100644 index 0000000..e005603 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + + +namespace TMPro.EditorUtilities +{ + /// + /// Simple implementation of coroutine working in the Unity Editor. + /// + public class TMP_EditorCoroutine + { + //private static Dictionary s_ActiveCoroutines; + + readonly IEnumerator coroutine; + + /// + /// Constructor + /// + /// + TMP_EditorCoroutine(IEnumerator routine) + { + this.coroutine = routine; + } + + + /// + /// Starts a new EditorCoroutine. + /// + /// Coroutine + /// new EditorCoroutine + public static TMP_EditorCoroutine StartCoroutine(IEnumerator routine) + { + TMP_EditorCoroutine coroutine = new TMP_EditorCoroutine(routine); + coroutine.Start(); + + // Add coroutine to tracking list + //if (s_ActiveCoroutines == null) + // s_ActiveCoroutines = new Dictionary(); + + // Add new instance of editor coroutine to dictionary. + //s_ActiveCoroutines.Add(coroutine.GetHashCode(), coroutine); + + return coroutine; + } + + + /// + /// Clear delegate list + /// + //public static void StopAllEditorCoroutines() + //{ + // EditorApplication.update = null; + //} + + + /// + /// Register callback for editor updates + /// + void Start() + { + EditorApplication.update += EditorUpdate; + } + + + /// + /// Unregister callback for editor updates. + /// + public void Stop() + { + if (EditorApplication.update != null) + EditorApplication.update -= EditorUpdate; + + //s_ActiveCoroutines.Remove(this.GetHashCode()); + } + + + /// + /// Delegate function called on editor updates. + /// + void EditorUpdate() + { + // Stop editor coroutine if it does not continue. + if (coroutine.MoveNext() == false) + Stop(); + + // Process the different types of EditorCoroutines. + if (coroutine.Current != null) + { + + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta new file mode 100644 index 0000000..16e03fa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27a0335dab59ec542aadd6636a5b4ebd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs new file mode 100644 index 0000000..a03494f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs @@ -0,0 +1,191 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.Presets; + +namespace TMPro.EditorUtilities +{ + + [CustomEditor(typeof(TextMeshPro), true), CanEditMultipleObjects] + public class TMP_EditorPanel : TMP_BaseEditorPanel + { + static readonly GUIContent k_SortingLayerLabel = new GUIContent("Sorting Layer", "Name of the Renderer's sorting layer."); + static readonly GUIContent k_OrderInLayerLabel = new GUIContent("Order in Layer", "Renderer's order within a sorting layer."); + static readonly GUIContent k_OrthographicLabel = new GUIContent("Orthographic Mode", "Should be enabled when using an orthographic camera. Instructs the shader to not perform any perspective correction."); + static readonly GUIContent k_VolumetricLabel = new GUIContent("Volumetric Setup", "Use cubes rather than quads to render the text. Allows for volumetric rendering when combined with a compatible shader."); + + private static string[] k_SortingLayerNames; + bool IsPreset; + + SerializedProperty m_IsVolumetricTextProp; + SerializedProperty m_IsOrthographicProp; + Renderer m_Renderer; + + protected override void OnEnable() + { + base.OnEnable(); + + // Determine if the inspected object is a Preset + IsPreset = (int)(target as Component).gameObject.hideFlags == 93; + + m_IsOrthographicProp = serializedObject.FindProperty("m_isOrthographic"); + + m_IsVolumetricTextProp = serializedObject.FindProperty("m_isVolumetricText"); + + m_Renderer = m_TextComponent.GetComponent(); + + // Populate Sorting Layer Names + k_SortingLayerNames = SortingLayerHelper.sortingLayerNames; + } + + protected override void DrawExtraSettings() + { + Rect rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Extra Settings"), TMP_UIStyleManager.sectionHeader)) + Foldout.extraSettings = !Foldout.extraSettings; + + GUI.Label(rect, (Foldout.extraSettings ? "" : k_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (Foldout.extraSettings) + { + //EditorGUI.indentLevel += 1; + + DrawMargins(); + + DrawSortingLayer(); + + DrawGeometrySorting(); + + DrawIsTextObjectScaleStatic(); + + DrawOrthographicMode(); + + DrawRichText(); + + DrawParsing(); + + DrawSpriteAsset(); + + DrawStyleSheet(); + + //DrawVolumetricSetup(); + + DrawKerning(); + + DrawPadding(); + + //EditorGUI.indentLevel -= 1; + } + } + + protected void DrawSortingLayer() + { + Undo.RecordObject(m_Renderer, "Sorting Layer Change"); + + EditorGUI.BeginChangeCheck(); + + TextMeshPro textComponent = (TextMeshPro)m_TextComponent; + + // Look up the layer name using the current layer ID + string oldName = IsPreset ? SortingLayer.IDToName(textComponent._SortingLayerID) : SortingLayer.IDToName(textComponent.sortingLayerID); + + // Use the name to look up our array index into the names list + int oldLayerIndex = System.Array.IndexOf(k_SortingLayerNames, oldName); + + // Show the pop-up for the names + EditorGUIUtility.fieldWidth = 0f; + int newLayerIndex = EditorGUILayout.Popup(k_SortingLayerLabel, oldLayerIndex, k_SortingLayerNames); + + // If the index changes, look up the ID for the new index to store as the new ID + if (newLayerIndex != oldLayerIndex) + UpdateTargetsSortingLayerID(SortingLayer.NameToID(k_SortingLayerNames[newLayerIndex])); + + // Get value from internal property if target is a Preset otherwise from the public property + int oldSortingOrder = IsPreset ? textComponent._SortingOrder : textComponent.sortingOrder; + + int newSortingLayerOrder = EditorGUILayout.IntField(k_OrderInLayerLabel, oldSortingOrder); + + if (newSortingLayerOrder != textComponent.sortingOrder) + UpdateTargetsSortingOrder(newSortingLayerOrder); + + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + + EditorGUILayout.Space(); + } + + protected void DrawOrthographicMode() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_IsOrthographicProp, k_OrthographicLabel); + if (EditorGUI.EndChangeCheck()) + m_HavePropertiesChanged = true; + } + + protected void DrawVolumetricSetup() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_IsVolumetricTextProp, k_VolumetricLabel); + if (EditorGUI.EndChangeCheck()) + { + m_HavePropertiesChanged = true; + m_TextComponent.textInfo.ResetVertexLayout(m_IsVolumetricTextProp.boolValue); + } + + EditorGUILayout.Space(); + } + + // Method to handle multi object selection + protected override bool IsMixSelectionTypes() + { + GameObject[] objects = Selection.gameObjects; + if (objects.Length > 1) + { + for (int i = 0; i < objects.Length; i++) + { + if (objects[i].GetComponent() == null) + return true; + } + } + return false; + } + + protected override void OnUndoRedo() + { + int undoEventId = Undo.GetCurrentGroup(); + int lastUndoEventId = s_EventId; + + if (undoEventId != lastUndoEventId) + { + for (int i = 0; i < targets.Length; i++) + { + //Debug.Log("Undo & Redo Performed detected in Editor Panel. Event ID:" + Undo.GetCurrentGroup()); + TMPro_EventManager.ON_TEXTMESHPRO_PROPERTY_CHANGED(true, targets[i] as TextMeshPro); + s_EventId = undoEventId; + } + } + } + + void UpdateTargetsSortingLayerID(int sortingLayerID) + { + for (int i = 0; i < targets.Length; i++) + { + var textComponent = (TextMeshPro)targets[i]; + + if (textComponent != null) + textComponent.sortingLayerID = sortingLayerID; + } + } + + void UpdateTargetsSortingOrder(int sortingOrder) + { + for (int i = 0; i < targets.Length; i++) + { + var textComponent = (TextMeshPro)targets[i]; + + if (textComponent != null) + textComponent.sortingOrder = sortingOrder; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs.meta new file mode 100644 index 0000000..54fd804 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 34f6695d37a94370a3697f6b068f5d5e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs new file mode 100644 index 0000000..c508546 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs @@ -0,0 +1,124 @@ +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + + [CustomEditor(typeof(TextMeshProUGUI), true), CanEditMultipleObjects] + public class TMP_EditorPanelUI : TMP_BaseEditorPanel + { + static readonly GUIContent k_RaycastTargetLabel = new GUIContent("Raycast Target", "Whether the text blocks raycasts from the Graphic Raycaster."); + static readonly GUIContent k_MaskableLabel = new GUIContent("Maskable", "Determines if the text object will be affected by UI Mask."); + + SerializedProperty m_RaycastTargetProp; + private SerializedProperty m_MaskableProp; + + protected override void OnEnable() + { + base.OnEnable(); + m_RaycastTargetProp = serializedObject.FindProperty("m_RaycastTarget"); + m_MaskableProp = serializedObject.FindProperty("m_Maskable"); + } + + protected override void DrawExtraSettings() + { + Rect rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Extra Settings"), TMP_UIStyleManager.sectionHeader)) + Foldout.extraSettings = !Foldout.extraSettings; + + GUI.Label(rect, (Foldout.extraSettings ? k_UiStateLabel[0] : k_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + if (Foldout.extraSettings) + { + //EditorGUI.indentLevel += 1; + + DrawMargins(); + + DrawGeometrySorting(); + + DrawIsTextObjectScaleStatic(); + + DrawRichText(); + + DrawRaycastTarget(); + + DrawMaskable(); + + DrawParsing(); + + DrawSpriteAsset(); + + DrawStyleSheet(); + + DrawKerning(); + + DrawPadding(); + + //EditorGUI.indentLevel -= 1; + } + } + + protected void DrawRaycastTarget() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_RaycastTargetProp, k_RaycastTargetLabel); + if (EditorGUI.EndChangeCheck()) + { + // Change needs to propagate to the child sub objects. + Graphic[] graphicComponents = m_TextComponent.GetComponentsInChildren(); + for (int i = 1; i < graphicComponents.Length; i++) + graphicComponents[i].raycastTarget = m_RaycastTargetProp.boolValue; + + m_HavePropertiesChanged = true; + } + } + + protected void DrawMaskable() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_MaskableProp, k_MaskableLabel); + if (EditorGUI.EndChangeCheck()) + { + m_TextComponent.maskable = m_MaskableProp.boolValue; + + // Change needs to propagate to the child sub objects. + MaskableGraphic[] maskableGraphics = m_TextComponent.GetComponentsInChildren(); + for (int i = 1; i < maskableGraphics.Length; i++) + maskableGraphics[i].maskable = m_MaskableProp.boolValue; + + m_HavePropertiesChanged = true; + } + } + + // Method to handle multi object selection + protected override bool IsMixSelectionTypes() + { + GameObject[] objects = Selection.gameObjects; + if (objects.Length > 1) + { + for (int i = 0; i < objects.Length; i++) + { + if (objects[i].GetComponent() == null) + return true; + } + } + return false; + } + protected override void OnUndoRedo() + { + int undoEventId = Undo.GetCurrentGroup(); + int lastUndoEventId = s_EventId; + + if (undoEventId != lastUndoEventId) + { + for (int i = 0; i < targets.Length; i++) + { + //Debug.Log("Undo & Redo Performed detected in Editor Panel. Event ID:" + Undo.GetCurrentGroup()); + TMPro_EventManager.ON_TEXTMESHPRO_UGUI_PROPERTY_CHANGED(true, targets[i] as TextMeshProUGUI); + s_EventId = undoEventId; + } + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs.meta new file mode 100644 index 0000000..ea3b36b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 21c0044a7f964773be90d197a78e4703 +timeCreated: 1443571501 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs new file mode 100644 index 0000000..8869dd3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs @@ -0,0 +1,451 @@ +using UnityEngine; +using UnityEditor; +using System.Text; +using System.IO; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_EditorUtility + { + /// + /// Returns the relative path of the package. + /// + public static string packageRelativePath + { + get + { + if (string.IsNullOrEmpty(m_PackagePath)) + m_PackagePath = GetPackageRelativePath(); + + return m_PackagePath; + } + } + [SerializeField] + private static string m_PackagePath; + + /// + /// Returns the fully qualified path of the package. + /// + public static string packageFullPath + { + get + { + if (string.IsNullOrEmpty(m_PackageFullPath)) + m_PackageFullPath = GetPackageFullPath(); + + return m_PackageFullPath; + } + } + [SerializeField] + private static string m_PackageFullPath; + + + // Static Fields Related to locating the TextMesh Pro Asset + private static string folderPath = "Not Found"; + + private static EditorWindow Gameview; + private static bool isInitialized = false; + + private static void GetGameview() + { + System.Reflection.Assembly assembly = typeof(UnityEditor.EditorWindow).Assembly; + System.Type type = assembly.GetType("UnityEditor.GameView"); + Gameview = EditorWindow.GetWindow(type); + } + + + public static void RepaintAll() + { + if (isInitialized == false) + { + GetGameview(); + isInitialized = true; + } + + SceneView.RepaintAll(); + Gameview.Repaint(); + } + + + /// + /// Create and return a new asset in a smart location based on the current selection and then select it. + /// + /// + /// Name of the new asset. Do not include the .asset extension. + /// + /// + /// The new asset. + /// + public static T CreateAsset(string name) where T : ScriptableObject + { + string path = AssetDatabase.GetAssetPath(Selection.activeObject); + if (path.Length == 0) + { + // no asset selected, place in asset root + path = "Assets/" + name + ".asset"; + } + else if (Directory.Exists(path)) + { + // place in currently selected directory + path += "/" + name + ".asset"; + } + else { + // place in current selection's containing directory + path = Path.GetDirectoryName(path) + "/" + name + ".asset"; + } + T asset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(asset, AssetDatabase.GenerateUniqueAssetPath(path)); + EditorUtility.FocusProjectWindow(); + Selection.activeObject = asset; + return asset; + } + + + + // Function used to find all materials which reference a font atlas so we can update all their references. + public static Material[] FindMaterialReferences(TMP_FontAsset fontAsset) + { + List refs = new List(); + Material mat = fontAsset.material; + refs.Add(mat); + + // Get materials matching the search pattern. + string searchPattern = "t:Material" + " " + fontAsset.name.Split(new char[] { ' ' })[0]; + string[] materialAssetGUIDs = AssetDatabase.FindAssets(searchPattern); + + for (int i = 0; i < materialAssetGUIDs.Length; i++) + { + string materialPath = AssetDatabase.GUIDToAssetPath(materialAssetGUIDs[i]); + Material targetMaterial = AssetDatabase.LoadAssetAtPath(materialPath); + + if (targetMaterial.HasProperty(ShaderUtilities.ID_MainTex) && targetMaterial.GetTexture(ShaderUtilities.ID_MainTex) != null && mat.GetTexture(ShaderUtilities.ID_MainTex) != null && targetMaterial.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID() == mat.GetTexture(ShaderUtilities.ID_MainTex).GetInstanceID()) + { + if (!refs.Contains(targetMaterial)) + refs.Add(targetMaterial); + } + else + { + // TODO: Find a more efficient method to unload resources. + //Resources.UnloadAsset(targetMaterial.GetTexture(ShaderUtilities.ID_MainTex)); + } + } + + return refs.ToArray(); + } + + + // Function used to find the Font Asset which matches the given Material Preset and Font Atlas Texture. + public static TMP_FontAsset FindMatchingFontAsset(Material mat) + { + if (mat.GetTexture(ShaderUtilities.ID_MainTex) == null) return null; + + // Find the dependent assets of this material. + string[] dependentAssets = AssetDatabase.GetDependencies(AssetDatabase.GetAssetPath(mat), false); + + for (int i = 0; i < dependentAssets.Length; i++) + { + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(dependentAssets[i]); + if (fontAsset != null) + return fontAsset; + } + + return null; + } + + + private static string GetPackageRelativePath() + { + // Check for potential UPM package + string packagePath = Path.GetFullPath("Packages/com.unity.textmeshpro"); + if (Directory.Exists(packagePath)) + { + return "Packages/com.unity.textmeshpro"; + } + + packagePath = Path.GetFullPath("Assets/.."); + if (Directory.Exists(packagePath)) + { + // Search default location for development package + if (Directory.Exists(packagePath + "/Assets/Packages/com.unity.TextMeshPro/Editor Resources")) + { + return "Assets/Packages/com.unity.TextMeshPro"; + } + + // Search for default location of normal TextMesh Pro AssetStore package + if (Directory.Exists(packagePath + "/Assets/TextMesh Pro/Editor Resources")) + { + return "Assets/TextMesh Pro"; + } + + // Search for potential alternative locations in the user project + string[] matchingPaths = Directory.GetDirectories(packagePath, "TextMesh Pro", SearchOption.AllDirectories); + packagePath = ValidateLocation(matchingPaths, packagePath); + if (packagePath != null) return packagePath; + } + + return null; + } + + private static string GetPackageFullPath() + { + // Check for potential UPM package + string packagePath = Path.GetFullPath("Packages/com.unity.textmeshpro"); + if (Directory.Exists(packagePath)) + { + return packagePath; + } + + packagePath = Path.GetFullPath("Assets/.."); + if (Directory.Exists(packagePath)) + { + // Search default location for development package + if (Directory.Exists(packagePath + "/Assets/Packages/com.unity.TextMeshPro/Editor Resources")) + { + return packagePath + "/Assets/Packages/com.unity.TextMeshPro"; + } + + // Search for default location of normal TextMesh Pro AssetStore package + if (Directory.Exists(packagePath + "/Assets/TextMesh Pro/Editor Resources")) + { + return packagePath + "/Assets/TextMesh Pro"; + } + + // Search for potential alternative locations in the user project + string[] matchingPaths = Directory.GetDirectories(packagePath, "TextMesh Pro", SearchOption.AllDirectories); + string path = ValidateLocation(matchingPaths, packagePath); + if (path != null) return packagePath + path; + } + + return null; + } + + + /// + /// Method to validate the location of the asset folder by making sure the GUISkins folder exists. + /// + /// + /// + private static string ValidateLocation(string[] paths, string projectPath) + { + for (int i = 0; i < paths.Length; i++) + { + // Check if any of the matching directories contain a GUISkins directory. + if (Directory.Exists(paths[i] + "/Editor Resources")) + { + folderPath = paths[i].Replace(projectPath, ""); + folderPath = folderPath.TrimStart('\\', '/'); + return folderPath; + } + } + + return null; + } + + + /// + /// Function which returns a string containing a sequence of Decimal character ranges. + /// + /// + /// + public static string GetDecimalCharacterSequence(int[] characterSet) + { + if (characterSet == null || characterSet.Length == 0) + return string.Empty; + + string characterSequence = string.Empty; + int count = characterSet.Length; + int first = characterSet[0]; + int last = first; + + for (int i = 1; i < count; i++) + { + if (characterSet[i - 1] + 1 == characterSet[i]) + { + last = characterSet[i]; + } + else + { + if (first == last) + characterSequence += first + ","; + else + characterSequence += first + "-" + last + ","; + + first = last = characterSet[i]; + } + + } + + // handle the final group + if (first == last) + characterSequence += first; + else + characterSequence += first + "-" + last; + + return characterSequence; + } + + + /// + /// Function which returns a string containing a sequence of Unicode (Hex) character ranges. + /// + /// + /// + public static string GetUnicodeCharacterSequence(int[] characterSet) + { + if (characterSet == null || characterSet.Length == 0) + return string.Empty; + + string characterSequence = string.Empty; + int count = characterSet.Length; + int first = characterSet[0]; + int last = first; + + for (int i = 1; i < count; i++) + { + if (characterSet[i - 1] + 1 == characterSet[i]) + { + last = characterSet[i]; + } + else + { + if (first == last) + characterSequence += first.ToString("X2") + ","; + else + characterSequence += first.ToString("X2") + "-" + last.ToString("X2") + ","; + + first = last = characterSet[i]; + } + + } + + // handle the final group + if (first == last) + characterSequence += first.ToString("X2"); + else + characterSequence += first.ToString("X2") + "-" + last.ToString("X2"); + + return characterSequence; + } + + + /// + /// + /// + /// + /// + /// + public static void DrawBox(Rect rect, float thickness, Color color) + { + EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + thickness, rect.width + thickness * 2, thickness), color); + EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + thickness, thickness, rect.height - thickness * 2), color); + EditorGUI.DrawRect(new Rect(rect.x - thickness, rect.y + rect.height - thickness * 2, rect.width + thickness * 2, thickness), color); + EditorGUI.DrawRect(new Rect(rect.x + rect.width, rect.y + thickness, thickness, rect.height - thickness * 2), color); + } + + + /// + /// Function to return the horizontal alignment grid value. + /// + /// + /// + public static int GetHorizontalAlignmentGridValue(int value) + { + if ((value & 0x1) == 0x1) + return 0; + else if ((value & 0x2) == 0x2) + return 1; + else if ((value & 0x4) == 0x4) + return 2; + else if ((value & 0x8) == 0x8) + return 3; + else if ((value & 0x10) == 0x10) + return 4; + else if ((value & 0x20) == 0x20) + return 5; + + return 0; + } + + /// + /// Function to return the vertical alignment grid value. + /// + /// + /// + public static int GetVerticalAlignmentGridValue(int value) + { + if ((value & 0x100) == 0x100) + return 0; + if ((value & 0x200) == 0x200) + return 1; + if ((value & 0x400) == 0x400) + return 2; + if ((value & 0x800) == 0x800) + return 3; + if ((value & 0x1000) == 0x1000) + return 4; + if ((value & 0x2000) == 0x2000) + return 5; + + return 0; + } + + public static void DrawColorProperty(Rect rect, SerializedProperty property) + { + int oldIndent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + if (EditorGUIUtility.wideMode) + { + EditorGUI.PropertyField(new Rect(rect.x, rect.y, 50f, rect.height), property, GUIContent.none); + rect.x += 50f; + rect.width = Mathf.Min(100f, rect.width - 55f); + } + else + { + rect.height /= 2f; + rect.width = Mathf.Min(100f, rect.width - 5f); + EditorGUI.PropertyField(rect, property, GUIContent.none); + rect.y += rect.height; + } + + EditorGUI.BeginChangeCheck(); + string colorString = EditorGUI.TextField(rect, string.Format("#{0}", ColorUtility.ToHtmlStringRGBA(property.colorValue))); + if (EditorGUI.EndChangeCheck()) + { + Color color; + if (ColorUtility.TryParseHtmlString(colorString, out color)) + { + property.colorValue = color; + } + } + EditorGUI.indentLevel = oldIndent; + } + + public static bool EditorToggle(Rect position, bool value, GUIContent content, GUIStyle style) + { + var id = GUIUtility.GetControlID(content, FocusType.Keyboard, position); + var evt = Event.current; + + // Toggle selected toggle on space or return key + if (GUIUtility.keyboardControl == id && evt.type == EventType.KeyDown && (evt.keyCode == KeyCode.Space || evt.keyCode == KeyCode.Return || evt.keyCode == KeyCode.KeypadEnter)) + { + value = !value; + evt.Use(); + GUI.changed = true; + } + + if (evt.type == EventType.MouseDown && position.Contains(Event.current.mousePosition)) + { + GUIUtility.keyboardControl = id; + EditorGUIUtility.editingTextField = false; + HandleUtility.Repaint(); + } + + return GUI.Toggle(position, id, value, content, style); + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs.meta new file mode 100644 index 0000000..5088b1b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2300e75732d74890b38a8ff257a3ae15 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs new file mode 100644 index 0000000..8cf9a79 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs @@ -0,0 +1,1717 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor.TextCore.LowLevel; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_FontWeightPair))] + public class FontWeightDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_regular = property.FindPropertyRelative("regularTypeface"); + SerializedProperty prop_italic = property.FindPropertyRelative("italicTypeface"); + + float width = position.width; + + position.width = EditorGUIUtility.labelWidth; + EditorGUI.LabelField(position, label); + + int oldIndent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 0; + + // NORMAL TYPEFACE + if (label.text[0] == '4') GUI.enabled = false; + position.x += position.width; position.width = (width - position.width) / 2; + EditorGUI.PropertyField(position, prop_regular, GUIContent.none); + + // ITALIC TYPEFACE + GUI.enabled = true; + position.x += position.width; + EditorGUI.PropertyField(position, prop_italic, GUIContent.none); + + EditorGUI.indentLevel = oldIndent; + } + } + + [CustomEditor(typeof(TMP_FontAsset))] + public class TMP_FontAssetEditor : Editor + { + private struct UI_PanelState + { + public static bool faceInfoPanel = true; + public static bool generationSettingsPanel = true; + public static bool fontAtlasInfoPanel = true; + public static bool fontWeightPanel = true; + public static bool fallbackFontAssetPanel = true; + public static bool glyphTablePanel = false; + public static bool characterTablePanel = false; + public static bool fontFeatureTablePanel = false; + } + + private struct AtlasSettings + { + public GlyphRenderMode glyphRenderMode; + public int pointSize; + public int padding; + public int atlasWidth; + public int atlasHeight; + } + + /// + /// Material used to display SDF glyphs in the Character and Glyph tables. + /// + internal static Material internalSDFMaterial + { + get + { + if (s_InternalSDFMaterial == null) + { + Shader shader = Shader.Find("Hidden/TMP/Internal/Editor/Distance Field SSD"); + + if (shader != null) + s_InternalSDFMaterial = new Material(shader); + } + + return s_InternalSDFMaterial; + } + } + static Material s_InternalSDFMaterial; + + /// + /// Material used to display Bitmap glyphs in the Character and Glyph tables. + /// + internal static Material internalBitmapMaterial + { + get + { + if (s_InternalBitmapMaterial == null) + { + Shader shader = Shader.Find("Hidden/Internal-GUITextureClipText"); + + if (shader != null) + s_InternalBitmapMaterial = new Material(shader); + } + + return s_InternalBitmapMaterial; + } + } + static Material s_InternalBitmapMaterial; + + private static string[] s_UiStateLabel = new string[] { "(Click to collapse) ", "(Click to expand) " }; + private GUIContent[] m_AtlasResolutionLabels = { new GUIContent("8"), new GUIContent("16"), new GUIContent("32"), new GUIContent("64"), new GUIContent("128"), new GUIContent("256"), new GUIContent("512"), new GUIContent("1024"), new GUIContent("2048"), new GUIContent("4096"), new GUIContent("8192") }; + private int[] m_AtlasResolutions = { 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; + + private struct Warning + { + public bool isEnabled; + public double expirationTime; + } + + private int m_CurrentGlyphPage = 0; + private int m_CurrentCharacterPage = 0; + private int m_CurrentKerningPage = 0; + + private int m_SelectedGlyphRecord = -1; + private int m_SelectedCharacterRecord = -1; + private int m_SelectedAdjustmentRecord = -1; + + private string m_dstGlyphID; + private string m_dstUnicode; + private const string k_placeholderUnicodeHex = "New Unicode (Hex)"; + private string m_unicodeHexLabel = k_placeholderUnicodeHex; + private const string k_placeholderGlyphID = "New Glyph ID"; + private string m_GlyphIDLabel = k_placeholderGlyphID; + + private Warning m_AddGlyphWarning; + private Warning m_AddCharacterWarning; + private bool m_DisplayDestructiveChangeWarning; + private AtlasSettings m_AtlasSettings; + private bool m_MaterialPresetsRequireUpdate; + + private string m_GlyphSearchPattern; + private List m_GlyphSearchList; + + private string m_CharacterSearchPattern; + private List m_CharacterSearchList; + + private string m_KerningTableSearchPattern; + private List m_KerningTableSearchList; + + private bool m_isSearchDirty; + + private const string k_UndoRedo = "UndoRedoPerformed"; + + private SerializedProperty m_AtlasPopulationMode_prop; + private SerializedProperty font_atlas_prop; + private SerializedProperty font_material_prop; + + private SerializedProperty m_AtlasRenderMode_prop; + private SerializedProperty m_SamplingPointSize_prop; + private SerializedProperty m_AtlasPadding_prop; + private SerializedProperty m_AtlasWidth_prop; + private SerializedProperty m_AtlasHeight_prop; + private SerializedProperty m_IsMultiAtlasTexturesEnabled_prop; + + private SerializedProperty fontWeights_prop; + + //private SerializedProperty fallbackFontAssets_prop; + private ReorderableList m_list; + + private SerializedProperty font_normalStyle_prop; + private SerializedProperty font_normalSpacing_prop; + + private SerializedProperty font_boldStyle_prop; + private SerializedProperty font_boldSpacing_prop; + + private SerializedProperty font_italicStyle_prop; + private SerializedProperty font_tabSize_prop; + + private SerializedProperty m_FaceInfo_prop; + private SerializedProperty m_GlyphTable_prop; + private SerializedProperty m_CharacterTable_prop; + + private TMP_FontFeatureTable m_FontFeatureTable; + private SerializedProperty m_FontFeatureTable_prop; + private SerializedProperty m_GlyphPairAdjustmentRecords_prop; + + private TMP_SerializedPropertyHolder m_SerializedPropertyHolder; + private SerializedProperty m_EmptyGlyphPairAdjustmentRecord_prop; + + private TMP_FontAsset m_fontAsset; + + private Material[] m_materialPresets; + + private bool isAssetDirty = false; + + private int errorCode; + + private System.DateTime timeStamp; + + + public void OnEnable() + { + m_FaceInfo_prop = serializedObject.FindProperty("m_FaceInfo"); + + font_atlas_prop = serializedObject.FindProperty("m_AtlasTextures").GetArrayElementAtIndex(0); + font_material_prop = serializedObject.FindProperty("material"); + + m_AtlasPopulationMode_prop = serializedObject.FindProperty("m_AtlasPopulationMode"); + m_AtlasRenderMode_prop = serializedObject.FindProperty("m_AtlasRenderMode"); + m_SamplingPointSize_prop = m_FaceInfo_prop.FindPropertyRelative("m_PointSize"); + m_AtlasPadding_prop = serializedObject.FindProperty("m_AtlasPadding"); + m_AtlasWidth_prop = serializedObject.FindProperty("m_AtlasWidth"); + m_AtlasHeight_prop = serializedObject.FindProperty("m_AtlasHeight"); + m_IsMultiAtlasTexturesEnabled_prop = serializedObject.FindProperty("m_IsMultiAtlasTexturesEnabled"); + + fontWeights_prop = serializedObject.FindProperty("m_FontWeightTable"); + + m_list = new ReorderableList(serializedObject, serializedObject.FindProperty("m_FallbackFontAssetTable"), true, true, true, true); + + m_list.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + var element = m_list.serializedProperty.GetArrayElementAtIndex(index); + rect.y += 2; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none); + }; + + m_list.drawHeaderCallback = rect => + { + EditorGUI.LabelField(rect, "Fallback List"); + }; + + // Clean up fallback list in the event if contains null elements. + CleanFallbackFontAssetTable(); + + font_normalStyle_prop = serializedObject.FindProperty("normalStyle"); + font_normalSpacing_prop = serializedObject.FindProperty("normalSpacingOffset"); + + font_boldStyle_prop = serializedObject.FindProperty("boldStyle"); + font_boldSpacing_prop = serializedObject.FindProperty("boldSpacing"); + + font_italicStyle_prop = serializedObject.FindProperty("italicStyle"); + font_tabSize_prop = serializedObject.FindProperty("tabSize"); + + m_CharacterTable_prop = serializedObject.FindProperty("m_CharacterTable"); + m_GlyphTable_prop = serializedObject.FindProperty("m_GlyphTable"); + + m_FontFeatureTable_prop = serializedObject.FindProperty("m_FontFeatureTable"); + m_GlyphPairAdjustmentRecords_prop = m_FontFeatureTable_prop.FindPropertyRelative("m_GlyphPairAdjustmentRecords"); + + m_fontAsset = target as TMP_FontAsset; + m_FontFeatureTable = m_fontAsset.fontFeatureTable; + + // Upgrade Font Feature Table if necessary + if (m_fontAsset.m_KerningTable != null && m_fontAsset.m_KerningTable.kerningPairs != null && m_fontAsset.m_KerningTable.kerningPairs.Count > 0) + m_fontAsset.ReadFontAssetDefinition(); + + // Create serialized object to allow us to use a serialized property of an empty kerning pair. + m_SerializedPropertyHolder = CreateInstance(); + m_SerializedPropertyHolder.fontAsset = m_fontAsset; + SerializedObject internalSerializedObject = new SerializedObject(m_SerializedPropertyHolder); + m_EmptyGlyphPairAdjustmentRecord_prop = internalSerializedObject.FindProperty("glyphPairAdjustmentRecord"); + + m_materialPresets = TMP_EditorUtility.FindMaterialReferences(m_fontAsset); + + m_GlyphSearchList = new List(); + m_KerningTableSearchList = new List(); + + // Sort Font Asset Tables + m_fontAsset.SortAllTables(); + } + + + public void OnDisable() + { + // Revert changes if user closes or changes selection without having made a choice. + if (m_DisplayDestructiveChangeWarning) + { + m_DisplayDestructiveChangeWarning = false; + RestoreAtlasGenerationSettings(); + GUIUtility.keyboardControl = 0; + + serializedObject.ApplyModifiedProperties(); + } + } + + + public override void OnInspectorGUI() + { + //Debug.Log("OnInspectorGUI Called."); + + Event currentEvent = Event.current; + + serializedObject.Update(); + + Rect rect = EditorGUILayout.GetControlRect(false, 24); + float labelWidth = EditorGUIUtility.labelWidth; + float fieldWidth = EditorGUIUtility.fieldWidth; + + // FACE INFO PANEL + #region Face info + GUI.Label(rect, new GUIContent("Face Info - v" + m_fontAsset.version), TMP_UIStyleManager.sectionHeader); + + rect.x += rect.width - 132f; + rect.y += 2; + rect.width = 130f; + rect.height = 18f; + if (GUI.Button(rect, new GUIContent("Update Atlas Texture"))) + { + TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(target as TMP_FontAsset); + } + + EditorGUI.indentLevel = 1; + GUI.enabled = false; // Lock UI + + // TODO : Consider creating a property drawer for these. + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_FamilyName")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_StyleName")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_PointSize")); + + GUI.enabled = true; + + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_Scale")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_LineHeight")); + + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_AscentLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_CapLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_MeanLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_Baseline")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_DescentLine")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_UnderlineOffset")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_UnderlineThickness")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_StrikethroughOffset")); + //EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("strikethroughThickness")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SuperscriptOffset")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SuperscriptSize")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SubscriptOffset")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_SubscriptSize")); + EditorGUILayout.PropertyField(m_FaceInfo_prop.FindPropertyRelative("m_TabWidth")); + // TODO : Add clamping for some of these values. + //subSize_prop.floatValue = Mathf.Clamp(subSize_prop.floatValue, 0.25f, 1f); + + EditorGUILayout.Space(); + #endregion + + // GENERATION SETTINGS + #region Generation Settings + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Generation Settings"), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.generationSettingsPanel = !UI_PanelState.generationSettingsPanel; + + GUI.Label(rect, (UI_PanelState.generationSettingsPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.generationSettingsPanel) + { + EditorGUI.indentLevel = 1; + + EditorGUI.BeginChangeCheck(); + Font sourceFont = (Font)EditorGUILayout.ObjectField("Source Font File", m_fontAsset.m_SourceFontFile_EditorRef, typeof(Font), false); + if (EditorGUI.EndChangeCheck()) + { + string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(sourceFont)); + m_fontAsset.m_SourceFontFileGUID = guid; + m_fontAsset.m_SourceFontFile_EditorRef = sourceFont; + } + + EditorGUI.BeginDisabledGroup(sourceFont == null); + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_AtlasPopulationMode_prop, new GUIContent("Atlas Population Mode")); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + + bool isDatabaseRefreshRequired = false; + + if (m_AtlasPopulationMode_prop.intValue == 0) + { + m_fontAsset.sourceFontFile = null; + + //Set atlas textures to non readable. + for (int i = 0; i < m_fontAsset.atlasTextures.Length; i++) + { + Texture2D tex = m_fontAsset.atlasTextures[i]; + + if (tex != null && tex.isReadable) + FontEngineEditorUtilities.SetAtlasTextureIsReadable(tex, false); + } + + Debug.Log("Atlas Population mode set to [Static]."); + } + else if (m_AtlasPopulationMode_prop.intValue == 1) + { + if (m_fontAsset.m_SourceFontFile_EditorRef.dynamic == false) + { + Debug.LogWarning("Please set the [" + m_fontAsset.name + "] font to dynamic mode as this is required for Dynamic SDF support.", m_fontAsset.m_SourceFontFile_EditorRef); + m_AtlasPopulationMode_prop.intValue = 0; + + serializedObject.ApplyModifiedProperties(); + } + else + { + m_fontAsset.sourceFontFile = m_fontAsset.m_SourceFontFile_EditorRef; + + // Set atlas textures to non readable. + for (int i = 0; i < m_fontAsset.atlasTextures.Length; i++) + { + Texture2D tex = m_fontAsset.atlasTextures[i]; + + if (tex != null && tex.isReadable == false) + FontEngineEditorUtilities.SetAtlasTextureIsReadable(tex, true); + } + + Debug.Log("Atlas Population mode set to [Dynamic]."); + } + } + + if (isDatabaseRefreshRequired) + AssetDatabase.Refresh(); + + serializedObject.Update(); + isAssetDirty = true; + } + + // Save state of atlas settings + if (m_DisplayDestructiveChangeWarning == false) + { + SavedAtlasGenerationSettings(); + //Undo.RegisterCompleteObjectUndo(m_fontAsset, "Font Asset Changes"); + } + + EditorGUI.BeginDisabledGroup(m_AtlasPopulationMode_prop.intValue == (int)AtlasPopulationMode.Static); + { + EditorGUI.BeginChangeCheck(); + // TODO: Switch shaders depending on GlyphRenderMode. + EditorGUILayout.PropertyField(m_AtlasRenderMode_prop); + EditorGUILayout.PropertyField(m_SamplingPointSize_prop, new GUIContent("Sampling Point Size")); + if (EditorGUI.EndChangeCheck()) + { + m_DisplayDestructiveChangeWarning = true; + } + + // Changes to these properties require updating Material Presets for this font asset. + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_AtlasPadding_prop, new GUIContent("Padding")); + EditorGUILayout.IntPopup(m_AtlasWidth_prop, m_AtlasResolutionLabels, m_AtlasResolutions, new GUIContent("Atlas Width")); + EditorGUILayout.IntPopup(m_AtlasHeight_prop, m_AtlasResolutionLabels, m_AtlasResolutions, new GUIContent("Atlas Height")); + EditorGUILayout.PropertyField(m_IsMultiAtlasTexturesEnabled_prop, new GUIContent("Multi Atlas Textures", "Determines if the font asset will store glyphs in multiple atlas textures.")); + if (EditorGUI.EndChangeCheck()) + { + m_MaterialPresetsRequireUpdate = true; + m_DisplayDestructiveChangeWarning = true; + } + + if (m_DisplayDestructiveChangeWarning) + { + // These changes are destructive on the font asset + rect = EditorGUILayout.GetControlRect(false, 60); + rect.x += 15; + rect.width -= 15; + EditorGUI.HelpBox(rect, "Changing these settings will clear the font asset's character, glyph and texture data.", MessageType.Warning); + + if (GUI.Button(new Rect(rect.width - 140, rect.y + 36, 80, 18), new GUIContent("Apply"))) + { + m_DisplayDestructiveChangeWarning = false; + + // Update face info is sampling point size was changed. + if (m_AtlasSettings.pointSize != m_SamplingPointSize_prop.intValue) + { + FontEngine.LoadFontFace(m_fontAsset.sourceFontFile, m_SamplingPointSize_prop.intValue); + m_fontAsset.faceInfo = FontEngine.GetFaceInfo(); + } + + // Update material + m_fontAsset.material.SetFloat(ShaderUtilities.ID_TextureWidth, m_AtlasWidth_prop.intValue); + m_fontAsset.material.SetFloat(ShaderUtilities.ID_TextureHeight, m_AtlasHeight_prop.intValue); + m_fontAsset.material.SetFloat(ShaderUtilities.ID_GradientScale, m_AtlasPadding_prop.intValue + 1); + + // Update material presets if any of the relevant properties have been changed. + if (m_MaterialPresetsRequireUpdate) + { + m_MaterialPresetsRequireUpdate = false; + + Material[] materialPresets = TMP_EditorUtility.FindMaterialReferences(m_fontAsset); + for (int i = 0; i < materialPresets.Length; i++) + { + Material mat = materialPresets[i]; + + mat.SetFloat(ShaderUtilities.ID_TextureWidth, m_AtlasWidth_prop.intValue); + mat.SetFloat(ShaderUtilities.ID_TextureHeight, m_AtlasHeight_prop.intValue); + mat.SetFloat(ShaderUtilities.ID_GradientScale, m_AtlasPadding_prop.intValue + 1); + } + } + + m_fontAsset.UpdateFontAssetData(); + GUIUtility.keyboardControl = 0; + isAssetDirty = true; + + // Update Font Asset Creation Settings to reflect new changes. + UpdateFontAssetCreationSettings(); + + // TODO: Clear undo buffers. + //Undo.ClearUndo(m_fontAsset); + } + + if (GUI.Button(new Rect(rect.width - 56, rect.y + 36, 80, 18), new GUIContent("Revert"))) + { + m_DisplayDestructiveChangeWarning = false; + RestoreAtlasGenerationSettings(); + GUIUtility.keyboardControl = 0; + + // TODO: Clear undo buffers. + //Undo.ClearUndo(m_fontAsset); + } + } + } + EditorGUI.EndDisabledGroup(); + } + EditorGUI.EndDisabledGroup(); + EditorGUILayout.Space(); + } + #endregion + + // ATLAS & MATERIAL PANEL + #region Atlas & Material + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Atlas & Material"), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fontAtlasInfoPanel = !UI_PanelState.fontAtlasInfoPanel; + + GUI.Label(rect, (UI_PanelState.fontAtlasInfoPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fontAtlasInfoPanel) + { + EditorGUI.indentLevel = 1; + + GUI.enabled = false; + EditorGUILayout.PropertyField(font_atlas_prop, new GUIContent("Font Atlas")); + EditorGUILayout.PropertyField(font_material_prop, new GUIContent("Font Material")); + GUI.enabled = true; + EditorGUILayout.Space(); + } + #endregion + + string evt_cmd = Event.current.commandName; // Get Current Event CommandName to check for Undo Events + + // FONT WEIGHT PANEL + #region Font Weights + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Font Weights", "The Font Assets that will be used for different font weights and the settings used to simulate a typeface when no asset is available."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fontWeightPanel = !UI_PanelState.fontWeightPanel; + + GUI.Label(rect, (UI_PanelState.fontWeightPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fontWeightPanel) + { + EditorGUIUtility.labelWidth *= 0.75f; + EditorGUIUtility.fieldWidth *= 0.25f; + + EditorGUILayout.BeginVertical(); + EditorGUI.indentLevel = 1; + rect = EditorGUILayout.GetControlRect(true); + rect.x += EditorGUIUtility.labelWidth; + rect.width = (rect.width - EditorGUIUtility.labelWidth) / 2f; + GUI.Label(rect, "Regular Typeface", EditorStyles.label); + rect.x += rect.width; + GUI.Label(rect, "Italic Typeface", EditorStyles.label); + + EditorGUI.indentLevel = 1; + + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(1), new GUIContent("100 - Thin")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(2), new GUIContent("200 - Extra-Light")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(3), new GUIContent("300 - Light")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(4), new GUIContent("400 - Regular")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(5), new GUIContent("500 - Medium")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(6), new GUIContent("600 - Semi-Bold")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(7), new GUIContent("700 - Bold")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(8), new GUIContent("800 - Heavy")); + EditorGUILayout.PropertyField(fontWeights_prop.GetArrayElementAtIndex(9), new GUIContent("900 - Black")); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.Space(); + + EditorGUILayout.BeginVertical(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(font_normalStyle_prop, new GUIContent("Normal Weight")); + font_normalStyle_prop.floatValue = Mathf.Clamp(font_normalStyle_prop.floatValue, -3.0f, 3.0f); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + + // Modify the material property on matching material presets. + for (int i = 0; i < m_materialPresets.Length; i++) + m_materialPresets[i].SetFloat("_WeightNormal", font_normalStyle_prop.floatValue); + } + + EditorGUILayout.PropertyField(font_boldStyle_prop, new GUIContent("Bold Weight")); + font_boldStyle_prop.floatValue = Mathf.Clamp(font_boldStyle_prop.floatValue, -3.0f, 3.0f); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + + // Modify the material property on matching material presets. + for (int i = 0; i < m_materialPresets.Length; i++) + m_materialPresets[i].SetFloat("_WeightBold", font_boldStyle_prop.floatValue); + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(font_normalSpacing_prop, new GUIContent("Spacing Offset")); + font_normalSpacing_prop.floatValue = Mathf.Clamp(font_normalSpacing_prop.floatValue, -100, 100); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + } + + EditorGUILayout.PropertyField(font_boldSpacing_prop, new GUIContent("Bold Spacing")); + font_boldSpacing_prop.floatValue = Mathf.Clamp(font_boldSpacing_prop.floatValue, 0, 100); + if (GUI.changed || evt_cmd == k_UndoRedo) + { + GUI.changed = false; + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(font_italicStyle_prop, new GUIContent("Italic Style")); + font_italicStyle_prop.intValue = Mathf.Clamp(font_italicStyle_prop.intValue, 15, 60); + + EditorGUILayout.PropertyField(font_tabSize_prop, new GUIContent("Tab Multiple")); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(); + } + + EditorGUIUtility.labelWidth = 0; + EditorGUIUtility.fieldWidth = 0; + #endregion + + // FALLBACK FONT ASSETS + #region Fallback Font Asset + rect = EditorGUILayout.GetControlRect(false, 24); + EditorGUI.indentLevel = 0; + if (GUI.Button(rect, new GUIContent("Fallback Font Assets", "Select the Font Assets that will be searched and used as fallback when characters are missing from this font asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fallbackFontAssetPanel = !UI_PanelState.fallbackFontAssetPanel; + + GUI.Label(rect, (UI_PanelState.fallbackFontAssetPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fallbackFontAssetPanel) + { + EditorGUIUtility.labelWidth = 120; + EditorGUI.indentLevel = 0; + + m_list.DoLayoutList(); + EditorGUILayout.Space(); + } + #endregion + + // CHARACTER TABLE TABLE + #region Character Table + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + int characterCount = m_fontAsset.characterTable.Count; + + if (GUI.Button(rect, new GUIContent("Character Table [" + characterCount + "]" + (rect.width > 320 ? " Characters" : ""), "List of characters contained in this font asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.characterTablePanel = !UI_PanelState.characterTablePanel; + + GUI.Label(rect, (UI_PanelState.characterTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.characterTablePanel) + { + int arraySize = m_CharacterTable_prop.arraySize; + int itemsPerPage = 15; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 130f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Character Search", m_CharacterSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_isSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + m_CharacterSearchPattern = searchPattern; + + // Search Character Table for potential matches + SearchCharacterTable (m_CharacterSearchPattern, ref m_CharacterSearchList); + } + else + m_CharacterSearchPattern = null; + + m_isSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_CharacterSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_CharacterSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + arraySize = m_CharacterSearchList.Count; + + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + // Display Character Table Elements + if (arraySize > 0) + { + // Display each character entry using the CharacterPropertyDrawer. + for (int i = itemsPerPage * m_CurrentCharacterPage; i < arraySize && i < itemsPerPage * (m_CurrentCharacterPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + elementIndex = m_CharacterSearchList[i]; + + SerializedProperty characterProperty = m_CharacterTable_prop.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + EditorGUI.BeginDisabledGroup(i != m_SelectedCharacterRecord); + { + EditorGUILayout.PropertyField(characterProperty); + } + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedCharacterRecord == i) + m_SelectedCharacterRecord = -1; + else + { + m_SelectedCharacterRecord = i; + m_AddCharacterWarning.isEnabled = false; + m_unicodeHexLabel = k_placeholderUnicodeHex; + GUIUtility.keyboardControl = 0; + } + } + + // Draw Selection Highlight and Glyph Options + if (m_SelectedCharacterRecord == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw Glyph management options + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + float optionAreaWidth = controlRect.width * 0.6f; + float btnWidth = optionAreaWidth / 3; + + Rect position = new Rect(controlRect.x + controlRect.width * .4f, controlRect.y, btnWidth, controlRect.height); + + // Copy Selected Glyph to Target Glyph ID + GUI.enabled = !string.IsNullOrEmpty(m_dstUnicode); + if (GUI.Button(position, new GUIContent("Copy to"))) + { + GUIUtility.keyboardControl = 0; + + // Convert Hex Value to Decimal + int dstGlyphID = TMP_TextUtilities.StringHexToInt(m_dstUnicode); + + //Add new glyph at target Unicode hex id. + if (!AddNewCharacter(elementIndex, dstGlyphID)) + { + m_AddCharacterWarning.isEnabled = true; + m_AddCharacterWarning.expirationTime = EditorApplication.timeSinceStartup + 1; + } + + m_dstUnicode = string.Empty; + m_isSearchDirty = true; + + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset); + } + + // Target Glyph ID + GUI.enabled = true; + position.x += btnWidth; + + GUI.SetNextControlName("CharacterID_Input"); + m_dstUnicode = EditorGUI.TextField(position, m_dstUnicode); + + // Placeholder text + EditorGUI.LabelField(position, new GUIContent(m_unicodeHexLabel, "The Unicode (Hex) ID of the duplicated Character"), TMP_UIStyleManager.label); + + // Only filter the input when the destination glyph ID text field has focus. + if (GUI.GetNameOfFocusedControl() == "CharacterID_Input") + { + m_unicodeHexLabel = string.Empty; + + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F')) + { + Event.current.character = '\0'; + } + } + else + { + m_unicodeHexLabel = k_placeholderUnicodeHex; + //m_dstUnicode = string.Empty; + } + + + // Remove Glyph + position.x += btnWidth; + if (GUI.Button(position, "Remove")) + { + GUIUtility.keyboardControl = 0; + + RemoveCharacterFromList(elementIndex); + + isAssetDirty = true; + m_SelectedCharacterRecord = -1; + m_isSearchDirty = true; + break; + } + + if (m_AddCharacterWarning.isEnabled && EditorApplication.timeSinceStartup < m_AddCharacterWarning.expirationTime) + { + EditorGUILayout.HelpBox("The Destination Character ID already exists", MessageType.Warning); + } + + } + } + } + + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + + EditorGUILayout.Space(); + } + #endregion + + // GLYPH TABLE + #region Glyph Table + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + GUIStyle glyphPanelStyle = new GUIStyle(EditorStyles.helpBox); + + int glyphCount = m_fontAsset.glyphTable.Count; + + if (GUI.Button(rect, new GUIContent("Glyph Table [" + glyphCount + "]" + (rect.width > 275 ? " Glyphs" : ""), "List of glyphs contained in this font asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.glyphTablePanel = !UI_PanelState.glyphTablePanel; + + GUI.Label(rect, (UI_PanelState.glyphTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.glyphTablePanel) + { + int arraySize = m_GlyphTable_prop.arraySize; + int itemsPerPage = 15; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 130f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Glyph Search", m_GlyphSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_isSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + m_GlyphSearchPattern = searchPattern; + + // Search Glyph Table for potential matches + SearchGlyphTable(m_GlyphSearchPattern, ref m_GlyphSearchList); + } + else + m_GlyphSearchPattern = null; + + m_isSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_GlyphSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_GlyphSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + arraySize = m_GlyphSearchList.Count; + + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + // Display Glyph Table Elements + + if (arraySize > 0) + { + // Display each GlyphInfo entry using the GlyphInfo property drawer. + for (int i = itemsPerPage * m_CurrentGlyphPage; i < arraySize && i < itemsPerPage * (m_CurrentGlyphPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + elementIndex = m_GlyphSearchList[i]; + + SerializedProperty glyphProperty = m_GlyphTable_prop.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(glyphPanelStyle); + + using (new EditorGUI.DisabledScope(i != m_SelectedGlyphRecord)) + { + EditorGUILayout.PropertyField(glyphProperty); + } + + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedGlyphRecord == i) + m_SelectedGlyphRecord = -1; + else + { + m_SelectedGlyphRecord = i; + m_AddGlyphWarning.isEnabled = false; + m_unicodeHexLabel = k_placeholderUnicodeHex; + GUIUtility.keyboardControl = 0; + } + } + + // Draw Selection Highlight and Glyph Options + if (m_SelectedGlyphRecord == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw Glyph management options + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + float optionAreaWidth = controlRect.width * 0.6f; + float btnWidth = optionAreaWidth / 3; + + Rect position = new Rect(controlRect.x + controlRect.width * .4f, controlRect.y, btnWidth, controlRect.height); + + // Copy Selected Glyph to Target Glyph ID + GUI.enabled = !string.IsNullOrEmpty(m_dstGlyphID); + if (GUI.Button(position, new GUIContent("Copy to"))) + { + GUIUtility.keyboardControl = 0; + int dstGlyphID; + + // Convert Hex Value to Decimal + int.TryParse(m_dstGlyphID, out dstGlyphID); + + //Add new glyph at target Unicode hex id. + if (!AddNewGlyph(elementIndex, dstGlyphID)) + { + m_AddGlyphWarning.isEnabled = true; + m_AddGlyphWarning.expirationTime = EditorApplication.timeSinceStartup + 1; + } + + m_dstGlyphID = string.Empty; + m_isSearchDirty = true; + + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset); + } + + // Target Glyph ID + GUI.enabled = true; + position.x += btnWidth; + + GUI.SetNextControlName("GlyphID_Input"); + m_dstGlyphID = EditorGUI.TextField(position, m_dstGlyphID); + + // Placeholder text + EditorGUI.LabelField(position, new GUIContent(m_GlyphIDLabel, "The Glyph ID of the duplicated Glyph"), TMP_UIStyleManager.label); + + // Only filter the input when the destination glyph ID text field has focus. + if (GUI.GetNameOfFocusedControl() == "GlyphID_Input") + { + m_GlyphIDLabel = string.Empty; + + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9')) + { + Event.current.character = '\0'; + } + } + else + { + m_GlyphIDLabel = k_placeholderGlyphID; + //m_dstGlyphID = string.Empty; + } + + // Remove Glyph + position.x += btnWidth; + if (GUI.Button(position, "Remove")) + { + GUIUtility.keyboardControl = 0; + + RemoveGlyphFromList(elementIndex); + + isAssetDirty = true; + m_SelectedGlyphRecord = -1; + m_isSearchDirty = true; + break; + } + + if (m_AddGlyphWarning.isEnabled && EditorApplication.timeSinceStartup < m_AddGlyphWarning.expirationTime) + { + EditorGUILayout.HelpBox("The Destination Glyph ID already exists", MessageType.Warning); + } + + } + } + } + + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + + EditorGUILayout.Space(); + } + #endregion + + // FONT FEATURE TABLE + #region Font Feature Table + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + int adjustmentPairCount = m_fontAsset.fontFeatureTable.glyphPairAdjustmentRecords.Count; + + if (GUI.Button(rect, new GUIContent("Glyph Adjustment Table [" + adjustmentPairCount + "]" + (rect.width > 340 ? " Records" : ""), "List of glyph adjustment / advanced kerning pairs."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fontFeatureTablePanel = !UI_PanelState.fontFeatureTablePanel; + + GUI.Label(rect, (UI_PanelState.fontFeatureTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fontFeatureTablePanel) + { + int arraySize = m_GlyphPairAdjustmentRecords_prop.arraySize; + int itemsPerPage = 20; + + // Display Kerning Pair Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 150f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Adjustment Pair Search", m_KerningTableSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_isSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + m_KerningTableSearchPattern = searchPattern; + + // Search Glyph Table for potential matches + SearchKerningTable(m_KerningTableSearchPattern, ref m_KerningTableSearchList); + } + else + m_KerningTableSearchPattern = null; + + m_isSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_KerningTableSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_KerningTableSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_KerningTableSearchPattern)) + arraySize = m_KerningTableSearchList.Count; + + DisplayPageNavigation(ref m_CurrentKerningPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + if (arraySize > 0) + { + // Display each GlyphInfo entry using the GlyphInfo property drawer. + for (int i = itemsPerPage * m_CurrentKerningPage; i < arraySize && i < itemsPerPage * (m_CurrentKerningPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_KerningTableSearchPattern)) + elementIndex = m_KerningTableSearchList[i]; + + SerializedProperty pairAdjustmentRecordProperty = m_GlyphPairAdjustmentRecords_prop.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + using (new EditorGUI.DisabledScope(i != m_SelectedAdjustmentRecord)) + { + EditorGUILayout.PropertyField(pairAdjustmentRecordProperty, new GUIContent("Selectable")); + } + + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedAdjustmentRecord == i) + { + m_SelectedAdjustmentRecord = -1; + } + else + { + m_SelectedAdjustmentRecord = i; + GUIUtility.keyboardControl = 0; + } + } + + // Draw Selection Highlight and Kerning Pair Options + if (m_SelectedAdjustmentRecord == i) + { + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw Glyph management options + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + float optionAreaWidth = controlRect.width; + float btnWidth = optionAreaWidth / 4; + + Rect position = new Rect(controlRect.x + controlRect.width - btnWidth, controlRect.y, btnWidth, controlRect.height); + + // Remove Kerning pair + GUI.enabled = true; + if (GUI.Button(position, "Remove")) + { + GUIUtility.keyboardControl = 0; + + RemoveAdjustmentPairFromList(i); + + isAssetDirty = true; + m_SelectedAdjustmentRecord = -1; + m_isSearchDirty = true; + break; + } + } + } + } + + DisplayPageNavigation(ref m_CurrentKerningPage, arraySize, itemsPerPage); + + GUILayout.Space(5); + + // Add new kerning pair + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUILayout.PropertyField(m_EmptyGlyphPairAdjustmentRecord_prop); + } + EditorGUILayout.EndVertical(); + + if (GUILayout.Button("Add New Glyph Adjustment Record")) + { + SerializedProperty firstAdjustmentRecordProperty = m_EmptyGlyphPairAdjustmentRecord_prop.FindPropertyRelative("m_FirstAdjustmentRecord"); + SerializedProperty secondAdjustmentRecordProperty = m_EmptyGlyphPairAdjustmentRecord_prop.FindPropertyRelative("m_SecondAdjustmentRecord"); + + uint firstGlyphIndex = (uint)firstAdjustmentRecordProperty.FindPropertyRelative("m_GlyphIndex").intValue; + uint secondGlyphIndex = (uint)secondAdjustmentRecordProperty.FindPropertyRelative("m_GlyphIndex").intValue; + + TMP_GlyphValueRecord firstValueRecord = GetValueRecord(firstAdjustmentRecordProperty.FindPropertyRelative("m_GlyphValueRecord")); + TMP_GlyphValueRecord secondValueRecord = GetValueRecord(secondAdjustmentRecordProperty.FindPropertyRelative("m_GlyphValueRecord")); + + errorCode = -1; + uint pairKey = secondGlyphIndex << 16 | firstGlyphIndex; + if (m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.ContainsKey(pairKey) == false) + { + TMP_GlyphPairAdjustmentRecord adjustmentRecord = new TMP_GlyphPairAdjustmentRecord(new TMP_GlyphAdjustmentRecord(firstGlyphIndex, firstValueRecord), new TMP_GlyphAdjustmentRecord(secondGlyphIndex, secondValueRecord)); + m_FontFeatureTable.m_GlyphPairAdjustmentRecords.Add(adjustmentRecord); + m_FontFeatureTable.m_GlyphPairAdjustmentRecordLookupDictionary.Add(pairKey, adjustmentRecord); + errorCode = 0; + } + + // Add glyphs and characters + TMP_Character character; + + uint firstCharacter = m_SerializedPropertyHolder.firstCharacter; + if (!m_fontAsset.characterLookupTable.ContainsKey(firstCharacter)) + m_fontAsset.TryAddCharacterInternal(firstCharacter, out character); + + uint secondCharacter = m_SerializedPropertyHolder.secondCharacter; + if (!m_fontAsset.characterLookupTable.ContainsKey(secondCharacter)) + m_fontAsset.TryAddCharacterInternal(secondCharacter, out character); + + // Sort Kerning Pairs & Reload Font Asset if new kerning pair was added. + if (errorCode != -1) + { + m_FontFeatureTable.SortGlyphPairAdjustmentRecords(); + serializedObject.ApplyModifiedProperties(); + isAssetDirty = true; + m_isSearchDirty = true; + } + else + { + timeStamp = System.DateTime.Now.AddSeconds(5); + } + + // Clear Add Kerning Pair Panel + // TODO + } + + if (errorCode == -1) + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Label("Kerning Pair already exists!", TMP_UIStyleManager.label); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + if (System.DateTime.Now > timeStamp) + errorCode = 0; + } + } + #endregion + + if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo || isAssetDirty) + { + // Delay callback until user has decided to Apply or Revert the changes. + if (m_DisplayDestructiveChangeWarning == false) + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, m_fontAsset); + + if (m_fontAsset.IsFontAssetLookupTablesDirty || evt_cmd == k_UndoRedo) + m_fontAsset.ReadFontAssetDefinition(); + + isAssetDirty = false; + EditorUtility.SetDirty(target); + } + + + // Clear selection if mouse event was not consumed. + GUI.enabled = true; + if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0) + m_SelectedAdjustmentRecord = -1; + + } + + void CleanFallbackFontAssetTable() + { + SerializedProperty m_FallbackFontAsseTable = serializedObject.FindProperty("m_FallbackFontAssetTable"); + + bool isListDirty = false; + + int elementCount = m_FallbackFontAsseTable.arraySize; + + for (int i = 0; i < elementCount; i++) + { + SerializedProperty element = m_FallbackFontAsseTable.GetArrayElementAtIndex(i); + if (element.objectReferenceValue == null) + { + m_FallbackFontAsseTable.DeleteArrayElementAtIndex(i); + elementCount -= 1; + i -= 1; + + isListDirty = true; + } + } + + if (isListDirty) + { + serializedObject.ApplyModifiedProperties(); + serializedObject.Update(); + } + } + + void SavedAtlasGenerationSettings() + { + m_AtlasSettings.glyphRenderMode = (GlyphRenderMode)m_AtlasRenderMode_prop.intValue; + m_AtlasSettings.pointSize = m_SamplingPointSize_prop.intValue; + m_AtlasSettings.padding = m_AtlasPadding_prop.intValue; + m_AtlasSettings.atlasWidth = m_AtlasWidth_prop.intValue; + m_AtlasSettings.atlasHeight = m_AtlasHeight_prop.intValue; + } + + void RestoreAtlasGenerationSettings() + { + m_AtlasRenderMode_prop.intValue = (int)m_AtlasSettings.glyphRenderMode; + m_SamplingPointSize_prop.intValue = m_AtlasSettings.pointSize; + m_AtlasPadding_prop.intValue = m_AtlasSettings.padding; + m_AtlasWidth_prop.intValue = m_AtlasSettings.atlasWidth; + m_AtlasHeight_prop.intValue = m_AtlasSettings.atlasHeight; + } + + + void UpdateFontAssetCreationSettings() + { + m_fontAsset.m_CreationSettings.pointSize = m_SamplingPointSize_prop.intValue; + m_fontAsset.m_CreationSettings.renderMode = m_AtlasRenderMode_prop.intValue; + m_fontAsset.m_CreationSettings.padding = m_AtlasPadding_prop.intValue; + m_fontAsset.m_CreationSettings.atlasWidth = m_AtlasWidth_prop.intValue; + m_fontAsset.m_CreationSettings.atlasHeight = m_AtlasHeight_prop.intValue; + } + + + void UpdateCharacterData(SerializedProperty property, int index) + { + TMP_Character character = m_fontAsset.characterTable[index]; + + character.unicode = (uint)property.FindPropertyRelative("m_Unicode").intValue; + character.scale = property.FindPropertyRelative("m_Scale").floatValue; + + SerializedProperty glyphProperty = property.FindPropertyRelative("m_Glyph"); + character.glyph.index = (uint)glyphProperty.FindPropertyRelative("m_Index").intValue; + + SerializedProperty glyphRectProperty = glyphProperty.FindPropertyRelative("m_GlyphRect"); + character.glyph.glyphRect = new GlyphRect(glyphRectProperty.FindPropertyRelative("m_X").intValue, glyphRectProperty.FindPropertyRelative("m_Y").intValue, glyphRectProperty.FindPropertyRelative("m_Width").intValue, glyphRectProperty.FindPropertyRelative("m_Height").intValue); + + SerializedProperty glyphMetricsProperty = glyphProperty.FindPropertyRelative("m_Metrics"); + character.glyph.metrics = new GlyphMetrics(glyphMetricsProperty.FindPropertyRelative("m_Width").floatValue, glyphMetricsProperty.FindPropertyRelative("m_Height").floatValue, glyphMetricsProperty.FindPropertyRelative("m_HorizontalBearingX").floatValue, glyphMetricsProperty.FindPropertyRelative("m_HorizontalBearingY").floatValue, glyphMetricsProperty.FindPropertyRelative("m_HorizontalAdvance").floatValue); + + character.glyph.scale = glyphProperty.FindPropertyRelative("m_Scale").floatValue; + + character.glyph.atlasIndex = glyphProperty.FindPropertyRelative("m_AtlasIndex").intValue; + } + + + void UpdateGlyphData(SerializedProperty property, int index) + { + Glyph glyph = m_fontAsset.glyphTable[index]; + + glyph.index = (uint)property.FindPropertyRelative("m_Index").intValue; + + SerializedProperty glyphRect = property.FindPropertyRelative("m_GlyphRect"); + glyph.glyphRect = new GlyphRect(glyphRect.FindPropertyRelative("m_X").intValue, glyphRect.FindPropertyRelative("m_Y").intValue, glyphRect.FindPropertyRelative("m_Width").intValue, glyphRect.FindPropertyRelative("m_Height").intValue); + + SerializedProperty glyphMetrics = property.FindPropertyRelative("m_Metrics"); + glyph.metrics = new GlyphMetrics(glyphMetrics.FindPropertyRelative("m_Width").floatValue, glyphMetrics.FindPropertyRelative("m_Height").floatValue, glyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue, glyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue, glyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue); + + glyph.scale = property.FindPropertyRelative("m_Scale").floatValue; + } + + + void DisplayPageNavigation(ref int currentPage, int arraySize, int itemsPerPage) + { + Rect pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 3; + + int shiftMultiplier = Event.current.shift ? 10 : 1; // Page + Shift goes 10 page forward + + // Previous Page + GUI.enabled = currentPage > 0; + + if (GUI.Button(pagePos, "Previous Page")) + currentPage -= 1 * shiftMultiplier; + + + // Page Counter + GUI.enabled = true; + pagePos.x += pagePos.width; + int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f); + GUI.Label(pagePos, "Page " + (currentPage + 1) + " / " + totalPages, TMP_UIStyleManager.centeredLabel); + + // Next Page + pagePos.x += pagePos.width; + GUI.enabled = itemsPerPage * (currentPage + 1) < arraySize; + + if (GUI.Button(pagePos, "Next Page")) + currentPage += 1 * shiftMultiplier; + + // Clamp page range + currentPage = Mathf.Clamp(currentPage, 0, arraySize / itemsPerPage); + + GUI.enabled = true; + } + + + /// + /// + /// + /// + /// + bool AddNewGlyph(int srcIndex, int dstGlyphID) + { + // Make sure Destination Glyph ID doesn't already contain a Glyph + if (m_fontAsset.glyphLookupTable.ContainsKey((uint)dstGlyphID)) + return false; + + // Add new element to glyph list. + m_GlyphTable_prop.arraySize += 1; + + // Get a reference to the source glyph. + SerializedProperty sourceGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(srcIndex); + + int dstIndex = m_GlyphTable_prop.arraySize - 1; + + // Get a reference to the target / destination glyph. + SerializedProperty targetGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(dstIndex); + + CopyGlyphSerializedProperty(sourceGlyph, ref targetGlyph); + + // Update the ID of the glyph + targetGlyph.FindPropertyRelative("m_Index").intValue = dstGlyphID; + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.SortGlyphTable(); + + m_fontAsset.ReadFontAssetDefinition(); + + return true; + } + + /// + /// + /// + /// + void RemoveGlyphFromList(int index) + { + if (index > m_GlyphTable_prop.arraySize) + return; + + int targetGlyphIndex = m_GlyphTable_prop.GetArrayElementAtIndex(index).FindPropertyRelative("m_Index").intValue; + + m_GlyphTable_prop.DeleteArrayElementAtIndex(index); + + // Remove all characters referencing this glyph. + for (int i = 0; i < m_CharacterTable_prop.arraySize; i++) + { + int glyphIndex = m_CharacterTable_prop.GetArrayElementAtIndex(i).FindPropertyRelative("m_GlyphIndex").intValue; + + if (glyphIndex == targetGlyphIndex) + { + // Remove character + m_CharacterTable_prop.DeleteArrayElementAtIndex(i); + } + } + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.ReadFontAssetDefinition(); + } + + bool AddNewCharacter(int srcIndex, int dstGlyphID) + { + // Make sure Destination Glyph ID doesn't already contain a Glyph + if (m_fontAsset.characterLookupTable.ContainsKey((uint)dstGlyphID)) + return false; + + // Add new element to glyph list. + m_CharacterTable_prop.arraySize += 1; + + // Get a reference to the source glyph. + SerializedProperty sourceCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(srcIndex); + + int dstIndex = m_CharacterTable_prop.arraySize - 1; + + // Get a reference to the target / destination glyph. + SerializedProperty targetCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(dstIndex); + + CopyCharacterSerializedProperty(sourceCharacter, ref targetCharacter); + + // Update the ID of the glyph + targetCharacter.FindPropertyRelative("m_Unicode").intValue = dstGlyphID; + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.SortCharacterTable(); + + m_fontAsset.ReadFontAssetDefinition(); + + return true; + } + + void RemoveCharacterFromList(int index) + { + if (index > m_CharacterTable_prop.arraySize) + return; + + m_CharacterTable_prop.DeleteArrayElementAtIndex(index); + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.ReadFontAssetDefinition(); + } + + + // Check if any of the Style elements were clicked on. + private bool DoSelectionCheck(Rect selectionArea) + { + Event currentEvent = Event.current; + + switch (currentEvent.type) + { + case EventType.MouseDown: + if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0) + { + currentEvent.Use(); + return true; + } + + break; + } + + return false; + } + + TMP_GlyphValueRecord GetValueRecord(SerializedProperty property) + { + TMP_GlyphValueRecord record = new TMP_GlyphValueRecord(); + record.xPlacement = property.FindPropertyRelative("m_XPlacement").floatValue; + record.yPlacement = property.FindPropertyRelative("m_YPlacement").floatValue; + record.xAdvance = property.FindPropertyRelative("m_XAdvance").floatValue; + record.yAdvance = property.FindPropertyRelative("m_YAdvance").floatValue; + + return record; + } + + void RemoveAdjustmentPairFromList(int index) + { + if (index > m_GlyphPairAdjustmentRecords_prop.arraySize) + return; + + m_GlyphPairAdjustmentRecords_prop.DeleteArrayElementAtIndex(index); + + serializedObject.ApplyModifiedProperties(); + + m_fontAsset.ReadFontAssetDefinition(); + } + + /// + /// + /// + /// + /// + void CopyGlyphSerializedProperty(SerializedProperty srcGlyph, ref SerializedProperty dstGlyph) + { + // TODO : Should make a generic function which copies each of the properties. + dstGlyph.FindPropertyRelative("m_Index").intValue = srcGlyph.FindPropertyRelative("m_Index").intValue; + + // Glyph -> GlyphMetrics + SerializedProperty srcGlyphMetrics = srcGlyph.FindPropertyRelative("m_Metrics"); + SerializedProperty dstGlyphMetrics = dstGlyph.FindPropertyRelative("m_Metrics"); + + dstGlyphMetrics.FindPropertyRelative("m_Width").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Width").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_Height").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Height").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue; + + // Glyph -> GlyphRect + SerializedProperty srcGlyphRect = srcGlyph.FindPropertyRelative("m_GlyphRect"); + SerializedProperty dstGlyphRect = dstGlyph.FindPropertyRelative("m_GlyphRect"); + + dstGlyphRect.FindPropertyRelative("m_X").intValue = srcGlyphRect.FindPropertyRelative("m_X").intValue; + dstGlyphRect.FindPropertyRelative("m_Y").intValue = srcGlyphRect.FindPropertyRelative("m_Y").intValue; + dstGlyphRect.FindPropertyRelative("m_Width").intValue = srcGlyphRect.FindPropertyRelative("m_Width").intValue; + dstGlyphRect.FindPropertyRelative("m_Height").intValue = srcGlyphRect.FindPropertyRelative("m_Height").intValue; + + dstGlyph.FindPropertyRelative("m_Scale").floatValue = srcGlyph.FindPropertyRelative("m_Scale").floatValue; + dstGlyph.FindPropertyRelative("m_AtlasIndex").intValue = srcGlyph.FindPropertyRelative("m_AtlasIndex").intValue; + } + + + void CopyCharacterSerializedProperty(SerializedProperty source, ref SerializedProperty target) + { + // TODO : Should make a generic function which copies each of the properties. + int unicode = source.FindPropertyRelative("m_Unicode").intValue; + target.FindPropertyRelative("m_Unicode").intValue = unicode; + + int srcGlyphIndex = source.FindPropertyRelative("m_GlyphIndex").intValue; + target.FindPropertyRelative("m_GlyphIndex").intValue = srcGlyphIndex; + + target.FindPropertyRelative("m_Scale").floatValue = source.FindPropertyRelative("m_Scale").floatValue; + } + + + /// + /// + /// + /// + /// + void SearchGlyphTable (string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + + searchResults.Clear(); + + int arraySize = m_GlyphTable_prop.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceGlyph = m_GlyphTable_prop.GetArrayElementAtIndex(i); + + int id = sourceGlyph.FindPropertyRelative("m_Index").intValue; + + // Check for potential match against a character. + //if (searchPattern.Length == 1 && id == searchPattern[0]) + // searchResults.Add(i); + + // Check for potential match against decimal id + if (id.ToString().Contains(searchPattern)) + searchResults.Add(i); + + //if (id.ToString("x").Contains(searchPattern)) + // searchResults.Add(i); + + //if (id.ToString("X").Contains(searchPattern)) + // searchResults.Add(i); + } + } + + + void SearchCharacterTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + + searchResults.Clear(); + + int arraySize = m_CharacterTable_prop.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceCharacter = m_CharacterTable_prop.GetArrayElementAtIndex(i); + + int id = sourceCharacter.FindPropertyRelative("m_Unicode").intValue; + + // Check for potential match against a character. + if (searchPattern.Length == 1 && id == searchPattern[0]) + searchResults.Add(i); + else if (id.ToString("x").Contains(searchPattern)) + searchResults.Add(i); + else if (id.ToString("X").Contains(searchPattern)) + searchResults.Add(i); + + // Check for potential match against decimal id + //if (id.ToString().Contains(searchPattern)) + // searchResults.Add(i); + } + } + + + void SearchKerningTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + + searchResults.Clear(); + + // Lookup glyph index of potential characters contained in the search pattern. + uint firstGlyphIndex = 0; + TMP_Character firstCharacterSearch; + + if (searchPattern.Length > 0 && m_fontAsset.characterLookupTable.TryGetValue(searchPattern[0], out firstCharacterSearch)) + firstGlyphIndex = firstCharacterSearch.glyphIndex; + + uint secondGlyphIndex = 0; + TMP_Character secondCharacterSearch; + + if (searchPattern.Length > 1 && m_fontAsset.characterLookupTable.TryGetValue(searchPattern[1], out secondCharacterSearch)) + secondGlyphIndex = secondCharacterSearch.glyphIndex; + + int arraySize = m_GlyphPairAdjustmentRecords_prop.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty record = m_GlyphPairAdjustmentRecords_prop.GetArrayElementAtIndex(i); + + SerializedProperty firstAdjustmentRecord = record.FindPropertyRelative("m_FirstAdjustmentRecord"); + SerializedProperty secondAdjustmentRecord = record.FindPropertyRelative("m_SecondAdjustmentRecord"); + + int firstGlyph = firstAdjustmentRecord.FindPropertyRelative("m_GlyphIndex").intValue; + int secondGlyph = secondAdjustmentRecord.FindPropertyRelative("m_GlyphIndex").intValue; + + if (firstGlyphIndex == firstGlyph && secondGlyphIndex == secondGlyph) + searchResults.Add(i); + else if (searchPattern.Length == 1 && (firstGlyphIndex == firstGlyph || firstGlyphIndex == secondGlyph)) + searchResults.Add(i); + else if (firstGlyph.ToString().Contains(searchPattern)) + searchResults.Add(i); + else if (secondGlyph.ToString().Contains(searchPattern)) + searchResults.Add(i); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta new file mode 100644 index 0000000..9b26bae --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 96b44f7d98314b139324a8a87eb66067 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs new file mode 100644 index 0000000..344965c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs @@ -0,0 +1,235 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using TMPro; + + +namespace TMPro +{ + public static class TMP_FontAsset_CreationMenu + { + [MenuItem("Assets/Create/TextMeshPro/Font Asset Variant", false, 105)] + public static void CreateFontAssetVariant() + { + Object target = Selection.activeObject; + + // Make sure the selection is a font file + if (target == null || target.GetType() != typeof(TMP_FontAsset)) + { + Debug.LogWarning("A Font file must first be selected in order to create a Font Asset."); + return; + } + + TMP_FontAsset sourceFontAsset = (TMP_FontAsset)target; + + string sourceFontFilePath = AssetDatabase.GetAssetPath(target); + + string folderPath = Path.GetDirectoryName(sourceFontFilePath); + string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath); + + string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " - Variant.asset"); + + // Set Texture and Material reference to the source font asset. + TMP_FontAsset fontAsset = ScriptableObject.Instantiate(sourceFontAsset); + AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName); + + fontAsset.atlasPopulationMode = AtlasPopulationMode.Static; + + // Initialize array for the font atlas textures. + fontAsset.atlasTextures = sourceFontAsset.atlasTextures; + fontAsset.material = sourceFontAsset.material; + + // Not sure if this is still necessary in newer versions of Unity. + EditorUtility.SetDirty(fontAsset); + + AssetDatabase.SaveAssets(); + } + + + /* + [MenuItem("Assets/Create/TextMeshPro/Font Asset Fallback", false, 105)] + public static void CreateFallbackFontAsset() + { + Object target = Selection.activeObject; + + // Make sure the selection is a font file + if (target == null || target.GetType() != typeof(TMP_FontAsset)) + { + Debug.LogWarning("A Font file must first be selected in order to create a Font Asset."); + return; + } + + TMP_FontAsset sourceFontAsset = (TMP_FontAsset)target; + + string sourceFontFilePath = AssetDatabase.GetAssetPath(target); + + string folderPath = Path.GetDirectoryName(sourceFontFilePath); + string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath); + + string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " - Fallback.asset"); + + //// Create new TM Font Asset. + TMP_FontAsset fontAsset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName); + + fontAsset.version = "1.1.0"; + + fontAsset.faceInfo = sourceFontAsset.faceInfo; + + fontAsset.m_SourceFontFileGUID = sourceFontAsset.m_SourceFontFileGUID; + fontAsset.m_SourceFontFile_EditorRef = sourceFontAsset.m_SourceFontFile_EditorRef; + fontAsset.atlasPopulationMode = TMP_FontAsset.AtlasPopulationMode.Dynamic; + + int atlasWidth = fontAsset.atlasWidth = sourceFontAsset.atlasWidth; + int atlasHeight = fontAsset.atlasHeight = sourceFontAsset.atlasHeight; + int atlasPadding = fontAsset.atlasPadding = sourceFontAsset.atlasPadding; + fontAsset.atlasRenderMode = sourceFontAsset.atlasRenderMode; + + // Initialize array for the font atlas textures. + fontAsset.atlasTextures = new Texture2D[1]; + + // Create and add font atlas texture + Texture2D texture = new Texture2D(atlasWidth, atlasHeight, TextureFormat.Alpha8, false); + Color32[] colors = new Color32[atlasWidth * atlasHeight]; + texture.SetPixels32(colors); + + texture.name = assetName + " Atlas"; + fontAsset.atlasTextures[0] = texture; + AssetDatabase.AddObjectToAsset(texture, fontAsset); + + // Add free rectangle of the size of the texture. + int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + fontAsset.m_FreeGlyphRects = new List() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) }; + fontAsset.m_UsedGlyphRects = new List(); + + // Create new Material and Add it as Sub-Asset + Material tmp_material = new Material(sourceFontAsset.material); + + tmp_material.name = texture.name + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture); + tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth); + tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight); + + tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier); + + tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + // Add Font Asset Creation Settings + // TODO + + // Not sure if this is still necessary in newer versions of Unity. + EditorUtility.SetDirty(fontAsset); + + AssetDatabase.SaveAssets(); + } + */ + + //[MenuItem("Assets/Create/TextMeshPro/Font Asset #%F12", true)] + //public static bool CreateFontAssetMenuValidation() + //{ + // return false; + //} + + [MenuItem("Assets/Create/TextMeshPro/Font Asset #%F12", false, 100)] + public static void CreateFontAsset() + { + Object target = Selection.activeObject; + + // Make sure the selection is a font file + if (target == null || target.GetType() != typeof(Font)) + { + Debug.LogWarning("A Font file must first be selected in order to create a Font Asset."); + return; + } + + Font sourceFont = (Font)target; + + string sourceFontFilePath = AssetDatabase.GetAssetPath(target); + + string folderPath = Path.GetDirectoryName(sourceFontFilePath); + string assetName = Path.GetFileNameWithoutExtension(sourceFontFilePath); + + string newAssetFilePathWithName = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + " SDF.asset"); + + // Initialize FontEngine + FontEngine.InitializeFontEngine(); + + // Load Font Face + if (FontEngine.LoadFontFace(sourceFont, 90) != FontEngineError.Success) + { + Debug.LogWarning("Unable to load font face for [" + sourceFont.name + "]. Make sure \"Include Font Data\" is enabled in the Font Import Settings.", sourceFont); + return; + } + + // Create new Font Asset + TMP_FontAsset fontAsset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(fontAsset, newAssetFilePathWithName); + + fontAsset.version = "1.1.0"; + + fontAsset.faceInfo = FontEngine.GetFaceInfo(); + + // Set font reference and GUID + fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(sourceFontFilePath); + fontAsset.m_SourceFontFile_EditorRef = sourceFont; + fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic; + + // Default atlas resolution is 1024 x 1024. + int atlasWidth = fontAsset.atlasWidth = 1024; + int atlasHeight = fontAsset.atlasHeight = 1024; + int atlasPadding = fontAsset.atlasPadding = 9; + fontAsset.atlasRenderMode = GlyphRenderMode.SDFAA; + + // Initialize array for the font atlas textures. + fontAsset.atlasTextures = new Texture2D[1]; + + // Create atlas texture of size zero. + Texture2D texture = new Texture2D(0, 0, TextureFormat.Alpha8, false); + + texture.name = assetName + " Atlas"; + fontAsset.atlasTextures[0] = texture; + AssetDatabase.AddObjectToAsset(texture, fontAsset); + + // Add free rectangle of the size of the texture. + int packingModifier = ((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + fontAsset.freeGlyphRects = new List() { new GlyphRect(0, 0, atlasWidth - packingModifier, atlasHeight - packingModifier) }; + fontAsset.usedGlyphRects = new List(); + + // Create new Material and Add it as Sub-Asset + Shader default_Shader = Shader.Find("TextMeshPro/Distance Field"); + Material tmp_material = new Material(default_Shader); + + tmp_material.name = texture.name + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, texture); + tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, atlasWidth); + tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, atlasHeight); + + tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, atlasPadding + packingModifier); + + tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + // Add Font Asset Creation Settings + fontAsset.creationSettings = new FontAssetCreationSettings(fontAsset.m_SourceFontFileGUID, fontAsset.faceInfo.pointSize, 0, atlasPadding, 0, 1024, 1024, 7, string.Empty, (int)GlyphRenderMode.SDFAA); + + // Not sure if this is still necessary in newer versions of Unity. + EditorUtility.SetDirty(fontAsset); + + AssetDatabase.SaveAssets(); + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta new file mode 100644 index 0000000..57a3fce --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7496af95dfe67cf429ac65edaaf99106 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs new file mode 100644 index 0000000..69ac6f8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs @@ -0,0 +1,391 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor; +using System.Collections; +using System.Text.RegularExpressions; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_GlyphPairAdjustmentRecord))] + public class TMP_GlyphPairAdjustmentRecordPropertyDrawer : PropertyDrawer + { + private bool isEditingEnabled = false; + private bool isSelectable = false; + + private string m_FirstCharacter = string.Empty; + private string m_SecondCharacter = string.Empty; + private string m_PreviousInput; + + static GUIContent s_CharacterTextFieldLabel = new GUIContent("Char:", "Enter the character or its UTF16 or UTF32 Unicode character escape sequence. For UTF16 use \"\\uFF00\" and for UTF32 use \"\\UFF00FF00\" representation."); + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_FirstAdjustmentRecord = property.FindPropertyRelative("m_FirstAdjustmentRecord"); + SerializedProperty prop_SecondAdjustmentRecord = property.FindPropertyRelative("m_SecondAdjustmentRecord"); + + SerializedProperty prop_FirstGlyphIndex = prop_FirstAdjustmentRecord.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_FirstGlyphValueRecord = prop_FirstAdjustmentRecord.FindPropertyRelative("m_GlyphValueRecord"); + + SerializedProperty prop_SecondGlyphIndex = prop_SecondAdjustmentRecord.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_SecondGlyphValueRecord = prop_SecondAdjustmentRecord.FindPropertyRelative("m_GlyphValueRecord"); + + SerializedProperty prop_FontFeatureLookupFlags = property.FindPropertyRelative("m_FeatureLookupFlags"); + + position.yMin += 2; + + float width = position.width / 2; + float padding = 5.0f; + + Rect rect; + + isEditingEnabled = GUI.enabled; + isSelectable = label.text == "Selectable" ? true : false; + + if (isSelectable) + GUILayoutUtility.GetRect(position.width, 75); + else + GUILayoutUtility.GetRect(position.width, 55); + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + // First Glyph + GUI.enabled = isEditingEnabled; + if (isSelectable) + { + rect = new Rect(position.x + 70, position.y, position.width, 49); + + float labelWidth = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_FirstGlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 60, 64f, 18f), new GUIContent("ID: " + prop_FirstGlyphIndex.intValue + ""), style); + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 30f; + + rect = new Rect(position.x + 70, position.y + 10, (width - 70) - padding, 18); + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX:")); + + //rect.y += 20; + //EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_YAdvance"), new GUIContent("AY:")); + + DrawGlyph((uint)prop_FirstGlyphIndex.intValue, new Rect(position.x, position.y, position.width, position.height), property); + } + else + { + rect = new Rect(position.x, position.y, width / 2 * 0.8f - padding, 18); + EditorGUIUtility.labelWidth = 40f; + + // First Character Lookup + GUI.SetNextControlName("FirstCharacterField"); + EditorGUI.BeginChangeCheck(); + string firstCharacter = EditorGUI.TextField(rect, s_CharacterTextFieldLabel, m_FirstCharacter); + + if (GUI.GetNameOfFocusedControl() == "FirstCharacterField") + { + if (ValidateInput(firstCharacter)) + { + //Debug.Log("1st Unicode value: [" + firstCharacter + "]"); + + uint unicode = GetUnicodeCharacter(firstCharacter); + + // Lookup glyph index + TMP_SerializedPropertyHolder propertyHolder = property.serializedObject.targetObject as TMP_SerializedPropertyHolder; + TMP_FontAsset fontAsset = propertyHolder.fontAsset; + if (fontAsset != null) + { + prop_FirstGlyphIndex.intValue = (int)fontAsset.GetGlyphIndex(unicode); + propertyHolder.firstCharacter = unicode; + } + } + } + + if (EditorGUI.EndChangeCheck()) + m_FirstCharacter = firstCharacter; + + // First Glyph Index + rect.x += width / 2 * 0.8f; + + EditorGUIUtility.labelWidth = 25f; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, prop_FirstGlyphIndex, new GUIContent("ID:")); + if (EditorGUI.EndChangeCheck()) + { + + } + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 25f; + + rect = new Rect(position.x, position.y + 20, width * 0.5f - padding, 18); + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX")); + + rect.x += width * 0.5f; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY")); + + rect.x = position.x; + rect.y += 20; + EditorGUI.PropertyField(rect, prop_FirstGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX")); + + //rect.x += width * 0.5f; + //EditorGUI.PropertyField(rect, prop_FirstGlyphAdjustment.FindPropertyRelative("m_YAdvance"), new GUIContent("AY")); + + } + + + // Second Glyph + GUI.enabled = isEditingEnabled; + if (isSelectable) + { + float labelWidth = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_SecondGlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.width / 2 + 20 + (64 - labelWidth) / 2, position.y + 60, 64f, 18f), new GUIContent("ID: " + prop_SecondGlyphIndex.intValue + ""), style); + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 30f; + + rect = new Rect(position.width / 2 + 20 + 70, position.y + 10, (width - 70) - padding, 18); + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY:")); + + rect.y += 20; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX:")); + + //rect.y += 20; + //EditorGUI.PropertyField(rect, prop_SecondGlyphAdjustment.FindPropertyRelative("m_YAdvance"), new GUIContent("AY")); + + DrawGlyph((uint)prop_SecondGlyphIndex.intValue, new Rect(position.width / 2 + 20, position.y, position.width, position.height), property); + } + else + { + rect = new Rect(position.width / 2 + 20, position.y, width / 2 * 0.8f - padding, 18); + EditorGUIUtility.labelWidth = 40f; + + // Second Character Lookup + GUI.SetNextControlName("SecondCharacterField"); + EditorGUI.BeginChangeCheck(); + string secondCharacter = EditorGUI.TextField(rect, s_CharacterTextFieldLabel, m_SecondCharacter); + + if (GUI.GetNameOfFocusedControl() == "SecondCharacterField") + { + if (ValidateInput(secondCharacter)) + { + //Debug.Log("2nd Unicode value: [" + secondCharacter + "]"); + + uint unicode = GetUnicodeCharacter(secondCharacter); + + // Lookup glyph index + TMP_SerializedPropertyHolder propertyHolder = property.serializedObject.targetObject as TMP_SerializedPropertyHolder; + TMP_FontAsset fontAsset = propertyHolder.fontAsset; + if (fontAsset != null) + { + prop_SecondGlyphIndex.intValue = (int)fontAsset.GetGlyphIndex(unicode); + propertyHolder.secondCharacter = unicode; + } + } + } + + if (EditorGUI.EndChangeCheck()) + m_SecondCharacter = secondCharacter; + + // Second Glyph Index + rect.x += width / 2 * 0.8f; + + EditorGUIUtility.labelWidth = 25f; + EditorGUI.BeginChangeCheck(); + EditorGUI.PropertyField(rect, prop_SecondGlyphIndex, new GUIContent("ID:")); + if (EditorGUI.EndChangeCheck()) + { + + } + + GUI.enabled = isEditingEnabled; + EditorGUIUtility.labelWidth = 25f; + + rect = new Rect(position.width / 2 + 20, position.y + 20, width * 0.5f - padding, 18); + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XPlacement"), new GUIContent("OX")); + + rect.x += width * 0.5f; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_YPlacement"), new GUIContent("OY")); + + rect.x = position.width / 2 + 20; + rect.y += 20; + EditorGUI.PropertyField(rect, prop_SecondGlyphValueRecord.FindPropertyRelative("m_XAdvance"), new GUIContent("AX")); + + //rect.x += width * 0.5f; + //EditorGUI.PropertyField(rect, prop_SecondGlyphAdjustment.FindPropertyRelative("m_YAdvance"), new GUIContent("AY")); + } + + // Font Feature Lookup Flags + if (isSelectable) + { + EditorGUIUtility.labelWidth = 55f; + + rect.x = position.width - 255; + rect.y += 23; + rect.width = 270; // width - 70 - padding; + + FontFeatureLookupFlags flags = (FontFeatureLookupFlags)prop_FontFeatureLookupFlags.intValue; + + EditorGUI.BeginChangeCheck(); + flags = (FontFeatureLookupFlags)EditorGUI.EnumFlagsField(rect, new GUIContent("Options:"), flags); + if (EditorGUI.EndChangeCheck()) + { + prop_FontFeatureLookupFlags.intValue = (int)flags; + } + } + + } + + bool ValidateInput(string source) + { + int length = string.IsNullOrEmpty(source) ? 0 : source.Length; + + ////Filter out unwanted characters. + Event evt = Event.current; + + char c = evt.character; + + if (c != '\0') + { + switch (length) + { + case 0: + break; + case 1: + if (source != m_PreviousInput) + return true; + + if ((source[0] == '\\' && (c == 'u' || c == 'U')) == false) + evt.character = '\0'; + + break; + case 2: + case 3: + case 4: + case 5: + if ((c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F')) + evt.character = '\0'; + break; + case 6: + case 7: + case 8: + case 9: + if (source[1] == 'u' || (c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F')) + evt.character = '\0'; + + // Validate input + if (length == 6 && source[1] == 'u' && source != m_PreviousInput) + return true; + break; + case 10: + if (source != m_PreviousInput) + return true; + + evt.character = '\0'; + break; + } + } + + m_PreviousInput = source; + + return false; + } + + uint GetUnicodeCharacter (string source) + { + uint unicode; + + if (source.Length == 1) + unicode = source[0]; + else if (source.Length == 6) + unicode = (uint)TMP_TextUtilities.StringHexToInt(source.Replace("\\u", "")); + else + unicode = (uint)TMP_TextUtilities.StringHexToInt(source.Replace("\\U", "")); + + return unicode; + } + + void DrawGlyph(uint glyphIndex, Rect position, SerializedProperty property) + { + // Get a reference to the font asset + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset == null) + return; + + Glyph glyph; + + // Check if glyph is present in the atlas texture. + if (!fontAsset.glyphLookupTable.TryGetValue(glyphIndex, out glyph)) + return; + + // Get the atlas index of the glyph and lookup its atlas texture + int atlasIndex = glyph.atlasIndex; + Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null; + + if (atlasTexture == null) + return; + + Material mat; + if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + mat = TMP_FontAssetEditor.internalBitmapMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + } + else + { + mat = TMP_FontAssetEditor.internalSDFMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1); + } + + // Draw glyph from atlas texture. + Rect glyphDrawPosition = new Rect(position.x, position.y + 2, 64, 60); + + GlyphRect glyphRect = glyph.glyphRect; + + int padding = fontAsset.atlasPadding; + + int glyphOriginX = glyphRect.x - padding; + int glyphOriginY = glyphRect.y - padding; + int glyphWidth = glyphRect.width + padding * 2; + int glyphHeight = glyphRect.height + padding * 2; + + float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine; + float scale = glyphDrawPosition.width / normalizedHeight; + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height); + + if (Event.current.type == EventType.Repaint) + { + glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2; + glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2; + glyphDrawPosition.width = glyphWidth * scale; + glyphDrawPosition.height = glyphHeight * scale; + + // Could switch to using the default material of the font asset which would require passing scale to the shader. + Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat); + } + } + + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta new file mode 100644 index 0000000..b95203f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d256fa541faf5d4409992c631adb98a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs new file mode 100644 index 0000000..d8d3700 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs @@ -0,0 +1,122 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(Glyph))] + public class TMP_GlyphPropertyDrawer : PropertyDrawer + { + private string k_ColorProperty = "_Color"; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_GlyphIndex = property.FindPropertyRelative("m_Index"); + SerializedProperty prop_GlyphMetrics = property.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + SerializedProperty prop_Scale = property.FindPropertyRelative("m_Scale"); + SerializedProperty prop_AtlasIndex = property.FindPropertyRelative("m_AtlasIndex"); + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + Rect rect = new Rect(position.x + 70, position.y, position.width, 49); + + float labelWidth = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_GlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 85, 64f, 18f), new GUIContent("ID: " + prop_GlyphIndex.intValue + ""), style); + //EditorGUIUtility.labelWidth = 22f; + //EditorGUI.DelayedIntField(new Rect(position.x + (64 - labelWidth) / 2, position.y + 89, 58f, 18f), prop_GlyphIndex, new GUIContent("ID:")); + + // We get Rect since a valid position may not be provided by the caller. + EditorGUI.PropertyField(new Rect(rect.x, rect.y, position.width, 49), prop_GlyphRect); + + rect.y += 45; + EditorGUI.PropertyField(rect, prop_GlyphMetrics); + + EditorGUIUtility.labelWidth = 40f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 65, 75, 18), prop_Scale, new GUIContent("Scale:")); // new GUIContent("Scale: " + prop_Scale.floatValue + ""), style); + + EditorGUIUtility.labelWidth = 74f; + EditorGUI.PropertyField(new Rect(rect.x + 85, rect.y + 65, 95, 18), prop_AtlasIndex, new GUIContent("Atlas Index:")); // new GUIContent("Atlas Index: " + prop_AtlasIndex.intValue + ""), style); + + DrawGlyph(position, property); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 130f; + } + + void DrawGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the sprite texture + TMP_FontAsset fontAsset = property.serializedObject.targetObject as TMP_FontAsset; + + if (fontAsset == null) + return; + + // Get reference to atlas texture. + int atlasIndex = property.FindPropertyRelative("m_AtlasIndex").intValue; + Texture2D atlasTexture = fontAsset.atlasTextures.Length > atlasIndex ? fontAsset.atlasTextures[atlasIndex] : null; + + if (atlasTexture == null) + return; + + Material mat; + if (((GlyphRasterModes)fontAsset.atlasRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + mat = TMP_FontAssetEditor.internalBitmapMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetColor(k_ColorProperty, Color.white); + } + else + { + mat = TMP_FontAssetEditor.internalSDFMaterial; + + if (mat == null) + return; + + mat.mainTexture = atlasTexture; + mat.SetFloat(ShaderUtilities.ID_GradientScale, fontAsset.atlasPadding + 1); + } + + // Draw glyph from atlas texture. + Rect glyphDrawPosition = new Rect(position.x, position.y + 2, 64, 80); + + SerializedProperty glyphRectProperty = property.FindPropertyRelative("m_GlyphRect"); + + int padding = fontAsset.atlasPadding; + + int glyphOriginX = glyphRectProperty.FindPropertyRelative("m_X").intValue - padding; + int glyphOriginY = glyphRectProperty.FindPropertyRelative("m_Y").intValue - padding; + int glyphWidth = glyphRectProperty.FindPropertyRelative("m_Width").intValue + padding * 2; + int glyphHeight = glyphRectProperty.FindPropertyRelative("m_Height").intValue + padding * 2; + + float normalizedHeight = fontAsset.faceInfo.ascentLine - fontAsset.faceInfo.descentLine; + float scale = glyphDrawPosition.width / normalizedHeight; + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)glyphOriginX / atlasTexture.width, (float)glyphOriginY / atlasTexture.height, (float)glyphWidth / atlasTexture.width, (float)glyphHeight / atlasTexture.height); + + if (Event.current.type == EventType.Repaint) + { + glyphDrawPosition.x += (glyphDrawPosition.width - glyphWidth * scale) / 2; + glyphDrawPosition.y += (glyphDrawPosition.height - glyphHeight * scale) / 2; + glyphDrawPosition.width = glyphWidth * scale; + glyphDrawPosition.height = glyphHeight * scale; + + // Could switch to using the default material of the font asset which would require passing scale to the shader. + Graphics.DrawTexture(glyphDrawPosition, atlasTexture, texCoords, 0, 0, 0, 0, new Color(1f, 1f, 1f), mat); + } + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta new file mode 100644 index 0000000..ce08447 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4777500b5da6094e956c3d4f04de4db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs new file mode 100644 index 0000000..ec481d7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs @@ -0,0 +1,283 @@ +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using UnityEditor.UI; +using UnityEditor.AnimatedValues; + + +namespace TMPro.EditorUtilities +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(TMP_InputField), true)] + public class TMP_InputFieldEditor : SelectableEditor + { + private struct m_foldout + { // Track Inspector foldout panel states, globally. + public static bool textInput = true; + public static bool fontSettings = true; + public static bool extraSettings = true; + //public static bool shadowSetting = false; + //public static bool materialEditor = true; + } + + SerializedProperty m_TextViewport; + SerializedProperty m_TextComponent; + SerializedProperty m_Text; + SerializedProperty m_ContentType; + SerializedProperty m_LineType; + SerializedProperty m_LineLimit; + SerializedProperty m_InputType; + SerializedProperty m_CharacterValidation; + SerializedProperty m_InputValidator; + SerializedProperty m_RegexValue; + SerializedProperty m_KeyboardType; + SerializedProperty m_CharacterLimit; + SerializedProperty m_CaretBlinkRate; + SerializedProperty m_CaretWidth; + SerializedProperty m_CaretColor; + SerializedProperty m_CustomCaretColor; + SerializedProperty m_SelectionColor; + SerializedProperty m_HideMobileKeyboard; + SerializedProperty m_HideMobileInput; + SerializedProperty m_Placeholder; + SerializedProperty m_VerticalScrollbar; + SerializedProperty m_ScrollbarScrollSensitivity; + SerializedProperty m_OnValueChanged; + SerializedProperty m_OnEndEdit; + SerializedProperty m_OnSelect; + SerializedProperty m_OnDeselect; + SerializedProperty m_ReadOnly; + SerializedProperty m_RichText; + SerializedProperty m_RichTextEditingAllowed; + SerializedProperty m_ResetOnDeActivation; + SerializedProperty m_RestoreOriginalTextOnEscape; + + SerializedProperty m_OnFocusSelectAll; + SerializedProperty m_GlobalPointSize; + SerializedProperty m_GlobalFontAsset; + + AnimBool m_CustomColor; + + //TMP_InputValidator m_ValidationScript; + + protected override void OnEnable() + { + base.OnEnable(); + + m_TextViewport = serializedObject.FindProperty("m_TextViewport"); + m_TextComponent = serializedObject.FindProperty("m_TextComponent"); + m_Text = serializedObject.FindProperty("m_Text"); + m_ContentType = serializedObject.FindProperty("m_ContentType"); + m_LineType = serializedObject.FindProperty("m_LineType"); + m_LineLimit = serializedObject.FindProperty("m_LineLimit"); + m_InputType = serializedObject.FindProperty("m_InputType"); + m_CharacterValidation = serializedObject.FindProperty("m_CharacterValidation"); + m_InputValidator = serializedObject.FindProperty("m_InputValidator"); + m_RegexValue = serializedObject.FindProperty("m_RegexValue"); + m_KeyboardType = serializedObject.FindProperty("m_KeyboardType"); + m_CharacterLimit = serializedObject.FindProperty("m_CharacterLimit"); + m_CaretBlinkRate = serializedObject.FindProperty("m_CaretBlinkRate"); + m_CaretWidth = serializedObject.FindProperty("m_CaretWidth"); + m_CaretColor = serializedObject.FindProperty("m_CaretColor"); + m_CustomCaretColor = serializedObject.FindProperty("m_CustomCaretColor"); + m_SelectionColor = serializedObject.FindProperty("m_SelectionColor"); + + m_HideMobileKeyboard = serializedObject.FindProperty("m_HideSoftKeyboard"); + m_HideMobileInput = serializedObject.FindProperty("m_HideMobileInput"); + + m_Placeholder = serializedObject.FindProperty("m_Placeholder"); + m_VerticalScrollbar = serializedObject.FindProperty("m_VerticalScrollbar"); + m_ScrollbarScrollSensitivity = serializedObject.FindProperty("m_ScrollSensitivity"); + + m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged"); + m_OnEndEdit = serializedObject.FindProperty("m_OnEndEdit"); + m_OnSelect = serializedObject.FindProperty("m_OnSelect"); + m_OnDeselect = serializedObject.FindProperty("m_OnDeselect"); + m_ReadOnly = serializedObject.FindProperty("m_ReadOnly"); + m_RichText = serializedObject.FindProperty("m_RichText"); + m_RichTextEditingAllowed = serializedObject.FindProperty("m_isRichTextEditingAllowed"); + m_ResetOnDeActivation = serializedObject.FindProperty("m_ResetOnDeActivation"); + m_RestoreOriginalTextOnEscape = serializedObject.FindProperty("m_RestoreOriginalTextOnEscape"); + + m_OnFocusSelectAll = serializedObject.FindProperty("m_OnFocusSelectAll"); + m_GlobalPointSize = serializedObject.FindProperty("m_GlobalPointSize"); + m_GlobalFontAsset = serializedObject.FindProperty("m_GlobalFontAsset"); + + m_CustomColor = new AnimBool(m_CustomCaretColor.boolValue); + m_CustomColor.valueChanged.AddListener(Repaint); + } + + protected override void OnDisable() + { + base.OnDisable(); + m_CustomColor.valueChanged.RemoveListener(Repaint); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + base.OnInspectorGUI(); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_TextViewport); + + EditorGUILayout.PropertyField(m_TextComponent); + + TextMeshProUGUI text = null; + if (m_TextComponent != null && m_TextComponent.objectReferenceValue != null) + { + text = m_TextComponent.objectReferenceValue as TextMeshProUGUI; + //if (text.supportRichText) + //{ + // EditorGUILayout.HelpBox("Using Rich Text with input is unsupported.", MessageType.Warning); + //} + } + + EditorGUI.BeginDisabledGroup(m_TextComponent == null || m_TextComponent.objectReferenceValue == null); + + // TEXT INPUT BOX + EditorGUILayout.PropertyField(m_Text); + + // INPUT FIELD SETTINGS + #region INPUT FIELD SETTINGS + + m_foldout.fontSettings = EditorGUILayout.Foldout(m_foldout.fontSettings, "Input Field Settings", true, TMP_UIStyleManager.boldFoldout); + + if (m_foldout.fontSettings) + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_GlobalFontAsset, new GUIContent("Font Asset", "Set the Font Asset for both Placeholder and Input Field text object.")); + if (EditorGUI.EndChangeCheck()) + { + TMP_InputField inputField = target as TMP_InputField; + inputField.SetGlobalFontAsset(m_GlobalFontAsset.objectReferenceValue as TMP_FontAsset); + } + + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_GlobalPointSize, new GUIContent("Point Size", "Set the point size of both Placeholder and Input Field text object.")); + if (EditorGUI.EndChangeCheck()) + { + TMP_InputField inputField = target as TMP_InputField; + inputField.SetGlobalPointSize(m_GlobalPointSize.floatValue); + } + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_CharacterLimit); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_ContentType); + if (!m_ContentType.hasMultipleDifferentValues) + { + EditorGUI.indentLevel++; + + if (m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Standard || + m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Autocorrected || + m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Custom) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_LineType); + if (EditorGUI.EndChangeCheck()) + { + if (text != null) + { + if (m_LineType.enumValueIndex == (int)TMP_InputField.LineType.SingleLine) + text.enableWordWrapping = false; + else + { + text.enableWordWrapping = true; + } + } + } + + if (m_LineType.enumValueIndex != (int)TMP_InputField.LineType.SingleLine) + { + EditorGUILayout.PropertyField(m_LineLimit); + } + } + + if (m_ContentType.enumValueIndex == (int)TMP_InputField.ContentType.Custom) + { + EditorGUILayout.PropertyField(m_InputType); + EditorGUILayout.PropertyField(m_KeyboardType); + EditorGUILayout.PropertyField(m_CharacterValidation); + if (m_CharacterValidation.enumValueIndex == (int)TMP_InputField.CharacterValidation.Regex) + { + EditorGUILayout.PropertyField(m_RegexValue); + } + else if (m_CharacterValidation.enumValueIndex == (int)TMP_InputField.CharacterValidation.CustomValidator) + { + EditorGUILayout.PropertyField(m_InputValidator); + } + } + + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_Placeholder); + EditorGUILayout.PropertyField(m_VerticalScrollbar); + + if (m_VerticalScrollbar.objectReferenceValue != null) + EditorGUILayout.PropertyField(m_ScrollbarScrollSensitivity); + + EditorGUILayout.PropertyField(m_CaretBlinkRate); + EditorGUILayout.PropertyField(m_CaretWidth); + + EditorGUILayout.PropertyField(m_CustomCaretColor); + + m_CustomColor.target = m_CustomCaretColor.boolValue; + + if (EditorGUILayout.BeginFadeGroup(m_CustomColor.faded)) + { + EditorGUILayout.PropertyField(m_CaretColor); + } + EditorGUILayout.EndFadeGroup(); + + EditorGUILayout.PropertyField(m_SelectionColor); + + EditorGUI.indentLevel--; + } + #endregion + + + // CONTROL SETTINGS + #region CONTROL SETTINGS + m_foldout.extraSettings = EditorGUILayout.Foldout(m_foldout.extraSettings, "Control Settings", true, TMP_UIStyleManager.boldFoldout); + + if (m_foldout.extraSettings) + { + EditorGUI.indentLevel++; + + EditorGUILayout.PropertyField(m_OnFocusSelectAll, new GUIContent("OnFocus - Select All", "Should all the text be selected when the Input Field is selected.")); + EditorGUILayout.PropertyField(m_ResetOnDeActivation, new GUIContent("Reset On DeActivation", "Should the Text and Caret position be reset when Input Field is DeActivated.")); + EditorGUILayout.PropertyField(m_RestoreOriginalTextOnEscape, new GUIContent("Restore On ESC Key", "Should the original text be restored when pressing ESC.")); + EditorGUILayout.PropertyField(m_HideMobileKeyboard, new GUIContent("Hide Soft Keyboard", "Controls the visibility of the mobile virtual keyboard.")); + EditorGUILayout.PropertyField(m_HideMobileInput, new GUIContent("Hide Mobile Input", "Controls the visibility of the editable text field above the mobile virtual keyboard.")); + EditorGUILayout.PropertyField(m_ReadOnly); + EditorGUILayout.PropertyField(m_RichText); + EditorGUILayout.PropertyField(m_RichTextEditingAllowed, new GUIContent("Allow Rich Text Editing")); + + EditorGUI.indentLevel--; + } + #endregion + + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(m_OnValueChanged); + EditorGUILayout.PropertyField(m_OnEndEdit); + EditorGUILayout.PropertyField(m_OnSelect); + EditorGUILayout.PropertyField(m_OnDeselect); + + EditorGUI.EndDisabledGroup(); + + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta new file mode 100644 index 0000000..eeb62d8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aa160f27c3fe4052a5850e21108811b6 +timeCreated: 1457861621 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs new file mode 100644 index 0000000..83d19f8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs @@ -0,0 +1,76 @@ +// When enabled, allows setting the material by dropping a material onto the MeshRenderer inspector component. +// The drawback is that the MeshRenderer inspector will not have properties for light probes, so if you need light probe support, do not enable this. +//#define ALLOW_MESHRENDERER_MATERIAL_DRAG_N_DROP + +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + // Disabled for compatibility reason as lightprobe setup isn't supported due to inability to inherit from MeshRendererEditor class +#if ALLOW_MESHRENDERER_MATERIAL_DRAG_N_DROP + [CanEditMultipleObjects] + [CustomEditor(typeof(MeshRenderer))] + public class TMP_MeshRendererEditor : Editor + { + private SerializedProperty m_Materials; + + void OnEnable() + { + m_Materials = serializedObject.FindProperty("m_Materials"); + } + + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + // Get a reference to the current material. + SerializedProperty material_prop = m_Materials.GetArrayElementAtIndex(0); + Material currentMaterial = material_prop.objectReferenceValue as Material; + + EditorGUI.BeginChangeCheck(); + base.OnInspectorGUI(); + if (EditorGUI.EndChangeCheck()) + { + material_prop = m_Materials.GetArrayElementAtIndex(0); + + TMP_FontAsset newFontAsset = null; + Material newMaterial = null; + + if (material_prop != null) + newMaterial = material_prop.objectReferenceValue as Material; + + // Check if the new material is referencing a different font atlas texture. + if (newMaterial != null && currentMaterial.GetInstanceID() != newMaterial.GetInstanceID()) + { + // Search for the Font Asset matching the new font atlas texture. + newFontAsset = TMP_EditorUtility.FindMatchingFontAsset(newMaterial); + } + + + GameObject[] objects = Selection.gameObjects; + + for (int i = 0; i < objects.Length; i++) + { + // Assign new font asset + if (newFontAsset != null) + { + TMP_Text textComponent = objects[i].GetComponent(); + + if (textComponent != null) + { + Undo.RecordObject(textComponent, "Font Asset Change"); + textComponent.font = newFontAsset; + } + } + + TMPro_EventManager.ON_DRAG_AND_DROP_MATERIAL_CHANGED(objects[i], currentMaterial, newMaterial); + } + } + } + } +#endif +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta new file mode 100644 index 0000000..d6b133f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6d437b997e074079b4b2f6e395394f4b +timeCreated: 1462864011 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs new file mode 100644 index 0000000..9288111 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs @@ -0,0 +1,565 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.IO; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using TMPro.EditorUtilities; + + +namespace TMPro +{ + // Suppressing warnings related to the use of private structures which are confusing the compiler as these data structures are used by .json files. + #pragma warning disable 0649 + + /// + /// Data structure containing the target and replacement fileIDs and GUIDs which will require remapping from previous version of TextMesh Pro to the new TextMesh Pro UPM package. + /// + [System.Serializable] + struct AssetConversionRecord + { + public string referencedResource; + public string target; + public string replacement; + } + + + /// + /// Data structure containing a list of target and replacement fileID and GUID requiring remapping from previous versions of TextMesh Pro to the new TextMesh Pro UPM package. + /// This data structure is populated with the data contained in the PackageConversionData.json file included in the package. + /// + [System.Serializable] + class AssetConversionData + { + public List assetRecords; + } + + + public class TMP_ProjectConversionUtility : EditorWindow + { + // Create Project Files GUID Remapping Tool window + [MenuItem("Window/TextMeshPro/Project Files GUID Remapping Tool", false, 2100)] + static void ShowConverterWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Conversion Tool"); + window.Focus(); + } + + private static HashSet m_IgnoreAssetTypes = new HashSet() + { + typeof(AnimatorOverrideController), + typeof(AudioClip), + typeof(AvatarMask), + typeof(ComputeShader), + typeof(Cubemap), + typeof(DefaultAsset), + typeof(Flare), + typeof(Font), + typeof(GUISkin), + typeof(HumanTemplate), + typeof(LightingDataAsset), + typeof(Mesh), + typeof(MonoScript), + typeof(PhysicMaterial), + typeof(PhysicsMaterial2D), + typeof(RenderTexture), + typeof(Shader), + typeof(TerrainData), + typeof(TextAsset), + typeof(Texture2D), + typeof(Texture2DArray), + typeof(Texture3D), + typeof(UnityEditorInternal.AssemblyDefinitionAsset), + typeof(UnityEngine.AI.NavMeshData), + typeof(UnityEngine.Tilemaps.Tile), + typeof(UnityEngine.U2D.SpriteAtlas), + typeof(UnityEngine.Video.VideoClip), + }; + + /// + /// + /// + struct AssetModificationRecord + { + public string assetFilePath; + public string assetDataFile; + } + + struct AssetFileRecord + { + public string assetFilePath; + public string assetMetaFilePath; + + public AssetFileRecord(string filePath, string metaFilePath) + { + this.assetFilePath = filePath; + this.assetMetaFilePath = metaFilePath; + } + } + + private static string m_ProjectPath; + private static string m_ProjectFolderToScan; + private static bool m_IsAlreadyScanningProject; + private static bool m_CancelScanProcess; + private static string k_ProjectScanReportDefaultText = "Project Scan Results\n"; + private static string k_ProjectScanLabelPrefix = "Scanning: "; + private static string m_ProjectScanResults = string.Empty; + private static Vector2 m_ProjectScanResultScrollPosition; + private static float m_ProgressPercentage = 0; + + private static int m_ScanningTotalFiles; + private static int m_RemainingFilesToScan; + private static int m_ScanningCurrentFileIndex; + private static string m_ScanningCurrentFileName; + + private static AssetConversionData m_ConversionData; + + private static List m_ModifiedAssetList = new List(); + + + void OnEnable() + { + // Set Editor Window Size + SetEditorWindowSize(); + + m_ProjectScanResults = k_ProjectScanReportDefaultText; + } + + + void OnGUI() + { + GUILayout.BeginVertical(); + { + // Scan project files and resources + GUILayout.BeginVertical(EditorStyles.helpBox); + { + GUILayout.Label("Scan Project Files", EditorStyles.boldLabel); + GUILayout.Label("Press the Scan Project Files button to begin scanning your project for files & resources that were created with a previous version of TextMesh Pro.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + GUILayout.Label("Project folder to be scanned. Example \"Assets/TextMesh Pro\""); + m_ProjectFolderToScan = EditorGUILayout.TextField("Folder Path: Assets/", m_ProjectFolderToScan); + GUILayout.Space(5f); + + GUI.enabled = m_IsAlreadyScanningProject == false ? true : false; + if (GUILayout.Button("Scan Project Files")) + { + m_CancelScanProcess = false; + + // Make sure Asset Serialization mode is set to ForceText and Version Control mode to Visible Meta Files. + if (CheckProjectSerializationAndSourceControlModes() == true) + { + m_ProjectPath = Path.GetFullPath("Assets/.."); + TMP_EditorCoroutine.StartCoroutine(ScanProjectFiles()); + } + else + { + EditorUtility.DisplayDialog("Project Settings Change Required", "In menu options \"Edit - Project Settings - Editor\", please change Asset Serialization Mode to ForceText and Source Control Mode to Visible Meta Files.", "OK", string.Empty); + } + } + GUI.enabled = true; + + // Display progress bar + Rect rect = GUILayoutUtility.GetRect(0f, 20f, GUILayout.ExpandWidth(true)); + EditorGUI.ProgressBar(rect, m_ProgressPercentage, "Scan Progress (" + m_ScanningCurrentFileIndex + "/" + m_ScanningTotalFiles + ")"); + + // Display cancel button and name of file currently being scanned. + if (m_IsAlreadyScanningProject) + { + Rect cancelRect = new Rect(rect.width - 20, rect.y + 2, 20, 16); + if (GUI.Button(cancelRect, "X")) + { + m_CancelScanProcess = true; + } + GUILayout.Label(k_ProjectScanLabelPrefix + m_ScanningCurrentFileName, TMP_UIStyleManager.label); + } + else + GUILayout.Label(string.Empty); + + GUILayout.Space(5); + + // Creation Feedback + GUILayout.BeginVertical(TMP_UIStyleManager.textAreaBoxWindow, GUILayout.ExpandHeight(true)); + { + m_ProjectScanResultScrollPosition = EditorGUILayout.BeginScrollView(m_ProjectScanResultScrollPosition, GUILayout.ExpandHeight(true)); + EditorGUILayout.LabelField(m_ProjectScanResults, TMP_UIStyleManager.label); + EditorGUILayout.EndScrollView(); + } + GUILayout.EndVertical(); + GUILayout.Space(5f); + } + GUILayout.EndVertical(); + + // Scan project files and resources + GUILayout.BeginVertical(EditorStyles.helpBox); + { + GUILayout.Label("Save Modified Project Files", EditorStyles.boldLabel); + GUILayout.Label("Pressing the Save Modified Project Files button will update the files in the Project Scan Results listed above. Please make sure that you have created a backup of your project first as these file modifications are permanent and cannot be undone.", TMP_UIStyleManager.label); + GUILayout.Space(5f); + + GUI.enabled = m_IsAlreadyScanningProject == false && m_ModifiedAssetList.Count > 0 ? true : false; + if (GUILayout.Button("Save Modified Project Files")) + { + UpdateProjectFiles(); + } + GUILayout.Space(10f); + } + GUILayout.EndVertical(); + + } + GUILayout.EndVertical(); + GUILayout.Space(5f); + } + + void OnInspectorUpdate() + { + Repaint(); + } + + + /// + /// Limits the minimum size of the editor window. + /// + void SetEditorWindowSize() + { + EditorWindow editorWindow = this; + + Vector2 currentWindowSize = editorWindow.minSize; + + editorWindow.minSize = new Vector2(Mathf.Max(640, currentWindowSize.x), Mathf.Max(420, currentWindowSize.y)); + } + + + /// + /// + /// + /// + /// + private static bool ShouldIgnoreFile(string filePath) + { + string fileExtension = Path.GetExtension(filePath); + Type fileType = AssetDatabase.GetMainAssetTypeAtPath(filePath); + + if (m_IgnoreAssetTypes.Contains(fileType)) + return true; + + // Exclude FBX + if (fileType == typeof(GameObject) && (fileExtension.ToLower() == ".fbx" || fileExtension.ToLower() == ".blend")) + return true; + + return false; + } + + + private IEnumerator ScanProjectFiles() + { + m_IsAlreadyScanningProject = true; + string packageFullPath = EditorUtilities.TMP_EditorUtility.packageFullPath; + + // List containing assets that have been modified. + m_ProjectScanResults = k_ProjectScanReportDefaultText; + m_ModifiedAssetList.Clear(); + m_ProgressPercentage = 0; + + // Read Conversion Data from Json file. + if (m_ConversionData == null) + m_ConversionData = JsonUtility.FromJson(File.ReadAllText(packageFullPath + "/PackageConversionData.json")); + + // Get list of GUIDs for assets that might contain references to previous GUIDs that require updating. + string searchFolder = string.IsNullOrEmpty(m_ProjectFolderToScan) ? "Assets" : ("Assets/" + m_ProjectFolderToScan); + string[] guids = AssetDatabase.FindAssets("t:Object", new string[] { searchFolder }).Distinct().ToArray(); + + k_ProjectScanLabelPrefix = "Phase 1 - Filtering: "; + m_ScanningTotalFiles = guids.Length; + m_ScanningCurrentFileIndex = 0; + + List projectFilesToScan = new List(); + + foreach (var guid in guids) + { + if (m_CancelScanProcess) + break; + + string assetFilePath = AssetDatabase.GUIDToAssetPath(guid); + + m_ScanningCurrentFileIndex += 1; + m_ScanningCurrentFileName = assetFilePath; + m_ProgressPercentage = (float)m_ScanningCurrentFileIndex / m_ScanningTotalFiles; + + // Filter out file types we have no interest in searching + if (ShouldIgnoreFile(assetFilePath)) + continue; + + string assetMetaFilePath = AssetDatabase.GetTextMetaFilePathFromAssetPath(assetFilePath); + + projectFilesToScan.Add(new AssetFileRecord(assetFilePath, assetMetaFilePath)); + + yield return null; + } + + m_RemainingFilesToScan = m_ScanningTotalFiles = projectFilesToScan.Count; + + k_ProjectScanLabelPrefix = "Phase 2 - Scanning: "; + + for (int i = 0; i < m_ScanningTotalFiles; i++) + { + if (m_CancelScanProcess) + break; + + AssetFileRecord fileRecord = projectFilesToScan[i]; + + ThreadPool.QueueUserWorkItem(Task => + { + ScanProjectFileAsync(fileRecord); + + m_ScanningCurrentFileName = fileRecord.assetFilePath; + + int completedScans = m_ScanningTotalFiles - Interlocked.Decrement(ref m_RemainingFilesToScan); + + m_ScanningCurrentFileIndex = completedScans; + m_ProgressPercentage = (float)completedScans / m_ScanningTotalFiles; + }); + + if (i % 64 == 0) + yield return new WaitForSeconds(2.0f); + + } + + while (m_RemainingFilesToScan > 0 && !m_CancelScanProcess) + yield return null; + + m_IsAlreadyScanningProject = false; + m_ScanningCurrentFileName = string.Empty; + } + + + static void ScanProjectFileAsync(AssetFileRecord fileRecord) + { + if (m_CancelScanProcess) + return; + + // Read the asset data file + string assetDataFile = string.Empty; + bool hasFileChanged = false; + + try + { + assetDataFile = File.ReadAllText(m_ProjectPath + "/" + fileRecord.assetFilePath); + } + catch + { + // Continue to the next asset if we can't read the current one. + return; + } + + // Read the asset meta data file + string assetMetaFile = File.ReadAllText(m_ProjectPath + "/" + fileRecord.assetMetaFilePath); + bool hasMetaFileChanges = false; + + foreach (AssetConversionRecord record in m_ConversionData.assetRecords) + { + if (assetDataFile.Contains(record.target)) + { + hasFileChanged = true; + + assetDataFile = assetDataFile.Replace(record.target, record.replacement); + } + + //// Check meta file + if (assetMetaFile.Contains(record.target)) + { + hasMetaFileChanges = true; + + assetMetaFile = assetMetaFile.Replace(record.target, record.replacement); + } + } + + if (hasFileChanged) + { + AssetModificationRecord modifiedAsset; + modifiedAsset.assetFilePath = fileRecord.assetFilePath; + modifiedAsset.assetDataFile = assetDataFile; + + m_ModifiedAssetList.Add(modifiedAsset); + + m_ProjectScanResults += fileRecord.assetFilePath + "\n"; + } + + if (hasMetaFileChanges) + { + AssetModificationRecord modifiedAsset; + modifiedAsset.assetFilePath = fileRecord.assetMetaFilePath; + modifiedAsset.assetDataFile = assetMetaFile; + + m_ModifiedAssetList.Add(modifiedAsset); + + m_ProjectScanResults += fileRecord.assetMetaFilePath + "\n"; + } + } + + + /// + /// + /// + private static void ResetScanProcess() + { + m_IsAlreadyScanningProject = false; + m_ScanningCurrentFileName = string.Empty; + m_ProgressPercentage = 0; + m_ScanningCurrentFileIndex = 0; + m_ScanningTotalFiles = 0; + } + + + /// + /// + /// + private static void UpdateProjectFiles() + { + // Make sure Asset Serialization mode is set to ForceText with Visible Meta Files. + CheckProjectSerializationAndSourceControlModes(); + + string projectPath = Path.GetFullPath("Assets/.."); + + // Display dialogue to show user a list of project files that will be modified upon their consent. + if (EditorUtility.DisplayDialog("Save Modified Asset(s)?", "Are you sure you want to save all modified assets?", "YES", "NO")) + { + for (int i = 0; i < m_ModifiedAssetList.Count; i++) + { + // Make sure all file streams that might have been opened by Unity are closed. + //AssetDatabase.ReleaseCachedFileHandles(); + + //Debug.Log("Writing asset file [" + m_ModifiedAssetList[i].assetFilePath + "]."); + + File.WriteAllText(projectPath + "/" + m_ModifiedAssetList[i].assetFilePath, m_ModifiedAssetList[i].assetDataFile); + } + } + + AssetDatabase.Refresh(); + + m_ProgressPercentage = 0; + m_ProjectScanResults = k_ProjectScanReportDefaultText; + } + + + /// + /// Check project Asset Serialization and Source Control modes + /// + private static bool CheckProjectSerializationAndSourceControlModes() + { + // Check Project Asset Serialization and Visible Meta Files mode. + if (EditorSettings.serializationMode != SerializationMode.ForceText || EditorSettings.externalVersionControl != "Visible Meta Files") + { + return false; + } + + return true; + } + } + + + + public class TMP_PackageUtilities : Editor + { + + enum SaveAssetDialogueOptions { Unset = 0, Save = 1, SaveAll = 2, DoNotSave = 3 }; + + private static SerializationMode m_ProjectAssetSerializationMode; + private static string m_ProjectExternalVersionControl; + + struct AssetRemappingRecord + { + public string oldGuid; + public string newGuid; + public string assetPath; + } + + struct AssetModificationRecord + { + public string assetFilePath; + public string assetDataFile; + } + + /// + /// + /// + [MenuItem("Window/TextMeshPro/Import TMP Essential Resources", false, 2050)] + public static void ImportProjectResourcesMenu() + { + ImportEssentialResources(); + } + + + /// + /// + /// + [MenuItem("Window/TextMeshPro/Import TMP Examples and Extras", false, 2051)] + public static void ImportExamplesContentMenu() + { + ImportExamplesAndExtras(); + } + + + private static void GetVersionInfo() + { + string version = TMP_Settings.version; + Debug.Log("The version of this TextMesh Pro UPM package is (" + version + ")."); + } + + + /// + /// + /// + private static void ImportExamplesAndExtras() + { + string packageFullPath = TMP_EditorUtility.packageFullPath; + + AssetDatabase.ImportPackage(packageFullPath + "/Package Resources/TMP Examples & Extras.unitypackage", true); + } + + private static string k_SettingsFilePath; + private static byte[] k_SettingsBackup; + + /// + /// + /// + private static void ImportEssentialResources() + { + // Check if the TMP Settings asset is already present in the project. + string[] settings = AssetDatabase.FindAssets("t:TMP_Settings"); + + if (settings.Length > 0) + { + // Save assets just in case the TMP Setting were modified before import. + AssetDatabase.SaveAssets(); + + // Copy existing TMP Settings asset to a byte[] + k_SettingsFilePath = AssetDatabase.GUIDToAssetPath(settings[0]); + k_SettingsBackup = File.ReadAllBytes(k_SettingsFilePath); + + RegisterResourceImportCallback(); + } + + string packageFullPath = TMP_EditorUtility.packageFullPath; + + AssetDatabase.ImportPackage(packageFullPath + "/Package Resources/TMP Essential Resources.unitypackage", true); + } + + private static void RegisterResourceImportCallback() + { + AssetDatabase.importPackageCompleted += ImportCallback; + } + + private static void ImportCallback(string packageName) + { + // Restore backup of TMP Settings from byte[] + File.WriteAllBytes(k_SettingsFilePath, k_SettingsBackup); + + AssetDatabase.Refresh(); + + AssetDatabase.importPackageCompleted -= ImportCallback; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs.meta new file mode 100644 index 0000000..e03778c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68eedd4e5b33b37429c02c4add0036fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs new file mode 100644 index 0000000..a8b800a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs @@ -0,0 +1,63 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; +using System.IO; + + +namespace TMPro +{ + public class TMP_PostBuildProcessHandler + { + [PostProcessBuildAttribute(10000)] + public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) + { + // Check if TMP Essential Resource are present in user project. + if (target == BuildTarget.iOS && File.Exists(GetEssentialProjectResourcesPath() + "/Resources/TMP Settings.asset") && TMP_Settings.enableEmojiSupport) + { + string file = Path.Combine(pathToBuiltProject, "Classes/UI/Keyboard.mm"); + string content = File.ReadAllText(file); + content = content.Replace("FILTER_EMOJIS_IOS_KEYBOARD 1", "FILTER_EMOJIS_IOS_KEYBOARD 0"); + File.WriteAllText(file, content); + } + } + + + private static string GetEssentialProjectResourcesPath() + { + // Find the potential location of the TextMesh Pro folder in the user project. + string projectPath = Path.GetFullPath("Assets/.."); + if (Directory.Exists(projectPath)) + { + // Search for default location of TMP Essential Resources + if (Directory.Exists(projectPath + "/Assets/TextMesh Pro/Resources")) + { + return "Assets/TextMesh Pro"; + } + + // Search for potential alternative locations in the user project + string[] matchingPaths = Directory.GetDirectories(projectPath, "TextMesh Pro", SearchOption.AllDirectories); + projectPath = ValidateLocation(matchingPaths, projectPath); + if (projectPath != null) return projectPath; + } + + return null; + } + + + private static string ValidateLocation(string[] paths, string projectPath) + { + for (int i = 0; i < paths.Length; i++) + { + // Check if any of the matching directories contain a GUISkins directory. + if (Directory.Exists(paths[i] + "/Resources")) + { + string folderPath = paths[i].Replace(projectPath, ""); + folderPath = folderPath.TrimStart('\\', '/'); + return folderPath; + } + } + + return null; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta new file mode 100644 index 0000000..af212b8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6fdea2af3daa40fe8f88e5e9cfc17abb +timeCreated: 1479886230 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs new file mode 100644 index 0000000..b8695be --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs @@ -0,0 +1,43 @@ +#if !UNITY_2018_3_OR_NEWER +using UnityEditor; + +namespace TMPro +{ + + public static class TMP_ProjectTextSettings + { + // Open Project Text Settings + [MenuItem("Edit/Project Settings/TextMeshPro Settings", false, 309)] + public static void SelectProjectTextSettings() + { + TMP_Settings textSettings = TMP_Settings.instance; + + if (textSettings) + { + Selection.activeObject = textSettings; + + // TODO: Do we want to ping the Project Text Settings asset in the Project Inspector + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(textSettings); + } + else + TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED); + } + + + // Event received when TMP resources have been loaded. + static void ON_RESOURCES_LOADED() + { + TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED); + + TMP_Settings textSettings = TMP_Settings.instance; + + Selection.activeObject = textSettings; + + // TODO: Do we want to ping the Project Text Settings asset in the Project Inspector + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(textSettings); + } + } +} +#endif \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta new file mode 100644 index 0000000..6d19454 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e751e877ed14d71a6b8e63ac54949cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs new file mode 100644 index 0000000..090bd77 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs @@ -0,0 +1,68 @@ +using UnityEditor; +using UnityEngine; +using System.Collections; + +namespace TMPro.EditorUtilities +{ + + //[InitializeOnLoad] + class TMP_ResourcesLoader + { + + /// + /// Function to pre-load the TMP Resources + /// + public static void LoadTextMeshProResources() + { + //TMP_Settings.LoadDefaultSettings(); + //TMP_StyleSheet.LoadDefaultStyleSheet(); + } + + + static TMP_ResourcesLoader() + { + //Debug.Log("Loading TMP Resources..."); + + // Get current targetted platform + + + //string Settings = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone); + //TMPro.TMP_Settings.LoadDefaultSettings(); + //TMPro.TMP_StyleSheet.LoadDefaultStyleSheet(); + } + + + + //[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + //static void OnBeforeSceneLoaded() + //{ + //Debug.Log("Before scene is loaded."); + + // //TMPro.TMP_Settings.LoadDefaultSettings(); + // //TMPro.TMP_StyleSheet.LoadDefaultStyleSheet(); + + // //ShaderVariantCollection collection = new ShaderVariantCollection(); + // //Shader s0 = Shader.Find("TextMeshPro/Mobile/Distance Field"); + // //ShaderVariantCollection.ShaderVariant tmp_Variant = new ShaderVariantCollection.ShaderVariant(s0, UnityEngine.Rendering.PassType.Normal, string.Empty); + + // //collection.Add(tmp_Variant); + // //collection.WarmUp(); + //} + + } + + //static class TMP_ProjectSettings + //{ + // [InitializeOnLoadMethod] + // static void SetProjectDefineSymbols() + // { + // string currentBuildSettings = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + + // //Check for and inject TMP_INSTALLED + // if (!currentBuildSettings.Contains("TMP_PRESENT")) + // { + // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings + ";TMP_PRESENT"); + // } + // } + //} +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta new file mode 100644 index 0000000..8b322e2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7241c7dc25374fc1a6ab3ef9da79c363 +timeCreated: 1465441092 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs new file mode 100644 index 0000000..220bac2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs @@ -0,0 +1,487 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + public class TMP_SDFShaderGUI : TMP_BaseShaderGUI + { + static ShaderFeature s_OutlineFeature, s_UnderlayFeature, s_BevelFeature, s_GlowFeature, s_MaskFeature; + + static bool s_Face = true, s_Outline = true, s_Outline2, s_Underlay, s_Lighting, s_Glow, s_Bevel, s_Light, s_Bump, s_Env; + + static string[] + s_FaceUvSpeedNames = { "_FaceUVSpeedX", "_FaceUVSpeedY" }, + s_OutlineUvSpeedNames = { "_OutlineUVSpeedX", "_OutlineUVSpeedY" }; + + static TMP_SDFShaderGUI() + { + s_OutlineFeature = new ShaderFeature() + { + undoLabel = "Outline", + keywords = new[] { "OUTLINE_ON" } + }; + + s_UnderlayFeature = new ShaderFeature() + { + undoLabel = "Underlay", + keywords = new[] { "UNDERLAY_ON", "UNDERLAY_INNER" }, + label = new GUIContent("Underlay Type"), + keywordLabels = new[] + { + new GUIContent("None"), new GUIContent("Normal"), new GUIContent("Inner") + } + }; + + s_BevelFeature = new ShaderFeature() + { + undoLabel = "Bevel", + keywords = new[] { "BEVEL_ON" } + }; + + s_GlowFeature = new ShaderFeature() + { + undoLabel = "Glow", + keywords = new[] { "GLOW_ON" } + }; + + s_MaskFeature = new ShaderFeature() + { + undoLabel = "Mask", + keywords = new[] { "MASK_HARD", "MASK_SOFT" }, + label = new GUIContent("Mask"), + keywordLabels = new[] + { + new GUIContent("Mask Off"), new GUIContent("Mask Hard"), new GUIContent("Mask Soft") + } + }; + } + + protected override void DoGUI() + { + s_Face = BeginPanel("Face", s_Face); + if (s_Face) + { + DoFacePanel(); + } + + EndPanel(); + + s_Outline = m_Material.HasProperty(ShaderUtilities.ID_OutlineTex) ? BeginPanel("Outline", s_Outline) : BeginPanel("Outline", s_OutlineFeature, s_Outline); + if (s_Outline) + { + DoOutlinePanel(); + } + + EndPanel(); + + if (m_Material.HasProperty(ShaderUtilities.ID_Outline2Color)) + { + s_Outline2 = BeginPanel("Outline 2", s_OutlineFeature, s_Outline2); + if (s_Outline2) + { + DoOutline2Panel(); + } + + EndPanel(); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_UnderlayColor)) + { + s_Underlay = BeginPanel("Underlay", s_UnderlayFeature, s_Underlay); + if (s_Underlay) + { + DoUnderlayPanel(); + } + + EndPanel(); + } + + if (m_Material.HasProperty("_SpecularColor")) + { + s_Lighting = BeginPanel("Lighting", s_BevelFeature, s_Lighting); + if (s_Lighting) + { + s_Bevel = BeginPanel("Bevel", s_Bevel); + if (s_Bevel) + { + DoBevelPanel(); + } + + EndPanel(); + + s_Light = BeginPanel("Local Lighting", s_Light); + if (s_Light) + { + DoLocalLightingPanel(); + } + + EndPanel(); + + s_Bump = BeginPanel("Bump Map", s_Bump); + if (s_Bump) + { + DoBumpMapPanel(); + } + + EndPanel(); + + s_Env = BeginPanel("Environment Map", s_Env); + if (s_Env) + { + DoEnvMapPanel(); + } + + EndPanel(); + } + + EndPanel(); + } + else if (m_Material.HasProperty("_SpecColor")) + { + s_Bevel = BeginPanel("Bevel", s_Bevel); + if (s_Bevel) + { + DoBevelPanel(); + } + + EndPanel(); + + s_Light = BeginPanel("Surface Lighting", s_Light); + if (s_Light) + { + DoSurfaceLightingPanel(); + } + + EndPanel(); + + s_Bump = BeginPanel("Bump Map", s_Bump); + if (s_Bump) + { + DoBumpMapPanel(); + } + + EndPanel(); + + s_Env = BeginPanel("Environment Map", s_Env); + if (s_Env) + { + DoEnvMapPanel(); + } + + EndPanel(); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_GlowColor)) + { + s_Glow = BeginPanel("Glow", s_GlowFeature, s_Glow); + if (s_Glow) + { + DoGlowPanel(); + } + + EndPanel(); + } + + s_DebugExtended = BeginPanel("Debug Settings", s_DebugExtended); + if (s_DebugExtended) + { + DoDebugPanel(); + } + + EndPanel(); + } + + void DoFacePanel() + { + EditorGUI.indentLevel += 1; + DoColor("_FaceColor", "Color"); + if (m_Material.HasProperty(ShaderUtilities.ID_FaceTex)) + { + if (m_Material.HasProperty("_FaceUVSpeedX")) + { + DoTexture2D("_FaceTex", "Texture", true, s_FaceUvSpeedNames); + } + else + { + DoTexture2D("_FaceTex", "Texture", true); + } + } + + DoSlider("_OutlineSoftness", "Softness"); + DoSlider("_FaceDilate", "Dilate"); + if (m_Material.HasProperty(ShaderUtilities.ID_Shininess)) + { + DoSlider("_FaceShininess", "Gloss"); + } + + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoOutlinePanel() + { + EditorGUI.indentLevel += 1; + DoColor("_OutlineColor", "Color"); + if (m_Material.HasProperty(ShaderUtilities.ID_OutlineTex)) + { + if (m_Material.HasProperty("_OutlineUVSpeedX")) + { + DoTexture2D("_OutlineTex", "Texture", true, s_OutlineUvSpeedNames); + } + else + { + DoTexture2D("_OutlineTex", "Texture", true); + } + } + + DoSlider("_OutlineWidth", "Thickness"); + if (m_Material.HasProperty("_OutlineShininess")) + { + DoSlider("_OutlineShininess", "Gloss"); + } + + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoOutline2Panel() + { + EditorGUI.indentLevel += 1; + DoColor("_Outline2Color", "Color"); + //if (m_Material.HasProperty(ShaderUtilities.ID_OutlineTex)) + //{ + // if (m_Material.HasProperty("_OutlineUVSpeedX")) + // { + // DoTexture2D("_OutlineTex", "Texture", true, s_OutlineUvSpeedNames); + // } + // else + // { + // DoTexture2D("_OutlineTex", "Texture", true); + // } + //} + + DoSlider("_Outline2Width", "Thickness"); + //if (m_Material.HasProperty("_OutlineShininess")) + //{ + // DoSlider("_OutlineShininess", "Gloss"); + //} + + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoUnderlayPanel() + { + EditorGUI.indentLevel += 1; + s_UnderlayFeature.DoPopup(m_Editor, m_Material); + DoColor("_UnderlayColor", "Color"); + DoSlider("_UnderlayOffsetX", "Offset X"); + DoSlider("_UnderlayOffsetY", "Offset Y"); + DoSlider("_UnderlayDilate", "Dilate"); + DoSlider("_UnderlaySoftness", "Softness"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + static GUIContent[] s_BevelTypeLabels = + { + new GUIContent("Outer Bevel"), + new GUIContent("Inner Bevel") + }; + + void DoBevelPanel() + { + EditorGUI.indentLevel += 1; + DoPopup("_ShaderFlags", "Type", s_BevelTypeLabels); + DoSlider("_Bevel", "Amount"); + DoSlider("_BevelOffset", "Offset"); + DoSlider("_BevelWidth", "Width"); + DoSlider("_BevelRoundness", "Roundness"); + DoSlider("_BevelClamp", "Clamp"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoLocalLightingPanel() + { + EditorGUI.indentLevel += 1; + DoSlider("_LightAngle", "Light Angle"); + DoColor("_SpecularColor", "Specular Color"); + DoSlider("_SpecularPower", "Specular Power"); + DoSlider("_Reflectivity", "Reflectivity Power"); + DoSlider("_Diffuse", "Diffuse Shadow"); + DoSlider("_Ambient", "Ambient Shadow"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoSurfaceLightingPanel() + { + EditorGUI.indentLevel += 1; + DoColor("_SpecColor", "Specular Color"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoBumpMapPanel() + { + EditorGUI.indentLevel += 1; + DoTexture2D("_BumpMap", "Texture"); + DoSlider("_BumpFace", "Face"); + DoSlider("_BumpOutline", "Outline"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoEnvMapPanel() + { + EditorGUI.indentLevel += 1; + DoColor("_ReflectFaceColor", "Face Color"); + DoColor("_ReflectOutlineColor", "Outline Color"); + DoCubeMap("_Cube", "Texture"); + DoVector3("_EnvMatrixRotation", "Rotation"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoGlowPanel() + { + EditorGUI.indentLevel += 1; + DoColor("_GlowColor", "Color"); + DoSlider("_GlowOffset", "Offset"); + DoSlider("_GlowInner", "Inner"); + DoSlider("_GlowOuter", "Outer"); + DoSlider("_GlowPower", "Power"); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoDebugPanel() + { + EditorGUI.indentLevel += 1; + DoTexture2D("_MainTex", "Font Atlas"); + DoFloat("_GradientScale", "Gradient Scale"); + DoFloat("_TextureWidth", "Texture Width"); + DoFloat("_TextureHeight", "Texture Height"); + EditorGUILayout.Space(); + DoFloat("_ScaleX", "Scale X"); + DoFloat("_ScaleY", "Scale Y"); + + if (m_Material.HasProperty(ShaderUtilities.ID_Sharpness)) + DoSlider("_Sharpness", "Sharpness"); + + DoSlider("_PerspectiveFilter", "Perspective Filter"); + EditorGUILayout.Space(); + DoFloat("_VertexOffsetX", "Offset X"); + DoFloat("_VertexOffsetY", "Offset Y"); + + if (m_Material.HasProperty(ShaderUtilities.ID_MaskCoord)) + { + EditorGUILayout.Space(); + s_MaskFeature.ReadState(m_Material); + s_MaskFeature.DoPopup(m_Editor, m_Material); + if (s_MaskFeature.Active) + { + DoMaskSubgroup(); + } + + EditorGUILayout.Space(); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + else if (m_Material.HasProperty("_MaskTex")) + { + DoMaskTexSubgroup(); + } + else if (m_Material.HasProperty(ShaderUtilities.ID_MaskSoftnessX)) + { + EditorGUILayout.Space(); + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + + if (m_Material.HasProperty(ShaderUtilities.ID_StencilID)) + { + EditorGUILayout.Space(); + DoFloat("_Stencil", "Stencil ID"); + DoFloat("_StencilComp", "Stencil Comp"); + } + + EditorGUILayout.Space(); + + EditorGUI.BeginChangeCheck(); + bool useRatios = EditorGUILayout.Toggle("Use Ratios", !m_Material.IsKeywordEnabled("RATIOS_OFF")); + if (EditorGUI.EndChangeCheck()) + { + m_Editor.RegisterPropertyChangeUndo("Use Ratios"); + if (useRatios) + { + m_Material.DisableKeyword("RATIOS_OFF"); + } + else + { + m_Material.EnableKeyword("RATIOS_OFF"); + } + } + + if (m_Material.HasProperty(ShaderUtilities.ShaderTag_CullMode)) + { + EditorGUILayout.Space(); + DoPopup("_CullMode", "Cull Mode", s_CullingTypeLabels); + } + + EditorGUILayout.Space(); + + EditorGUI.BeginDisabledGroup(true); + DoFloat("_ScaleRatioA", "Scale Ratio A"); + DoFloat("_ScaleRatioB", "Scale Ratio B"); + DoFloat("_ScaleRatioC", "Scale Ratio C"); + EditorGUI.EndDisabledGroup(); + EditorGUI.indentLevel -= 1; + EditorGUILayout.Space(); + } + + void DoMaskSubgroup() + { + DoVector("_MaskCoord", "Mask Bounds", s_XywhVectorLabels); + if (Selection.activeGameObject != null) + { + Renderer renderer = Selection.activeGameObject.GetComponent(); + if (renderer != null) + { + Rect rect = EditorGUILayout.GetControlRect(); + rect.x += EditorGUIUtility.labelWidth; + rect.width -= EditorGUIUtility.labelWidth; + if (GUI.Button(rect, "Match Renderer Bounds")) + { + FindProperty("_MaskCoord", m_Properties).vectorValue = new Vector4( + 0, + 0, + Mathf.Round(renderer.bounds.extents.x * 1000) / 1000, + Mathf.Round(renderer.bounds.extents.y * 1000) / 1000 + ); + } + } + } + + if (s_MaskFeature.State == 1) + { + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + } + } + + void DoMaskTexSubgroup() + { + EditorGUILayout.Space(); + DoTexture2D("_MaskTex", "Mask Texture"); + DoToggle("_MaskInverse", "Inverse Mask"); + DoColor("_MaskEdgeColor", "Edge Color"); + DoSlider("_MaskEdgeSoftness", "Edge Softness"); + DoSlider("_MaskWipeControl", "Wipe Position"); + DoFloat("_MaskSoftnessX", "Softness X"); + DoFloat("_MaskSoftnessY", "Softness Y"); + DoVector("_ClipRect", "Clip Rect", s_LbrtVectorLabels); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta new file mode 100644 index 0000000..c643afa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8413ca0e506d42a1a4bd9769f204ad16 +timeCreated: 1469844718 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs new file mode 100644 index 0000000..2ba34d6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs @@ -0,0 +1,14 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro +{ + class TMP_SerializedPropertyHolder : ScriptableObject + { + public TMP_FontAsset fontAsset; + public uint firstCharacter; + public uint secondCharacter; + + public TMP_GlyphPairAdjustmentRecord glyphPairAdjustmentRecord = new TMP_GlyphPairAdjustmentRecord(new TMP_GlyphAdjustmentRecord(), new TMP_GlyphAdjustmentRecord()); + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta new file mode 100644 index 0000000..cde31db --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c4a050f089abb04ebd4125e419f4548 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs new file mode 100644 index 0000000..f8c601e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs @@ -0,0 +1,381 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +#pragma warning disable 0414 // Disabled a few warnings for not yet implemented features. + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_Settings))] + public class TMP_SettingsEditor : Editor + { + internal class Styles + { + public static readonly GUIContent defaultFontAssetLabel = new GUIContent("Default Font Asset", "The Font Asset that will be assigned by default to newly created text objects when no Font Asset is specified."); + public static readonly GUIContent defaultFontAssetPathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Font Assets and Material Presets are located.\nExample \"Fonts & Materials/\""); + + public static readonly GUIContent fallbackFontAssetsLabel = new GUIContent("Fallback Font Assets", "The Font Assets that will be searched to locate and replace missing characters from a given Font Asset."); + public static readonly GUIContent fallbackFontAssetsListLabel = new GUIContent("Fallback Font Assets List", "The Font Assets that will be searched to locate and replace missing characters from a given Font Asset."); + + public static readonly GUIContent fallbackMaterialSettingsLabel = new GUIContent("Fallback Material Settings"); + public static readonly GUIContent matchMaterialPresetLabel = new GUIContent("Match Material Presets"); + + public static readonly GUIContent containerDefaultSettingsLabel = new GUIContent("Text Container Default Settings"); + + public static readonly GUIContent textMeshProLabel = new GUIContent("TextMeshPro"); + public static readonly GUIContent textMeshProUiLabel = new GUIContent("TextMeshPro UI"); + public static readonly GUIContent enableRaycastTarget = new GUIContent("Enable Raycast Target"); + public static readonly GUIContent autoSizeContainerLabel = new GUIContent("Auto Size Text Container", "Set the size of the text container to match the text."); + public static readonly GUIContent isTextObjectScaleStaticLabel = new GUIContent("Is Object Scale Static", "Disables calling InternalUpdate() when enabled. This can improve performance when text object scale is static."); + + public static readonly GUIContent textComponentDefaultSettingsLabel = new GUIContent("Text Component Default Settings"); + public static readonly GUIContent defaultFontSize = new GUIContent("Default Font Size"); + public static readonly GUIContent autoSizeRatioLabel = new GUIContent("Text Auto Size Ratios"); + public static readonly GUIContent minLabel = new GUIContent("Min"); + public static readonly GUIContent maxLabel = new GUIContent("Max"); + + public static readonly GUIContent wordWrappingLabel = new GUIContent("Word Wrapping"); + public static readonly GUIContent kerningLabel = new GUIContent("Kerning"); + public static readonly GUIContent extraPaddingLabel = new GUIContent("Extra Padding"); + public static readonly GUIContent tintAllSpritesLabel = new GUIContent("Tint All Sprites"); + public static readonly GUIContent parseEscapeCharactersLabel = new GUIContent("Parse Escape Sequence"); + + public static readonly GUIContent dynamicFontSystemSettingsLabel = new GUIContent("Dynamic Font System Settings"); + public static readonly GUIContent getFontFeaturesAtRuntime = new GUIContent("Get Font Features at Runtime", "Determines if Glyph Adjustment Data will be retrieved from font files at runtime when new characters and glyphs are added to font assets."); + public static readonly GUIContent dynamicAtlasTextureGroup = new GUIContent("Dynamic Atlas Texture Group"); + + public static readonly GUIContent missingGlyphLabel = new GUIContent("Missing Character Unicode", "The character to be displayed when the requested character is not found in any font asset or fallbacks."); + public static readonly GUIContent disableWarningsLabel = new GUIContent("Disable warnings", "Disable warning messages in the Console."); + + public static readonly GUIContent defaultSpriteAssetLabel = new GUIContent("Default Sprite Asset", "The Sprite Asset that will be assigned by default when using the tag when no Sprite Asset is specified."); + public static readonly GUIContent missingSpriteCharacterUnicodeLabel = new GUIContent("Missing Sprite Unicode", "The unicode value for the sprite character to be displayed when the requested sprite character is not found in any sprite assets or fallbacks."); + public static readonly GUIContent enableEmojiSupportLabel = new GUIContent("iOS Emoji Support", "Enables Emoji support for Touch Screen Keyboards on target devices."); + //public static readonly GUIContent spriteRelativeScale = new GUIContent("Relative Scaling", "Determines if the sprites will be scaled relative to the primary font asset assigned to the text object or relative to the current font asset."); + + public static readonly GUIContent spriteAssetsPathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Sprite Assets are located.\nExample \"Sprite Assets/\""); + + public static readonly GUIContent defaultStyleSheetLabel = new GUIContent("Default Style Sheet", "The Style Sheet that will be used for all text objects in this project."); + public static readonly GUIContent styleSheetResourcePathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Style Sheets are located.\nExample \"Style Sheets/\""); + + public static readonly GUIContent colorGradientPresetsLabel = new GUIContent("Color Gradient Presets", "The relative path to a Resources folder where the Color Gradient Presets are located.\nExample \"Color Gradient Presets/\""); + public static readonly GUIContent colorGradientsPathLabel = new GUIContent("Path: Resources/", "The relative path to a Resources folder where the Color Gradient Presets are located.\nExample \"Color Gradient Presets/\""); + + public static readonly GUIContent lineBreakingLabel = new GUIContent("Line Breaking for Asian languages", "The text assets that contain the Leading and Following characters which define the rules for line breaking with Asian languages."); + public static readonly GUIContent koreanSpecificRules = new GUIContent("Korean Language Options"); + } + + SerializedProperty m_PropFontAsset; + SerializedProperty m_PropDefaultFontAssetPath; + SerializedProperty m_PropDefaultFontSize; + SerializedProperty m_PropDefaultAutoSizeMinRatio; + SerializedProperty m_PropDefaultAutoSizeMaxRatio; + SerializedProperty m_PropDefaultTextMeshProTextContainerSize; + SerializedProperty m_PropDefaultTextMeshProUITextContainerSize; + SerializedProperty m_PropAutoSizeTextContainer; + SerializedProperty m_PropEnableRaycastTarget; + SerializedProperty m_PropIsTextObjectScaleStatic; + + SerializedProperty m_PropSpriteAsset; + SerializedProperty m_PropMissingSpriteCharacterUnicode; + //SerializedProperty m_PropSpriteRelativeScaling; + SerializedProperty m_PropEnableEmojiSupport; + SerializedProperty m_PropSpriteAssetPath; + + + SerializedProperty m_PropStyleSheet; + SerializedProperty m_PropStyleSheetsResourcePath; + ReorderableList m_List; + + SerializedProperty m_PropColorGradientPresetsPath; + + SerializedProperty m_PropMatchMaterialPreset; + SerializedProperty m_PropWordWrapping; + SerializedProperty m_PropKerning; + SerializedProperty m_PropExtraPadding; + SerializedProperty m_PropTintAllSprites; + SerializedProperty m_PropParseEscapeCharacters; + SerializedProperty m_PropMissingGlyphCharacter; + + //SerializedProperty m_DynamicAtlasTextureManager; + SerializedProperty m_GetFontFeaturesAtRuntime; + + SerializedProperty m_PropWarningsDisabled; + + SerializedProperty m_PropLeadingCharacters; + SerializedProperty m_PropFollowingCharacters; + SerializedProperty m_PropUseModernHangulLineBreakingRules; + + private const string k_UndoRedo = "UndoRedoPerformed"; + + public void OnEnable() + { + if (target == null) + return; + + m_PropFontAsset = serializedObject.FindProperty("m_defaultFontAsset"); + m_PropDefaultFontAssetPath = serializedObject.FindProperty("m_defaultFontAssetPath"); + m_PropDefaultFontSize = serializedObject.FindProperty("m_defaultFontSize"); + m_PropDefaultAutoSizeMinRatio = serializedObject.FindProperty("m_defaultAutoSizeMinRatio"); + m_PropDefaultAutoSizeMaxRatio = serializedObject.FindProperty("m_defaultAutoSizeMaxRatio"); + m_PropDefaultTextMeshProTextContainerSize = serializedObject.FindProperty("m_defaultTextMeshProTextContainerSize"); + m_PropDefaultTextMeshProUITextContainerSize = serializedObject.FindProperty("m_defaultTextMeshProUITextContainerSize"); + m_PropAutoSizeTextContainer = serializedObject.FindProperty("m_autoSizeTextContainer"); + m_PropEnableRaycastTarget = serializedObject.FindProperty("m_EnableRaycastTarget"); + m_PropIsTextObjectScaleStatic = serializedObject.FindProperty("m_IsTextObjectScaleStatic"); + + m_PropSpriteAsset = serializedObject.FindProperty("m_defaultSpriteAsset"); + m_PropMissingSpriteCharacterUnicode = serializedObject.FindProperty("m_MissingCharacterSpriteUnicode"); + //m_PropSpriteRelativeScaling = serializedObject.FindProperty("m_SpriteRelativeScaling"); + m_PropEnableEmojiSupport = serializedObject.FindProperty("m_enableEmojiSupport"); + m_PropSpriteAssetPath = serializedObject.FindProperty("m_defaultSpriteAssetPath"); + + m_PropStyleSheet = serializedObject.FindProperty("m_defaultStyleSheet"); + m_PropStyleSheetsResourcePath = serializedObject.FindProperty("m_StyleSheetsResourcePath"); + + + m_PropColorGradientPresetsPath = serializedObject.FindProperty("m_defaultColorGradientPresetsPath"); + + m_List = new ReorderableList(serializedObject, serializedObject.FindProperty("m_fallbackFontAssets"), true, true, true, true); + + m_List.drawElementCallback = (rect, index, isActive, isFocused) => + { + var element = m_List.serializedProperty.GetArrayElementAtIndex(index); + rect.y += 2; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none); + }; + + m_List.drawHeaderCallback = rect => + { + EditorGUI.LabelField(rect, Styles.fallbackFontAssetsListLabel); + }; + + m_PropMatchMaterialPreset = serializedObject.FindProperty("m_matchMaterialPreset"); + + m_PropWordWrapping = serializedObject.FindProperty("m_enableWordWrapping"); + m_PropKerning = serializedObject.FindProperty("m_enableKerning"); + m_PropExtraPadding = serializedObject.FindProperty("m_enableExtraPadding"); + m_PropTintAllSprites = serializedObject.FindProperty("m_enableTintAllSprites"); + m_PropParseEscapeCharacters = serializedObject.FindProperty("m_enableParseEscapeCharacters"); + m_PropMissingGlyphCharacter = serializedObject.FindProperty("m_missingGlyphCharacter"); + + m_PropWarningsDisabled = serializedObject.FindProperty("m_warningsDisabled"); + + //m_DynamicAtlasTextureManager = serializedObject.FindProperty("m_DynamicAtlasTextureGroup"); + m_GetFontFeaturesAtRuntime = serializedObject.FindProperty("m_GetFontFeaturesAtRuntime"); + + m_PropLeadingCharacters = serializedObject.FindProperty("m_leadingCharacters"); + m_PropFollowingCharacters = serializedObject.FindProperty("m_followingCharacters"); + m_PropUseModernHangulLineBreakingRules = serializedObject.FindProperty("m_UseModernHangulLineBreakingRules"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + string evt_cmd = Event.current.commandName; + + float labelWidth = EditorGUIUtility.labelWidth; + float fieldWidth = EditorGUIUtility.fieldWidth; + + // TextMeshPro Font Info Panel + EditorGUI.indentLevel = 0; + + // FONT ASSET + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.defaultFontAssetLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropFontAsset, Styles.defaultFontAssetLabel); + EditorGUILayout.PropertyField(m_PropDefaultFontAssetPath, Styles.defaultFontAssetPathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // FALLBACK FONT ASSETs + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.fallbackFontAssetsLabel, EditorStyles.boldLabel); + m_List.DoLayoutList(); + + GUILayout.Label(Styles.fallbackMaterialSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropMatchMaterialPreset, Styles.matchMaterialPresetLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // MISSING GLYPHS + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.dynamicFontSystemSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_GetFontFeaturesAtRuntime, Styles.getFontFeaturesAtRuntime); + EditorGUILayout.PropertyField(m_PropMissingGlyphCharacter, Styles.missingGlyphLabel); + EditorGUILayout.PropertyField(m_PropWarningsDisabled, Styles.disableWarningsLabel); + //EditorGUILayout.PropertyField(m_DynamicAtlasTextureManager, Styles.dynamicAtlasTextureManager); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // TEXT OBJECT DEFAULT PROPERTIES + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.containerDefaultSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + + EditorGUILayout.PropertyField(m_PropDefaultTextMeshProTextContainerSize, Styles.textMeshProLabel); + EditorGUILayout.PropertyField(m_PropDefaultTextMeshProUITextContainerSize, Styles.textMeshProUiLabel); + EditorGUILayout.PropertyField(m_PropEnableRaycastTarget, Styles.enableRaycastTarget); + EditorGUILayout.PropertyField(m_PropAutoSizeTextContainer, Styles.autoSizeContainerLabel); + EditorGUILayout.PropertyField(m_PropIsTextObjectScaleStatic, Styles.isTextObjectScaleStaticLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + + GUILayout.Label(Styles.textComponentDefaultSettingsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropDefaultFontSize, Styles.defaultFontSize); + + EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.PrefixLabel(Styles.autoSizeRatioLabel); + EditorGUIUtility.labelWidth = 32; + EditorGUIUtility.fieldWidth = 10; + + EditorGUI.indentLevel = 0; + EditorGUILayout.PropertyField(m_PropDefaultAutoSizeMinRatio, Styles.minLabel); + EditorGUILayout.PropertyField(m_PropDefaultAutoSizeMaxRatio, Styles.maxLabel); + EditorGUI.indentLevel = 1; + } + EditorGUILayout.EndHorizontal(); + + EditorGUIUtility.labelWidth = labelWidth; + EditorGUIUtility.fieldWidth = fieldWidth; + + EditorGUILayout.PropertyField(m_PropWordWrapping, Styles.wordWrappingLabel); + EditorGUILayout.PropertyField(m_PropKerning, Styles.kerningLabel); + + EditorGUILayout.PropertyField(m_PropExtraPadding, Styles.extraPaddingLabel); + EditorGUILayout.PropertyField(m_PropTintAllSprites, Styles.tintAllSpritesLabel); + + EditorGUILayout.PropertyField(m_PropParseEscapeCharacters, Styles.parseEscapeCharactersLabel); + + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // SPRITE ASSET + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.defaultSpriteAssetLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropSpriteAsset, Styles.defaultSpriteAssetLabel); + EditorGUILayout.PropertyField(m_PropMissingSpriteCharacterUnicode, Styles.missingSpriteCharacterUnicodeLabel); + EditorGUILayout.PropertyField(m_PropEnableEmojiSupport, Styles.enableEmojiSupportLabel); + //EditorGUILayout.PropertyField(m_PropSpriteRelativeScaling, Styles.spriteRelativeScale); + EditorGUILayout.PropertyField(m_PropSpriteAssetPath, Styles.spriteAssetsPathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // STYLE SHEET + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.defaultStyleSheetLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_PropStyleSheet, Styles.defaultStyleSheetLabel); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + + TMP_StyleSheet styleSheet = m_PropStyleSheet.objectReferenceValue as TMP_StyleSheet; + if (styleSheet != null) + styleSheet.RefreshStyles(); + } + EditorGUILayout.PropertyField(m_PropStyleSheetsResourcePath, Styles.styleSheetResourcePathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // COLOR GRADIENT PRESETS + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.colorGradientPresetsLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropColorGradientPresetsPath, Styles.colorGradientsPathLabel); + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + // LINE BREAKING RULE + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label(Styles.lineBreakingLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel = 1; + EditorGUILayout.PropertyField(m_PropLeadingCharacters); + EditorGUILayout.PropertyField(m_PropFollowingCharacters); + + EditorGUILayout.Space(); + GUILayout.Label(Styles.koreanSpecificRules, EditorStyles.boldLabel); + EditorGUILayout.PropertyField(m_PropUseModernHangulLineBreakingRules, new GUIContent("Use Modern Line Breaking", "Determines if traditional or modern line breaking rules will be used to control line breaking. Traditional line breaking rules use the Leading and Following Character rules whereas Modern uses spaces for line breaking.")); + + EditorGUI.indentLevel = 0; + + EditorGUILayout.Space(); + EditorGUILayout.EndVertical(); + + if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo) + { + EditorUtility.SetDirty(target); + TMPro_EventManager.ON_TMP_SETTINGS_CHANGED(); + } + } + } + +#if UNITY_2018_3_OR_NEWER + class TMP_ResourceImporterProvider : SettingsProvider + { + TMP_PackageResourceImporter m_ResourceImporter; + + public TMP_ResourceImporterProvider() + : base("Project/TextMesh Pro", SettingsScope.Project) + { + } + + public override void OnGUI(string searchContext) + { + // Lazy creation that supports domain reload + if (m_ResourceImporter == null) + m_ResourceImporter = new TMP_PackageResourceImporter(); + + m_ResourceImporter.OnGUI(); + } + + public override void OnDeactivate() + { + if (m_ResourceImporter != null) + m_ResourceImporter.OnDestroy(); + } + + static UnityEngine.Object GetTMPSettings() + { + return Resources.Load("TMP Settings"); + } + + [SettingsProviderGroup] + static SettingsProvider[] CreateTMPSettingsProvider() + { + var providers = new List { new TMP_ResourceImporterProvider() }; + + if (GetTMPSettings() != null) + { + var provider = new AssetSettingsProvider("Project/TextMesh Pro/Settings", GetTMPSettings); + provider.PopulateSearchKeywordsFromGUIContentProperties(); + providers.Add(provider); + } + + return providers.ToArray(); + } + } +#endif +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs.meta new file mode 100644 index 0000000..a719ae7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0386b6eb838c47138cd51d1c1b879a35 +timeCreated: 1436658550 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs new file mode 100644 index 0000000..e7d48d1 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs @@ -0,0 +1,953 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; + + +namespace TMPro.EditorUtilities +{ + + [CustomEditor(typeof(TMP_SpriteAsset))] + public class TMP_SpriteAssetEditor : Editor + { + struct UI_PanelState + { + public static bool spriteAssetFaceInfoPanel = true; + public static bool spriteAtlasInfoPanel = true; + public static bool fallbackSpriteAssetPanel = true; + public static bool spriteCharacterTablePanel; + public static bool spriteGlyphTablePanel; + } + + private static string[] s_UiStateLabel = new string[] { "(Click to collapse) ", "(Click to expand) " }; + + int m_moveToIndex; + int m_selectedElement = -1; + int m_CurrentCharacterPage; + int m_CurrentGlyphPage; + + const string k_UndoRedo = "UndoRedoPerformed"; + + string m_CharacterSearchPattern; + List m_CharacterSearchList; + bool m_IsCharacterSearchDirty; + + string m_GlyphSearchPattern; + List m_GlyphSearchList; + bool m_IsGlyphSearchDirty; + + SerializedProperty m_FaceInfoProperty; + SerializedProperty m_PointSizeProperty; + SerializedProperty m_ScaleProperty; + SerializedProperty m_LineHeightProperty; + SerializedProperty m_AscentLineProperty; + SerializedProperty m_BaselineProperty; + SerializedProperty m_DescentLineProperty; + + SerializedProperty m_spriteAtlas_prop; + SerializedProperty m_material_prop; + SerializedProperty m_SpriteCharacterTableProperty; + SerializedProperty m_SpriteGlyphTableProperty; + ReorderableList m_fallbackSpriteAssetList; + + TMP_SpriteAsset m_SpriteAsset; + + bool isAssetDirty; + + float m_xOffset; + float m_yOffset; + float m_xAdvance; + float m_scale; + + public void OnEnable() + { + m_SpriteAsset = target as TMP_SpriteAsset; + + m_FaceInfoProperty = serializedObject.FindProperty("m_FaceInfo"); + m_PointSizeProperty = m_FaceInfoProperty.FindPropertyRelative("m_PointSize"); + m_ScaleProperty = m_FaceInfoProperty.FindPropertyRelative("m_Scale"); + m_LineHeightProperty = m_FaceInfoProperty.FindPropertyRelative("m_LineHeight"); + m_AscentLineProperty = m_FaceInfoProperty.FindPropertyRelative("m_AscentLine"); + m_BaselineProperty = m_FaceInfoProperty.FindPropertyRelative("m_Baseline"); + m_DescentLineProperty = m_FaceInfoProperty.FindPropertyRelative("m_DescentLine"); + + m_spriteAtlas_prop = serializedObject.FindProperty("spriteSheet"); + m_material_prop = serializedObject.FindProperty("material"); + m_SpriteCharacterTableProperty = serializedObject.FindProperty("m_SpriteCharacterTable"); + m_SpriteGlyphTableProperty = serializedObject.FindProperty("m_SpriteGlyphTable"); + + // Fallback TMP Sprite Asset list + m_fallbackSpriteAssetList = new ReorderableList(serializedObject, serializedObject.FindProperty("fallbackSpriteAssets"), true, true, true, true); + + m_fallbackSpriteAssetList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + var element = m_fallbackSpriteAssetList.serializedProperty.GetArrayElementAtIndex(index); + rect.y += 2; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none); + }; + + m_fallbackSpriteAssetList.drawHeaderCallback = rect => + { + EditorGUI.LabelField(rect, new GUIContent("Fallback Sprite Asset List", "Select the Sprite Assets that will be searched and used as fallback when a given sprite is missing from this sprite asset.")); + }; + } + + + public override void OnInspectorGUI() + { + + //Debug.Log("OnInspectorGUI Called."); + Event currentEvent = Event.current; + string evt_cmd = currentEvent.commandName; // Get Current Event CommandName to check for Undo Events + + serializedObject.Update(); + + + // TEXTMESHPRO SPRITE INFO PANEL + #region Display Sprite Asset Face Info + Rect rect = EditorGUILayout.GetControlRect(false, 24); + + GUI.Label(rect, new GUIContent("Face Info - v" + m_SpriteAsset.version), TMP_UIStyleManager.sectionHeader); + + rect.x += rect.width - 132f; + rect.y += 2; + rect.width = 130f; + rect.height = 18f; + if (GUI.Button(rect, new GUIContent("Update Sprite Asset"))) + { + TMP_SpriteAssetMenu.UpdateSpriteAsset(m_SpriteAsset); + } + EditorGUI.indentLevel = 1; + + EditorGUILayout.PropertyField(m_PointSizeProperty); + EditorGUILayout.PropertyField(m_ScaleProperty); + //EditorGUILayout.PropertyField(m_LineHeightProperty); + EditorGUILayout.PropertyField(m_AscentLineProperty); + EditorGUILayout.PropertyField(m_BaselineProperty); + EditorGUILayout.PropertyField(m_DescentLineProperty); + EditorGUILayout.Space(); + #endregion + + + // ATLAS TEXTURE & MATERIAL + #region Display Atlas Texture and Material + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Atlas & Material"), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.spriteAtlasInfoPanel = !UI_PanelState.spriteAtlasInfoPanel; + + GUI.Label(rect, (UI_PanelState.spriteAtlasInfoPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.spriteAtlasInfoPanel) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_spriteAtlas_prop, new GUIContent("Sprite Atlas")); + if (EditorGUI.EndChangeCheck()) + { + // Assign the new sprite atlas texture to the current material + Texture2D tex = m_spriteAtlas_prop.objectReferenceValue as Texture2D; + if (tex != null) + { + Material mat = m_material_prop.objectReferenceValue as Material; + if (mat != null) + mat.mainTexture = tex; + } + } + + EditorGUILayout.PropertyField(m_material_prop, new GUIContent("Default Material")); + EditorGUILayout.Space(); + } + #endregion + + + // FALLBACK SPRITE ASSETS + #region Display Sprite Fallbacks + rect = EditorGUILayout.GetControlRect(false, 24); + EditorGUI.indentLevel = 0; + if (GUI.Button(rect, new GUIContent("Fallback Sprite Assets", "Select the Sprite Assets that will be searched and used as fallback when a given sprite is missing from this sprite asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.fallbackSpriteAssetPanel = !UI_PanelState.fallbackSpriteAssetPanel; + + GUI.Label(rect, (UI_PanelState.fallbackSpriteAssetPanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.fallbackSpriteAssetPanel) + { + m_fallbackSpriteAssetList.DoLayoutList(); + EditorGUILayout.Space(); + } + #endregion + + + // SPRITE CHARACTER TABLE + #region Display Sprite Character Table + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Sprite Character Table", "List of sprite characters contained in this sprite asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.spriteCharacterTablePanel = !UI_PanelState.spriteCharacterTablePanel; + + GUI.Label(rect, (UI_PanelState.spriteCharacterTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.spriteCharacterTablePanel) + { + int arraySize = m_SpriteCharacterTableProperty.arraySize; + int itemsPerPage = 10; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(true)); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 110f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Sprite Search", m_CharacterSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_IsCharacterSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + //GUIUtility.keyboardControl = 0; + m_CharacterSearchPattern = searchPattern.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + + // Search Glyph Table for potential matches + SearchCharacterTable(m_CharacterSearchPattern, ref m_CharacterSearchList); + } + else + m_CharacterSearchPattern = null; + + m_IsCharacterSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_CharacterSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_CharacterSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + arraySize = m_CharacterSearchList.Count; + + // Display Page Navigation + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + if (arraySize > 0) + { + // Display each SpriteInfo entry using the SpriteInfo property drawer. + for (int i = itemsPerPage * m_CurrentCharacterPage; i < arraySize && i < itemsPerPage * (m_CurrentCharacterPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_CharacterSearchPattern)) + elementIndex = m_CharacterSearchList[i]; + + SerializedProperty spriteCharacterProperty = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUI.BeginDisabledGroup(i != m_selectedElement); + { + EditorGUILayout.PropertyField(spriteCharacterProperty); + } + EditorGUI.EndDisabledGroup(); + } + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_selectedElement == i) + { + m_selectedElement = -1; + } + else + { + m_selectedElement = i; + GUIUtility.keyboardControl = 0; + } + } + + // Draw & Handle Section Area + if (m_selectedElement == i) + { + // Draw selection highlight + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw options to MoveUp, MoveDown, Add or Remove Sprites + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + controlRect.width /= 8; + + // Move sprite up. + bool guiEnabled = GUI.enabled; + if (i == 0) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Up")) + { + SwapCharacterElements(i, i - 1); + } + GUI.enabled = guiEnabled; + + // Move sprite down. + controlRect.x += controlRect.width; + if (i == arraySize - 1) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Down")) + { + SwapCharacterElements(i, i + 1); + } + GUI.enabled = guiEnabled; + + // Move sprite to new index + controlRect.x += controlRect.width * 2; + //if (i == arraySize - 1) { GUI.enabled = false; } + m_moveToIndex = EditorGUI.IntField(controlRect, m_moveToIndex); + controlRect.x -= controlRect.width; + if (GUI.Button(controlRect, "Goto")) + { + MoveCharacterToIndex(i, m_moveToIndex); + } + //controlRect.x += controlRect.width; + GUI.enabled = guiEnabled; + + // Add new Sprite + controlRect.x += controlRect.width * 4; + if (GUI.Button(controlRect, "+")) + { + m_SpriteCharacterTableProperty.arraySize += 1; + + int index = m_SpriteCharacterTableProperty.arraySize - 1; + + SerializedProperty spriteInfo_prop = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(index); + + // Copy properties of the selected element + CopyCharacterSerializedProperty(m_SpriteCharacterTableProperty.GetArrayElementAtIndex(elementIndex), ref spriteInfo_prop); + + //spriteInfo_prop.FindPropertyRelative("m_Index").intValue = index; + serializedObject.ApplyModifiedProperties(); + + m_IsCharacterSearchDirty = true; + } + + // Delete selected Sprite + controlRect.x += controlRect.width; + if (m_selectedElement == -1) GUI.enabled = false; + if (GUI.Button(controlRect, "-")) + { + m_SpriteCharacterTableProperty.DeleteArrayElementAtIndex(elementIndex); + + m_selectedElement = -1; + serializedObject.ApplyModifiedProperties(); + + m_IsCharacterSearchDirty = true; + + return; + } + + + } + } + } + + DisplayPageNavigation(ref m_CurrentCharacterPage, arraySize, itemsPerPage); + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 20f; + + GUILayout.Space(5f); + + // GLOBAL TOOLS + #region Global Tools + /* + GUI.enabled = true; + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + rect = EditorGUILayout.GetControlRect(false, 40); + + float width = (rect.width - 75f) / 4; + EditorGUI.LabelField(rect, "Global Offsets & Scale", EditorStyles.boldLabel); + + + rect.x += 70; + bool old_ChangedState = GUI.changed; + + GUI.changed = false; + m_xOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 0, rect.y + 20, width - 5f, 18), new GUIContent("OX:"), m_xOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingX", m_xOffset); + + m_yOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 1, rect.y + 20, width - 5f, 18), new GUIContent("OY:"), m_yOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingY", m_yOffset); + + m_xAdvance = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 2, rect.y + 20, width - 5f, 18), new GUIContent("ADV."), m_xAdvance); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalAdvance", m_xAdvance); + + m_scale = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 3, rect.y + 20, width - 5f, 18), new GUIContent("SF."), m_scale); + if (GUI.changed) UpdateGlobalProperty("m_Scale", m_scale); + + EditorGUILayout.EndVertical(); + + GUI.changed = old_ChangedState; + */ + #endregion + + } + #endregion + + + // SPRITE GLYPH TABLE + #region Display Sprite Glyph Table + EditorGUI.indentLevel = 0; + rect = EditorGUILayout.GetControlRect(false, 24); + + if (GUI.Button(rect, new GUIContent("Sprite Glyph Table", "A list of the SpriteGlyphs contained in this sprite asset."), TMP_UIStyleManager.sectionHeader)) + UI_PanelState.spriteGlyphTablePanel = !UI_PanelState.spriteGlyphTablePanel; + + GUI.Label(rect, (UI_PanelState.spriteGlyphTablePanel ? "" : s_UiStateLabel[1]), TMP_UIStyleManager.rightLabel); + + if (UI_PanelState.spriteGlyphTablePanel) + { + int arraySize = m_SpriteGlyphTableProperty.arraySize; + int itemsPerPage = 10; + + // Display Glyph Management Tools + EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(true)); + { + // Search Bar implementation + #region DISPLAY SEARCH BAR + EditorGUILayout.BeginHorizontal(); + { + EditorGUIUtility.labelWidth = 110f; + EditorGUI.BeginChangeCheck(); + string searchPattern = EditorGUILayout.TextField("Sprite Search", m_GlyphSearchPattern, "SearchTextField"); + if (EditorGUI.EndChangeCheck() || m_IsGlyphSearchDirty) + { + if (string.IsNullOrEmpty(searchPattern) == false) + { + //GUIUtility.keyboardControl = 0; + m_GlyphSearchPattern = searchPattern.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + + // Search Glyph Table for potential matches + SearchCharacterTable(m_GlyphSearchPattern, ref m_GlyphSearchList); + } + else + m_GlyphSearchPattern = null; + + m_IsGlyphSearchDirty = false; + } + + string styleName = string.IsNullOrEmpty(m_GlyphSearchPattern) ? "SearchCancelButtonEmpty" : "SearchCancelButton"; + if (GUILayout.Button(GUIContent.none, styleName)) + { + GUIUtility.keyboardControl = 0; + m_GlyphSearchPattern = string.Empty; + } + } + EditorGUILayout.EndHorizontal(); + #endregion + + // Display Page Navigation + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + arraySize = m_GlyphSearchList.Count; + + // Display Page Navigation + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + } + EditorGUILayout.EndVertical(); + + if (arraySize > 0) + { + // Display each SpriteInfo entry using the SpriteInfo property drawer. + for (int i = itemsPerPage * m_CurrentGlyphPage; i < arraySize && i < itemsPerPage * (m_CurrentGlyphPage + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + int elementIndex = i; + if (!string.IsNullOrEmpty(m_GlyphSearchPattern)) + elementIndex = m_GlyphSearchList[i]; + + SerializedProperty spriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + { + EditorGUI.BeginDisabledGroup(i != m_selectedElement); + { + EditorGUILayout.PropertyField(spriteGlyphProperty); + } + EditorGUI.EndDisabledGroup(); + } + EditorGUILayout.EndVertical(); + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_selectedElement == i) + { + m_selectedElement = -1; + } + else + { + m_selectedElement = i; + GUIUtility.keyboardControl = 0; + } + } + + // Draw & Handle Section Area + if (m_selectedElement == i) + { + // Draw selection highlight + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + + // Draw options to MoveUp, MoveDown, Add or Remove Sprites + Rect controlRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight * 1f); + controlRect.width /= 8; + + // Move sprite up. + bool guiEnabled = GUI.enabled; + if (i == 0) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Up")) + { + SwapGlyphElements(i, i - 1); + } + GUI.enabled = guiEnabled; + + // Move sprite down. + controlRect.x += controlRect.width; + if (i == arraySize - 1) { GUI.enabled = false; } + if (GUI.Button(controlRect, "Down")) + { + SwapGlyphElements(i, i + 1); + } + GUI.enabled = guiEnabled; + + // Move sprite to new index + controlRect.x += controlRect.width * 2; + //if (i == arraySize - 1) { GUI.enabled = false; } + m_moveToIndex = EditorGUI.IntField(controlRect, m_moveToIndex); + controlRect.x -= controlRect.width; + if (GUI.Button(controlRect, "Goto")) + { + MoveGlyphToIndex(i, m_moveToIndex); + } + //controlRect.x += controlRect.width; + GUI.enabled = guiEnabled; + + // Add new Sprite + controlRect.x += controlRect.width * 4; + if (GUI.Button(controlRect, "+")) + { + m_SpriteGlyphTableProperty.arraySize += 1; + + int index = m_SpriteGlyphTableProperty.arraySize - 1; + + SerializedProperty newSpriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(index); + + // Copy properties of the selected element + CopyGlyphSerializedProperty(m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex), ref newSpriteGlyphProperty); + + newSpriteGlyphProperty.FindPropertyRelative("m_Index").intValue = index; + + serializedObject.ApplyModifiedProperties(); + + m_IsGlyphSearchDirty = true; + + //m_SpriteAsset.UpdateLookupTables(); + } + + // Delete selected Sprite + controlRect.x += controlRect.width; + if (m_selectedElement == -1) GUI.enabled = false; + if (GUI.Button(controlRect, "-")) + { + SerializedProperty selectedSpriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(elementIndex); + + int selectedGlyphIndex = selectedSpriteGlyphProperty.FindPropertyRelative("m_Index").intValue; + + m_SpriteGlyphTableProperty.DeleteArrayElementAtIndex(elementIndex); + + // Remove all Sprite Characters referencing this glyph. + for (int j = 0; j < m_SpriteCharacterTableProperty.arraySize; j++) + { + int glyphIndex = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(j).FindPropertyRelative("m_GlyphIndex").intValue; + + if (glyphIndex == selectedGlyphIndex) + { + // Remove character + m_SpriteCharacterTableProperty.DeleteArrayElementAtIndex(j); + } + } + + m_selectedElement = -1; + serializedObject.ApplyModifiedProperties(); + + m_IsGlyphSearchDirty = true; + + //m_SpriteAsset.UpdateLookupTables(); + + return; + } + + + } + } + } + + DisplayPageNavigation(ref m_CurrentGlyphPage, arraySize, itemsPerPage); + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 20f; + + GUILayout.Space(5f); + + // GLOBAL TOOLS + #region Global Tools + GUI.enabled = true; + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + rect = EditorGUILayout.GetControlRect(false, 40); + + float width = (rect.width - 75f) / 4; + EditorGUI.LabelField(rect, "Global Offsets & Scale", EditorStyles.boldLabel); + + + rect.x += 70; + bool old_ChangedState = GUI.changed; + + GUI.changed = false; + m_xOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 0, rect.y + 20, width - 5f, 18), new GUIContent("OX:"), m_xOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingX", m_xOffset); + + m_yOffset = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 1, rect.y + 20, width - 5f, 18), new GUIContent("OY:"), m_yOffset); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalBearingY", m_yOffset); + + m_xAdvance = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 2, rect.y + 20, width - 5f, 18), new GUIContent("ADV."), m_xAdvance); + if (GUI.changed) UpdateGlobalProperty("m_HorizontalAdvance", m_xAdvance); + + m_scale = EditorGUI.FloatField(new Rect(rect.x + 5f + width * 3, rect.y + 20, width - 5f, 18), new GUIContent("SF."), m_scale); + if (GUI.changed) UpdateGlobalProperty("m_Scale", m_scale); + + EditorGUILayout.EndVertical(); + #endregion + + GUI.changed = old_ChangedState; + + } + #endregion + + + if (serializedObject.ApplyModifiedProperties() || evt_cmd == k_UndoRedo || isAssetDirty) + { + if (m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty || evt_cmd == k_UndoRedo) + m_SpriteAsset.UpdateLookupTables(); + + TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, m_SpriteAsset); + + isAssetDirty = false; + EditorUtility.SetDirty(target); + } + + // Clear selection if mouse event was not consumed. + GUI.enabled = true; + if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0) + m_selectedElement = -1; + + } + + + /// + /// + /// + /// + /// + void DisplayPageNavigation(ref int currentPage, int arraySize, int itemsPerPage) + { + Rect pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 3; + + int shiftMultiplier = Event.current.shift ? 10 : 1; // Page + Shift goes 10 page forward + + // Previous Page + GUI.enabled = currentPage > 0; + + if (GUI.Button(pagePos, "Previous Page")) + { + currentPage -= 1 * shiftMultiplier; + //m_isNewPage = true; + } + + // Page Counter + GUI.enabled = true; + pagePos.x += pagePos.width; + int totalPages = (int)(arraySize / (float)itemsPerPage + 0.999f); + GUI.Label(pagePos, "Page " + (currentPage + 1) + " / " + totalPages, TMP_UIStyleManager.centeredLabel); + + // Next Page + pagePos.x += pagePos.width; + GUI.enabled = itemsPerPage * (currentPage + 1) < arraySize; + + if (GUI.Button(pagePos, "Next Page")) + { + currentPage += 1 * shiftMultiplier; + //m_isNewPage = true; + } + + // Clamp page range + currentPage = Mathf.Clamp(currentPage, 0, arraySize / itemsPerPage); + + GUI.enabled = true; + } + + + /// + /// Method to update the properties of all sprites + /// + /// + /// + void UpdateGlobalProperty(string property, float value) + { + int arraySize = m_SpriteGlyphTableProperty.arraySize; + + for (int i = 0; i < arraySize; i++) + { + // Get a reference to the sprite glyph. + SerializedProperty spriteGlyphProperty = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(i); + + if (property == "m_Scale") + { + spriteGlyphProperty.FindPropertyRelative(property).floatValue = value; + } + else + { + SerializedProperty glyphMetricsProperty = spriteGlyphProperty.FindPropertyRelative("m_Metrics"); + glyphMetricsProperty.FindPropertyRelative(property).floatValue = value; + } + } + + GUI.changed = false; + } + + // Check if any of the Style elements were clicked on. + private bool DoSelectionCheck(Rect selectionArea) + { + Event currentEvent = Event.current; + + switch (currentEvent.type) + { + case EventType.MouseDown: + if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0) + { + currentEvent.Use(); + return true; + } + break; + } + + return false; + } + + + /// + /// Swap the sprite item at the currently selected array index to another index. + /// + /// Selected index. + /// New index. + void SwapCharacterElements(int selectedIndex, int newIndex) + { + m_SpriteCharacterTableProperty.MoveArrayElement(selectedIndex, newIndex); + m_selectedElement = newIndex; + m_IsCharacterSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + /// + /// Move Sprite Element at selected index to another index and reorder sprite list. + /// + /// + /// + void MoveCharacterToIndex(int selectedIndex, int newIndex) + { + int arraySize = m_SpriteCharacterTableProperty.arraySize; + + if (newIndex >= arraySize) + newIndex = arraySize - 1; + + m_SpriteCharacterTableProperty.MoveArrayElement(selectedIndex, newIndex); + + m_selectedElement = newIndex; + m_IsCharacterSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + + // TODO: Need to handle switching pages if the character or glyph is moved to a different page. + } + + /// + /// + /// + /// + /// + void SwapGlyphElements(int selectedIndex, int newIndex) + { + m_SpriteGlyphTableProperty.MoveArrayElement(selectedIndex, newIndex); + m_selectedElement = newIndex; + m_IsGlyphSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + /// + /// Move Sprite Element at selected index to another index and reorder sprite list. + /// + /// + /// + void MoveGlyphToIndex(int selectedIndex, int newIndex) + { + int arraySize = m_SpriteGlyphTableProperty.arraySize; + + if (newIndex >= arraySize) + newIndex = arraySize - 1; + + m_SpriteGlyphTableProperty.MoveArrayElement(selectedIndex, newIndex); + + m_selectedElement = newIndex; + m_IsGlyphSearchDirty = true; + m_SpriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + + // TODO: Need to handle switching pages if the character or glyph is moved to a different page. + } + + + /// + /// + /// + /// + /// + void CopyCharacterSerializedProperty(SerializedProperty source, ref SerializedProperty target) + { + target.FindPropertyRelative("m_Name").stringValue = source.FindPropertyRelative("m_Name").stringValue; + target.FindPropertyRelative("m_HashCode").intValue = source.FindPropertyRelative("m_HashCode").intValue; + target.FindPropertyRelative("m_Unicode").intValue = source.FindPropertyRelative("m_Unicode").intValue; + target.FindPropertyRelative("m_GlyphIndex").intValue = source.FindPropertyRelative("m_GlyphIndex").intValue; + target.FindPropertyRelative("m_Scale").floatValue = source.FindPropertyRelative("m_Scale").floatValue; + } + + void CopyGlyphSerializedProperty(SerializedProperty srcGlyph, ref SerializedProperty dstGlyph) + { + // TODO : Should make a generic function which copies each of the properties. + + // Index + dstGlyph.FindPropertyRelative("m_Index").intValue = srcGlyph.FindPropertyRelative("m_Index").intValue; + + // GlyphMetrics + SerializedProperty srcGlyphMetrics = srcGlyph.FindPropertyRelative("m_Metrics"); + SerializedProperty dstGlyphMetrics = dstGlyph.FindPropertyRelative("m_Metrics"); + + dstGlyphMetrics.FindPropertyRelative("m_Width").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Width").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_Height").floatValue = srcGlyphMetrics.FindPropertyRelative("m_Height").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingX").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalBearingY").floatValue; + dstGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue = srcGlyphMetrics.FindPropertyRelative("m_HorizontalAdvance").floatValue; + + // GlyphRect + SerializedProperty srcGlyphRect = srcGlyph.FindPropertyRelative("m_GlyphRect"); + SerializedProperty dstGlyphRect = dstGlyph.FindPropertyRelative("m_GlyphRect"); + + dstGlyphRect.FindPropertyRelative("m_X").intValue = srcGlyphRect.FindPropertyRelative("m_X").intValue; + dstGlyphRect.FindPropertyRelative("m_Y").intValue = srcGlyphRect.FindPropertyRelative("m_Y").intValue; + dstGlyphRect.FindPropertyRelative("m_Width").intValue = srcGlyphRect.FindPropertyRelative("m_Width").intValue; + dstGlyphRect.FindPropertyRelative("m_Height").intValue = srcGlyphRect.FindPropertyRelative("m_Height").intValue; + + dstGlyph.FindPropertyRelative("m_Scale").floatValue = srcGlyph.FindPropertyRelative("m_Scale").floatValue; + dstGlyph.FindPropertyRelative("m_AtlasIndex").intValue = srcGlyph.FindPropertyRelative("m_AtlasIndex").intValue; + } + + + /// + /// + /// + /// + /// + void SearchCharacterTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + searchResults.Clear(); + + int arraySize = m_SpriteCharacterTableProperty.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceSprite = m_SpriteCharacterTableProperty.GetArrayElementAtIndex(i); + + // Check for potential match against array index + if (i.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against decimal id + int id = sourceSprite.FindPropertyRelative("m_GlyphIndex").intValue; + if (id.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against name + string name = sourceSprite.FindPropertyRelative("m_Name").stringValue.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + if (name.Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + } + } + + void SearchGlyphTable(string searchPattern, ref List searchResults) + { + if (searchResults == null) searchResults = new List(); + searchResults.Clear(); + + int arraySize = m_SpriteGlyphTableProperty.arraySize; + + for (int i = 0; i < arraySize; i++) + { + SerializedProperty sourceSprite = m_SpriteGlyphTableProperty.GetArrayElementAtIndex(i); + + // Check for potential match against array index + if (i.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against decimal id + int id = sourceSprite.FindPropertyRelative("m_GlyphIndex").intValue; + if (id.ToString().Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + + // Check for potential match against name + string name = sourceSprite.FindPropertyRelative("m_Name").stringValue.ToLower(System.Globalization.CultureInfo.InvariantCulture).Trim(); + if (name.Contains(searchPattern)) + { + searchResults.Add(i); + continue; + } + } + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta new file mode 100644 index 0000000..9fcede3 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b09be1f217d34247af54863a2f5587e1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs new file mode 100644 index 0000000..89be4ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs @@ -0,0 +1,257 @@ +using System; +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.IO; +using System.Collections.Generic; +using TMPro.EditorUtilities; +using TMPro.SpriteAssetUtilities; + +namespace TMPro +{ + public class TMP_SpriteAssetImporter : EditorWindow + { + // Create Sprite Asset Editor Window + [MenuItem("Window/TextMeshPro/Sprite Importer", false, 2026)] + public static void ShowFontAtlasCreatorWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Sprite Importer"); + window.Focus(); + } + + Texture2D m_SpriteAtlas; + SpriteAssetImportFormats m_SpriteDataFormat = SpriteAssetImportFormats.TexturePackerJsonArray; + TextAsset m_JsonFile; + + string m_CreationFeedback; + + TMP_SpriteAsset m_SpriteAsset; + List m_SpriteInfoList = new List(); + + /// + /// + /// + void OnEnable() + { + // Set Editor Window Size + SetEditorWindowSize(); + } + + /// + /// + /// + public void OnGUI() + { + DrawEditorPanel(); + } + + /// + /// + /// + private void OnDisable() + { + // Clean up sprite asset object that may have been created and not saved. + if (m_SpriteAsset != null && !EditorUtility.IsPersistent(m_SpriteAsset)) + DestroyImmediate(m_SpriteAsset); + } + + /// + /// + /// + void DrawEditorPanel() + { + // label + GUILayout.Label("Import Settings", EditorStyles.boldLabel); + + EditorGUI.BeginChangeCheck(); + + // Sprite Texture Selection + m_JsonFile = EditorGUILayout.ObjectField("Sprite Data Source", m_JsonFile, typeof(TextAsset), false) as TextAsset; + + m_SpriteDataFormat = (SpriteAssetImportFormats)EditorGUILayout.EnumPopup("Import Format", m_SpriteDataFormat); + + // Sprite Texture Selection + m_SpriteAtlas = EditorGUILayout.ObjectField("Sprite Texture Atlas", m_SpriteAtlas, typeof(Texture2D), false) as Texture2D; + + if (EditorGUI.EndChangeCheck()) + { + m_CreationFeedback = string.Empty; + } + + GUILayout.Space(10); + + GUI.enabled = m_JsonFile != null && m_SpriteAtlas != null && m_SpriteDataFormat != SpriteAssetImportFormats.None; + + // Create Sprite Asset + if (GUILayout.Button("Create Sprite Asset")) + { + m_CreationFeedback = string.Empty; + + // Clean up sprite asset object that may have been previously created. + if (m_SpriteAsset != null && !EditorUtility.IsPersistent(m_SpriteAsset)) + DestroyImmediate(m_SpriteAsset); + + // Read json data file + if (m_JsonFile != null) + { + switch (m_SpriteDataFormat) + { + case SpriteAssetImportFormats.TexturePackerJsonArray: + TexturePacker_JsonArray.SpriteDataObject jsonData = null; + try + { + jsonData = JsonUtility.FromJson(m_JsonFile.text); + } + catch + { + m_CreationFeedback = "The Sprite Data Source file [" + m_JsonFile.name + "] appears to be invalid or incorrectly formatted."; + } + + if (jsonData != null && jsonData.frames != null && jsonData.frames.Count > 0) + { + int spriteCount = jsonData.frames.Count; + + // Update import results + m_CreationFeedback = "Import Results\n--------------------\n"; + m_CreationFeedback += "" + spriteCount + " Sprites were imported from file."; + + // Create new Sprite Asset + m_SpriteAsset = CreateInstance(); + + // Assign sprite sheet / atlas texture to sprite asset + m_SpriteAsset.spriteSheet = m_SpriteAtlas; + + List spriteGlyphTable = new List(); + List spriteCharacterTable = new List(); + + PopulateSpriteTables(jsonData, spriteCharacterTable, spriteGlyphTable); + + m_SpriteAsset.spriteCharacterTable = spriteCharacterTable; + m_SpriteAsset.spriteGlyphTable = spriteGlyphTable; + } + break; + } + } + } + + GUI.enabled = true; + + // Creation Feedback + GUILayout.Space(5); + GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(60)); + { + EditorGUILayout.TextArea(m_CreationFeedback, TMP_UIStyleManager.label); + } + GUILayout.EndVertical(); + + GUILayout.Space(5); + GUI.enabled = m_JsonFile != null && m_SpriteAtlas && m_SpriteInfoList != null && m_SpriteAsset != null; + if (GUILayout.Button("Save Sprite Asset") && m_JsonFile != null) + { + string filePath = EditorUtility.SaveFilePanel("Save Sprite Asset File", new FileInfo(AssetDatabase.GetAssetPath(m_JsonFile)).DirectoryName, m_JsonFile.name, "asset"); + + if (filePath.Length == 0) + return; + + SaveSpriteAsset(filePath); + } + GUI.enabled = true; + } + + /// + /// + /// + /// + /// + /// + private static void PopulateSpriteTables(TexturePacker_JsonArray.SpriteDataObject spriteDataObject, List spriteCharacterTable, List spriteGlyphTable) + { + List importedSprites = spriteDataObject.frames; + + float atlasHeight = spriteDataObject.meta.size.h; + + for (int i = 0; i < importedSprites.Count; i++) + { + TexturePacker_JsonArray.Frame spriteData = importedSprites[i]; + + TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph(); + spriteGlyph.index = (uint)i; + + spriteGlyph.metrics = new GlyphMetrics((int)spriteData.frame.w, (int)spriteData.frame.h, -spriteData.frame.w * spriteData.pivot.x, spriteData.frame.h * spriteData.pivot.y, (int)spriteData.frame.w); + spriteGlyph.glyphRect = new GlyphRect((int)spriteData.frame.x, (int)(atlasHeight - spriteData.frame.h - spriteData.frame.y), (int)spriteData.frame.w, (int)spriteData.frame.h); + spriteGlyph.scale = 1.0f; + + spriteGlyphTable.Add(spriteGlyph); + + TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0, spriteGlyph); + spriteCharacter.name = spriteData.filename.Split('.')[0]; + spriteCharacter.unicode = 0xFFFE; + spriteCharacter.scale = 1.0f; + + spriteCharacterTable.Add(spriteCharacter); + } + } + + /// + /// + /// + /// + void SaveSpriteAsset(string filePath) + { + filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath. + + string dataPath = Application.dataPath; + + if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\""); + return; + } + + string relativeAssetPath = filePath.Substring(dataPath.Length - 6); + string dirName = Path.GetDirectoryName(relativeAssetPath); + string fileName = Path.GetFileNameWithoutExtension(relativeAssetPath); + string pathNoExt = dirName + "/" + fileName; + + // Save Sprite Asset + AssetDatabase.CreateAsset(m_SpriteAsset, pathNoExt + ".asset"); + + // Set version number + m_SpriteAsset.version = "1.1.0"; + + // Compute the hash code for the sprite asset. + m_SpriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(m_SpriteAsset.name); + + // Add new default material for sprite asset. + AddDefaultMaterial(m_SpriteAsset); + } + + /// + /// Create and add new default material to sprite asset. + /// + /// + static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset) + { + Shader shader = Shader.Find("TextMeshPro/Sprite"); + Material material = new Material(shader); + material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet); + + spriteAsset.material = material; + material.hideFlags = HideFlags.HideInHierarchy; + AssetDatabase.AddObjectToAsset(material, spriteAsset); + } + + /// + /// Limits the minimum size of the editor window. + /// + void SetEditorWindowSize() + { + EditorWindow editorWindow = this; + + Vector2 currentWindowSize = editorWindow.minSize; + + editorWindow.minSize = new Vector2(Mathf.Max(230, currentWindowSize.x), Mathf.Max(300, currentWindowSize.y)); + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta new file mode 100644 index 0000000..d60763a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f1ea944dcf8849ebab391e461b99ccb7 +timeCreated: 1480023525 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs new file mode 100644 index 0000000..344150b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs @@ -0,0 +1,389 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.U2D; +using UnityEditor; +using System.Linq; +using System.IO; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro.EditorUtilities +{ + public static class TMP_SpriteAssetMenu + { + // Add a Context Menu to the Sprite Asset Editor Panel to Create and Add a Default Material. + [MenuItem("CONTEXT/TMP_SpriteAsset/Add Default Material", false, 2200)] + static void CopyTexture(MenuCommand command) + { + TMP_SpriteAsset spriteAsset = (TMP_SpriteAsset)command.context; + + // Make sure the sprite asset already contains a default material + if (spriteAsset != null && spriteAsset.material == null) + { + // Add new default material for sprite asset. + AddDefaultMaterial(spriteAsset); + } + } + + // Add a Context Menu to the Sprite Asset Editor Panel to update existing sprite assets. + [MenuItem("CONTEXT/TMP_SpriteAsset/Update Sprite Asset", false, 2100)] + static void UpdateSpriteAsset(MenuCommand command) + { + TMP_SpriteAsset spriteAsset = (TMP_SpriteAsset)command.context; + + if (spriteAsset == null) + return; + + UpdateSpriteAsset(spriteAsset); + } + + internal static void UpdateSpriteAsset(TMP_SpriteAsset spriteAsset) + { + // Get a list of all the sprites contained in the texture referenced by the sprite asset. + // This only works if the texture is set to sprite mode. + string filePath = AssetDatabase.GetAssetPath(spriteAsset.spriteSheet); + + if (string.IsNullOrEmpty(filePath)) + return; + + // Get all the sprites defined in the sprite sheet texture referenced by this sprite asset. + Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).ToArray(); + + // Return if sprite sheet texture does not have any sprites defined in it. + if (sprites.Length == 0) + { + Debug.Log("Sprite Asset [" + spriteAsset.name + "]'s atlas texture does not appear to have any sprites defined in it. Use the Unity Sprite Editor to define sprites for this texture.", spriteAsset.spriteSheet); + return; + } + + List spriteGlyphTable = spriteAsset.spriteGlyphTable; + + // Find available glpyh indexes + uint[] existingGlyphIndexes = spriteGlyphTable.Select(x => x.index).ToArray(); + List availableGlyphIndexes = new List(); + + uint lastGlyphIndex = existingGlyphIndexes.Length > 0 ? existingGlyphIndexes.Last() : 0; + int elementIndex = 0; + for (uint i = 0; i < lastGlyphIndex; i++) + { + uint existingGlyphIndex = existingGlyphIndexes[elementIndex]; + + if (i == existingGlyphIndex) + elementIndex += 1; + else + availableGlyphIndexes.Add(i); + } + + // Iterate over sprites contained in the updated sprite sheet to identify new and / or modified sprites. + for (int i = 0; i < sprites.Length; i++) + { + Sprite sprite = sprites[i]; + + // Check if current sprites is already contained in the sprite glyph table of the sprite asset. + TMP_SpriteGlyph spriteGlyph = spriteGlyphTable.FirstOrDefault(x => x.sprite == sprite); + + if (spriteGlyph != null) + { + // update existing sprite glyph + if (spriteGlyph.glyphRect.x != sprite.rect.x || spriteGlyph.glyphRect.y != sprite.rect.y || spriteGlyph.glyphRect.width != sprite.rect.width || spriteGlyph.glyphRect.height != sprite.rect.height) + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + } + else + { + TMP_SpriteCharacter spriteCharacter; + + // Check if this sprite potentially exists under the same name in the sprite character table. + if (spriteAsset.spriteCharacterTable != null && spriteAsset.spriteCharacterTable.Count > 0) + { + spriteCharacter = spriteAsset.spriteCharacterTable.FirstOrDefault(x => x.name == sprite.name); + spriteGlyph = spriteCharacter != null ? spriteGlyphTable[(int)spriteCharacter.glyphIndex] : null; + + if (spriteGlyph != null) + { + // Update sprite reference and data + spriteGlyph.sprite = sprite; + + if (spriteGlyph.glyphRect.x != sprite.rect.x || spriteGlyph.glyphRect.y != sprite.rect.y || spriteGlyph.glyphRect.width != sprite.rect.width || spriteGlyph.glyphRect.height != sprite.rect.height) + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + } + } + + // Add new Sprite Glyph to the table + spriteGlyph = new TMP_SpriteGlyph(); + + // Get available glyph index + if (availableGlyphIndexes.Count > 0) + { + spriteGlyph.index = availableGlyphIndexes[0]; + availableGlyphIndexes.RemoveAt(0); + } + else + spriteGlyph.index = (uint)spriteGlyphTable.Count; + + spriteGlyph.metrics = new GlyphMetrics(sprite.rect.width, sprite.rect.height, -sprite.pivot.x, sprite.rect.height - sprite.pivot.y, sprite.rect.width); + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + spriteGlyph.scale = 1.0f; + spriteGlyph.sprite = sprite; + + spriteGlyphTable.Add(spriteGlyph); + + spriteCharacter = new TMP_SpriteCharacter(0xFFFE, spriteGlyph); + spriteCharacter.name = sprite.name; + spriteCharacter.scale = 1.0f; + + spriteAsset.spriteCharacterTable.Add(spriteCharacter); + } + } + + // Update Sprite Character Table to replace unicode 0x0 by 0xFFFE + for (int i = 0; i < spriteAsset.spriteCharacterTable.Count; i++) + { + TMP_SpriteCharacter spriteCharacter = spriteAsset.spriteCharacterTable[i]; + if (spriteCharacter.unicode == 0) + spriteCharacter.unicode = 0xFFFE; + } + + // Sort glyph table by glyph index + spriteAsset.SortGlyphTable(); + spriteAsset.UpdateLookupTables(); + TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, spriteAsset); + + } + + + [MenuItem("Assets/Create/TextMeshPro/Sprite Asset", false, 110)] + public static void CreateSpriteAsset() + { + Object target = Selection.activeObject; + + if (target == null || target.GetType() != typeof(Texture2D)) // && target.GetType() != typeof(SpriteAtlas))) + { + Debug.LogWarning("A texture must first be selected in order to create a TextMesh Pro Sprite Asset."); + return; + } + + // Get the path to the selected asset. + string filePathWithName = AssetDatabase.GetAssetPath(target); + string fileNameWithExtension = Path.GetFileName(filePathWithName); + string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePathWithName); + string filePath = filePathWithName.Replace(fileNameWithExtension, ""); + + + // Create new Sprite Asset + TMP_SpriteAsset spriteAsset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(spriteAsset, filePath + fileNameWithoutExtension + ".asset"); + + spriteAsset.version = "1.1.0"; + + // Compute the hash code for the sprite asset. + spriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteAsset.name); + + List spriteGlyphTable = new List(); + List spriteCharacterTable = new List(); + + if (target.GetType() == typeof(Texture2D)) + { + Texture2D sourceTex = target as Texture2D; + + // Assign new Sprite Sheet texture to the Sprite Asset. + spriteAsset.spriteSheet = sourceTex; + + PopulateSpriteTables(sourceTex, ref spriteCharacterTable, ref spriteGlyphTable); + + spriteAsset.spriteCharacterTable = spriteCharacterTable; + spriteAsset.spriteGlyphTable = spriteGlyphTable; + + // Add new default material for sprite asset. + AddDefaultMaterial(spriteAsset); + } + else if (target.GetType() == typeof(SpriteAtlas)) + { + //SpriteAtlas spriteAtlas = target as SpriteAtlas; + + //PopulateSpriteTables(spriteAtlas, ref spriteCharacterTable, ref spriteGlyphTable); + + //spriteAsset.spriteCharacterTable = spriteCharacterTable; + //spriteAsset.spriteGlyphTable = spriteGlyphTable; + + //spriteAsset.spriteSheet = spriteGlyphTable[0].sprite.texture; + + //// Add new default material for sprite asset. + //AddDefaultMaterial(spriteAsset); + } + + // Update Lookup tables. + spriteAsset.UpdateLookupTables(); + + // Get the Sprites contained in the Sprite Sheet + EditorUtility.SetDirty(spriteAsset); + + //spriteAsset.sprites = sprites; + + // Set source texture back to Not Readable. + //texImporter.isReadable = false; + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(spriteAsset)); // Re-import font asset to get the new updated version. + + //AssetDatabase.Refresh(); + } + + + private static void PopulateSpriteTables(Texture source, ref List spriteCharacterTable, ref List spriteGlyphTable) + { + //Debug.Log("Creating new Sprite Asset."); + + string filePath = AssetDatabase.GetAssetPath(source); + + // Get all the Sprites sorted by Index + Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray(); + + for (int i = 0; i < sprites.Length; i++) + { + Sprite sprite = sprites[i]; + + TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph(); + spriteGlyph.index = (uint)i; + spriteGlyph.metrics = new GlyphMetrics(sprite.rect.width, sprite.rect.height, -sprite.pivot.x, sprite.rect.height - sprite.pivot.y, sprite.rect.width); + spriteGlyph.glyphRect = new GlyphRect(sprite.rect); + spriteGlyph.scale = 1.0f; + spriteGlyph.sprite = sprite; + + spriteGlyphTable.Add(spriteGlyph); + + TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0xFFFE, spriteGlyph); + spriteCharacter.name = sprite.name; + spriteCharacter.scale = 1.0f; + + spriteCharacterTable.Add(spriteCharacter); + } + } + + + private static void PopulateSpriteTables(SpriteAtlas spriteAtlas, ref List spriteCharacterTable, ref List spriteGlyphTable) + { + // Get number of sprites contained in the sprite atlas. + int spriteCount = spriteAtlas.spriteCount; + Sprite[] sprites = new Sprite[spriteCount]; + + // Get all the sprites + spriteAtlas.GetSprites(sprites); + + for (int i = 0; i < sprites.Length; i++) + { + Sprite sprite = sprites[i]; + + TMP_SpriteGlyph spriteGlyph = new TMP_SpriteGlyph(); + spriteGlyph.index = (uint)i; + spriteGlyph.metrics = new GlyphMetrics(sprite.textureRect.width, sprite.textureRect.height, -sprite.pivot.x, sprite.textureRect.height - sprite.pivot.y, sprite.textureRect.width); + spriteGlyph.glyphRect = new GlyphRect(sprite.textureRect); + spriteGlyph.scale = 1.0f; + spriteGlyph.sprite = sprite; + + spriteGlyphTable.Add(spriteGlyph); + + TMP_SpriteCharacter spriteCharacter = new TMP_SpriteCharacter(0xFFFE, spriteGlyph); + spriteCharacter.name = sprite.name; + spriteCharacter.scale = 1.0f; + + spriteCharacterTable.Add(spriteCharacter); + } + } + + + /// + /// Create and add new default material to sprite asset. + /// + /// + private static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset) + { + Shader shader = Shader.Find("TextMeshPro/Sprite"); + Material material = new Material(shader); + material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet); + + spriteAsset.material = material; + material.hideFlags = HideFlags.HideInHierarchy; + AssetDatabase.AddObjectToAsset(material, spriteAsset); + } + + + // Update existing SpriteInfo + private static List UpdateSpriteInfo(TMP_SpriteAsset spriteAsset) + { + //Debug.Log("Updating Sprite Asset."); + + string filePath = AssetDatabase.GetAssetPath(spriteAsset.spriteSheet); + + // Get all the Sprites sorted Left to Right / Top to Bottom + Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(filePath).Select(x => x as Sprite).Where(x => x != null).OrderByDescending(x => x.rect.y).ThenBy(x => x.rect.x).ToArray(); + + for (int i = 0; i < sprites.Length; i++) + { + Sprite sprite = sprites[i]; + + // Check if the sprite is already contained in the SpriteInfoList + int index = -1; + if (spriteAsset.spriteInfoList.Count > i && spriteAsset.spriteInfoList[i].sprite != null) + index = spriteAsset.spriteInfoList.FindIndex(item => item.sprite.GetInstanceID() == sprite.GetInstanceID()); + + // Use existing SpriteInfo if it already exists + TMP_Sprite spriteInfo = index == -1 ? new TMP_Sprite() : spriteAsset.spriteInfoList[index]; + + Rect spriteRect = sprite.rect; + spriteInfo.x = spriteRect.x; + spriteInfo.y = spriteRect.y; + spriteInfo.width = spriteRect.width; + spriteInfo.height = spriteRect.height; + + // Get Sprite Pivot + Vector2 pivot = new Vector2(0 - (sprite.bounds.min.x) / (sprite.bounds.extents.x * 2), 0 - (sprite.bounds.min.y) / (sprite.bounds.extents.y * 2)); + + // The position of the pivot influences the Offset position. + spriteInfo.pivot = new Vector2(0 - pivot.x * spriteRect.width, spriteRect.height - pivot.y * spriteRect.height); + + if (index == -1) + { + // Find the next available index for this Sprite + int[] ids = spriteAsset.spriteInfoList.Select(item => item.id).ToArray(); + + int id = 0; + for (int j = 0; j < ids.Length; j++ ) + { + if (ids[0] != 0) break; + + if (j > 0 && (ids[j] - ids[j - 1]) > 1) + { + id = ids[j - 1] + 1; + break; + } + + id = j + 1; + } + + spriteInfo.sprite = sprite; + spriteInfo.name = sprite.name; + spriteInfo.hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteInfo.name); + spriteInfo.id = id; + spriteInfo.xAdvance = spriteRect.width; + spriteInfo.scale = 1.0f; + + spriteInfo.xOffset = spriteInfo.pivot.x; + spriteInfo.yOffset = spriteInfo.pivot.y; + + spriteAsset.spriteInfoList.Add(spriteInfo); + + // Sort the Sprites by ID + spriteAsset.spriteInfoList = spriteAsset.spriteInfoList.OrderBy(s => s.id).ToList(); + } + else + { + spriteAsset.spriteInfoList[index] = spriteInfo; + } + } + + return spriteAsset.spriteInfoList; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta new file mode 100644 index 0000000..850ab1f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1048a87135154606808bf2030da32d18 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs new file mode 100644 index 0000000..bc50161 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs @@ -0,0 +1,227 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_SpriteCharacter))] + public class TMP_SpriteCharacterPropertyDrawer : PropertyDrawer + { + int m_GlyphSelectedForEditing = -1; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_SpriteName = property.FindPropertyRelative("m_Name"); + SerializedProperty prop_SpriteNameHashCode = property.FindPropertyRelative("m_HashCode"); + SerializedProperty prop_SpriteUnicode = property.FindPropertyRelative("m_Unicode"); + SerializedProperty prop_SpriteGlyphIndex = property.FindPropertyRelative("m_GlyphIndex"); + SerializedProperty prop_SpriteScale = property.FindPropertyRelative("m_Scale"); + + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + EditorGUIUtility.labelWidth = 40f; + EditorGUIUtility.fieldWidth = 50; + + Rect rect = new Rect(position.x + 60, position.y, position.width, 49); + + // Display non-editable fields + if (GUI.enabled == false) + { + // Sprite Character Index + int spriteCharacterIndex; + int.TryParse(property.displayName.Split(' ')[1], out spriteCharacterIndex); + EditorGUI.LabelField(new Rect(rect.x, rect.y, 75f, 18), new GUIContent("Index: " + spriteCharacterIndex + ""), style); + + EditorGUI.LabelField(new Rect(rect.x + 75f, rect.y, 120f, 18), new GUIContent("Unicode: 0x" + prop_SpriteUnicode.intValue.ToString("X") + ""), style); + EditorGUI.LabelField(new Rect(rect.x + 195f, rect.y, rect.width - 255, 18), new GUIContent("Name: " + prop_SpriteName.stringValue + ""), style); + + EditorGUI.LabelField(new Rect(rect.x, rect.y + 18, 120, 18), new GUIContent("Glyph ID: " + prop_SpriteGlyphIndex.intValue + ""), style); + + // Draw Sprite Glyph (if exists) + DrawSpriteGlyph(position, property); + + EditorGUI.LabelField(new Rect(rect.x, rect.y + 36, 80, 18), new GUIContent("Scale: " + prop_SpriteScale.floatValue + ""), style); + } + else // Display editable fields + { + // Get a reference to the underlying Sprite Asset + TMP_SpriteAsset spriteAsset = property.serializedObject.targetObject as TMP_SpriteAsset; + + // Sprite Character Index + int spriteCharacterIndex; + int.TryParse(property.displayName.Split(' ')[1], out spriteCharacterIndex); + + EditorGUI.LabelField(new Rect(rect.x, rect.y, 75f, 18), new GUIContent("Index: " + spriteCharacterIndex + ""), style); + + EditorGUIUtility.labelWidth = 55f; + GUI.SetNextControlName("Unicode Input"); + EditorGUI.BeginChangeCheck(); + string unicode = EditorGUI.DelayedTextField(new Rect(rect.x + 75f, rect.y, 120, 18), "Unicode:", prop_SpriteUnicode.intValue.ToString("X")); + + if (GUI.GetNameOfFocusedControl() == "Unicode Input") + { + //Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F')) + { + Event.current.character = '\0'; + } + } + + if (EditorGUI.EndChangeCheck()) + { + // Update Unicode value + prop_SpriteUnicode.intValue = TMP_TextUtilities.StringHexToInt(unicode); + spriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + EditorGUIUtility.labelWidth = 41f; + EditorGUI.BeginChangeCheck(); + EditorGUI.DelayedTextField(new Rect(rect.x + 195f, rect.y, rect.width - 255, 18), prop_SpriteName, new GUIContent("Name:")); + if (EditorGUI.EndChangeCheck()) + { + // Recompute hashCode for new name + prop_SpriteNameHashCode.intValue = TMP_TextUtilities.GetSimpleHashCode(prop_SpriteName.stringValue); + spriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + EditorGUIUtility.labelWidth = 59f; + EditorGUI.BeginChangeCheck(); + EditorGUI.DelayedIntField(new Rect(rect.x, rect.y + 18, 100, 18), prop_SpriteGlyphIndex, new GUIContent("Glyph ID:")); + if (EditorGUI.EndChangeCheck()) + { + spriteAsset.m_IsSpriteAssetLookupTablesDirty = true; + } + + // Draw Sprite Glyph (if exists) + DrawSpriteGlyph(position, property); + + int glyphIndex = prop_SpriteGlyphIndex.intValue; + + // Reset glyph selection if new character has been selected. + if (GUI.enabled && m_GlyphSelectedForEditing != glyphIndex) + m_GlyphSelectedForEditing = -1; + + // Display button to edit the glyph data. + if (GUI.Button(new Rect(rect.x + 120, rect.y + 18, 75, 18), new GUIContent("Edit Glyph"))) + { + if (m_GlyphSelectedForEditing == -1) + m_GlyphSelectedForEditing = glyphIndex; + else + m_GlyphSelectedForEditing = -1; + + // Button clicks should not result in potential change. + GUI.changed = false; + } + + // Show the glyph property drawer if selected + if (glyphIndex == m_GlyphSelectedForEditing && GUI.enabled) + { + if (spriteAsset != null) + { + // Lookup glyph and draw glyph (if available) + int elementIndex = spriteAsset.spriteGlyphTable.FindIndex(item => item.index == glyphIndex); + + if (elementIndex != -1) + { + // Get a reference to the Sprite Glyph Table + SerializedProperty prop_SpriteGlyphTable = property.serializedObject.FindProperty("m_SpriteGlyphTable"); + + SerializedProperty prop_SpriteGlyph = prop_SpriteGlyphTable.GetArrayElementAtIndex(elementIndex); + SerializedProperty prop_GlyphMetrics = prop_SpriteGlyph.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = prop_SpriteGlyph.FindPropertyRelative("m_GlyphRect"); + + Rect newRect = EditorGUILayout.GetControlRect(false, 115); + EditorGUI.DrawRect(new Rect(newRect.x + 62, newRect.y - 20, newRect.width - 62, newRect.height - 5), new Color(0.1f, 0.1f, 0.1f, 0.45f)); + EditorGUI.DrawRect(new Rect(newRect.x + 63, newRect.y - 19, newRect.width - 64, newRect.height - 7), new Color(0.3f, 0.3f, 0.3f, 0.8f)); + + // Display GlyphRect + newRect.x += 65; + newRect.y -= 18; + newRect.width += 5; + EditorGUI.PropertyField(newRect, prop_GlyphRect); + + // Display GlyphMetrics + newRect.y += 45; + EditorGUI.PropertyField(newRect, prop_GlyphMetrics); + + rect.y += 120; + } + } + } + + EditorGUIUtility.labelWidth = 39f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 36, 80, 18), prop_SpriteScale, new GUIContent("Scale:")); + } + } + + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 58; + } + + + void DrawSpriteGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the sprite glyph table + TMP_SpriteAsset spriteAsset = property.serializedObject.targetObject as TMP_SpriteAsset; + + if (spriteAsset == null) + return; + + int glyphIndex = property.FindPropertyRelative("m_GlyphIndex").intValue; + + // Lookup glyph and draw glyph (if available) + int elementIndex = spriteAsset.spriteGlyphTable.FindIndex(item => item.index == glyphIndex); + + if (elementIndex != -1) + { + // Get a reference to the Sprite Glyph Table + SerializedProperty prop_SpriteGlyphTable = property.serializedObject.FindProperty("m_SpriteGlyphTable"); + SerializedProperty prop_SpriteGlyph = prop_SpriteGlyphTable.GetArrayElementAtIndex(elementIndex); + SerializedProperty prop_GlyphRect = prop_SpriteGlyph.FindPropertyRelative("m_GlyphRect"); + + // Get a reference to the sprite texture + Texture tex = spriteAsset.spriteSheet; + + // Return if we don't have a texture assigned to the sprite asset. + if (tex == null) + { + Debug.LogWarning("Please assign a valid Sprite Atlas texture to the [" + spriteAsset.name + "] Sprite Asset.", spriteAsset); + return; + } + + Vector2 spriteTexPosition = new Vector2(position.x, position.y); + Vector2 spriteSize = new Vector2(48, 48); + Vector2 alignmentOffset = new Vector2((58 - spriteSize.x) / 2, (58 - spriteSize.y) / 2); + + float x = prop_GlyphRect.FindPropertyRelative("m_X").intValue; + float y = prop_GlyphRect.FindPropertyRelative("m_Y").intValue; + float spriteWidth = prop_GlyphRect.FindPropertyRelative("m_Width").intValue; + float spriteHeight = prop_GlyphRect.FindPropertyRelative("m_Height").intValue; + + if (spriteWidth >= spriteHeight) + { + spriteSize.y = spriteHeight * spriteSize.x / spriteWidth; + spriteTexPosition.y += (spriteSize.x - spriteSize.y) / 2; + } + else + { + spriteSize.x = spriteWidth * spriteSize.y / spriteHeight; + spriteTexPosition.x += (spriteSize.y - spriteSize.x) / 2; + } + + // Compute the normalized texture coordinates + Rect texCoords = new Rect(x / tex.width, y / tex.height, spriteWidth / tex.width, spriteHeight / tex.height); + GUI.DrawTextureWithTexCoords(new Rect(spriteTexPosition.x + alignmentOffset.x, spriteTexPosition.y + alignmentOffset.y, spriteSize.x, spriteSize.y), tex, texCoords, true); + } + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta new file mode 100644 index 0000000..0733749 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37cff9f5a86ae494c8cb04423580480d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs new file mode 100644 index 0000000..cf79bc8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs @@ -0,0 +1,94 @@ +using UnityEngine; +using UnityEngine.TextCore; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_SpriteGlyph))] + public class TMP_SpriteGlyphPropertyDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty prop_GlyphIndex = property.FindPropertyRelative("m_Index"); + SerializedProperty prop_GlyphMetrics = property.FindPropertyRelative("m_Metrics"); + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + SerializedProperty prop_Scale = property.FindPropertyRelative("m_Scale"); + SerializedProperty prop_AtlasIndex = property.FindPropertyRelative("m_AtlasIndex"); + + GUIStyle style = new GUIStyle(EditorStyles.label); + style.richText = true; + + Rect rect = new Rect(position.x + 70, position.y, position.width, 49); + + // Draw GlyphRect + EditorGUI.PropertyField(rect, prop_GlyphRect); + + // Draw GlyphMetrics + rect.y += 45; + EditorGUI.PropertyField(rect, prop_GlyphMetrics); + + EditorGUIUtility.labelWidth = 40f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + 65, 75, 18), prop_Scale, new GUIContent("Scale:")); + + EditorGUIUtility.labelWidth = 74f; + EditorGUI.PropertyField(new Rect(rect.x + 85, rect.y + 65, 95, 18), prop_AtlasIndex, new GUIContent("Atlas Index:")); + + DrawGlyph(position, property); + + int spriteCharacterIndex; + int.TryParse(property.displayName.Split(' ')[1], out spriteCharacterIndex); + + EditorGUI.LabelField(new Rect(position.x, position.y + 5, 64f, 18f), new GUIContent("#" + spriteCharacterIndex), style); + + float labelWidthID = GUI.skin.label.CalcSize(new GUIContent("ID: " + prop_GlyphIndex.intValue)).x; + EditorGUI.LabelField(new Rect(position.x + (64 - labelWidthID) / 2, position.y + 110, 64f, 18f), new GUIContent("ID: " + prop_GlyphIndex.intValue + ""), style); + } + + void DrawGlyph(Rect position, SerializedProperty property) + { + // Get a reference to the sprite texture + Texture tex = (property.serializedObject.targetObject as TMP_SpriteAsset).spriteSheet; + + // Return if we don't have a texture assigned to the sprite asset. + if (tex == null) + { + Debug.LogWarning("Please assign a valid Sprite Atlas texture to the [" + property.serializedObject.targetObject.name + "] Sprite Asset.", property.serializedObject.targetObject); + return; + } + + Vector2 spriteTexPosition = new Vector2(position.x, position.y); + Vector2 spriteSize = new Vector2(65, 65); + + SerializedProperty prop_GlyphRect = property.FindPropertyRelative("m_GlyphRect"); + + int spriteImageX = prop_GlyphRect.FindPropertyRelative("m_X").intValue; + int spriteImageY = prop_GlyphRect.FindPropertyRelative("m_Y").intValue; + int spriteImageWidth = prop_GlyphRect.FindPropertyRelative("m_Width").intValue; + int spriteImageHeight = prop_GlyphRect.FindPropertyRelative("m_Height").intValue; + + if (spriteImageWidth >= spriteImageHeight) + { + spriteSize.y = spriteImageHeight * spriteSize.x / spriteImageWidth; + spriteTexPosition.y += (spriteSize.x - spriteSize.y) / 2; + } + else + { + spriteSize.x = spriteImageWidth * spriteSize.y / spriteImageHeight; + spriteTexPosition.x += (spriteSize.y - spriteSize.x) / 2; + } + + // Compute the normalized texture coordinates + Rect texCoords = new Rect((float)spriteImageX / tex.width, (float)spriteImageY / tex.height, (float)spriteImageWidth / tex.width, (float)spriteImageHeight / tex.height); + GUI.DrawTextureWithTexCoords(new Rect(spriteTexPosition.x + 5, spriteTexPosition.y + 32f, spriteSize.x, spriteSize.y), tex, texCoords, true); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return 130f; + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta new file mode 100644 index 0000000..0414562 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 056819c66570ca54cadb72330a354050 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs new file mode 100644 index 0000000..480a776 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs @@ -0,0 +1,56 @@ +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_StyleAssetMenu + { + + [MenuItem("Assets/Create/TextMeshPro/Style Sheet", false, 120)] + public static void CreateTextMeshProObjectPerform() + { + string filePath; + if (Selection.assetGUIDs.Length == 0) + { + // No asset selected. + filePath = "Assets"; + } + else + { + // Get the path of the selected folder or asset. + filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); + + // Get the file extension of the selected asset as it might need to be removed. + string fileExtension = Path.GetExtension(filePath); + if (fileExtension != "") + { + filePath = Path.GetDirectoryName(filePath); + } + } + + + string filePathWithName = AssetDatabase.GenerateUniqueAssetPath(filePath + "/Text StyleSheet.asset"); + + //// Create new Style Sheet Asset. + TMP_StyleSheet styleSheet = ScriptableObject.CreateInstance(); + + // Create Normal default style + TMP_Style style = new TMP_Style("Normal", string.Empty, string.Empty); + styleSheet.styles.Add(style); + + AssetDatabase.CreateAsset(styleSheet, filePathWithName); + + EditorUtility.SetDirty(styleSheet); + + AssetDatabase.SaveAssets(); + + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(styleSheet); + } + } + +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta new file mode 100644 index 0000000..cb44dc2 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 23a562f2cac6401f9f91251c68a1a794 +timeCreated: 1432690168 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs new file mode 100644 index 0000000..2968c29 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs @@ -0,0 +1,318 @@ +using System; +using UnityEngine; +using UnityEditor; + + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TMP_Style))] + public class StyleDrawer : PropertyDrawer + { + public static readonly float height = 95f; + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return height; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty nameProperty = property.FindPropertyRelative("m_Name"); + SerializedProperty hashCodeProperty = property.FindPropertyRelative("m_HashCode"); + SerializedProperty openingDefinitionProperty = property.FindPropertyRelative("m_OpeningDefinition"); + SerializedProperty closingDefinitionProperty = property.FindPropertyRelative("m_ClosingDefinition"); + SerializedProperty openingDefinitionArray = property.FindPropertyRelative("m_OpeningTagArray"); + SerializedProperty closingDefinitionArray = property.FindPropertyRelative("m_ClosingTagArray"); + + + EditorGUIUtility.labelWidth = 86; + position.height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + float labelHeight = position.height + 2f; + + EditorGUI.BeginChangeCheck(); + Rect rect0 = new Rect(position.x, position.y, (position.width) / 2 + 5, position.height); + EditorGUI.PropertyField(rect0, nameProperty); + if (EditorGUI.EndChangeCheck()) + { + // Recompute HashCode if name has changed. + hashCodeProperty.intValue = TMP_TextUtilities.GetSimpleHashCode(nameProperty.stringValue); + + property.serializedObject.ApplyModifiedProperties(); + + // Dictionary needs to be updated since HashCode has changed. + TMP_StyleSheet styleSheet = property.serializedObject.targetObject as TMP_StyleSheet; + styleSheet.RefreshStyles(); + } + + // HashCode + Rect rect1 = new Rect(rect0.x + rect0.width + 5, position.y, 65, position.height); + GUI.Label(rect1, "HashCode"); + GUI.enabled = false; + rect1.x += 65; + rect1.width = position.width / 2 - 75; + EditorGUI.PropertyField(rect1, hashCodeProperty, GUIContent.none); + + GUI.enabled = true; + + // Text Tags + EditorGUI.BeginChangeCheck(); + + // Opening Tags + position.y += labelHeight; + GUI.Label(position, "Opening Tags"); + Rect textRect1 = new Rect(110, position.y, position.width - 86, 35); + openingDefinitionProperty.stringValue = EditorGUI.TextArea(textRect1, openingDefinitionProperty.stringValue); + if (EditorGUI.EndChangeCheck()) + { + // If any properties have changed, we need to update the Opening and Closing Arrays. + int size = openingDefinitionProperty.stringValue.Length; + + // Adjust array size to match new string length. + if (openingDefinitionArray.arraySize != size) openingDefinitionArray.arraySize = size; + + for (int i = 0; i < size; i++) + { + SerializedProperty element = openingDefinitionArray.GetArrayElementAtIndex(i); + element.intValue = openingDefinitionProperty.stringValue[i]; + } + } + + EditorGUI.BeginChangeCheck(); + + // Closing Tags + position.y += 38; + GUI.Label(position, "Closing Tags"); + Rect textRect2 = new Rect(110, position.y, position.width - 86, 35); + closingDefinitionProperty.stringValue = EditorGUI.TextArea(textRect2, closingDefinitionProperty.stringValue); + + if (EditorGUI.EndChangeCheck()) + { + // If any properties have changed, we need to update the Opening and Closing Arrays. + int size = closingDefinitionProperty.stringValue.Length; + + // Adjust array size to match new string length. + if (closingDefinitionArray.arraySize != size) closingDefinitionArray.arraySize = size; + + for (int i = 0; i < size; i++) + { + SerializedProperty element = closingDefinitionArray.GetArrayElementAtIndex(i); + element.intValue = closingDefinitionProperty.stringValue[i]; + } + } + + } + } + + + + [CustomEditor(typeof(TMP_StyleSheet)), CanEditMultipleObjects] + public class TMP_StyleEditor : Editor + { + + TMP_StyleSheet m_StyleSheet; + SerializedProperty m_StyleListProp; + + int m_SelectedElement = -1; + int m_Page; + + bool m_IsStyleSheetDirty; + + + void OnEnable() + { + m_StyleSheet = target as TMP_StyleSheet; + m_StyleListProp = serializedObject.FindProperty("m_StyleList"); + } + + + public override void OnInspectorGUI() + { + Event currentEvent = Event.current; + + serializedObject.Update(); + + m_IsStyleSheetDirty = false; + int elementCount = m_StyleListProp.arraySize; + int itemsPerPage = (Screen.height - 100) / 110; + + if (elementCount > 0) + { + // Display each Style entry using the StyleDrawer PropertyDrawer. + for (int i = itemsPerPage * m_Page; i < elementCount && i < itemsPerPage * (m_Page + 1); i++) + { + // Define the start of the selection region of the element. + Rect elementStartRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + SerializedProperty styleProperty = m_StyleListProp.GetArrayElementAtIndex(i); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(styleProperty); + EditorGUILayout.EndVertical(); + if (EditorGUI.EndChangeCheck()) + { + // + } + + // Define the end of the selection region of the element. + Rect elementEndRegion = GUILayoutUtility.GetRect(0f, 0f, GUILayout.ExpandWidth(true)); + + // Check for Item selection + Rect selectionArea = new Rect(elementStartRegion.x, elementStartRegion.y, elementEndRegion.width, elementEndRegion.y - elementStartRegion.y); + if (DoSelectionCheck(selectionArea)) + { + if (m_SelectedElement == i) + { + m_SelectedElement = -1; + } + else + { + m_SelectedElement = i; + GUIUtility.keyboardControl = 0; + } + } + + // Handle Selection Highlighting + if (m_SelectedElement == i) + TMP_EditorUtility.DrawBox(selectionArea, 2f, new Color32(40, 192, 255, 255)); + } + } + + // STYLE LIST MANAGEMENT + Rect rect = EditorGUILayout.GetControlRect(false, 20); + rect.width /= 6; + + // Move Style up. + bool guiEnabled = GUI.enabled; + if (m_SelectedElement == -1 || m_SelectedElement == 0) { GUI.enabled = false; } + if (GUI.Button(rect, "Up")) + { + SwapStyleElements(m_SelectedElement, m_SelectedElement - 1); + } + GUI.enabled = guiEnabled; + + // Move Style down. + rect.x += rect.width; + if (m_SelectedElement == elementCount - 1) { GUI.enabled = false; } + if (GUI.Button(rect, "Down")) + { + SwapStyleElements(m_SelectedElement, m_SelectedElement + 1); + } + GUI.enabled = guiEnabled; + + // Add Style + rect.x += rect.width * 3; + if (GUI.Button(rect, "+")) + { + int index = m_SelectedElement == -1 ? 0 : m_SelectedElement; + + if (index > elementCount) + index = elementCount; + + // Copy selected element + m_StyleListProp.InsertArrayElementAtIndex(index); + + // Select newly inserted element + m_SelectedElement = index + 1; + + serializedObject.ApplyModifiedProperties(); + m_StyleSheet.RefreshStyles(); + } + + // Delete style + rect.x += rect.width; + if (m_SelectedElement == -1 || m_SelectedElement >= elementCount) GUI.enabled = false; + if (GUI.Button(rect, "-")) + { + int index = m_SelectedElement == -1 ? 0 : m_SelectedElement; + + m_StyleListProp.DeleteArrayElementAtIndex(index); + + m_SelectedElement = -1; + serializedObject.ApplyModifiedProperties(); + m_StyleSheet.RefreshStyles(); + return; + } + + // Return if we can't display any items. + if (itemsPerPage == 0) return; + + // DISPLAY PAGE CONTROLS + int shiftMultiplier = currentEvent.shift ? 10 : 1; // Page + Shift goes 10 page forward + + Rect pagePos = EditorGUILayout.GetControlRect(false, 20); + pagePos.width /= 3; + + // Previous Page + if (m_Page > 0) GUI.enabled = true; + else GUI.enabled = false; + + if (GUI.Button(pagePos, "Previous")) + m_Page -= 1 * shiftMultiplier; + + // PAGE COUNTER + GUI.enabled = true; + pagePos.x += pagePos.width; + int totalPages = (int)(elementCount / (float)itemsPerPage + 0.999f); + GUI.Label(pagePos, "Page " + (m_Page + 1) + " / " + totalPages, TMP_UIStyleManager.centeredLabel); + + // Next Page + pagePos.x += pagePos.width; + if (itemsPerPage * (m_Page + 1) < elementCount) GUI.enabled = true; + else GUI.enabled = false; + + if (GUI.Button(pagePos, "Next")) + m_Page += 1 * shiftMultiplier; + + // Clamp page range + m_Page = Mathf.Clamp(m_Page, 0, elementCount / itemsPerPage); + + + if (serializedObject.ApplyModifiedProperties()) + { + TMPro_EventManager.ON_TEXT_STYLE_PROPERTY_CHANGED(true); + + if (m_IsStyleSheetDirty) + { + m_IsStyleSheetDirty = false; + m_StyleSheet.RefreshStyles(); + } + } + + // Clear selection if mouse event was not consumed. + GUI.enabled = true; + if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0) + m_SelectedElement = -1; + + } + + + // Check if any of the Style elements were clicked on. + static bool DoSelectionCheck(Rect selectionArea) + { + Event currentEvent = Event.current; + + switch (currentEvent.type) + { + case EventType.MouseDown: + if (selectionArea.Contains(currentEvent.mousePosition) && currentEvent.button == 0) + { + currentEvent.Use(); + return true; + } + break; + } + + return false; + } + + void SwapStyleElements(int selectedIndex, int newIndex) + { + m_StyleListProp.MoveArrayElement(selectedIndex, newIndex); + m_SelectedElement = newIndex; + m_IsStyleSheetDirty = true; + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta new file mode 100644 index 0000000..a3bff26 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 34e2c9b9d9e44953933afe37461f44e6 +timeCreated: 1432683777 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs new file mode 100644 index 0000000..679f445 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs @@ -0,0 +1,104 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_SubMeshUI)), CanEditMultipleObjects] + public class TMP_SubMeshUI_Editor : Editor + { + private struct m_foldout + { // Track Inspector foldout panel states, globally. + //public static bool textInput = true; + public static bool fontSettings = true; + //public static bool extraSettings = false; + //public static bool shadowSetting = false; + //public static bool materialEditor = true; + } + + private SerializedProperty fontAsset_prop; + private SerializedProperty spriteAsset_prop; + + //private TMP_SubMeshUI m_SubMeshComponent; + + //private CanvasRenderer m_canvasRenderer; + private Editor m_materialEditor; + private Material m_targetMaterial; + + + public void OnEnable() + { + fontAsset_prop = serializedObject.FindProperty("m_fontAsset"); + spriteAsset_prop = serializedObject.FindProperty("m_spriteAsset"); + + //m_SubMeshComponent = target as TMP_SubMeshUI; + //m_rectTransform = m_SubMeshComponent.rectTransform; + //m_canvasRenderer = m_SubMeshComponent.canvasRenderer; + + + // Create new Material Editor if one does not exists + /* + if (m_canvasRenderer != null && m_canvasRenderer.GetMaterial() != null) + { + m_materialEditor = Editor.CreateEditor(m_canvasRenderer.GetMaterial()); + m_targetMaterial = m_canvasRenderer.GetMaterial(); + } + */ + } + + + public void OnDisable() + { + // Destroy material editor if one exists + /* + if (m_materialEditor != null) + { + //Debug.Log("Destroying Inline Material Editor."); + DestroyImmediate(m_materialEditor); + } + */ + } + + + + public override void OnInspectorGUI() + { + GUI.enabled = false; + EditorGUILayout.PropertyField(fontAsset_prop); + EditorGUILayout.PropertyField(spriteAsset_prop); + GUI.enabled = true; + + EditorGUILayout.Space(); + + // If a Custom Material Editor exists, we use it. + /* + if (m_canvasRenderer != null && m_canvasRenderer.GetMaterial() != null) + { + Material mat = m_canvasRenderer.GetMaterial(); + + //Debug.Log(mat + " " + m_targetMaterial); + + if (mat != m_targetMaterial) + { + // Destroy previous Material Instance + //Debug.Log("New Material has been assigned."); + m_targetMaterial = mat; + DestroyImmediate(m_materialEditor); + } + + + if (m_materialEditor == null) + { + m_materialEditor = Editor.CreateEditor(mat); + } + + m_materialEditor.DrawHeader(); + + + m_materialEditor.OnInspectorGUI(); + } + */ + } + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta new file mode 100644 index 0000000..b82410e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6b01141ed8f74d198965c86f25eb7040 +timeCreated: 1452757501 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs new file mode 100644 index 0000000..f668af9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs @@ -0,0 +1,71 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TMP_SubMesh)), CanEditMultipleObjects] + public class TMP_SubMesh_Editor : Editor + { + private struct m_foldout + { // Track Inspector foldout panel states, globally. + //public static bool textInput = true; + public static bool fontSettings = true; + //public static bool extraSettings = false; + //public static bool shadowSetting = false; + //public static bool materialEditor = true; + } + + private SerializedProperty fontAsset_prop; + private SerializedProperty spriteAsset_prop; + + private TMP_SubMesh m_SubMeshComponent; + private Renderer m_Renderer; + + private string[] m_SortingLayerNames; + + public void OnEnable() + { + fontAsset_prop = serializedObject.FindProperty("m_fontAsset"); + spriteAsset_prop = serializedObject.FindProperty("m_spriteAsset"); + + m_SubMeshComponent = target as TMP_SubMesh; + + m_Renderer = m_SubMeshComponent.renderer; + + m_SortingLayerNames = SortingLayerHelper.sortingLayerNames; + } + + + public override void OnInspectorGUI() + { + EditorGUI.indentLevel = 0; + + GUI.enabled = false; + EditorGUILayout.PropertyField(fontAsset_prop); + EditorGUILayout.PropertyField(spriteAsset_prop); + GUI.enabled = true; + + EditorGUI.BeginChangeCheck(); + + // Look up the layer name using the current layer ID + string oldName = SortingLayer.IDToName(m_Renderer.sortingLayerID); + + // Use the name to look up our array index into the names list + int oldLayerIndex = System.Array.IndexOf(m_SortingLayerNames, oldName); + + // Show the pop-up for the names + int newLayerIndex = EditorGUILayout.Popup("Sorting Layer", oldLayerIndex, m_SortingLayerNames); + + // If the index changes, look up the ID for the new index to store as the new ID + if (newLayerIndex != oldLayerIndex) + m_Renderer.sortingLayerID = SortingLayer.NameToID(m_SortingLayerNames[newLayerIndex]); + + // Expose the manual sorting order + int newSortingLayerOrder = EditorGUILayout.IntField("Order in Layer", m_Renderer.sortingOrder); + if (newSortingLayerOrder != m_Renderer.sortingOrder) + m_Renderer.sortingOrder = newSortingLayerOrder; + + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta new file mode 100644 index 0000000..fd4713b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd2fe74169b54bf58fca17288513ef38 +timeCreated: 1456189048 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs new file mode 100644 index 0000000..1361de7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs @@ -0,0 +1,273 @@ +using UnityEngine; +using UnityEditor; + +namespace TMPro.EditorUtilities +{ + + [CustomPropertyDrawer(typeof(TextAlignmentOptions))] + public class TMP_TextAlignmentDrawer : PropertyDrawer + { + const int k_AlignmentButtonWidth = 24; + const int k_AlignmentButtonHeight = 20; + const int k_WideViewWidth = 504; + const int k_ControlsSpacing = 6; + const int k_GroupWidth = k_AlignmentButtonWidth * 6; + static readonly int k_TextAlignmentHash = "DoTextAligmentControl".GetHashCode(); + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return EditorGUIUtility.currentViewWidth > k_WideViewWidth ? k_AlignmentButtonHeight : k_AlignmentButtonHeight * 2 + 3; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + var id = GUIUtility.GetControlID(k_TextAlignmentHash, FocusType.Keyboard, position); + + EditorGUI.BeginProperty(position, label, property); + { + var controlArea = EditorGUI.PrefixLabel(position, id, label); + + var horizontalAligment = new Rect(controlArea.x, controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + var verticalAligment = new Rect(!(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.x : horizontalAligment.xMax + k_ControlsSpacing, !(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.y + k_AlignmentButtonHeight + 3 : controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + + EditorGUI.BeginChangeCheck(); + + var selectedHorizontal = DoHorizontalAligmentControl(horizontalAligment, property); + var selectedVertical = DoVerticalAligmentControl(verticalAligment, property); + + if (EditorGUI.EndChangeCheck()) + { + var value = (0x1 << selectedHorizontal) | (0x100 << selectedVertical); + property.intValue = value; + } + } + EditorGUI.EndProperty(); + } + + static int DoHorizontalAligmentControl(Rect position, SerializedProperty alignment) + { + var selected = TMP_EditorUtility.GetHorizontalAlignmentGridValue(alignment.intValue); + + var values = new bool[6]; + + values[selected] = true; + + if (alignment.hasMultipleDifferentValues) + { + foreach (var obj in alignment.serializedObject.targetObjects) + { + var text = obj as TMP_Text; + if (text != null) + { + values[TMP_EditorUtility.GetHorizontalAlignmentGridValue((int)text.alignment)] = true; + } + } + } + + position.width = k_AlignmentButtonWidth; + + for (var i = 0; i < values.Length; i++) + { + var oldValue = values[i]; + var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentA[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid)); + if (newValue != oldValue) + { + selected = i; + } + position.x += position.width; + } + + return selected; + } + + static int DoVerticalAligmentControl(Rect position, SerializedProperty alignment) + { + var selected = TMP_EditorUtility.GetVerticalAlignmentGridValue(alignment.intValue); + + var values = new bool[6]; + + values[selected] = true; + + if (alignment.hasMultipleDifferentValues) + { + foreach (var obj in alignment.serializedObject.targetObjects) + { + var text = obj as TMP_Text; + if (text != null) + { + values[TMP_EditorUtility.GetVerticalAlignmentGridValue((int)text.alignment)] = true; + } + } + } + + position.width = k_AlignmentButtonWidth; + + for (var i = 0; i < values.Length; i++) + { + var oldValue = values[i]; + var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentB[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid)); + if (newValue != oldValue) + { + selected = i; + } + position.x += position.width; + } + + return selected; + } + } + + [CustomPropertyDrawer(typeof(HorizontalAlignmentOptions))] + public class TMP_HorizontalAlignmentDrawer : PropertyDrawer + { + const int k_AlignmentButtonWidth = 24; + const int k_AlignmentButtonHeight = 20; + const int k_WideViewWidth = 504; + const int k_ControlsSpacing = 6; + const int k_GroupWidth = k_AlignmentButtonWidth * 6; + static readonly int k_TextAlignmentHash = "DoTextAligmentControl".GetHashCode(); + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return EditorGUIUtility.currentViewWidth > k_WideViewWidth ? k_AlignmentButtonHeight : k_AlignmentButtonHeight * 2 + 3; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + var id = GUIUtility.GetControlID(k_TextAlignmentHash, FocusType.Keyboard, position); + + EditorGUI.BeginProperty(position, label, property); + { + var controlArea = EditorGUI.PrefixLabel(position, id, label); + + var horizontalAligment = new Rect(controlArea.x, controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + //var verticalAligment = new Rect(!(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.x : horizontalAligment.xMax + k_ControlsSpacing, !(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.y + k_AlignmentButtonHeight + 3 : controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + + EditorGUI.BeginChangeCheck(); + + var selectedHorizontal = DoHorizontalAligmentControl(horizontalAligment, property); + + if (EditorGUI.EndChangeCheck()) + { + var value = 0x1 << selectedHorizontal; + property.intValue = value; + } + } + EditorGUI.EndProperty(); + } + + static int DoHorizontalAligmentControl(Rect position, SerializedProperty alignment) + { + var selected = TMP_EditorUtility.GetHorizontalAlignmentGridValue(alignment.intValue); + + var values = new bool[6]; + + values[selected] = true; + + if (alignment.hasMultipleDifferentValues) + { + foreach (var obj in alignment.serializedObject.targetObjects) + { + var text = obj as TMP_Text; + if (text != null) + { + values[TMP_EditorUtility.GetHorizontalAlignmentGridValue((int)text.horizontalAlignment)] = true; + } + } + } + + position.width = k_AlignmentButtonWidth; + + for (var i = 0; i < values.Length; i++) + { + var oldValue = values[i]; + var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentA[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid)); + if (newValue != oldValue) + { + selected = i; + } + position.x += position.width; + } + + return selected; + } + } + + + [CustomPropertyDrawer(typeof(VerticalAlignmentOptions))] + public class TMP_VerticalAlignmentDrawer : PropertyDrawer + { + const int k_AlignmentButtonWidth = 24; + const int k_AlignmentButtonHeight = 20; + const int k_WideViewWidth = 504; + const int k_ControlsSpacing = 6; + const int k_GroupWidth = k_AlignmentButtonWidth * 6; + static readonly int k_TextAlignmentHash = "DoTextAligmentControl".GetHashCode(); + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return EditorGUIUtility.currentViewWidth > k_WideViewWidth ? k_AlignmentButtonHeight : k_AlignmentButtonHeight * 2 + 3; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + var id = GUIUtility.GetControlID(k_TextAlignmentHash, FocusType.Keyboard, position); + + EditorGUI.BeginProperty(position, label, property); + { + var controlArea = EditorGUI.PrefixLabel(position, id, label); + + var horizontalAligment = new Rect(controlArea.x, controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + var verticalAligment = new Rect(!(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.x : horizontalAligment.xMax + k_ControlsSpacing, !(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.y + k_AlignmentButtonHeight + 3 : controlArea.y, k_GroupWidth, k_AlignmentButtonHeight); + + EditorGUI.BeginChangeCheck(); + + //var selectedHorizontal = DoHorizontalAligmentControl(horizontalAligment, property); + var selectedVertical = DoVerticalAligmentControl(verticalAligment, property); + + if (EditorGUI.EndChangeCheck()) + { + var value = 0x100 << selectedVertical; + property.intValue = value; + } + } + EditorGUI.EndProperty(); + } + + static int DoVerticalAligmentControl(Rect position, SerializedProperty alignment) + { + var selected = TMP_EditorUtility.GetVerticalAlignmentGridValue(alignment.intValue); + + var values = new bool[6]; + + values[selected] = true; + + if (alignment.hasMultipleDifferentValues) + { + foreach (var obj in alignment.serializedObject.targetObjects) + { + var text = obj as TMP_Text; + if (text != null) + { + values[TMP_EditorUtility.GetVerticalAlignmentGridValue((int)text.verticalAlignment)] = true; + } + } + } + + position.width = k_AlignmentButtonWidth; + + for (var i = 0; i < values.Length; i++) + { + var oldValue = values[i]; + var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentB[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid)); + if (newValue != oldValue) + { + selected = i; + } + position.x += position.width; + } + + return selected; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta new file mode 100644 index 0000000..a68a273 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c55a64c7570474f47a94abe39ebfef04 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs new file mode 100644 index 0000000..0a94a99 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs @@ -0,0 +1,134 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public static class TMP_UIStyleManager + { + public static GUIStyle label; + public static GUIStyle textAreaBoxWindow; + public static GUIStyle boldFoldout; + public static GUIStyle panelTitle; + public static GUIStyle sectionHeader; + public static GUIStyle centeredLabel; + public static GUIStyle rightLabel; + public static GUIStyle wrappingTextArea; + + public static GUIStyle alignmentButtonLeft; + public static GUIStyle alignmentButtonMid; + public static GUIStyle alignmentButtonRight; + + // Alignment Button Textures + public static Texture2D alignLeft; + public static Texture2D alignCenter; + public static Texture2D alignRight; + public static Texture2D alignJustified; + public static Texture2D alignFlush; + public static Texture2D alignGeoCenter; + public static Texture2D alignTop; + public static Texture2D alignMiddle; + public static Texture2D alignBottom; + public static Texture2D alignBaseline; + public static Texture2D alignMidline; + public static Texture2D alignCapline; + public static Texture2D sectionHeaderTexture; + + public static GUIContent[] alignContentA; + public static GUIContent[] alignContentB; + + static TMP_UIStyleManager() + { + // Find to location of the TextMesh Pro Asset Folder (as users may have moved it) + var tmproAssetFolderPath = TMP_EditorUtility.packageRelativePath; + + if (EditorGUIUtility.isProSkin) + { + alignLeft = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignLeft.psd", typeof(Texture2D)) as Texture2D; + alignCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenter.psd", typeof(Texture2D)) as Texture2D; + alignRight = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignRight.psd", typeof(Texture2D)) as Texture2D; + alignJustified = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignJustified.psd", typeof(Texture2D)) as Texture2D; + alignFlush = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignFlush.psd", typeof(Texture2D)) as Texture2D; + alignGeoCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenterGeo.psd", typeof(Texture2D)) as Texture2D; + alignTop = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignTop.psd", typeof(Texture2D)) as Texture2D; + alignMiddle = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMiddle.psd", typeof(Texture2D)) as Texture2D; + alignBottom = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBottom.psd", typeof(Texture2D)) as Texture2D; + alignBaseline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBaseLine.psd", typeof(Texture2D)) as Texture2D; + alignMidline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMidLine.psd", typeof(Texture2D)) as Texture2D; + alignCapline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCapLine.psd", typeof(Texture2D)) as Texture2D; + sectionHeaderTexture = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/SectionHeader_Dark.psd", typeof(Texture2D)) as Texture2D; + } + else + { + alignLeft = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignLeft_Light.psd", typeof(Texture2D)) as Texture2D; + alignCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenter_Light.psd", typeof(Texture2D)) as Texture2D; + alignRight = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignRight_Light.psd", typeof(Texture2D)) as Texture2D; + alignJustified = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignJustified_Light.psd", typeof(Texture2D)) as Texture2D; + alignFlush = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignFlush_Light.psd", typeof(Texture2D)) as Texture2D; + alignGeoCenter = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd", typeof(Texture2D)) as Texture2D; + alignTop = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignTop_Light.psd", typeof(Texture2D)) as Texture2D; + alignMiddle = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMiddle_Light.psd", typeof(Texture2D)) as Texture2D; + alignBottom = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBottom_Light.psd", typeof(Texture2D)) as Texture2D; + alignBaseline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignBaseLine_Light.psd", typeof(Texture2D)) as Texture2D; + alignMidline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignMidLine_Light.psd", typeof(Texture2D)) as Texture2D; + alignCapline = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/btn_AlignCapLine_Light.psd", typeof(Texture2D)) as Texture2D; + sectionHeaderTexture = AssetDatabase.LoadAssetAtPath(tmproAssetFolderPath + "/Editor Resources/Textures/SectionHeader_Light.psd", typeof(Texture2D)) as Texture2D; + } + + label = new GUIStyle(EditorStyles.label) { richText = true, wordWrap = true, stretchWidth = true }; + textAreaBoxWindow = new GUIStyle(EditorStyles.textArea) { richText = true }; + boldFoldout = new GUIStyle(EditorStyles.foldout) { fontStyle = FontStyle.Bold }; + panelTitle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold }; + + sectionHeader = new GUIStyle(EditorStyles.label) { fixedHeight = 22, richText = true, border = new RectOffset(9, 9, 0, 0), overflow = new RectOffset(9, 0, 0, 0), padding = new RectOffset(0, 0, 4, 0) }; + sectionHeader.normal.background = sectionHeaderTexture; + + centeredLabel = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleCenter}; + rightLabel = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleRight, richText = true }; + + + alignmentButtonLeft = new GUIStyle(EditorStyles.miniButtonLeft); + alignmentButtonLeft.padding.left = 4; + alignmentButtonLeft.padding.right = 4; + alignmentButtonLeft.padding.top = 2; + alignmentButtonLeft.padding.bottom = 2; + + alignmentButtonMid = new GUIStyle(EditorStyles.miniButtonMid); + alignmentButtonMid.padding.left = 4; + alignmentButtonMid.padding.right = 4; + alignmentButtonLeft.padding.top = 2; + alignmentButtonLeft.padding.bottom = 2; + + alignmentButtonRight = new GUIStyle(EditorStyles.miniButtonRight); + alignmentButtonRight.padding.left = 4; + alignmentButtonRight.padding.right = 4; + alignmentButtonLeft.padding.top = 2; + alignmentButtonLeft.padding.bottom = 2; + + wrappingTextArea = new GUIStyle(EditorStyles.textArea); + wrappingTextArea.wordWrap = true; + + alignContentA = new [] + { + new GUIContent(alignLeft, "Left"), + new GUIContent(alignCenter, "Center"), + new GUIContent(alignRight, "Right"), + new GUIContent(alignJustified, "Justified"), + new GUIContent(alignFlush, "Flush"), + new GUIContent(alignGeoCenter, "Geometry Center") + }; + + alignContentB = new [] + { + new GUIContent(alignTop, "Top"), + new GUIContent(alignMiddle, "Middle"), + new GUIContent(alignBottom, "Bottom"), + new GUIContent(alignBaseline, "Baseline"), + new GUIContent(alignMidline, "Midline"), + new GUIContent(alignCapline, "Capline") + }; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs.meta new file mode 100644 index 0000000..9c09bfa --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 30a939dce2fd4073955f2f20e659d506 +timeCreated: 1426454127 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs new file mode 100644 index 0000000..a01760d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs @@ -0,0 +1,367 @@ +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public class TMP_ContextMenus : Editor + { + + private static Texture m_copiedTexture; + + private static Material m_copiedProperties; + private static Material m_copiedAtlasProperties; + + + // Add a Context Menu to the Texture Editor Panel to allow Copy / Paste of Texture. + [MenuItem("CONTEXT/Texture/Copy", false, 2000)] + static void CopyTexture(MenuCommand command) + { + m_copiedTexture = command.context as Texture; + } + + + // Select the currently assigned material or material preset. + [MenuItem("CONTEXT/Material/Select Material", false, 500)] + static void SelectMaterial(MenuCommand command) + { + Material mat = command.context as Material; + + // Select current material + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(mat); + } + + + // Add a Context Menu to allow easy duplication of the Material. + [MenuItem("CONTEXT/Material/Create Material Preset", false)] + static void DuplicateMaterial(MenuCommand command) + { + // Get the type of text object + // If material is not a base material, we get material leaks... + + Material source_Mat = (Material)command.context; + if (!EditorUtility.IsPersistent(source_Mat)) + { + Debug.LogWarning("Material is an instance and cannot be converted into a persistent asset."); + return; + } + + string assetPath = AssetDatabase.GetAssetPath(source_Mat).Split('.')[0]; + + if (assetPath.IndexOf("Assets/", System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogWarning("Material Preset cannot be created from a material that is located outside the project."); + return; + } + + Material duplicate = new Material(source_Mat); + + // Need to manually copy the shader keywords + duplicate.shaderKeywords = source_Mat.shaderKeywords; + + AssetDatabase.CreateAsset(duplicate, AssetDatabase.GenerateUniqueAssetPath(assetPath + ".mat")); + + GameObject[] selectedObjects = Selection.gameObjects; + + // Assign new Material Preset to selected text objects. + for (int i = 0; i < selectedObjects.Length; i++) + { + TMP_Text textObject = selectedObjects[i].GetComponent(); + + if (textObject != null) + { + textObject.fontSharedMaterial = duplicate; + } + else + { + TMP_SubMesh subMeshObject = selectedObjects[i].GetComponent(); + + if (subMeshObject != null) + subMeshObject.sharedMaterial = duplicate; + else + { + TMP_SubMeshUI subMeshUIObject = selectedObjects[i].GetComponent(); + + if (subMeshUIObject != null) + subMeshUIObject.sharedMaterial = duplicate; + } + } + } + + // Ping newly created Material Preset. + EditorUtility.FocusProjectWindow(); + EditorGUIUtility.PingObject(duplicate); + } + + + // COPY MATERIAL PROPERTIES + [MenuItem("CONTEXT/Material/Copy Material Properties", false)] + static void CopyMaterialProperties(MenuCommand command) + { + Material mat = null; + if (command.context.GetType() == typeof(Material)) + mat = (Material)command.context; + else + { + mat = Selection.activeGameObject.GetComponent().GetMaterial(); + } + + m_copiedProperties = new Material(mat); + + m_copiedProperties.shaderKeywords = mat.shaderKeywords; + + m_copiedProperties.hideFlags = HideFlags.DontSave; + } + + + // PASTE MATERIAL + //[MenuItem("CONTEXT/MaterialComponent/Paste Material Properties", false)] + [MenuItem("CONTEXT/Material/Paste Material Properties", false)] + static void PasteMaterialProperties(MenuCommand command) + { + if (m_copiedProperties == null) + { + Debug.LogWarning("No Material Properties to Paste. Use Copy Material Properties first."); + return; + } + + Material mat = null; + if (command.context.GetType() == typeof(Material)) + mat = (Material)command.context; + else + { + mat = Selection.activeGameObject.GetComponent().GetMaterial(); + } + + Undo.RecordObject(mat, "Paste Material"); + + ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs + if (mat.HasProperty(ShaderUtilities.ID_GradientScale)) + { + // Preserve unique SDF properties from destination material. + m_copiedProperties.SetTexture(ShaderUtilities.ID_MainTex, mat.GetTexture(ShaderUtilities.ID_MainTex)); + m_copiedProperties.SetFloat(ShaderUtilities.ID_GradientScale, mat.GetFloat(ShaderUtilities.ID_GradientScale)); + m_copiedProperties.SetFloat(ShaderUtilities.ID_TextureWidth, mat.GetFloat(ShaderUtilities.ID_TextureWidth)); + m_copiedProperties.SetFloat(ShaderUtilities.ID_TextureHeight, mat.GetFloat(ShaderUtilities.ID_TextureHeight)); + } + + EditorShaderUtilities.CopyMaterialProperties(m_copiedProperties, mat); + + // Copy ShaderKeywords from one material to the other. + mat.shaderKeywords = m_copiedProperties.shaderKeywords; + + // Let TextMeshPro Objects that this mat has changed. + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, mat); + } + + + // Enable Resetting of Material properties without losing unique properties of the font atlas. + [MenuItem("CONTEXT/Material/Reset", false, 2100)] + static void ResetSettings(MenuCommand command) + { + Material mat = null; + if (command.context.GetType() == typeof(Material)) + mat = (Material)command.context; + else + { + mat = Selection.activeGameObject.GetComponent().GetMaterial(); + } + + Undo.RecordObject(mat, "Reset Material"); + + ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs + if (mat.HasProperty(ShaderUtilities.ID_GradientScale)) + { + // Copy unique properties of the SDF Material + var texture = mat.GetTexture(ShaderUtilities.ID_MainTex); + var gradientScale = mat.GetFloat(ShaderUtilities.ID_GradientScale); + var texWidth = mat.GetFloat(ShaderUtilities.ID_TextureWidth); + var texHeight = mat.GetFloat(ShaderUtilities.ID_TextureHeight); + + var stencilId = 0.0f; + var stencilComp = 0.0f; + + if (mat.HasProperty(ShaderUtilities.ID_StencilID)) + { + stencilId = mat.GetFloat(ShaderUtilities.ID_StencilID); + stencilComp = mat.GetFloat(ShaderUtilities.ID_StencilComp); + } + + var normalWeight = mat.GetFloat(ShaderUtilities.ID_WeightNormal); + var boldWeight = mat.GetFloat(ShaderUtilities.ID_WeightBold); + + // Reset the material + Unsupported.SmartReset(mat); + + // Reset ShaderKeywords + mat.shaderKeywords = new string[0]; // { "BEVEL_OFF", "GLOW_OFF", "UNDERLAY_OFF" }; + + // Copy unique material properties back to the material. + mat.SetTexture(ShaderUtilities.ID_MainTex, texture); + mat.SetFloat(ShaderUtilities.ID_GradientScale, gradientScale); + mat.SetFloat(ShaderUtilities.ID_TextureWidth, texWidth); + mat.SetFloat(ShaderUtilities.ID_TextureHeight, texHeight); + + if (mat.HasProperty(ShaderUtilities.ID_StencilID)) + { + mat.SetFloat(ShaderUtilities.ID_StencilID, stencilId); + mat.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp); + } + + mat.SetFloat(ShaderUtilities.ID_WeightNormal, normalWeight); + mat.SetFloat(ShaderUtilities.ID_WeightBold, boldWeight); + } + else + { + Unsupported.SmartReset(mat); + } + + TMPro_EventManager.ON_MATERIAL_PROPERTY_CHANGED(true, mat); + } + + + //This function is used for debugging and fixing potentially broken font atlas links. + [MenuItem("CONTEXT/Material/Copy Atlas", false, 2000)] + static void CopyAtlas(MenuCommand command) + { + Material mat = command.context as Material; + + m_copiedAtlasProperties = new Material(mat); + m_copiedAtlasProperties.hideFlags = HideFlags.DontSave; + } + + + // This function is used for debugging and fixing potentially broken font atlas links + [MenuItem("CONTEXT/Material/Paste Atlas", false, 2001)] + static void PasteAtlas(MenuCommand command) + { + Material mat = command.context as Material; + + if (mat == null) + return; + + if (m_copiedAtlasProperties != null) + { + Undo.RecordObject(mat, "Paste Texture"); + + ShaderUtilities.GetShaderPropertyIDs(); // Make sure we have valid Property IDs + + if (m_copiedAtlasProperties.HasProperty(ShaderUtilities.ID_MainTex)) + mat.SetTexture(ShaderUtilities.ID_MainTex, m_copiedAtlasProperties.GetTexture(ShaderUtilities.ID_MainTex)); + + if (m_copiedAtlasProperties.HasProperty(ShaderUtilities.ID_GradientScale)) + { + mat.SetFloat(ShaderUtilities.ID_GradientScale, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_GradientScale)); + mat.SetFloat(ShaderUtilities.ID_TextureWidth, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_TextureWidth)); + mat.SetFloat(ShaderUtilities.ID_TextureHeight, m_copiedAtlasProperties.GetFloat(ShaderUtilities.ID_TextureHeight)); + } + } + else if (m_copiedTexture != null) + { + Undo.RecordObject(mat, "Paste Texture"); + + mat.SetTexture(ShaderUtilities.ID_MainTex, m_copiedTexture); + } + + //DestroyImmediate(m_copiedAtlasProperties); + } + + + // Context Menus for TMPro Font Assets + //This function is used for debugging and fixing potentially broken font atlas links. + [MenuItem("CONTEXT/TMP_FontAsset/Extract Atlas", false, 2100)] + static void ExtractAtlas(MenuCommand command) + { + TMP_FontAsset font = command.context as TMP_FontAsset; + + string fontPath = AssetDatabase.GetAssetPath(font); + string texPath = Path.GetDirectoryName(fontPath) + "/" + Path.GetFileNameWithoutExtension(fontPath) + " Atlas.png"; + + // Create a Serialized Object of the texture to allow us to make it readable. + SerializedObject texprop = new SerializedObject(font.material.GetTexture(ShaderUtilities.ID_MainTex)); + texprop.FindProperty("m_IsReadable").boolValue = true; + texprop.ApplyModifiedProperties(); + + // Create a copy of the texture. + Texture2D tex = Instantiate(font.material.GetTexture(ShaderUtilities.ID_MainTex)) as Texture2D; + + // Set the texture to not readable again. + texprop.FindProperty("m_IsReadable").boolValue = false; + texprop.ApplyModifiedProperties(); + + Debug.Log(texPath); + // Saving File for Debug + var pngData = tex.EncodeToPNG(); + File.WriteAllBytes(texPath, pngData); + + AssetDatabase.Refresh(); + DestroyImmediate(tex); + } + + /// + /// + /// + /// + [MenuItem("CONTEXT/TMP_FontAsset/Update Atlas Texture...", false, 2000)] + static void RegenerateFontAsset(MenuCommand command) + { + TMP_FontAsset fontAsset = command.context as TMP_FontAsset; + + if (fontAsset != null) + { + TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(fontAsset); + } + } + + [MenuItem("CONTEXT/TMP_FontAsset/Force Upgrade To Version 1.1.0...", false, 2010)] + static void ForceFontAssetUpgrade(MenuCommand command) + { + TMP_FontAsset fontAsset = command.context as TMP_FontAsset; + + if (fontAsset != null) + { + fontAsset.UpgradeFontAsset(); + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + } + + + /// + /// Clear Dynamic Font Asset data such as glyph, character and font features. + /// + /// + [MenuItem("CONTEXT/TMP_FontAsset/Reset", false, 100)] + static void ClearFontAssetData(MenuCommand command) + { + TMP_FontAsset fontAsset = command.context as TMP_FontAsset; + + if (fontAsset != null && Selection.activeObject != fontAsset) + { + Selection.activeObject = fontAsset; + } + + fontAsset.ClearFontAssetData(true); + + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + + + [MenuItem("CONTEXT/TrueTypeFontImporter/Create TMP Font Asset...", false, 200)] + static void CreateFontAsset(MenuCommand command) + { + TrueTypeFontImporter importer = command.context as TrueTypeFontImporter; + + if (importer != null) + { + Font sourceFontFile = AssetDatabase.LoadAssetAtPath(importer.assetPath); + + if (sourceFontFile) + TMPro_FontAssetCreatorWindow.ShowFontAtlasCreatorWindow(sourceFontFile); + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs.meta new file mode 100644 index 0000000..f16753f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 44e1d646473a40178712cb2150f54cec +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs new file mode 100644 index 0000000..99b83a6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs @@ -0,0 +1,392 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.Presets; +using UnityEditor.SceneManagement; +using UnityEditor.Experimental.SceneManagement; +using UnityEngine.SceneManagement; +using UnityEngine.UI; +using UnityEngine.EventSystems; + + +namespace TMPro.EditorUtilities +{ + public static class TMPro_CreateObjectMenu + { + + /// + /// Create a TextMeshPro object that works with the Mesh Renderer + /// + /// + [MenuItem("GameObject/3D Object/Text - TextMeshPro", false, 30)] + static void CreateTextMeshProObjectPerform(MenuCommand command) + { + GameObject go = ObjectFactory.CreateGameObject("Text (TMP)"); + + // Add support for new prefab mode + StageUtility.PlaceGameObjectInCurrentStage(go); + + TextMeshPro textComponent = ObjectFactory.AddComponent(go); + + if (textComponent.m_isWaitingOnResourceLoad == false) + { + // Get reference to potential Presets for component + #if UNITY_2019_3_OR_NEWER + Preset[] presets = Preset.GetDefaultPresetsForObject(textComponent); + + if (presets == null || presets.Length == 0) + { + textComponent.text = "Sample text"; + textComponent.alignment = TextAlignmentOptions.TopLeft; + } + else + { + textComponent.renderer.sortingLayerID = textComponent._SortingLayerID; + textComponent.renderer.sortingOrder = textComponent._SortingOrder; + } + #else + if (Preset.GetDefaultForObject(textComponent) == null) + { + textComponent.text = "Sample text"; + textComponent.alignment = TextAlignmentOptions.TopLeft; + } + else + { + textComponent.renderer.sortingLayerID = textComponent._SortingLayerID; + textComponent.renderer.sortingOrder = textComponent._SortingOrder; + } + #endif + + if (TMP_Settings.autoSizeTextContainer) + { + Vector2 size = textComponent.GetPreferredValues(TMP_Math.FLOAT_MAX, TMP_Math.FLOAT_MAX); + textComponent.rectTransform.sizeDelta = size; + } + else + { + textComponent.rectTransform.sizeDelta = TMP_Settings.defaultTextMeshProTextContainerSize; + } + } + else + { + textComponent.text = "Sample text"; + textComponent.alignment = TextAlignmentOptions.TopLeft; + } + + Undo.RegisterCreatedObjectUndo(go, "Create " + go.name); + + GameObject contextObject = command.context as GameObject; + if (contextObject != null) + { + GameObjectUtility.SetParentAndAlign(go, contextObject); + Undo.SetTransformParent(go.transform, contextObject.transform, "Parent " + go.name); + } + + Selection.activeGameObject = go; + } + + + /// + /// Create a TextMeshPro object that works with the CanvasRenderer + /// + /// + [MenuItem("GameObject/UI/Text - TextMeshPro", false, 2001)] + static void CreateTextMeshProGuiObjectPerform(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateText(GetStandardResources()); + + // Override text color and font size + TextMeshProUGUI textComponent = go.GetComponent(); + + if (textComponent.m_isWaitingOnResourceLoad == false) + { + // Get reference to potential Presets for component + #if UNITY_2019_3_OR_NEWER + Preset[] presets = Preset.GetDefaultPresetsForObject(textComponent); + + if (presets == null || presets.Length == 0) + { + textComponent.fontSize = TMP_Settings.defaultFontSize; + textComponent.color = Color.white; + textComponent.text = "New Text"; + } + #else + if (Preset.GetDefaultForObject(textComponent) == null) + { + textComponent.fontSize = TMP_Settings.defaultFontSize; + textComponent.color = Color.white; + textComponent.text = "New Text"; + } + #endif + + if (TMP_Settings.autoSizeTextContainer) + { + Vector2 size = textComponent.GetPreferredValues(TMP_Math.FLOAT_MAX, TMP_Math.FLOAT_MAX); + textComponent.rectTransform.sizeDelta = size; + } + else + { + textComponent.rectTransform.sizeDelta = TMP_Settings.defaultTextMeshProUITextContainerSize; + } + } + else + { + textComponent.fontSize = 36; + textComponent.color = Color.white; + textComponent.text = "New Text"; + } + + PlaceUIElementRoot(go, menuCommand); + } + + [MenuItem("GameObject/UI/Button - TextMeshPro", false, 2031)] + public static void AddButton(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateButton(GetStandardResources()); + + // Override font size + TMP_Text textComponent = go.GetComponentInChildren(); + textComponent.fontSize = 24; + + PlaceUIElementRoot(go, menuCommand); + } + + + + [MenuItem("GameObject/UI/Input Field - TextMeshPro", false, 2037)] + static void AddTextMeshProInputField(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateInputField(GetStandardResources()); + PlaceUIElementRoot(go, menuCommand); + } + + + [MenuItem("GameObject/UI/Dropdown - TextMeshPro", false, 2036)] + public static void AddDropdown(MenuCommand menuCommand) + { + GameObject go = TMP_DefaultControls.CreateDropdown(GetStandardResources()); + PlaceUIElementRoot(go, menuCommand); + } + + + private const string kUILayerName = "UI"; + + private const string kStandardSpritePath = "UI/Skin/UISprite.psd"; + private const string kBackgroundSpritePath = "UI/Skin/Background.psd"; + private const string kInputFieldBackgroundPath = "UI/Skin/InputFieldBackground.psd"; + private const string kKnobPath = "UI/Skin/Knob.psd"; + private const string kCheckmarkPath = "UI/Skin/Checkmark.psd"; + private const string kDropdownArrowPath = "UI/Skin/DropdownArrow.psd"; + private const string kMaskPath = "UI/Skin/UIMask.psd"; + + private static TMP_DefaultControls.Resources s_StandardResources; + + + private static TMP_DefaultControls.Resources GetStandardResources() + { + if (s_StandardResources.standard == null) + { + s_StandardResources.standard = AssetDatabase.GetBuiltinExtraResource(kStandardSpritePath); + s_StandardResources.background = AssetDatabase.GetBuiltinExtraResource(kBackgroundSpritePath); + s_StandardResources.inputField = AssetDatabase.GetBuiltinExtraResource(kInputFieldBackgroundPath); + s_StandardResources.knob = AssetDatabase.GetBuiltinExtraResource(kKnobPath); + s_StandardResources.checkmark = AssetDatabase.GetBuiltinExtraResource(kCheckmarkPath); + s_StandardResources.dropdown = AssetDatabase.GetBuiltinExtraResource(kDropdownArrowPath); + s_StandardResources.mask = AssetDatabase.GetBuiltinExtraResource(kMaskPath); + } + return s_StandardResources; + } + + + private static void SetPositionVisibleinSceneView(RectTransform canvasRTransform, RectTransform itemTransform) + { + // Find the best scene view + SceneView sceneView = SceneView.lastActiveSceneView; + if (sceneView == null && SceneView.sceneViews.Count > 0) + sceneView = SceneView.sceneViews[0] as SceneView; + + // Couldn't find a SceneView. Don't set position. + if (sceneView == null || sceneView.camera == null) + return; + + // Create world space Plane from canvas position. + Camera camera = sceneView.camera; + Vector3 position = Vector3.zero; + Vector2 localPlanePosition; + + if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRTransform, new Vector2(camera.pixelWidth / 2, camera.pixelHeight / 2), camera, out localPlanePosition)) + { + // Adjust for canvas pivot + localPlanePosition.x = localPlanePosition.x + canvasRTransform.sizeDelta.x * canvasRTransform.pivot.x; + localPlanePosition.y = localPlanePosition.y + canvasRTransform.sizeDelta.y * canvasRTransform.pivot.y; + + localPlanePosition.x = Mathf.Clamp(localPlanePosition.x, 0, canvasRTransform.sizeDelta.x); + localPlanePosition.y = Mathf.Clamp(localPlanePosition.y, 0, canvasRTransform.sizeDelta.y); + + // Adjust for anchoring + position.x = localPlanePosition.x - canvasRTransform.sizeDelta.x * itemTransform.anchorMin.x; + position.y = localPlanePosition.y - canvasRTransform.sizeDelta.y * itemTransform.anchorMin.y; + + Vector3 minLocalPosition; + minLocalPosition.x = canvasRTransform.sizeDelta.x * (0 - canvasRTransform.pivot.x) + itemTransform.sizeDelta.x * itemTransform.pivot.x; + minLocalPosition.y = canvasRTransform.sizeDelta.y * (0 - canvasRTransform.pivot.y) + itemTransform.sizeDelta.y * itemTransform.pivot.y; + + Vector3 maxLocalPosition; + maxLocalPosition.x = canvasRTransform.sizeDelta.x * (1 - canvasRTransform.pivot.x) - itemTransform.sizeDelta.x * itemTransform.pivot.x; + maxLocalPosition.y = canvasRTransform.sizeDelta.y * (1 - canvasRTransform.pivot.y) - itemTransform.sizeDelta.y * itemTransform.pivot.y; + + position.x = Mathf.Clamp(position.x, minLocalPosition.x, maxLocalPosition.x); + position.y = Mathf.Clamp(position.y, minLocalPosition.y, maxLocalPosition.y); + } + + itemTransform.anchoredPosition = position; + itemTransform.localRotation = Quaternion.identity; + itemTransform.localScale = Vector3.one; + } + + + private static void PlaceUIElementRoot(GameObject element, MenuCommand menuCommand) + { + GameObject parent = menuCommand.context as GameObject; + bool explicitParentChoice = true; + if (parent == null) + { + parent = GetOrCreateCanvasGameObject(); + explicitParentChoice = false; + + // If in Prefab Mode, Canvas has to be part of Prefab contents, + // otherwise use Prefab root instead. + PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); + if (prefabStage != null && !prefabStage.IsPartOfPrefabContents(parent)) + parent = prefabStage.prefabContentsRoot; + } + if (parent.GetComponentInParent() == null) + { + // Create canvas under context GameObject, + // and make that be the parent which UI element is added under. + GameObject canvas = CreateNewUI(); + canvas.transform.SetParent(parent.transform, false); + parent = canvas; + } + + // Setting the element to be a child of an element already in the scene should + // be sufficient to also move the element to that scene. + // However, it seems the element needs to be already in its destination scene when the + // RegisterCreatedObjectUndo is performed; otherwise the scene it was created in is dirtied. + SceneManager.MoveGameObjectToScene(element, parent.scene); + + if (element.transform.parent == null) + { + Undo.SetTransformParent(element.transform, parent.transform, "Parent " + element.name); + } + + GameObjectUtility.EnsureUniqueNameForSibling(element); + + // We have to fix up the undo name since the name of the object was only known after reparenting it. + Undo.SetCurrentGroupName("Create " + element.name); + + GameObjectUtility.SetParentAndAlign(element, parent); + if (!explicitParentChoice) // not a context click, so center in sceneview + SetPositionVisibleinSceneView(parent.GetComponent(), element.GetComponent()); + + Undo.RegisterCreatedObjectUndo(element, "Create " + element.name); + + Selection.activeGameObject = element; + } + + + public static GameObject CreateNewUI() + { + // Root for the UI + var root = new GameObject("Canvas"); + root.layer = LayerMask.NameToLayer(kUILayerName); + Canvas canvas = root.AddComponent(); + canvas.renderMode = RenderMode.ScreenSpaceOverlay; + root.AddComponent(); + root.AddComponent(); + + // Works for all stages. + StageUtility.PlaceGameObjectInCurrentStage(root); + bool customScene = false; + PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); + if (prefabStage != null) + { + root.transform.SetParent(prefabStage.prefabContentsRoot.transform, false); + customScene = true; + } + + Undo.RegisterCreatedObjectUndo(root, "Create " + root.name); + + // If there is no event system add one... + // No need to place event system in custom scene as these are temporary anyway. + // It can be argued for or against placing it in the user scenes, + // but let's not modify scene user is not currently looking at. + if (!customScene) + CreateEventSystem(false); + return root; + } + + + private static void CreateEventSystem(bool select) + { + CreateEventSystem(select, null); + } + + + private static void CreateEventSystem(bool select, GameObject parent) + { + var esys = Object.FindObjectOfType(); + if (esys == null) + { + var eventSystem = new GameObject("EventSystem"); + GameObjectUtility.SetParentAndAlign(eventSystem, parent); + esys = eventSystem.AddComponent(); + eventSystem.AddComponent(); + + Undo.RegisterCreatedObjectUndo(eventSystem, "Create " + eventSystem.name); + } + + if (select && esys != null) + { + Selection.activeGameObject = esys.gameObject; + } + } + + + // Helper function that returns a Canvas GameObject; preferably a parent of the selection, or other existing Canvas. + public static GameObject GetOrCreateCanvasGameObject() + { + GameObject selectedGo = Selection.activeGameObject; + + // Try to find a gameobject that is the selected GO or one if its parents. + Canvas canvas = (selectedGo != null) ? selectedGo.GetComponentInParent() : null; + if (IsValidCanvas(canvas)) + return canvas.gameObject; + + // No canvas in selection or its parents? Then use any valid canvas. + // We have to find all loaded Canvases, not just the ones in main scenes. + Canvas[] canvasArray = StageUtility.GetCurrentStageHandle().FindComponentsOfType(); + for (int i = 0; i < canvasArray.Length; i++) + if (IsValidCanvas(canvasArray[i])) + return canvasArray[i].gameObject; + + // No canvas in the scene at all? Then create a new one. + return CreateNewUI(); + } + + static bool IsValidCanvas(Canvas canvas) + { + if (canvas == null || !canvas.gameObject.activeInHierarchy) + return false; + + // It's important that the non-editable canvas from a prefab scene won't be rejected, + // but canvases not visible in the Hierarchy at all do. Don't check for HideAndDontSave. + if (EditorUtility.IsPersistent(canvas) || (canvas.hideFlags & HideFlags.HideInHierarchy) != 0) + return false; + + if (StageUtility.GetStageHandle(canvas.gameObject) != StageUtility.GetCurrentStageHandle()) + return false; + + return true; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta new file mode 100644 index 0000000..be9643f --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7065397ff8184621aa3ca4f854491259 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs new file mode 100644 index 0000000..3d63900 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public static class EditorShaderUtilities + { + + /// + /// Copy Shader properties from source to destination material. + /// + /// + /// + public static void CopyMaterialProperties(Material source, Material destination) + { + MaterialProperty[] source_prop = MaterialEditor.GetMaterialProperties(new Material[] { source }); + + for (int i = 0; i < source_prop.Length; i++) + { + int property_ID = Shader.PropertyToID(source_prop[i].name); + if (destination.HasProperty(property_ID)) + { + //Debug.Log(source_prop[i].name + " Type:" + ShaderUtil.GetPropertyType(source.shader, i)); + switch (ShaderUtil.GetPropertyType(source.shader, i)) + { + case ShaderUtil.ShaderPropertyType.Color: + destination.SetColor(property_ID, source.GetColor(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.Float: + destination.SetFloat(property_ID, source.GetFloat(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.Range: + destination.SetFloat(property_ID, source.GetFloat(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.TexEnv: + destination.SetTexture(property_ID, source.GetTexture(property_ID)); + break; + case ShaderUtil.ShaderPropertyType.Vector: + destination.SetVector(property_ID, source.GetVector(property_ID)); + break; + } + } + } + + } + + } + +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta new file mode 100644 index 0000000..89d2594 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: aa76955fe5bb44f7915d91db8c7043c4 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs new file mode 100644 index 0000000..4d895a5 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs @@ -0,0 +1,1802 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using System.IO; +using System.Text.RegularExpressions; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; +using UnityEditor.TextCore.LowLevel; +using Object = UnityEngine.Object; + +namespace TMPro.EditorUtilities +{ + public class TMPro_FontAssetCreatorWindow : EditorWindow + { + [MenuItem("Window/TextMeshPro/Font Asset Creator", false, 2025)] + public static void ShowFontAtlasCreatorWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Font Asset Creator"); + window.Focus(); + + // Make sure TMP Essential Resources have been imported. + window.CheckEssentialResources(); + } + + + public static void ShowFontAtlasCreatorWindow(Font sourceFontFile) + { + var window = GetWindow(); + + window.titleContent = new GUIContent("Font Asset Creator"); + window.Focus(); + + window.ClearGeneratedData(); + window.m_LegacyFontAsset = null; + window.m_SelectedFontAsset = null; + + // Override selected font asset + window.m_SourceFontFile = sourceFontFile; + + // Make sure TMP Essential Resources have been imported. + window.CheckEssentialResources(); + } + + + public static void ShowFontAtlasCreatorWindow(TMP_FontAsset fontAsset) + { + var window = GetWindow(); + + window.titleContent = new GUIContent("Font Asset Creator"); + window.Focus(); + + // Clear any previously generated data + window.ClearGeneratedData(); + window.m_LegacyFontAsset = null; + + // Load font asset creation settings if we have valid settings + if (string.IsNullOrEmpty(fontAsset.creationSettings.sourceFontFileGUID) == false) + { + window.LoadFontCreationSettings(fontAsset.creationSettings); + + // Override settings to inject character list from font asset + window.m_CharacterSetSelectionMode = 6; + window.m_CharacterSequence = TMP_EditorUtility.GetUnicodeCharacterSequence(TMP_FontAsset.GetCharactersArray(fontAsset)); + + + window.m_ReferencedFontAsset = fontAsset; + window.m_SavedFontAtlas = fontAsset.atlasTexture; + } + else + { + window.m_WarningMessage = "Font Asset [" + fontAsset.name + "] does not contain any previous \"Font Asset Creation Settings\". This usually means [" + fontAsset.name + "] was created before this new functionality was added."; + window.m_SourceFontFile = null; + window.m_LegacyFontAsset = fontAsset; + } + + // Even if we don't have any saved generation settings, we still want to pre-select the source font file. + window.m_SelectedFontAsset = fontAsset; + + // Make sure TMP Essential Resources have been imported. + window.CheckEssentialResources(); + } + + [System.Serializable] + class FontAssetCreationSettingsContainer + { + public List fontAssetCreationSettings; + } + + FontAssetCreationSettingsContainer m_FontAssetCreationSettingsContainer; + + //static readonly string[] m_FontCreationPresets = new string[] { "Recent 1", "Recent 2", "Recent 3", "Recent 4" }; + int m_FontAssetCreationSettingsCurrentIndex = 0; + + const string k_FontAssetCreationSettingsContainerKey = "TextMeshPro.FontAssetCreator.RecentFontAssetCreationSettings.Container"; + const string k_FontAssetCreationSettingsCurrentIndexKey = "TextMeshPro.FontAssetCreator.RecentFontAssetCreationSettings.CurrentIndex"; + const float k_TwoColumnControlsWidth = 335f; + + // Diagnostics + System.Diagnostics.Stopwatch m_StopWatch; + double m_GlyphPackingGenerationTime; + double m_GlyphRenderingGenerationTime; + + string[] m_FontSizingOptions = { "Auto Sizing", "Custom Size" }; + int m_PointSizeSamplingMode; + string[] m_FontResolutionLabels = { "8", "16","32", "64", "128", "256", "512", "1024", "2048", "4096", "8192" }; + int[] m_FontAtlasResolutions = { 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; + string[] m_FontCharacterSets = { "ASCII", "Extended ASCII", "ASCII Lowercase", "ASCII Uppercase", "Numbers + Symbols", "Custom Range", "Unicode Range (Hex)", "Custom Characters", "Characters from File" }; + enum FontPackingModes { Fast = 0, Optimum = 4 }; + FontPackingModes m_PackingMode = FontPackingModes.Fast; + + int m_CharacterSetSelectionMode; + + string m_CharacterSequence = ""; + string m_OutputFeedback = ""; + string m_WarningMessage; + int m_CharacterCount; + Vector2 m_ScrollPosition; + Vector2 m_OutputScrollPosition; + + bool m_IsRepaintNeeded; + + float m_AtlasGenerationProgress; + string m_AtlasGenerationProgressLabel = string.Empty; + float m_RenderingProgress; + bool m_IsGlyphPackingDone; + bool m_IsGlyphRenderingDone; + bool m_IsRenderingDone; + bool m_IsProcessing; + bool m_IsGenerationDisabled; + bool m_IsGenerationCancelled; + + bool m_IsFontAtlasInvalid; + Object m_SourceFontFile; + TMP_FontAsset m_SelectedFontAsset; + TMP_FontAsset m_LegacyFontAsset; + TMP_FontAsset m_ReferencedFontAsset; + + TextAsset m_CharactersFromFile; + int m_PointSize; + int m_Padding = 5; + //FaceStyles m_FontStyle = FaceStyles.Normal; + //float m_FontStyleValue = 2; + + GlyphRenderMode m_GlyphRenderMode = GlyphRenderMode.SDFAA; + int m_AtlasWidth = 512; + int m_AtlasHeight = 512; + byte[] m_AtlasTextureBuffer; + Texture2D m_FontAtlasTexture; + Texture2D m_SavedFontAtlas; + + // + List m_FontGlyphTable = new List(); + List m_FontCharacterTable = new List(); + + Dictionary m_CharacterLookupMap = new Dictionary(); + Dictionary> m_GlyphLookupMap = new Dictionary>(); + + List m_GlyphsToPack = new List(); + List m_GlyphsPacked = new List(); + List m_FreeGlyphRects = new List(); + List m_UsedGlyphRects = new List(); + List m_GlyphsToRender = new List(); + List m_AvailableGlyphsToAdd = new List(); + List m_MissingCharacters = new List(); + List m_ExcludedCharacters = new List(); + + private FaceInfo m_FaceInfo; + + bool m_IncludeFontFeatures; + + + public void OnEnable() + { + // Used for Diagnostics + m_StopWatch = new System.Diagnostics.Stopwatch(); + + // Set Editor window size. + minSize = new Vector2(315, minSize.y); + + // Initialize & Get shader property IDs. + ShaderUtilities.GetShaderPropertyIDs(); + + // Load last selected preset if we are not already in the process of regenerating an existing font asset (via the Context menu) + if (EditorPrefs.HasKey(k_FontAssetCreationSettingsContainerKey)) + { + if (m_FontAssetCreationSettingsContainer == null) + m_FontAssetCreationSettingsContainer = JsonUtility.FromJson(EditorPrefs.GetString(k_FontAssetCreationSettingsContainerKey)); + + if (m_FontAssetCreationSettingsContainer.fontAssetCreationSettings != null && m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count > 0) + { + // Load Font Asset Creation Settings preset. + if (EditorPrefs.HasKey(k_FontAssetCreationSettingsCurrentIndexKey)) + m_FontAssetCreationSettingsCurrentIndex = EditorPrefs.GetInt(k_FontAssetCreationSettingsCurrentIndexKey); + + LoadFontCreationSettings(m_FontAssetCreationSettingsContainer.fontAssetCreationSettings[m_FontAssetCreationSettingsCurrentIndex]); + } + } + + ClearGeneratedData(); + } + + + public void OnDisable() + { + //Debug.Log("TextMeshPro Editor Window has been disabled."); + + // Destroy Engine only if it has been initialized already + FontEngine.DestroyFontEngine(); + + ClearGeneratedData(); + + // Remove Glyph Report if one was created. + if (File.Exists("Assets/TextMesh Pro/Glyph Report.txt")) + { + File.Delete("Assets/TextMesh Pro/Glyph Report.txt"); + File.Delete("Assets/TextMesh Pro/Glyph Report.txt.meta"); + + AssetDatabase.Refresh(); + } + + // Save Font Asset Creation Settings Index + SaveCreationSettingsToEditorPrefs(SaveFontCreationSettings()); + EditorPrefs.SetInt(k_FontAssetCreationSettingsCurrentIndexKey, m_FontAssetCreationSettingsCurrentIndex); + + // Unregister to event + TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED); + + Resources.UnloadUnusedAssets(); + } + + + // Event received when TMP resources have been loaded. + void ON_RESOURCES_LOADED() + { + TMPro_EventManager.RESOURCE_LOAD_EVENT.Remove(ON_RESOURCES_LOADED); + + m_IsGenerationDisabled = false; + } + + // Make sure TMP Essential Resources have been imported. + void CheckEssentialResources() + { + if (TMP_Settings.instance == null) + { + if (m_IsGenerationDisabled == false) + TMPro_EventManager.RESOURCE_LOAD_EVENT.Add(ON_RESOURCES_LOADED); + + m_IsGenerationDisabled = true; + } + } + + + public void OnGUI() + { + GUILayout.BeginHorizontal(); + DrawControls(); + if (position.width > position.height && position.width > k_TwoColumnControlsWidth) + { + DrawPreview(); + } + GUILayout.EndHorizontal(); + } + + + public void Update() + { + if (m_IsRepaintNeeded) + { + //Debug.Log("Repainting..."); + m_IsRepaintNeeded = false; + Repaint(); + } + + // Update Progress bar is we are Rendering a Font. + if (m_IsProcessing) + { + m_AtlasGenerationProgress = FontEngine.generationProgress; + + m_IsRepaintNeeded = true; + } + + if (m_IsGlyphPackingDone) + { + Debug.Log("Glyph packing completed in: " + m_GlyphPackingGenerationTime.ToString("0.000 ms.")); + m_IsGlyphPackingDone = false; + } + + if (m_IsGlyphRenderingDone) + { + Debug.Log("Font Atlas generation completed in: " + m_GlyphRenderingGenerationTime.ToString("0.000 ms.")); + m_IsGlyphRenderingDone = false; + } + + // Update Feedback Window & Create Font Texture once Rendering is done. + if (m_IsRenderingDone) + { + m_IsProcessing = false; + m_IsRenderingDone = false; + + if (m_IsGenerationCancelled == false) + { + m_AtlasGenerationProgressLabel = "Generation completed in: " + (m_GlyphPackingGenerationTime + m_GlyphRenderingGenerationTime).ToString("0.00 ms."); + + UpdateRenderFeedbackWindow(); + CreateFontAtlasTexture(); + + // If dynamic make readable ... + m_FontAtlasTexture.Apply(false, false); + } + Repaint(); + } + } + + + /// + /// Method which returns the character corresponding to a decimal value. + /// + /// + /// + static uint[] ParseNumberSequence(string sequence) + { + List unicodeList = new List(); + string[] sequences = sequence.Split(','); + + foreach (string seq in sequences) + { + string[] s1 = seq.Split('-'); + + if (s1.Length == 1) + try + { + unicodeList.Add(uint.Parse(s1[0])); + } + catch + { + Debug.Log("No characters selected or invalid format."); + } + else + { + for (uint j = uint.Parse(s1[0]); j < uint.Parse(s1[1]) + 1; j++) + { + unicodeList.Add(j); + } + } + } + + return unicodeList.ToArray(); + } + + + /// + /// Method which returns the character (decimal value) from a hex sequence. + /// + /// + /// + static uint[] ParseHexNumberSequence(string sequence) + { + List unicodeList = new List(); + string[] sequences = sequence.Split(','); + + foreach (string seq in sequences) + { + string[] s1 = seq.Split('-'); + + if (s1.Length == 1) + try + { + unicodeList.Add(uint.Parse(s1[0], NumberStyles.AllowHexSpecifier)); + } + catch + { + Debug.Log("No characters selected or invalid format."); + } + else + { + for (uint j = uint.Parse(s1[0], NumberStyles.AllowHexSpecifier); j < uint.Parse(s1[1], NumberStyles.AllowHexSpecifier) + 1; j++) + { + unicodeList.Add(j); + } + } + } + + return unicodeList.ToArray(); + } + + + void DrawControls() + { + GUILayout.Space(5f); + + if (position.width > position.height && position.width > k_TwoColumnControlsWidth) + { + m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition, GUILayout.Width(315)); + } + else + { + m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition); + } + + GUILayout.Space(5f); + + GUILayout.Label(m_SelectedFontAsset != null ? string.Format("Font Settings [{0}]", m_SelectedFontAsset.name) : "Font Settings", EditorStyles.boldLabel); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + EditorGUIUtility.labelWidth = 125f; + EditorGUIUtility.fieldWidth = 5f; + + // Disable Options if already generating a font atlas texture. + EditorGUI.BeginDisabledGroup(m_IsProcessing); + { + // FONT TTF SELECTION + EditorGUI.BeginChangeCheck(); + m_SourceFontFile = EditorGUILayout.ObjectField("Source Font File", m_SourceFontFile, typeof(Font), false) as Font; + if (EditorGUI.EndChangeCheck()) + { + m_SelectedFontAsset = null; + m_IsFontAtlasInvalid = true; + } + + // FONT SIZING + EditorGUI.BeginChangeCheck(); + if (m_PointSizeSamplingMode == 0) + { + m_PointSizeSamplingMode = EditorGUILayout.Popup("Sampling Point Size", m_PointSizeSamplingMode, m_FontSizingOptions); + } + else + { + GUILayout.BeginHorizontal(); + m_PointSizeSamplingMode = EditorGUILayout.Popup("Sampling Point Size", m_PointSizeSamplingMode, m_FontSizingOptions, GUILayout.Width(225)); + m_PointSize = EditorGUILayout.IntField(m_PointSize); + GUILayout.EndHorizontal(); + } + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + // FONT PADDING + EditorGUI.BeginChangeCheck(); + m_Padding = EditorGUILayout.IntField("Padding", m_Padding); + m_Padding = (int)Mathf.Clamp(m_Padding, 0f, 64f); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + // FONT PACKING METHOD SELECTION + EditorGUI.BeginChangeCheck(); + m_PackingMode = (FontPackingModes)EditorGUILayout.EnumPopup("Packing Method", m_PackingMode); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + // FONT ATLAS RESOLUTION SELECTION + GUILayout.BeginHorizontal(); + GUI.changed = false; + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PrefixLabel("Atlas Resolution"); + m_AtlasWidth = EditorGUILayout.IntPopup(m_AtlasWidth, m_FontResolutionLabels, m_FontAtlasResolutions); + m_AtlasHeight = EditorGUILayout.IntPopup(m_AtlasHeight, m_FontResolutionLabels, m_FontAtlasResolutions); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + GUILayout.EndHorizontal(); + + + // FONT CHARACTER SET SELECTION + EditorGUI.BeginChangeCheck(); + bool hasSelectionChanged = false; + m_CharacterSetSelectionMode = EditorGUILayout.Popup("Character Set", m_CharacterSetSelectionMode, m_FontCharacterSets); + if (EditorGUI.EndChangeCheck()) + { + m_CharacterSequence = ""; + hasSelectionChanged = true; + m_IsFontAtlasInvalid = true; + } + + switch (m_CharacterSetSelectionMode) + { + case 0: // ASCII + //characterSequence = "32 - 126, 130, 132 - 135, 139, 145 - 151, 153, 155, 161, 166 - 167, 169 - 174, 176, 181 - 183, 186 - 187, 191, 8210 - 8226, 8230, 8240, 8242 - 8244, 8249 - 8250, 8252 - 8254, 8260, 8286"; + m_CharacterSequence = "32 - 126, 160, 8203, 8230, 9633"; + break; + + case 1: // EXTENDED ASCII + m_CharacterSequence = "32 - 126, 160 - 255, 8192 - 8303, 8364, 8482, 9633"; + // Could add 9632 for missing glyph + break; + + case 2: // Lowercase + m_CharacterSequence = "32 - 64, 91 - 126, 160"; + break; + + case 3: // Uppercase + m_CharacterSequence = "32 - 96, 123 - 126, 160"; + break; + + case 4: // Numbers & Symbols + m_CharacterSequence = "32 - 64, 91 - 96, 123 - 126, 160"; + break; + + case 5: // Custom Range + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label("Enter a sequence of decimal values to define the characters to be included in the font asset or retrieve one from another font asset.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + + EditorGUI.BeginChangeCheck(); + m_ReferencedFontAsset = EditorGUILayout.ObjectField("Select Font Asset", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset; + if (EditorGUI.EndChangeCheck() || hasSelectionChanged) + { + if (m_ReferencedFontAsset != null) + m_CharacterSequence = TMP_EditorUtility.GetDecimalCharacterSequence(TMP_FontAsset.GetCharactersArray(m_ReferencedFontAsset)); + + m_IsFontAtlasInvalid = true; + } + + // Filter out unwanted characters. + char chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < ',' || chr > '-')) + { + Event.current.character = '\0'; + } + GUILayout.Label("Character Sequence (Decimal)", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + EditorGUILayout.EndVertical(); + break; + + case 6: // Unicode HEX Range + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label("Enter a sequence of Unicode (hex) values to define the characters to be included in the font asset or retrieve one from another font asset.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + + EditorGUI.BeginChangeCheck(); + m_ReferencedFontAsset = EditorGUILayout.ObjectField("Select Font Asset", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset; + if (EditorGUI.EndChangeCheck() || hasSelectionChanged) + { + if (m_ReferencedFontAsset != null) + m_CharacterSequence = TMP_EditorUtility.GetUnicodeCharacterSequence(TMP_FontAsset.GetCharactersArray(m_ReferencedFontAsset)); + + m_IsFontAtlasInvalid = true; + } + + // Filter out unwanted characters. + chr = Event.current.character; + if ((chr < '0' || chr > '9') && (chr < 'a' || chr > 'f') && (chr < 'A' || chr > 'F') && (chr < ',' || chr > '-')) + { + Event.current.character = '\0'; + } + GUILayout.Label("Character Sequence (Hex)", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + EditorGUILayout.EndVertical(); + break; + + case 7: // Characters from Font Asset + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + GUILayout.Label("Type the characters to be included in the font asset or retrieve them from another font asset.", TMP_UIStyleManager.label); + GUILayout.Space(10f); + + EditorGUI.BeginChangeCheck(); + m_ReferencedFontAsset = EditorGUILayout.ObjectField("Select Font Asset", m_ReferencedFontAsset, typeof(TMP_FontAsset), false) as TMP_FontAsset; + if (EditorGUI.EndChangeCheck() || hasSelectionChanged) + { + if (m_ReferencedFontAsset != null) + m_CharacterSequence = TMP_FontAsset.GetCharacters(m_ReferencedFontAsset); + + m_IsFontAtlasInvalid = true; + } + + EditorGUI.indentLevel = 0; + + GUILayout.Label("Custom Character List", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + m_CharacterSequence = EditorGUILayout.TextArea(m_CharacterSequence, TMP_UIStyleManager.textAreaBoxWindow, GUILayout.Height(120), GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + EditorGUILayout.EndVertical(); + break; + + case 8: // Character List from File + EditorGUI.BeginChangeCheck(); + m_CharactersFromFile = EditorGUILayout.ObjectField("Character File", m_CharactersFromFile, typeof(TextAsset), false) as TextAsset; + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + if (m_CharactersFromFile != null) + { + Regex rx = new Regex(@"(? + { + if (match.Value.StartsWith("\\U")) + return char.ConvertFromUtf32(int.Parse(match.Value.Replace("\\U", ""), NumberStyles.HexNumber)); + + return char.ConvertFromUtf32(int.Parse(match.Value.Replace("\\u", ""), NumberStyles.HexNumber)); + }); + } + break; + } + + // FONT STYLE SELECTION + //GUILayout.BeginHorizontal(); + //EditorGUI.BeginChangeCheck(); + ////m_FontStyle = (FaceStyles)EditorGUILayout.EnumPopup("Font Style", m_FontStyle, GUILayout.Width(225)); + ////m_FontStyleValue = EditorGUILayout.IntField((int)m_FontStyleValue); + //if (EditorGUI.EndChangeCheck()) + //{ + // m_IsFontAtlasInvalid = true; + //} + //GUILayout.EndHorizontal(); + + // Render Mode Selection + CheckForLegacyGlyphRenderMode(); + + EditorGUI.BeginChangeCheck(); + m_GlyphRenderMode = (GlyphRenderMode)EditorGUILayout.EnumPopup("Render Mode", m_GlyphRenderMode); + if (EditorGUI.EndChangeCheck()) + { + m_IsFontAtlasInvalid = true; + } + + m_IncludeFontFeatures = EditorGUILayout.Toggle("Get Kerning Pairs", m_IncludeFontFeatures); + + EditorGUILayout.Space(); + } + + EditorGUI.EndDisabledGroup(); + + if (!string.IsNullOrEmpty(m_WarningMessage)) + { + EditorGUILayout.HelpBox(m_WarningMessage, MessageType.Warning); + } + + GUI.enabled = m_SourceFontFile != null && !m_IsProcessing && !m_IsGenerationDisabled; // Enable Preview if we are not already rendering a font. + if (GUILayout.Button("Generate Font Atlas") && GUI.enabled) + { + if (!m_IsProcessing && m_SourceFontFile != null) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + m_SavedFontAtlas = null; + + // Initialize font engine + FontEngineError errorCode = FontEngine.InitializeFontEngine(); + if (errorCode != FontEngineError.Success) + { + Debug.Log("Font Asset Creator - Error [" + errorCode + "] has occurred while Initializing the FreeType Library."); + } + + // Get file path of the source font file. + string fontPath = AssetDatabase.GetAssetPath(m_SourceFontFile); + + if (errorCode == FontEngineError.Success) + { + errorCode = FontEngine.LoadFontFace(fontPath); + + if (errorCode != FontEngineError.Success) + { + Debug.Log("Font Asset Creator - Error Code [" + errorCode + "] has occurred trying to load the [" + m_SourceFontFile.name + "] font file. This typically results from the use of an incompatible or corrupted font file.", m_SourceFontFile); + } + } + + + // Define an array containing the characters we will render. + if (errorCode == FontEngineError.Success) + { + uint[] characterSet = null; + + // Get list of characters that need to be packed and rendered to the atlas texture. + if (m_CharacterSetSelectionMode == 7 || m_CharacterSetSelectionMode == 8) + { + List char_List = new List(); + + for (int i = 0; i < m_CharacterSequence.Length; i++) + { + uint unicode = m_CharacterSequence[i]; + + // Handle surrogate pairs + if (i < m_CharacterSequence.Length - 1 && char.IsHighSurrogate((char)unicode) && char.IsLowSurrogate(m_CharacterSequence[i + 1])) + { + unicode = (uint)char.ConvertToUtf32(m_CharacterSequence[i], m_CharacterSequence[i + 1]); + i += 1; + } + + // Check to make sure we don't include duplicates + if (char_List.FindIndex(item => item == unicode) == -1) + char_List.Add(unicode); + } + + characterSet = char_List.ToArray(); + } + else if (m_CharacterSetSelectionMode == 6) + { + characterSet = ParseHexNumberSequence(m_CharacterSequence); + } + else + { + characterSet = ParseNumberSequence(m_CharacterSequence); + } + + m_CharacterCount = characterSet.Length; + + m_AtlasGenerationProgress = 0; + m_IsProcessing = true; + m_IsGenerationCancelled = false; + + GlyphLoadFlags glyphLoadFlags = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_HINTED) == GlyphRasterModes.RASTER_MODE_HINTED + ? GlyphLoadFlags.LOAD_RENDER + : GlyphLoadFlags.LOAD_RENDER | GlyphLoadFlags.LOAD_NO_HINTING; + + glyphLoadFlags = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_MONO) == GlyphRasterModes.RASTER_MODE_MONO + ? glyphLoadFlags | GlyphLoadFlags.LOAD_MONOCHROME + : glyphLoadFlags; + + // + AutoResetEvent autoEvent = new AutoResetEvent(false); + + // Worker thread to pack glyphs in the given texture space. + ThreadPool.QueueUserWorkItem(PackGlyphs => + { + // Start Stop Watch + m_StopWatch = System.Diagnostics.Stopwatch.StartNew(); + + // Clear the various lists used in the generation process. + m_AvailableGlyphsToAdd.Clear(); + m_MissingCharacters.Clear(); + m_ExcludedCharacters.Clear(); + m_CharacterLookupMap.Clear(); + m_GlyphLookupMap.Clear(); + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + // Check if requested characters are available in the source font file. + for (int i = 0; i < characterSet.Length; i++) + { + uint unicode = characterSet[i]; + uint glyphIndex; + + if (FontEngine.TryGetGlyphIndex(unicode, out glyphIndex)) + { + // Skip over potential duplicate characters. + if (m_CharacterLookupMap.ContainsKey(unicode)) + continue; + + // Add character to character lookup map. + m_CharacterLookupMap.Add(unicode, glyphIndex); + + // Skip over potential duplicate glyph references. + if (m_GlyphLookupMap.ContainsKey(glyphIndex)) + { + // Add additional glyph reference for this character. + m_GlyphLookupMap[glyphIndex].Add(unicode); + continue; + } + + // Add glyph reference to glyph lookup map. + m_GlyphLookupMap.Add(glyphIndex, new List() { unicode }); + + // Add glyph index to list of glyphs to add to texture. + m_AvailableGlyphsToAdd.Add(glyphIndex); + } + else + { + // Add Unicode to list of missing characters. + m_MissingCharacters.Add(unicode); + } + } + + // Pack available glyphs in the provided texture space. + if (m_AvailableGlyphsToAdd.Count > 0) + { + int packingModifier = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + + if (m_PointSizeSamplingMode == 0) // Auto-Sizing Point Size Mode + { + // Estimate min / max range for auto sizing of point size. + int minPointSize = 0; + int maxPointSize = (int)Mathf.Sqrt((m_AtlasWidth * m_AtlasHeight) / m_AvailableGlyphsToAdd.Count) * 3; + + m_PointSize = (maxPointSize + minPointSize) / 2; + + bool optimumPointSizeFound = false; + for (int iteration = 0; iteration < 15 && optimumPointSizeFound == false; iteration++) + { + m_AtlasGenerationProgressLabel = "Packing glyphs - Pass (" + iteration + ")"; + + FontEngine.SetFaceSize(m_PointSize); + + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + m_FreeGlyphRects.Clear(); + m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier)); + m_UsedGlyphRects.Clear(); + + for (int i = 0; i < m_AvailableGlyphsToAdd.Count; i++) + { + uint glyphIndex = m_AvailableGlyphsToAdd[i]; + Glyph glyph; + + if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out glyph)) + { + if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0) + { + m_GlyphsToPack.Add(glyph); + } + else + { + m_GlyphsPacked.Add(glyph); + } + } + } + + FontEngine.TryPackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_Padding, (GlyphPackingMode)m_PackingMode, m_GlyphRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects); + + if (m_IsGenerationCancelled) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + return; + } + + //Debug.Log("Glyphs remaining to add [" + m_GlyphsToAdd.Count + "]. Glyphs added [" + m_GlyphsAdded.Count + "]."); + + if (m_GlyphsToPack.Count > 0) + { + if (m_PointSize > minPointSize) + { + maxPointSize = m_PointSize; + m_PointSize = (m_PointSize + minPointSize) / 2; + + //Debug.Log("Decreasing point size from [" + maxPointSize + "] to [" + m_PointSize + "]."); + } + } + else + { + if (maxPointSize - minPointSize > 1 && m_PointSize < maxPointSize) + { + minPointSize = m_PointSize; + m_PointSize = (m_PointSize + maxPointSize) / 2; + + //Debug.Log("Increasing point size from [" + minPointSize + "] to [" + m_PointSize + "]."); + } + else + { + //Debug.Log("[" + iteration + "] iterations to find the optimum point size of : [" + m_PointSize + "]."); + optimumPointSizeFound = true; + } + } + } + } + else // Custom Point Size Mode + { + m_AtlasGenerationProgressLabel = "Packing glyphs..."; + + // Set point size + FontEngine.SetFaceSize(m_PointSize); + + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + m_FreeGlyphRects.Clear(); + m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier)); + m_UsedGlyphRects.Clear(); + + for (int i = 0; i < m_AvailableGlyphsToAdd.Count; i++) + { + uint glyphIndex = m_AvailableGlyphsToAdd[i]; + Glyph glyph; + + if (FontEngine.TryGetGlyphWithIndexValue(glyphIndex, glyphLoadFlags, out glyph)) + { + if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0) + { + m_GlyphsToPack.Add(glyph); + } + else + { + m_GlyphsPacked.Add(glyph); + } + } + } + + FontEngine.TryPackGlyphsInAtlas(m_GlyphsToPack, m_GlyphsPacked, m_Padding, (GlyphPackingMode)m_PackingMode, m_GlyphRenderMode, m_AtlasWidth, m_AtlasHeight, m_FreeGlyphRects, m_UsedGlyphRects); + + if (m_IsGenerationCancelled) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + return; + } + //Debug.Log("Glyphs remaining to add [" + m_GlyphsToAdd.Count + "]. Glyphs added [" + m_GlyphsAdded.Count + "]."); + } + + } + else + { + int packingModifier = ((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP ? 0 : 1; + + FontEngine.SetFaceSize(m_PointSize); + + m_GlyphsToPack.Clear(); + m_GlyphsPacked.Clear(); + + m_FreeGlyphRects.Clear(); + m_FreeGlyphRects.Add(new GlyphRect(0, 0, m_AtlasWidth - packingModifier, m_AtlasHeight - packingModifier)); + m_UsedGlyphRects.Clear(); + } + + //Stop StopWatch + m_StopWatch.Stop(); + m_GlyphPackingGenerationTime = m_StopWatch.Elapsed.TotalMilliseconds; + m_IsGlyphPackingDone = true; + m_StopWatch.Reset(); + + m_FontCharacterTable.Clear(); + m_FontGlyphTable.Clear(); + m_GlyphsToRender.Clear(); + + // Add glyphs and characters successfully added to texture to their respective font tables. + foreach (Glyph glyph in m_GlyphsPacked) + { + uint glyphIndex = glyph.index; + + m_FontGlyphTable.Add(glyph); + + // Add glyphs to list of glyphs that need to be rendered. + if (glyph.glyphRect.width > 0 && glyph.glyphRect.height > 0) + m_GlyphsToRender.Add(glyph); + + foreach (uint unicode in m_GlyphLookupMap[glyphIndex]) + { + // Create new Character + m_FontCharacterTable.Add(new TMP_Character(unicode, glyph)); + } + } + + // + foreach (Glyph glyph in m_GlyphsToPack) + { + foreach (uint unicode in m_GlyphLookupMap[glyph.index]) + { + m_ExcludedCharacters.Add(unicode); + } + } + + // Get the face info for the current sampling point size. + m_FaceInfo = FontEngine.GetFaceInfo(); + + autoEvent.Set(); + }); + + // Worker thread to render glyphs in texture buffer. + ThreadPool.QueueUserWorkItem(RenderGlyphs => + { + autoEvent.WaitOne(); + + // Start Stop Watch + m_StopWatch = System.Diagnostics.Stopwatch.StartNew(); + + m_IsRenderingDone = false; + + // Allocate texture data + m_AtlasTextureBuffer = new byte[m_AtlasWidth * m_AtlasHeight]; + + m_AtlasGenerationProgressLabel = "Rendering glyphs..."; + + // Render and add glyphs to the given atlas texture. + if (m_GlyphsToRender.Count > 0) + { + FontEngine.RenderGlyphsToTexture(m_GlyphsToRender, m_Padding, m_GlyphRenderMode, m_AtlasTextureBuffer, m_AtlasWidth, m_AtlasHeight); + } + + m_IsRenderingDone = true; + + // Stop StopWatch + m_StopWatch.Stop(); + m_GlyphRenderingGenerationTime = m_StopWatch.Elapsed.TotalMilliseconds; + m_IsGlyphRenderingDone = true; + m_StopWatch.Reset(); + }); + } + + SaveCreationSettingsToEditorPrefs(SaveFontCreationSettings()); + } + } + + // FONT RENDERING PROGRESS BAR + GUILayout.Space(1); + Rect progressRect = EditorGUILayout.GetControlRect(false, 20); + + GUI.enabled = true; + progressRect.width -= 22; + EditorGUI.ProgressBar(progressRect, Mathf.Max(0.01f, m_AtlasGenerationProgress), m_AtlasGenerationProgressLabel); + progressRect.x = progressRect.x + progressRect.width + 2; + progressRect.y -= 1; + progressRect.width = 20; + progressRect.height = 20; + + GUI.enabled = m_IsProcessing; + if (GUI.Button(progressRect, "X")) + { + FontEngine.SendCancellationRequest(); + m_AtlasGenerationProgress = 0; + m_IsProcessing = false; + m_IsGenerationCancelled = true; + } + GUILayout.Space(5); + + // FONT STATUS & INFORMATION + GUI.enabled = true; + + GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(200)); + m_OutputScrollPosition = EditorGUILayout.BeginScrollView(m_OutputScrollPosition); + EditorGUILayout.LabelField(m_OutputFeedback, TMP_UIStyleManager.label); + EditorGUILayout.EndScrollView(); + GUILayout.EndVertical(); + + // SAVE TEXTURE & CREATE and SAVE FONT XML FILE + GUI.enabled = m_FontAtlasTexture != null && !m_IsProcessing; // Enable Save Button if font_Atlas is not Null. + + EditorGUILayout.BeginHorizontal(); + + if (GUILayout.Button("Save") && GUI.enabled) + { + if (m_SelectedFontAsset == null) + { + if (m_LegacyFontAsset != null) + SaveNewFontAssetWithSameName(m_LegacyFontAsset); + else + SaveNewFontAsset(m_SourceFontFile); + } + else + { + // Save over exiting Font Asset + string filePath = Path.GetFullPath(AssetDatabase.GetAssetPath(m_SelectedFontAsset)).Replace('\\', '/'); + + if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + Save_Bitmap_FontAsset(filePath); + else + Save_SDF_FontAsset(filePath); + } + } + if (GUILayout.Button("Save as...") && GUI.enabled) + { + if (m_SelectedFontAsset == null) + { + SaveNewFontAsset(m_SourceFontFile); + } + else + { + SaveNewFontAssetWithSameName(m_SelectedFontAsset); + } + } + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + + EditorGUILayout.EndVertical(); + + GUI.enabled = true; // Re-enable GUI + + if (position.height > position.width || position.width < k_TwoColumnControlsWidth) + { + DrawPreview(); + GUILayout.Space(5); + } + + EditorGUILayout.EndScrollView(); + + if (m_IsFontAtlasInvalid) + ClearGeneratedData(); + } + + + /// + /// Clear the previously generated data. + /// + void ClearGeneratedData() + { + m_IsFontAtlasInvalid = false; + + if (m_FontAtlasTexture != null && !EditorUtility.IsPersistent(m_FontAtlasTexture)) + { + DestroyImmediate(m_FontAtlasTexture); + m_FontAtlasTexture = null; + } + + m_AtlasGenerationProgressLabel = string.Empty; + m_AtlasGenerationProgress = 0; + m_SavedFontAtlas = null; + + m_OutputFeedback = string.Empty; + m_WarningMessage = string.Empty; + } + + + /// + /// Function to update the feedback window showing the results of the latest generation. + /// + void UpdateRenderFeedbackWindow() + { + m_PointSize = m_FaceInfo.pointSize; + + string missingGlyphReport = string.Empty; + + //string colorTag = m_FontCharacterTable.Count == m_CharacterCount ? "" : ""; + string colorTag2 = ""; + + missingGlyphReport = "Font: " + colorTag2 + m_FaceInfo.familyName + " Style: " + colorTag2 + m_FaceInfo.styleName + ""; + + missingGlyphReport += "\nPoint Size: " + colorTag2 + m_FaceInfo.pointSize + " SP/PD Ratio: " + colorTag2 + ((float)m_Padding / m_FaceInfo.pointSize).ToString("0.0%" + ""); + + missingGlyphReport += "\n\nCharacters included: " + m_FontCharacterTable.Count + "/" + m_CharacterCount + ""; + missingGlyphReport += "\nMissing characters: " + m_MissingCharacters.Count + ""; + missingGlyphReport += "\nExcluded characters: " + m_ExcludedCharacters.Count + ""; + + // Report characters missing from font file + missingGlyphReport += "\n\nCharacters missing from font file:"; + missingGlyphReport += "\n----------------------------------------"; + + m_OutputFeedback = missingGlyphReport; + + for (int i = 0; i < m_MissingCharacters.Count; i++) + { + missingGlyphReport += "\nID: " + m_MissingCharacters[i] + "\tHex: " + m_MissingCharacters[i].ToString("X") + "\tChar [" + (char)m_MissingCharacters[i] + "]"; + + if (missingGlyphReport.Length < 16300) + m_OutputFeedback = missingGlyphReport; + } + + // Report characters that did not fit in the atlas texture + missingGlyphReport += "\n\nCharacters excluded from packing:"; + missingGlyphReport += "\n----------------------------------------"; + + for (int i = 0; i < m_ExcludedCharacters.Count; i++) + { + missingGlyphReport += "\nID: " + m_ExcludedCharacters[i] + "\tHex: " + m_ExcludedCharacters[i].ToString("X") + "\tChar [" + (char)m_ExcludedCharacters[i] + "]"; + + if (missingGlyphReport.Length < 16300) + m_OutputFeedback = missingGlyphReport; + } + + if (missingGlyphReport.Length > 16300) + m_OutputFeedback += "\n\nReport truncated.\nSee \"TextMesh Pro\\Glyph Report.txt\""; + + // Save Missing Glyph Report file + if (Directory.Exists("Assets/TextMesh Pro")) + { + missingGlyphReport = System.Text.RegularExpressions.Regex.Replace(missingGlyphReport, @"<[^>]*>", string.Empty); + File.WriteAllText("Assets/TextMesh Pro/Glyph Report.txt", missingGlyphReport); + AssetDatabase.Refresh(); + } + } + + + void CreateFontAtlasTexture() + { + if (m_FontAtlasTexture != null) + DestroyImmediate(m_FontAtlasTexture); + + m_FontAtlasTexture = new Texture2D(m_AtlasWidth, m_AtlasHeight, TextureFormat.Alpha8, false, true); + + Color32[] colors = new Color32[m_AtlasWidth * m_AtlasHeight]; + + for (int i = 0; i < colors.Length; i++) + { + byte c = m_AtlasTextureBuffer[i]; + colors[i] = new Color32(c, c, c, c); + } + + // Clear allocation of + m_AtlasTextureBuffer = null; + + if ((m_GlyphRenderMode & GlyphRenderMode.RASTER) == GlyphRenderMode.RASTER || (m_GlyphRenderMode & GlyphRenderMode.RASTER_HINTED) == GlyphRenderMode.RASTER_HINTED) + m_FontAtlasTexture.filterMode = FilterMode.Point; + + m_FontAtlasTexture.SetPixels32(colors, 0); + m_FontAtlasTexture.Apply(false, false); + + // Saving File for Debug + //var pngData = m_FontAtlasTexture.EncodeToPNG(); + //File.WriteAllBytes("Assets/Textures/Debug Font Texture.png", pngData); + } + + + /// + /// Open Save Dialog to provide the option save the font asset using the name of the source font file. This also appends SDF to the name if using any of the SDF Font Asset creation modes. + /// + /// + void SaveNewFontAsset(Object sourceObject) + { + string filePath; + + // Save new Font Asset and open save file requester at Source Font File location. + string saveDirectory = new FileInfo(AssetDatabase.GetAssetPath(sourceObject)).DirectoryName; + + if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + filePath = EditorUtility.SaveFilePanel("Save TextMesh Pro! Font Asset File", saveDirectory, sourceObject.name, "asset"); + + if (filePath.Length == 0) + return; + + Save_Bitmap_FontAsset(filePath); + } + else + { + filePath = EditorUtility.SaveFilePanel("Save TextMesh Pro! Font Asset File", saveDirectory, sourceObject.name + " SDF", "asset"); + + if (filePath.Length == 0) + return; + + Save_SDF_FontAsset(filePath); + } + } + + + /// + /// Open Save Dialog to provide the option to save the font asset under the same name. + /// + /// + void SaveNewFontAssetWithSameName(Object sourceObject) + { + string filePath; + + // Save new Font Asset and open save file requester at Source Font File location. + string saveDirectory = new FileInfo(AssetDatabase.GetAssetPath(sourceObject)).DirectoryName; + + filePath = EditorUtility.SaveFilePanel("Save TextMesh Pro! Font Asset File", saveDirectory, sourceObject.name, "asset"); + + if (filePath.Length == 0) + return; + + if (((GlyphRasterModes)m_GlyphRenderMode & GlyphRasterModes.RASTER_MODE_BITMAP) == GlyphRasterModes.RASTER_MODE_BITMAP) + { + Save_Bitmap_FontAsset(filePath); + } + else + { + Save_SDF_FontAsset(filePath); + } + } + + + void Save_Bitmap_FontAsset(string filePath) + { + filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath. + + string dataPath = Application.dataPath; + + if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\""); + return; + } + + string relativeAssetPath = filePath.Substring(dataPath.Length - 6); + string tex_DirName = Path.GetDirectoryName(relativeAssetPath); + string tex_FileName = Path.GetFileNameWithoutExtension(relativeAssetPath); + string tex_Path_NoExt = tex_DirName + "/" + tex_FileName; + + // Check if TextMeshPro font asset already exists. If not, create a new one. Otherwise update the existing one. + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(tex_Path_NoExt + ".asset", typeof(TMP_FontAsset)) as TMP_FontAsset; + if (fontAsset == null) + { + //Debug.Log("Creating TextMeshPro font asset!"); + fontAsset = ScriptableObject.CreateInstance(); // Create new TextMeshPro Font Asset. + AssetDatabase.CreateAsset(fontAsset, tex_Path_NoExt + ".asset"); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Reference to the source font file GUID. + fontAsset.m_SourceFontFile_EditorRef = (Font)m_SourceFontFile; + fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile)); + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortAllTables(); + + // Get and Add Kerning Pairs to Font Asset + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + + // Add Font Atlas as Sub-Asset + fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture }; + m_FontAtlasTexture.name = tex_FileName + " Atlas"; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset); + + // Create new Material and Add it as Sub-Asset + Shader default_Shader = Shader.Find("TextMeshPro/Bitmap"); // m_shaderSelection; + Material tmp_material = new Material(default_Shader); + tmp_material.name = tex_FileName + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture); + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + } + else + { + // Find all Materials referencing this font atlas. + Material[] material_references = TMP_EditorUtility.FindMaterialReferences(fontAsset); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + // Special handling to remove legacy font asset data + if (fontAsset.m_glyphInfoList != null && fontAsset.m_glyphInfoList.Count > 0) + fontAsset.m_glyphInfoList = null; + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortAllTables(); + + // Get and Add Kerning Pairs to Font Asset + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + // Destroy Assets that will be replaced. + if (fontAsset.atlasTextures != null && fontAsset.atlasTextures.Length > 0) + { + for (int i = 1; i < fontAsset.atlasTextures.Length; i++) + DestroyImmediate(fontAsset.atlasTextures[i], true); + } + + fontAsset.m_AtlasTextureIndex = 0; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + // Make sure remaining atlas texture is of the correct size + Texture2D tex = fontAsset.atlasTextures[0]; + tex.name = tex_FileName + " Atlas"; + + // Make texture readable to allow resizing + bool isReadableState = tex.isReadable; + if (isReadableState == false) + FontEngineEditorUtilities.SetAtlasTextureIsReadable(tex, true); + + if (tex.width != m_AtlasWidth || tex.height != m_AtlasHeight) + { + tex.Resize(m_AtlasWidth, m_AtlasHeight); + tex.Apply(); + } + + // Copy new texture data to existing texture + Graphics.CopyTexture(m_FontAtlasTexture, tex); + + // Apply changes to the texture. + tex.Apply(false, !isReadableState); + + // Special handling due to a bug in earlier versions of Unity. + m_FontAtlasTexture.hideFlags = HideFlags.None; + fontAsset.material.hideFlags = HideFlags.None; + + // Update the Texture reference on the Material + //for (int i = 0; i < material_references.Length; i++) + //{ + // material_references[i].SetFloat(ShaderUtilities.ID_TextureWidth, tex.width); + // material_references[i].SetFloat(ShaderUtilities.ID_TextureHeight, tex.height); + + // int spread = m_Padding; + // material_references[i].SetFloat(ShaderUtilities.ID_GradientScale, spread); + + // material_references[i].SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + // material_references[i].SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + //} + } + + // Add list of GlyphRects to font asset. + fontAsset.freeGlyphRects = m_FreeGlyphRects; + fontAsset.usedGlyphRects = m_UsedGlyphRects; + + // Save Font Asset creation settings + m_SelectedFontAsset = fontAsset; + m_LegacyFontAsset = null; + fontAsset.creationSettings = SaveFontCreationSettings(); + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(fontAsset)); // Re-import font asset to get the new updated version. + + //EditorUtility.SetDirty(font_asset); + fontAsset.ReadFontAssetDefinition(); + + AssetDatabase.Refresh(); + + m_FontAtlasTexture = null; + + // NEED TO GENERATE AN EVENT TO FORCE A REDRAW OF ANY TEXTMESHPRO INSTANCES THAT MIGHT BE USING THIS FONT ASSET + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + + + void Save_SDF_FontAsset(string filePath) + { + filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath. + + string dataPath = Application.dataPath; + + if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1) + { + Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\""); + return; + } + + string relativeAssetPath = filePath.Substring(dataPath.Length - 6); + string tex_DirName = Path.GetDirectoryName(relativeAssetPath); + string tex_FileName = Path.GetFileNameWithoutExtension(relativeAssetPath); + string tex_Path_NoExt = tex_DirName + "/" + tex_FileName; + + + // Check if TextMeshPro font asset already exists. If not, create a new one. Otherwise update the existing one. + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(tex_Path_NoExt + ".asset"); + if (fontAsset == null) + { + //Debug.Log("Creating TextMeshPro font asset!"); + fontAsset = ScriptableObject.CreateInstance(); // Create new TextMeshPro Font Asset. + AssetDatabase.CreateAsset(fontAsset, tex_Path_NoExt + ".asset"); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + // Reference to source font file GUID. + fontAsset.m_SourceFontFile_EditorRef = (Font)m_SourceFontFile; + fontAsset.m_SourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile)); + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortAllTables(); + + // Get and Add Kerning Pairs to Font Asset + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + // Add Font Atlas as Sub-Asset + fontAsset.atlasTextures = new Texture2D[] { m_FontAtlasTexture }; + m_FontAtlasTexture.name = tex_FileName + " Atlas"; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + AssetDatabase.AddObjectToAsset(m_FontAtlasTexture, fontAsset); + + // Create new Material and Add it as Sub-Asset + Shader default_Shader = Shader.Find("TextMeshPro/Distance Field"); + Material tmp_material = new Material(default_Shader); + + tmp_material.name = tex_FileName + " Material"; + tmp_material.SetTexture(ShaderUtilities.ID_MainTex, m_FontAtlasTexture); + tmp_material.SetFloat(ShaderUtilities.ID_TextureWidth, m_FontAtlasTexture.width); + tmp_material.SetFloat(ShaderUtilities.ID_TextureHeight, m_FontAtlasTexture.height); + + int spread = m_Padding + 1; + tmp_material.SetFloat(ShaderUtilities.ID_GradientScale, spread); // Spread = Padding for Brute Force SDF. + + tmp_material.SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + tmp_material.SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + + fontAsset.material = tmp_material; + + AssetDatabase.AddObjectToAsset(tmp_material, fontAsset); + + } + else + { + // Find all Materials referencing this font atlas. + Material[] material_references = TMP_EditorUtility.FindMaterialReferences(fontAsset); + + // Set version number of font asset + fontAsset.version = "1.1.0"; + + // Special handling to remove legacy font asset data + if (fontAsset.m_glyphInfoList != null && fontAsset.m_glyphInfoList.Count > 0) + fontAsset.m_glyphInfoList = null; + + //Set Font Asset Type + fontAsset.atlasRenderMode = m_GlyphRenderMode; + + // Add FaceInfo to Font Asset + fontAsset.faceInfo = m_FaceInfo; + + // Add GlyphInfo[] to Font Asset + fontAsset.glyphTable = m_FontGlyphTable; + + // Add CharacterTable[] to font asset. + fontAsset.characterTable = m_FontCharacterTable; + + // Sort glyph and character tables. + fontAsset.SortAllTables(); + + // Get and Add Kerning Pairs to Font Asset + // TODO: Check and preserve existing adjustment pairs. + if (m_IncludeFontFeatures) + fontAsset.fontFeatureTable = GetKerningTable(); + + // Destroy Assets that will be replaced. + if (fontAsset.atlasTextures != null && fontAsset.atlasTextures.Length > 0) + { + for (int i = 1; i < fontAsset.atlasTextures.Length; i++) + DestroyImmediate(fontAsset.atlasTextures[i], true); + } + + fontAsset.m_AtlasTextureIndex = 0; + fontAsset.atlasWidth = m_AtlasWidth; + fontAsset.atlasHeight = m_AtlasHeight; + fontAsset.atlasPadding = m_Padding; + + // Make sure remaining atlas texture is of the correct size + Texture2D tex = fontAsset.atlasTextures[0]; + tex.name = tex_FileName + " Atlas"; + + // Make texture readable to allow resizing + bool isReadableState = tex.isReadable; + if (isReadableState == false) + FontEngineEditorUtilities.SetAtlasTextureIsReadable(tex, true); + + if (tex.width != m_AtlasWidth || tex.height != m_AtlasHeight) + { + tex.Resize(m_AtlasWidth, m_AtlasHeight); + tex.Apply(); + } + + // Copy new texture data to existing texture + Graphics.CopyTexture(m_FontAtlasTexture, tex); + + // Apply changes to the texture. + tex.Apply(false, !isReadableState); + + // Special handling due to a bug in earlier versions of Unity. + m_FontAtlasTexture.hideFlags = HideFlags.None; + fontAsset.material.hideFlags = HideFlags.None; + + // Update the Texture reference on the Material + for (int i = 0; i < material_references.Length; i++) + { + material_references[i].SetFloat(ShaderUtilities.ID_TextureWidth, tex.width); + material_references[i].SetFloat(ShaderUtilities.ID_TextureHeight, tex.height); + + int spread = m_Padding + 1; + material_references[i].SetFloat(ShaderUtilities.ID_GradientScale, spread); + + material_references[i].SetFloat(ShaderUtilities.ID_WeightNormal, fontAsset.normalStyle); + material_references[i].SetFloat(ShaderUtilities.ID_WeightBold, fontAsset.boldStyle); + } + } + + // Saving File for Debug + //var pngData = destination_Atlas.EncodeToPNG(); + //File.WriteAllBytes("Assets/Textures/Debug Distance Field.png", pngData); + + // Add list of GlyphRects to font asset. + fontAsset.freeGlyphRects = m_FreeGlyphRects; + fontAsset.usedGlyphRects = m_UsedGlyphRects; + + // Save Font Asset creation settings + m_SelectedFontAsset = fontAsset; + m_LegacyFontAsset = null; + fontAsset.creationSettings = SaveFontCreationSettings(); + + AssetDatabase.SaveAssets(); + + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(fontAsset)); // Re-import font asset to get the new updated version. + + fontAsset.ReadFontAssetDefinition(); + + AssetDatabase.Refresh(); + + m_FontAtlasTexture = null; + + // NEED TO GENERATE AN EVENT TO FORCE A REDRAW OF ANY TEXTMESHPRO INSTANCES THAT MIGHT BE USING THIS FONT ASSET + TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); + } + + + /// + /// Internal method to save the Font Asset Creation Settings + /// + /// + FontAssetCreationSettings SaveFontCreationSettings() + { + FontAssetCreationSettings settings = new FontAssetCreationSettings(); + + //settings.sourceFontFileName = m_SourceFontFile.name; + settings.sourceFontFileGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_SourceFontFile)); + settings.pointSizeSamplingMode = m_PointSizeSamplingMode; + settings.pointSize = m_PointSize; + settings.padding = m_Padding; + settings.packingMode = (int)m_PackingMode; + settings.atlasWidth = m_AtlasWidth; + settings.atlasHeight = m_AtlasHeight; + settings.characterSetSelectionMode = m_CharacterSetSelectionMode; + settings.characterSequence = m_CharacterSequence; + settings.referencedFontAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_ReferencedFontAsset)); + settings.referencedTextAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_CharactersFromFile)); + //settings.fontStyle = (int)m_FontStyle; + //settings.fontStyleModifier = m_FontStyleValue; + settings.renderMode = (int)m_GlyphRenderMode; + settings.includeFontFeatures = m_IncludeFontFeatures; + + return settings; + } + + + /// + /// Internal method to load the Font Asset Creation Settings + /// + /// + void LoadFontCreationSettings(FontAssetCreationSettings settings) + { + m_SourceFontFile = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(settings.sourceFontFileGUID)); + m_PointSizeSamplingMode = settings.pointSizeSamplingMode; + m_PointSize = settings.pointSize; + m_Padding = settings.padding; + m_PackingMode = (FontPackingModes)settings.packingMode; + m_AtlasWidth = settings.atlasWidth; + m_AtlasHeight = settings.atlasHeight; + m_CharacterSetSelectionMode = settings.characterSetSelectionMode; + m_CharacterSequence = settings.characterSequence; + m_ReferencedFontAsset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(settings.referencedFontAssetGUID)); + m_CharactersFromFile = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(settings.referencedTextAssetGUID)); + //m_FontStyle = (FaceStyles)settings.fontStyle; + //m_FontStyleValue = settings.fontStyleModifier; + m_GlyphRenderMode = (GlyphRenderMode)settings.renderMode; + m_IncludeFontFeatures = settings.includeFontFeatures; + } + + + /// + /// Save the latest font asset creation settings to EditorPrefs. + /// + /// + void SaveCreationSettingsToEditorPrefs(FontAssetCreationSettings settings) + { + // Create new list if one does not already exist + if (m_FontAssetCreationSettingsContainer == null) + { + m_FontAssetCreationSettingsContainer = new FontAssetCreationSettingsContainer(); + m_FontAssetCreationSettingsContainer.fontAssetCreationSettings = new List(); + } + + // Add new creation settings to the list + m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Add(settings); + + // Since list should only contain the most 4 recent settings, we remove the first element if list exceeds 4 elements. + if (m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count > 4) + m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.RemoveAt(0); + + m_FontAssetCreationSettingsCurrentIndex = m_FontAssetCreationSettingsContainer.fontAssetCreationSettings.Count - 1; + + // Serialize list to JSON + string serializedSettings = JsonUtility.ToJson(m_FontAssetCreationSettingsContainer, true); + + EditorPrefs.SetString(k_FontAssetCreationSettingsContainerKey, serializedSettings); + } + + void DrawPreview() + { + Rect pixelRect; + if (position.width > position.height && position.width > k_TwoColumnControlsWidth) + { + float minSide = Mathf.Min(position.height - 15f, position.width - k_TwoColumnControlsWidth); + + EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.MaxWidth(minSide)); + + pixelRect = GUILayoutUtility.GetRect(minSide, minSide, GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(false)); + } + else + { + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + pixelRect = GUILayoutUtility.GetAspectRect(1f); + } + + if (m_FontAtlasTexture != null) + { + EditorGUI.DrawTextureAlpha(pixelRect, m_FontAtlasTexture, ScaleMode.StretchToFill); + } + else if (m_SavedFontAtlas != null) + { + EditorGUI.DrawTextureAlpha(pixelRect, m_SavedFontAtlas, ScaleMode.StretchToFill); + } + + EditorGUILayout.EndVertical(); + } + + + void CheckForLegacyGlyphRenderMode() + { + // Special handling for legacy glyph render mode + if ((int)m_GlyphRenderMode < 0x100) + { + switch ((int)m_GlyphRenderMode) + { + case 0: + m_GlyphRenderMode = GlyphRenderMode.SMOOTH_HINTED; + break; + case 1: + m_GlyphRenderMode = GlyphRenderMode.SMOOTH; + break; + case 2: + m_GlyphRenderMode = GlyphRenderMode.RASTER_HINTED; + break; + case 3: + m_GlyphRenderMode = GlyphRenderMode.RASTER; + break; + case 6: + case 7: + m_GlyphRenderMode = GlyphRenderMode.SDFAA; + break; + } + } + } + + + // Get Kerning Pairs + public TMP_FontFeatureTable GetKerningTable() + { + GlyphPairAdjustmentRecord[] adjustmentRecords = FontEngine.GetGlyphPairAdjustmentTable(m_AvailableGlyphsToAdd.ToArray()); + + if (adjustmentRecords == null) + return null; + + TMP_FontFeatureTable fontFeatureTable = new TMP_FontFeatureTable(); + + for (int i = 0; i < adjustmentRecords.Length && adjustmentRecords[i].firstAdjustmentRecord.glyphIndex != 0; i++) + { + fontFeatureTable.glyphPairAdjustmentRecords.Add(new TMP_GlyphPairAdjustmentRecord(adjustmentRecords[i])); + } + + fontFeatureTable.SortGlyphPairAdjustmentRecords(); + + return fontFeatureTable; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta new file mode 100644 index 0000000..4648857 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 383966e89d344865a36addd5d378ffd3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs new file mode 100644 index 0000000..3b098ff --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs @@ -0,0 +1,115 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System; +using System.Runtime.InteropServices; + + +namespace TMPro.EditorUtilities +{ + /* + public class TMPro_FontPlugin + { + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void DebugLog(string log); + private static readonly DebugLog debugLog = DebugWrapper; + private static readonly IntPtr functionPointer = Marshal.GetFunctionPointerForDelegate(debugLog); + + private static void DebugWrapper(string log) + { + Debug.Log(log); + } + + public static void LinkDebugLog() + { + LinkDebug(functionPointer); + } + + [DllImport("TMPro_Plugin")] + private static extern void LinkDebug([MarshalAs(UnmanagedType.FunctionPtr)]IntPtr debugCall); + + [DllImport("TMPro_Plugin")] + public static extern + int Initialize_FontEngine(); + + [DllImport("TMPro_Plugin")] + public static extern + int Destroy_FontEngine(); + + [DllImport("TMPro_Plugin")] + public static extern + int Load_TrueType_Font(string fontPath); + + [DllImport("TMPro_Plugin")] + public static extern + int FT_Size_Font(int fontSize); + + [DllImport("TMPro_Plugin")] + public static extern + int Render_Character(byte[] buffer_fill, byte[] buffer_edge, int buffer_width, int buffer_height, int offset, int asc, FaceStyles style, float thickness, RenderModes rasterMode, ref FT_GlyphInfo glyphInfo); + + [DllImport("TMPro_Plugin")] + public static extern + int Render_Characters(byte[] buffer, int buffer_width, int buffer_height, int character_padding, int[] asc_set, int char_count, FaceStyles style, float style_mod, bool autoSize, RenderModes renderMode, int method, ref FT_FaceInfo fontData, FT_GlyphInfo[] Output); + + [DllImport("TMPro_Plugin")] + public static extern + int FT_GetKerningPairs(string fontPath, int[] characterSet, int setCount, FT_KerningPair[] kerningPairs); + + [DllImport("TMPro_Plugin")] + public static extern + float Check_RenderProgress(); + + [DllImport("TMPro_Plugin")] + internal static extern + void SendCancellationRequest(CancellationRequestType request); + } + + public enum FaceStyles { Normal, Bold, Italic, Bold_Italic, Outline, Bold_Sim }; + public enum RenderModes { HintedSmooth = 0, Smooth = 1, RasterHinted = 2, Raster = 3, DistanceField16 = 6, DistanceField32 = 7 }; // SignedDistanceField64 = 8 + + internal enum CancellationRequestType : byte { None = 0x0, CancelInProgess = 0x1, WindowClosed = 0x2 }; + + [StructLayout(LayoutKind.Sequential)] + public struct FT_KerningPair + { + public int ascII_Left; + public int ascII_Right; + public float xAdvanceOffset; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct FT_GlyphInfo + { + public int id; + public float x; + public float y; + public float width; + public float height; + public float xOffset; + public float yOffset; + public float xAdvance; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct FT_FaceInfo + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] + public string name; + public int pointSize; + public int padding; + public float lineHeight; + public float baseline; + public float ascender; + public float descender; + public float centerLine; + public float underline; + public float underlineThickness; + public int characterCount; + public int atlasWidth; + public int atlasHeight; + } + */ +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs.meta new file mode 100644 index 0000000..66f3a87 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9edc9283e7d6409fab242fe8fb6a822c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs new file mode 100644 index 0000000..c36f9f8 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs @@ -0,0 +1,32 @@ +using UnityEngine; + + +namespace TMPro +{ + // Helpers used by the different sorting layer classes. + public static class SortingLayerHelper + { + // Gets an array of sorting layer names. + public static string[] sortingLayerNames + { + get + { + return GetSortingLayerNames(); + } + } + + static string[] GetSortingLayerNames() + { + int layerCount = SortingLayer.layers.Length; + + string[] layerNames = new string[layerCount]; + + for (int i = 0; i < layerCount; i++) + { + layerNames[i] = SortingLayer.layers[i].name; + } + + return layerNames; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta new file mode 100644 index 0000000..9d902b9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 88ed537c17c34f339121fe9a7d6d7a0e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs new file mode 100644 index 0000000..09fc617 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs @@ -0,0 +1,235 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + [CustomEditor(typeof(TextContainer)), CanEditMultipleObjects] + public class TMPro_TextContainerEditor : Editor + { + + // Serialized Properties + private SerializedProperty anchorPosition_prop; + private SerializedProperty pivot_prop; + private SerializedProperty rectangle_prop; + private SerializedProperty margins_prop; + + + private TextContainer m_textContainer; + //private Transform m_transform; + //private Vector3[] m_Rect_handlePoints = new Vector3[4]; + //private Vector3[] m_Margin_handlePoints = new Vector3[4]; + + //private Vector2 m_anchorPosition; + + //private Vector3 m_mousePreviousPOS; + //private Vector2 m_previousStartPOS; + //private int m_mouseDragFlag = 0; + + //private static Transform m_visualHelper; + + + void OnEnable() + { + + // Serialized Properties + anchorPosition_prop = serializedObject.FindProperty("m_anchorPosition"); + pivot_prop = serializedObject.FindProperty("m_pivot"); + rectangle_prop = serializedObject.FindProperty("m_rect"); + margins_prop = serializedObject.FindProperty("m_margins"); + + m_textContainer = (TextContainer)target; + //m_transform = m_textContainer.transform; + + + /* + if (m_visualHelper == null) + { + m_visualHelper = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform; + m_visualHelper.localScale = new Vector3(0.25f, 0.25f, 0.25f); + } + */ + } + + void OnDisable() + { + /* + if (m_visualHelper != null) + DestroyImmediate (m_visualHelper.gameObject); + */ + } + + + + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(anchorPosition_prop); + if (anchorPosition_prop.enumValueIndex == 9) + { + EditorGUI.indentLevel += 1; + EditorGUILayout.PropertyField(pivot_prop, new GUIContent("Pivot Position")); + EditorGUI.indentLevel -= 1; + } + + + DrawDimensionProperty(rectangle_prop, "Dimensions"); + DrawMaginProperty(margins_prop, "Margins"); + if (EditorGUI.EndChangeCheck()) + { + // Re-compute pivot position when changes are made. + if (anchorPosition_prop.enumValueIndex != 9) + pivot_prop.vector2Value = GetAnchorPosition(anchorPosition_prop.enumValueIndex); + + m_textContainer.hasChanged = true; + } + + serializedObject.ApplyModifiedProperties(); + + EditorGUILayout.Space(); + } + + + private void DrawDimensionProperty(SerializedProperty property, string label) + { + float old_LabelWidth = EditorGUIUtility.labelWidth; + float old_FieldWidth = EditorGUIUtility.fieldWidth; + + Rect rect = EditorGUILayout.GetControlRect(false, 18); + Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width, 18); + + float width = rect.width + 3; + pos0.width = old_LabelWidth; + GUI.Label(pos0, label); + + Rect rectangle = property.rectValue; + + float width_B = width - old_LabelWidth; + float fieldWidth = width_B / 4; + pos0.width = fieldWidth - 5; + + pos0.x = old_LabelWidth + 15; + GUI.Label(pos0, "Width"); + + pos0.x += fieldWidth; + rectangle.width = EditorGUI.FloatField(pos0, GUIContent.none, rectangle.width); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Height"); + + pos0.x += fieldWidth; + rectangle.height = EditorGUI.FloatField(pos0, GUIContent.none, rectangle.height); + + property.rectValue = rectangle; + EditorGUIUtility.labelWidth = old_LabelWidth; + EditorGUIUtility.fieldWidth = old_FieldWidth; + } + + + private void DrawMaginProperty(SerializedProperty property, string label) + { + float old_LabelWidth = EditorGUIUtility.labelWidth; + float old_FieldWidth = EditorGUIUtility.fieldWidth; + + Rect rect = EditorGUILayout.GetControlRect(false, 2 * 18); + Rect pos0 = new Rect(rect.x, rect.y + 2, rect.width, 18); + + float width = rect.width + 3; + pos0.width = old_LabelWidth; + GUI.Label(pos0, label); + + //Vector4 vec = property.vector4Value; + Vector4 vec = Vector4.zero; + vec.x = property.FindPropertyRelative("x").floatValue; + vec.y = property.FindPropertyRelative("y").floatValue; + vec.z = property.FindPropertyRelative("z").floatValue; + vec.w = property.FindPropertyRelative("w").floatValue; + + + float widthB = width - old_LabelWidth; + float fieldWidth = widthB / 4; + pos0.width = fieldWidth - 5; + + // Labels + pos0.x = old_LabelWidth + 15; + GUI.Label(pos0, "Left"); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Top"); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Right"); + + pos0.x += fieldWidth; + GUI.Label(pos0, "Bottom"); + + pos0.y += 18; + + pos0.x = old_LabelWidth + 15; + vec.x = EditorGUI.FloatField(pos0, GUIContent.none, vec.x); + + pos0.x += fieldWidth; + vec.y = EditorGUI.FloatField(pos0, GUIContent.none, vec.y); + + pos0.x += fieldWidth; + vec.z = EditorGUI.FloatField(pos0, GUIContent.none, vec.z); + + pos0.x += fieldWidth; + vec.w = EditorGUI.FloatField(pos0, GUIContent.none, vec.w); + + //property.vector4Value = vec; + property.FindPropertyRelative("x").floatValue = vec.x; + property.FindPropertyRelative("y").floatValue = vec.y; + property.FindPropertyRelative("z").floatValue = vec.z; + property.FindPropertyRelative("w").floatValue = vec.w; + + EditorGUIUtility.labelWidth = old_LabelWidth; + EditorGUIUtility.fieldWidth = old_FieldWidth; + } + + + Vector2 GetAnchorPosition(int index) + { + Vector2 anchorPosition = Vector2.zero; + + switch (index) + { + case 0: // TOP LEFT + anchorPosition = new Vector2(0, 1); + break; + case 1: // TOP + anchorPosition = new Vector2(0.5f, 1); + break; + case 2: // TOP RIGHT + anchorPosition = new Vector2(1, 1); + break; + case 3: // LEFT + anchorPosition = new Vector2(0, 0.5f); + break; + case 4: // MIDDLE + anchorPosition = new Vector2(0.5f, 0.5f); + break; + case 5: // RIGHT + anchorPosition = new Vector2(1, 0.5f); + break; + case 6: // BOTTOM LEFT + anchorPosition = new Vector2(0, 0); + break; + case 7: // BOTTOM + anchorPosition = new Vector2(0.5f, 0); + break; + case 8: // BOTTOM RIGHT + anchorPosition = new Vector2(1, 0); + break; + } + + return anchorPosition; + } + + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta new file mode 100644 index 0000000..bad7881 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 02893ffb522b490a9fa28eedd2584309 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs new file mode 100644 index 0000000..b822d47 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs @@ -0,0 +1,91 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections; + + +namespace TMPro.EditorUtilities +{ + + public class TMPro_TexturePostProcessor : AssetPostprocessor + { + void OnPostprocessTexture(Texture2D texture) + { + Texture2D tex = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Texture2D)) as Texture2D; + + // Send Event Sub Objects + if (tex != null) + TMPro_EventManager.ON_SPRITE_ASSET_PROPERTY_CHANGED(true, tex); + } + } + + /// + /// Asset post processor used to handle font assets getting updated outside of the Unity editor. + /// + class FontAssetPostProcessor : AssetPostprocessor + { + private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) + { + foreach (var asset in importedAssets) + { + if (AssetDatabase.GetMainAssetTypeAtPath(asset) == typeof(TMP_FontAsset)) + { + TMP_FontAsset fontAsset = AssetDatabase.LoadAssetAtPath(asset, typeof(TMP_FontAsset)) as TMP_FontAsset; + + if (fontAsset != null) + TMP_EditorResourceManager.RegisterFontAssetForDefinitionRefresh(fontAsset); + } + } + } + } + + //public class TMPro_PackageImportPostProcessor : AssetPostprocessor + //{ + // static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) + // { + // for (int i = 0; i < importedAssets.Length; i++) + // { + // if (importedAssets[i].Contains("TextMesh Pro/Resources/TMP Settings.asset")) + // { + // Debug.Log("New TMP Settings file was just imported."); + + // // TMP Settings file was just re-imported. + // // Check if project already contains + // } + + + // if (importedAssets[i].Contains("com.unity.TextMeshPro/Examples")) + // { + // //Debug.Log("New TMP Examples folder was just imported."); + // } + + // //Debug.Log("[" + importedAssets[i] + "] was just imported."); + // } + + + + // //for (int i = 0; i < deletedAssets.Length; i++) + // //{ + // // if (deletedAssets[i] == "Assets/TextMesh Pro") + // // { + // // //Debug.Log("Asset [" + deletedAssets[i] + "] has been deleted."); + // // string currentBuildSettings = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + + // // //Check for and inject TMP_PRESENT + // // if (currentBuildSettings.Contains("TMP_PRESENT;")) + // // { + // // currentBuildSettings = currentBuildSettings.Replace("TMP_PRESENT;", ""); + + // // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings); + // // } + // // else if (currentBuildSettings.Contains("TMP_PRESENT")) + // // { + // // currentBuildSettings = currentBuildSettings.Replace("TMP_PRESENT", ""); + + // // PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, currentBuildSettings); + // // } + // // } + // //} + // } + //} +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta new file mode 100644 index 0000000..fb00b80 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f4935fb862d54980b1bcbca942962642 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef new file mode 100644 index 0000000..437e221 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef @@ -0,0 +1,11 @@ +{ + "name": "Unity.TextMeshPro.Editor", + "references": [ + "Unity.TextMeshPro" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [] +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta new file mode 100644 index 0000000..6ed76ad --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6546d7765b4165b40850b3667f981c26 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime.meta new file mode 100644 index 0000000..4b24415 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5fc988a1d5b04aee9a5222502b201a45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs new file mode 100644 index 0000000..5278493 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs @@ -0,0 +1,11 @@ +using System.Runtime.CompilerServices; + +// Allow internal visibility for testing purposes. +[assembly: InternalsVisibleTo("Unity.TextCore")] + +[assembly: InternalsVisibleTo("Unity.FontEngine.Tests")] + +#if UNITY_EDITOR +[assembly: InternalsVisibleTo("Unity.TextCore.Editor")] +[assembly: InternalsVisibleTo("Unity.TextMeshPro.Editor")] +#endif diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs.meta new file mode 100644 index 0000000..cd52706 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c147d10db452eb4b854a35f84472017 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs new file mode 100644 index 0000000..62b378d --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs @@ -0,0 +1,150 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro +{ + public class FastAction + { + + LinkedList delegates = new LinkedList(); + + Dictionary> lookup = new Dictionary>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + LinkedListNode node; + if (lookup.TryGetValue(rhs, out node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call() + { + var node = delegates.First; + while (node != null) + { + node.Value(); + node = node.Next; + } + } + } + + + public class FastAction + { + + LinkedList> delegates = new LinkedList>(); + + Dictionary, LinkedListNode>> lookup = new Dictionary, LinkedListNode>>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + LinkedListNode> node; + if (lookup.TryGetValue(rhs, out node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call(A a) + { + var node = delegates.First; + while (node != null) + { + node.Value(a); + node = node.Next; + } + } + } + + + public class FastAction + { + + LinkedList> delegates = new LinkedList>(); + + Dictionary, LinkedListNode>> lookup = new Dictionary, LinkedListNode>>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + LinkedListNode> node; + if (lookup.TryGetValue(rhs, out node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call(A a, B b) + { + var node = delegates.First; + while (node != null) + { + node.Value(a, b); + node = node.Next; + } + } + } + + + public class FastAction + { + + LinkedList> delegates = new LinkedList>(); + + Dictionary, LinkedListNode>> lookup = new Dictionary, LinkedListNode>>(); + + public void Add(System.Action rhs) + { + if (lookup.ContainsKey(rhs)) return; + + lookup[rhs] = delegates.AddLast(rhs); + } + + public void Remove(System.Action rhs) + { + LinkedListNode> node; + if (lookup.TryGetValue(rhs, out node)) + { + lookup.Remove(rhs); + delegates.Remove(node); + } + } + + public void Call(A a, B b, C c) + { + var node = delegates.First; + while (node != null) + { + node.Value(a, b, c); + node = node.Next; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs.meta new file mode 100644 index 0000000..fcd991e --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 871f8edd56e84b8fb295b10cc3c78f36 +timeCreated: 1435956061 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs new file mode 100644 index 0000000..5d3f57a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs @@ -0,0 +1,17 @@ + + +namespace TMPro +{ + /// + /// Interface used for preprocessing and shaping of text. + /// + public interface ITextPreprocessor + { + /// + /// Function used for preprocessing of text + /// + /// Source text to be processed + /// Processed text + string PreprocessText(string text); + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs.meta new file mode 100644 index 0000000..8dd7083 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afc31ad767318c9488de260c166cd21d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs new file mode 100644 index 0000000..c1e05e9 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs @@ -0,0 +1,652 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + + +namespace TMPro +{ + + public class MaterialReferenceManager + { + private static MaterialReferenceManager s_Instance; + + // Dictionaries used to track Asset references. + private Dictionary m_FontMaterialReferenceLookup = new Dictionary(); + private Dictionary m_FontAssetReferenceLookup = new Dictionary(); + private Dictionary m_SpriteAssetReferenceLookup = new Dictionary(); + private Dictionary m_ColorGradientReferenceLookup = new Dictionary(); + + + /// + /// Get a singleton instance of the registry + /// + public static MaterialReferenceManager instance + { + get + { + if (MaterialReferenceManager.s_Instance == null) + MaterialReferenceManager.s_Instance = new MaterialReferenceManager(); + return MaterialReferenceManager.s_Instance; + } + } + + + + /// + /// Add new font asset reference to dictionary. + /// + /// + public static void AddFontAsset(TMP_FontAsset fontAsset) + { + MaterialReferenceManager.instance.AddFontAssetInternal(fontAsset); + } + + /// + /// Add new Font Asset reference to dictionary. + /// + /// + private void AddFontAssetInternal(TMP_FontAsset fontAsset) + { + if (m_FontAssetReferenceLookup.ContainsKey(fontAsset.hashCode)) return; + + // Add reference to the font asset. + m_FontAssetReferenceLookup.Add(fontAsset.hashCode, fontAsset); + + // Add reference to the font material. + m_FontMaterialReferenceLookup.Add(fontAsset.materialHashCode, fontAsset.material); + } + + + + /// + /// Add new Sprite Asset to dictionary. + /// + /// + /// + public static void AddSpriteAsset(TMP_SpriteAsset spriteAsset) + { + MaterialReferenceManager.instance.AddSpriteAssetInternal(spriteAsset); + } + + /// + /// Internal method to add a new sprite asset to the dictionary. + /// + /// + /// + private void AddSpriteAssetInternal(TMP_SpriteAsset spriteAsset) + { + if (m_SpriteAssetReferenceLookup.ContainsKey(spriteAsset.hashCode)) return; + + // Add reference to sprite asset. + m_SpriteAssetReferenceLookup.Add(spriteAsset.hashCode, spriteAsset); + + // Adding reference to the sprite asset material as well + m_FontMaterialReferenceLookup.Add(spriteAsset.hashCode, spriteAsset.material); + } + + /// + /// Add new Sprite Asset to dictionary. + /// + /// + /// + public static void AddSpriteAsset(int hashCode, TMP_SpriteAsset spriteAsset) + { + MaterialReferenceManager.instance.AddSpriteAssetInternal(hashCode, spriteAsset); + } + + /// + /// Internal method to add a new sprite asset to the dictionary. + /// + /// + /// + private void AddSpriteAssetInternal(int hashCode, TMP_SpriteAsset spriteAsset) + { + if (m_SpriteAssetReferenceLookup.ContainsKey(hashCode)) return; + + // Add reference to Sprite Asset. + m_SpriteAssetReferenceLookup.Add(hashCode, spriteAsset); + + // Add reference to Sprite Asset using the asset hashcode. + m_FontMaterialReferenceLookup.Add(hashCode, spriteAsset.material); + + // Compatibility check + if (spriteAsset.hashCode == 0) spriteAsset.hashCode = hashCode; + } + + + /// + /// Add new Material reference to dictionary. + /// + /// + /// + public static void AddFontMaterial(int hashCode, Material material) + { + MaterialReferenceManager.instance.AddFontMaterialInternal(hashCode, material); + } + + /// + /// Add new material reference to dictionary. + /// + /// + /// + private void AddFontMaterialInternal(int hashCode, Material material) + { + // Since this function is called after checking if the material is + // contained in the dictionary, there is no need to check again. + m_FontMaterialReferenceLookup.Add(hashCode, material); + } + + + /// + /// Add new Color Gradient Preset to dictionary. + /// + /// + /// + public static void AddColorGradientPreset(int hashCode, TMP_ColorGradient spriteAsset) + { + MaterialReferenceManager.instance.AddColorGradientPreset_Internal(hashCode, spriteAsset); + } + + /// + /// Internal method to add a new Color Gradient Preset to the dictionary. + /// + /// + /// + private void AddColorGradientPreset_Internal(int hashCode, TMP_ColorGradient spriteAsset) + { + if (m_ColorGradientReferenceLookup.ContainsKey(hashCode)) return; + + // Add reference to Color Gradient Preset Asset. + m_ColorGradientReferenceLookup.Add(hashCode, spriteAsset); + } + + + + /// + /// Add new material reference and return the index of this new reference in the materialReferences array. + /// + /// + /// + /// + //public int AddMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset) + //{ + // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode)) + // { + // int index = m_MaterialReferenceLookup.Count; + + // materialReferences[index].fontAsset = fontAsset; + // materialReferences[index].material = material; + // materialReferences[index].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false; + // materialReferences[index].index = index; + // materialReferences[index].referenceCount = 0; + + // m_MaterialReferenceLookup[materialHashCode] = index; + + // // Compute Padding value and store it + // // TODO + + // int fontAssetHashCode = fontAsset.hashCode; + + // if (!m_FontAssetReferenceLookup.ContainsKey(fontAssetHashCode)) + // m_FontAssetReferenceLookup.Add(fontAssetHashCode, fontAsset); + + // m_countInternal += 1; + + // return index; + // } + // else + // { + // return m_MaterialReferenceLookup[materialHashCode]; + // } + //} + + + /// + /// Add new material reference and return the index of this new reference in the materialReferences array. + /// + /// + /// + /// + /// + //public int AddMaterial(Material material, int materialHashCode, TMP_SpriteAsset spriteAsset) + //{ + // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode)) + // { + // int index = m_MaterialReferenceLookup.Count; + + // materialReferences[index].fontAsset = materialReferences[0].fontAsset; + // materialReferences[index].spriteAsset = spriteAsset; + // materialReferences[index].material = material; + // materialReferences[index].isDefaultMaterial = true; + // materialReferences[index].index = index; + // materialReferences[index].referenceCount = 0; + + // m_MaterialReferenceLookup[materialHashCode] = index; + + // int spriteAssetHashCode = spriteAsset.hashCode; + + // if (!m_SpriteAssetReferenceLookup.ContainsKey(spriteAssetHashCode)) + // m_SpriteAssetReferenceLookup.Add(spriteAssetHashCode, spriteAsset); + + // m_countInternal += 1; + + // return index; + // } + // else + // { + // return m_MaterialReferenceLookup[materialHashCode]; + // } + //} + + + /// + /// Function to check if the font asset is already referenced. + /// + /// + /// + public bool Contains(TMP_FontAsset font) + { + if (m_FontAssetReferenceLookup.ContainsKey(font.hashCode)) + return true; + + return false; + } + + + /// + /// Function to check if the sprite asset is already referenced. + /// + /// + /// + public bool Contains(TMP_SpriteAsset sprite) + { + if (m_FontAssetReferenceLookup.ContainsKey(sprite.hashCode)) + return true; + + return false; + } + + + + /// + /// Function returning the Font Asset corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetFontAsset(int hashCode, out TMP_FontAsset fontAsset) + { + return MaterialReferenceManager.instance.TryGetFontAssetInternal(hashCode, out fontAsset); + } + + /// + /// Internal Function returning the Font Asset corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetFontAssetInternal(int hashCode, out TMP_FontAsset fontAsset) + { + fontAsset = null; + + if (m_FontAssetReferenceLookup.TryGetValue(hashCode, out fontAsset)) + { + return true; + } + + return false; + } + + + + /// + /// Function returning the Sprite Asset corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetSpriteAsset(int hashCode, out TMP_SpriteAsset spriteAsset) + { + return MaterialReferenceManager.instance.TryGetSpriteAssetInternal(hashCode, out spriteAsset); + } + + /// + /// Internal function returning the Sprite Asset corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetSpriteAssetInternal(int hashCode, out TMP_SpriteAsset spriteAsset) + { + spriteAsset = null; + + if (m_SpriteAssetReferenceLookup.TryGetValue(hashCode, out spriteAsset)) + { + return true; + } + + return false; + } + + + /// + /// Function returning the Color Gradient Preset corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetColorGradientPreset(int hashCode, out TMP_ColorGradient gradientPreset) + { + return MaterialReferenceManager.instance.TryGetColorGradientPresetInternal(hashCode, out gradientPreset); + } + + /// + /// Internal function returning the Color Gradient Preset corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetColorGradientPresetInternal(int hashCode, out TMP_ColorGradient gradientPreset) + { + gradientPreset = null; + + if (m_ColorGradientReferenceLookup.TryGetValue(hashCode, out gradientPreset)) + { + return true; + } + + return false; + } + + + /// + /// Function returning the Font Material corresponding to the provided hash code. + /// + /// + /// + /// + public static bool TryGetMaterial(int hashCode, out Material material) + { + return MaterialReferenceManager.instance.TryGetMaterialInternal(hashCode, out material); + } + + /// + /// Internal function returning the Font Material corresponding to the provided hash code. + /// + /// + /// + /// + private bool TryGetMaterialInternal(int hashCode, out Material material) + { + material = null; + + if (m_FontMaterialReferenceLookup.TryGetValue(hashCode, out material)) + { + return true; + } + + return false; + } + + + /// + /// Function to lookup a material based on hash code and returning the MaterialReference containing this material. + /// + /// + /// + /// + //public bool TryGetMaterial(int hashCode, out MaterialReference materialReference) + //{ + // int materialIndex = -1; + + // if (m_MaterialReferenceLookup.TryGetValue(hashCode, out materialIndex)) + // { + // materialReference = materialReferences[materialIndex]; + + // return true; + // } + + // materialReference = new MaterialReference(); + + // return false; + //} + + + + /// + /// + /// + /// + /// + //public int GetMaterialIndex(TMP_FontAsset fontAsset) + //{ + // if (m_MaterialReferenceLookup.ContainsKey(fontAsset.materialHashCode)) + // return m_MaterialReferenceLookup[fontAsset.materialHashCode]; + + // return -1; + //} + + + /// + /// + /// + /// + /// + //public TMP_FontAsset GetFontAsset(int index) + //{ + // if (index >= 0 && index < materialReferences.Length) + // return materialReferences[index].fontAsset; + + // return null; + //} + + + /// + /// + /// + /// + /// + /// + //public void SetDefaultMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset) + //{ + // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode)) + // { + // materialReferences[0].fontAsset = fontAsset; + // materialReferences[0].material = material; + // materialReferences[0].index = 0; + // materialReferences[0].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false; + // materialReferences[0].referenceCount = 0; + // m_MaterialReferenceLookup[materialHashCode] = 0; + + // // Compute Padding value and store it + // // TODO + + // int fontHashCode = fontAsset.hashCode; + + // if (!m_FontAssetReferenceLookup.ContainsKey(fontHashCode)) + // m_FontAssetReferenceLookup.Add(fontHashCode, fontAsset); + // } + // else + // { + // materialReferences[0].fontAsset = fontAsset; + // materialReferences[0].material = material; + // materialReferences[0].index = 0; + // materialReferences[0].referenceCount = 0; + // m_MaterialReferenceLookup[materialHashCode] = 0; + // } + // // Compute padding + // // TODO + + // m_countInternal = 1; + //} + + + + /// + /// + /// + //public void Clear() + //{ + // //m_currentIndex = 0; + // m_MaterialReferenceLookup.Clear(); + // m_SpriteAssetReferenceLookup.Clear(); + // m_FontAssetReferenceLookup.Clear(); + //} + + + /// + /// Function to clear the reference count for each of the material references. + /// + //public void ClearReferenceCount() + //{ + // m_countInternal = 0; + + // for (int i = 0; i < materialReferences.Length; i++) + // { + // if (materialReferences[i].fontAsset == null) + // return; + + // materialReferences[i].referenceCount = 0; + // } + //} + + } + + + public struct TMP_MaterialReference + { + public Material material; + public int referenceCount; + } + + + public struct MaterialReference + { + + public int index; + public TMP_FontAsset fontAsset; + public TMP_SpriteAsset spriteAsset; + public Material material; + public bool isDefaultMaterial; + public bool isFallbackMaterial; + public Material fallbackMaterial; + public float padding; + public int referenceCount; + + + /// + /// Constructor for new Material Reference. + /// + /// + /// + /// + /// + /// + public MaterialReference(int index, TMP_FontAsset fontAsset, TMP_SpriteAsset spriteAsset, Material material, float padding) + { + this.index = index; + this.fontAsset = fontAsset; + this.spriteAsset = spriteAsset; + this.material = material; + this.isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false; + this.isFallbackMaterial = false; + this.fallbackMaterial = null; + this.padding = padding; + this.referenceCount = 0; + } + + + /// + /// Function to check if a certain font asset is contained in the material reference array. + /// + /// + /// + /// + public static bool Contains(MaterialReference[] materialReferences, TMP_FontAsset fontAsset) + { + int id = fontAsset.GetInstanceID(); + + for (int i = 0; i < materialReferences.Length && materialReferences[i].fontAsset != null; i++) + { + if (materialReferences[i].fontAsset.GetInstanceID() == id) + return true; + } + + return false; + } + + + /// + /// Function to add a new material reference and returning its index in the material reference array. + /// + /// + /// + /// + /// + /// + public static int AddMaterialReference(Material material, TMP_FontAsset fontAsset, MaterialReference[] materialReferences, Dictionary materialReferenceIndexLookup) + { + int materialID = material.GetInstanceID(); + int index; + + if (materialReferenceIndexLookup.TryGetValue(materialID, out index)) + { + return index; + } + else + { + index = materialReferenceIndexLookup.Count; + + // Add new reference index + materialReferenceIndexLookup[materialID] = index; + + materialReferences[index].index = index; + materialReferences[index].fontAsset = fontAsset; + materialReferences[index].spriteAsset = null; + materialReferences[index].material = material; + materialReferences[index].isDefaultMaterial = materialID == fontAsset.material.GetInstanceID() ? true : false; + //materialReferences[index].padding = 0; + materialReferences[index].referenceCount = 0; + + return index; + } + } + + + /// + /// + /// + /// + /// + /// + /// + /// + public static int AddMaterialReference(Material material, TMP_SpriteAsset spriteAsset, MaterialReference[] materialReferences, Dictionary materialReferenceIndexLookup) + { + int materialID = material.GetInstanceID(); + int index; + + if (materialReferenceIndexLookup.TryGetValue(materialID, out index)) + { + return index; + } + else + { + index = materialReferenceIndexLookup.Count; + + // Add new reference index + materialReferenceIndexLookup[materialID] = index; + + materialReferences[index].index = index; + materialReferences[index].fontAsset = materialReferences[0].fontAsset; + materialReferences[index].spriteAsset = spriteAsset; + materialReferences[index].material = material; + materialReferences[index].isDefaultMaterial = true; + //materialReferences[index].padding = 0; + materialReferences[index].referenceCount = 0; + + return index; + } + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs.meta new file mode 100644 index 0000000..17ad566 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 11a6a034ab84493cbed6af5ae7aae78b +timeCreated: 1449743129 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs new file mode 100644 index 0000000..60ed878 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs @@ -0,0 +1,42 @@ +using System; +using UnityEngine; + +namespace TMPro +{ + + // Base class inherited by the various TextMeshPro Assets. + [Serializable] + public abstract class TMP_Asset : ScriptableObject + { + /// + /// Instance ID of the TMP Asset + /// + public int instanceID + { + get + { + if (m_InstanceID == 0) + m_InstanceID = GetInstanceID(); + + return m_InstanceID; + } + } + private int m_InstanceID; + + /// + /// HashCode based on the name of the asset. + /// + public int hashCode; + + /// + /// The material used by this asset. + /// + public Material material; + + /// + /// HashCode based on the name of the material assigned to this asset. + /// + public int materialHashCode; + + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs.meta new file mode 100644 index 0000000..62e9ee7 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3bda1886f58f4e0ab1139400b160c3ee +timeCreated: 1459318952 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs new file mode 100644 index 0000000..6b4cc83 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs @@ -0,0 +1,70 @@ +using System; +using UnityEngine.TextCore; + +namespace TMPro +{ + /// + /// A basic element of text. + /// + [Serializable] + public class TMP_Character : TMP_TextElement + { + /// + /// Default constructor. + /// + public TMP_Character() + { + m_ElementType = TextElementType.Character; + this.scale = 1.0f; + } + + /// + /// Constructor for new character + /// + /// Unicode value. + /// Glyph + public TMP_Character(uint unicode, Glyph glyph) + { + m_ElementType = TextElementType.Character; + + this.unicode = unicode; + this.textAsset = null; + this.glyph = glyph; + this.glyphIndex = glyph.index; + this.scale = 1.0f; + } + + /// + /// Constructor for new character + /// + /// Unicode value. + /// The font asset to which this character belongs. + /// Glyph + public TMP_Character(uint unicode, TMP_FontAsset fontAsset, Glyph glyph) + { + m_ElementType = TextElementType.Character; + + this.unicode = unicode; + this.textAsset = fontAsset; + this.glyph = glyph; + this.glyphIndex = glyph.index; + this.scale = 1.0f; + } + + /// + /// Constructor for new character + /// + /// Unicode value. + /// Glyph index. + internal TMP_Character(uint unicode, uint glyphIndex) + { + m_ElementType = TextElementType.Character; + + this.unicode = unicode; + this.textAsset = null; + this.glyph = null; + this.glyphIndex = glyphIndex; + this.scale = 1.0f; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs.meta new file mode 100644 index 0000000..55aea1b --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ac5b6a65aaeb59478e3b78660e9f134 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs new file mode 100644 index 0000000..2a919f6 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs @@ -0,0 +1,220 @@ +using System.Diagnostics; +using UnityEngine; + + +namespace TMPro +{ + public struct TMP_Vertex + { + public Vector3 position; + public Vector2 uv; + public Vector2 uv2; + public Vector2 uv4; + public Color32 color; + + public static TMP_Vertex zero { get { return k_Zero; } } + + //public Vector3 normal; + //public Vector4 tangent; + + static readonly TMP_Vertex k_Zero = new TMP_Vertex(); + } + + /// + /// + /// + public struct TMP_Offset + { + public float left { get { return m_Left; } set { m_Left = value; } } + + public float right { get { return m_Right; } set { m_Right = value; } } + + public float top { get { return m_Top; } set { m_Top = value; } } + + public float bottom { get { return m_Bottom; } set { m_Bottom = value; } } + + public float horizontal { get { return m_Left; } set { m_Left = value; m_Right = value; } } + + public float vertical { get { return m_Top; } set { m_Top = value; m_Bottom = value; } } + + /// + /// + /// + public static TMP_Offset zero { get { return k_ZeroOffset; } } + + // ============================================= + // Private backing fields for public properties. + // ============================================= + + float m_Left; + float m_Right; + float m_Top; + float m_Bottom; + + static readonly TMP_Offset k_ZeroOffset = new TMP_Offset(0F, 0F, 0F, 0F); + + /// + /// + /// + /// + /// + /// + /// + public TMP_Offset(float left, float right, float top, float bottom) + { + m_Left = left; + m_Right = right; + m_Top = top; + m_Bottom = bottom; + } + + /// + /// + /// + /// + /// + public TMP_Offset(float horizontal, float vertical) + { + m_Left = horizontal; + m_Right = horizontal; + m_Top = vertical; + m_Bottom = vertical; + } + + public static bool operator ==(TMP_Offset lhs, TMP_Offset rhs) + { + return lhs.m_Left == rhs.m_Left && + lhs.m_Right == rhs.m_Right && + lhs.m_Top == rhs.m_Top && + lhs.m_Bottom == rhs.m_Bottom; + } + + public static bool operator !=(TMP_Offset lhs, TMP_Offset rhs) + { + return !(lhs == rhs); + } + + public static TMP_Offset operator *(TMP_Offset a, float b) + { + return new TMP_Offset(a.m_Left * b, a.m_Right * b, a.m_Top * b, a.m_Bottom * b); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public bool Equals(TMP_Offset other) + { + return base.Equals(other); + } + } + + + /// + /// + /// + public struct HighlightState + { + public Color32 color; + public TMP_Offset padding; + + public HighlightState(Color32 color, TMP_Offset padding) + { + this.color = color; + this.padding = padding; + } + + public static bool operator ==(HighlightState lhs, HighlightState rhs) + { + return lhs.color.Compare(rhs.color) && lhs.padding == rhs.padding; + } + + public static bool operator !=(HighlightState lhs, HighlightState rhs) + { + return !(lhs == rhs); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public bool Equals(HighlightState other) + { + return base.Equals(other); + } + } + /// + /// Structure containing information about individual text elements (character or sprites). + /// + [DebuggerDisplay("Unicode '{character}' ({((uint)character).ToString(\"X\")})")] + public struct TMP_CharacterInfo + { + public char character; // Should be changed to an uint to handle UTF32 + /// + /// Index of the character in the raw string. + /// + public int index; // Index of the character in the input string. + public int stringLength; + public TMP_TextElementType elementType; + + public TMP_TextElement textElement; + public TMP_FontAsset fontAsset; + public TMP_SpriteAsset spriteAsset; + public int spriteIndex; + public Material material; + public int materialReferenceIndex; + public bool isUsingAlternateTypeface; + + public float pointSize; + + //public short wordNumber; + public int lineNumber; + //public short charNumber; + public int pageNumber; + + + public int vertexIndex; + public TMP_Vertex vertex_BL; + public TMP_Vertex vertex_TL; + public TMP_Vertex vertex_TR; + public TMP_Vertex vertex_BR; + + public Vector3 topLeft; + public Vector3 bottomLeft; + public Vector3 topRight; + public Vector3 bottomRight; + + public float origin; + public float xAdvance; + public float ascender; + public float baseLine; + public float descender; + internal float adjustedAscender; + internal float adjustedDescender; + + public float aspectRatio; + public float scale; + public Color32 color; + public Color32 underlineColor; + public int underlineVertexIndex; + public Color32 strikethroughColor; + public int strikethroughVertexIndex; + public Color32 highlightColor; + public HighlightState highlightState; + public FontStyles style; + public bool isVisible; + //public bool isIgnoringAlignment; + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta new file mode 100644 index 0000000..9367a16 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 90fe1c65e6bb3bc4e90862df7297719e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs new file mode 100644 index 0000000..8e8e38a --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs @@ -0,0 +1,68 @@ +using UnityEngine; +using System.Collections; + +namespace TMPro +{ + public enum ColorMode + { + Single, + HorizontalGradient, + VerticalGradient, + FourCornersGradient + } + + [System.Serializable][ExcludeFromPresetAttribute] + public class TMP_ColorGradient : ScriptableObject + { + public ColorMode colorMode = ColorMode.FourCornersGradient; + + public Color topLeft; + public Color topRight; + public Color bottomLeft; + public Color bottomRight; + + const ColorMode k_DefaultColorMode = ColorMode.FourCornersGradient; + static readonly Color k_DefaultColor = Color.white; + + /// + /// Default Constructor which sets each of the colors as white. + /// + public TMP_ColorGradient() + { + colorMode = k_DefaultColorMode; + topLeft = k_DefaultColor; + topRight = k_DefaultColor; + bottomLeft = k_DefaultColor; + bottomRight = k_DefaultColor; + } + + /// + /// Constructor allowing to set the default color of the Color Gradient. + /// + /// + public TMP_ColorGradient(Color color) + { + colorMode = k_DefaultColorMode; + topLeft = color; + topRight = color; + bottomLeft = color; + bottomRight = color; + } + + /// + /// The vertex colors at the corners of the characters. + /// + /// Top left color. + /// Top right color. + /// Bottom left color. + /// Bottom right color. + public TMP_ColorGradient(Color color0, Color color1, Color color2, Color color3) + { + colorMode = k_DefaultColorMode; + this.topLeft = color0; + this.topRight = color1; + this.bottomLeft = color2; + this.bottomRight = color3; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs.meta new file mode 100644 index 0000000..1d79d01 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 54d21f6ece3b46479f0c328f8c6007e0 +timeCreated: 1468187202 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs new file mode 100644 index 0000000..8484a5c --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs @@ -0,0 +1,74 @@ +using UnityEngine; +using System.Collections; + + +namespace TMPro +{ + // Class used to convert scenes and objects saved in version 0.1.44 to the new Text Container + public static class TMP_Compatibility + { + public enum AnchorPositions { TopLeft, Top, TopRight, Left, Center, Right, BottomLeft, Bottom, BottomRight, BaseLine, None }; + + /// + /// Function used to convert text alignment option enumeration format. + /// + /// + /// + public static TextAlignmentOptions ConvertTextAlignmentEnumValues(TextAlignmentOptions oldValue) + { + switch ((int)oldValue) + { + case 0: + return TextAlignmentOptions.TopLeft; + case 1: + return TextAlignmentOptions.Top; + case 2: + return TextAlignmentOptions.TopRight; + case 3: + return TextAlignmentOptions.TopJustified; + case 4: + return TextAlignmentOptions.Left; + case 5: + return TextAlignmentOptions.Center; + case 6: + return TextAlignmentOptions.Right; + case 7: + return TextAlignmentOptions.Justified; + case 8: + return TextAlignmentOptions.BottomLeft; + case 9: + return TextAlignmentOptions.Bottom; + case 10: + return TextAlignmentOptions.BottomRight; + case 11: + return TextAlignmentOptions.BottomJustified; + case 12: + return TextAlignmentOptions.BaselineLeft; + case 13: + return TextAlignmentOptions.Baseline; + case 14: + return TextAlignmentOptions.BaselineRight; + case 15: + return TextAlignmentOptions.BaselineJustified; + case 16: + return TextAlignmentOptions.MidlineLeft; + case 17: + return TextAlignmentOptions.Midline; + case 18: + return TextAlignmentOptions.MidlineRight; + case 19: + return TextAlignmentOptions.MidlineJustified; + case 20: + return TextAlignmentOptions.CaplineLeft; + case 21: + return TextAlignmentOptions.Capline; + case 22: + return TextAlignmentOptions.CaplineRight; + case 23: + return TextAlignmentOptions.CaplineJustified; + } + + return TextAlignmentOptions.TopLeft; + } + } +} diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs.meta new file mode 100644 index 0000000..e0c9cab --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21364f754cf9b9b47a60742332d4af56 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs new file mode 100644 index 0000000..bec1f54 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs @@ -0,0 +1,246 @@ +using UnityEngine; +using UnityEngine.Events; +using System.Collections; + + +namespace TMPro +{ + // Base interface for tweeners, + // using an interface instead of + // an abstract class as we want the + // tweens to be structs. + internal interface ITweenValue + { + void TweenValue(float floatPercentage); + bool ignoreTimeScale { get; } + float duration { get; } + bool ValidTarget(); + } + + // Color tween class, receives the + // TweenValue callback and then sets + // the value on the target. + internal struct ColorTween : ITweenValue + { + public enum ColorTweenMode + { + All, + RGB, + Alpha + } + + public class ColorTweenCallback : UnityEvent { } + + private ColorTweenCallback m_Target; + private Color m_StartColor; + private Color m_TargetColor; + private ColorTweenMode m_TweenMode; + + private float m_Duration; + private bool m_IgnoreTimeScale; + + public Color startColor + { + get { return m_StartColor; } + set { m_StartColor = value; } + } + + public Color targetColor + { + get { return m_TargetColor; } + set { m_TargetColor = value; } + } + + public ColorTweenMode tweenMode + { + get { return m_TweenMode; } + set { m_TweenMode = value; } + } + + public float duration + { + get { return m_Duration; } + set { m_Duration = value; } + } + + public bool ignoreTimeScale + { + get { return m_IgnoreTimeScale; } + set { m_IgnoreTimeScale = value; } + } + + public void TweenValue(float floatPercentage) + { + if (!ValidTarget()) + return; + + var newColor = Color.Lerp(m_StartColor, m_TargetColor, floatPercentage); + + if (m_TweenMode == ColorTweenMode.Alpha) + { + newColor.r = m_StartColor.r; + newColor.g = m_StartColor.g; + newColor.b = m_StartColor.b; + } + else if (m_TweenMode == ColorTweenMode.RGB) + { + newColor.a = m_StartColor.a; + } + m_Target.Invoke(newColor); + } + + public void AddOnChangedCallback(UnityAction callback) + { + if (m_Target == null) + m_Target = new ColorTweenCallback(); + + m_Target.AddListener(callback); + } + + public bool GetIgnoreTimescale() + { + return m_IgnoreTimeScale; + } + + public float GetDuration() + { + return m_Duration; + } + + public bool ValidTarget() + { + return m_Target != null; + } + } + + // Float tween class, receives the + // TweenValue callback and then sets + // the value on the target. + internal struct FloatTween : ITweenValue + { + public class FloatTweenCallback : UnityEvent { } + + private FloatTweenCallback m_Target; + private float m_StartValue; + private float m_TargetValue; + + private float m_Duration; + private bool m_IgnoreTimeScale; + + public float startValue + { + get { return m_StartValue; } + set { m_StartValue = value; } + } + + public float targetValue + { + get { return m_TargetValue; } + set { m_TargetValue = value; } + } + + public float duration + { + get { return m_Duration; } + set { m_Duration = value; } + } + + public bool ignoreTimeScale + { + get { return m_IgnoreTimeScale; } + set { m_IgnoreTimeScale = value; } + } + + public void TweenValue(float floatPercentage) + { + if (!ValidTarget()) + return; + + var newValue = Mathf.Lerp(m_StartValue, m_TargetValue, floatPercentage); + m_Target.Invoke(newValue); + } + + public void AddOnChangedCallback(UnityAction callback) + { + if (m_Target == null) + m_Target = new FloatTweenCallback(); + + m_Target.AddListener(callback); + } + + public bool GetIgnoreTimescale() + { + return m_IgnoreTimeScale; + } + + public float GetDuration() + { + return m_Duration; + } + + public bool ValidTarget() + { + return m_Target != null; + } + } + + // Tween runner, executes the given tween. + // The coroutine will live within the given + // behaviour container. + internal class TweenRunner where T : struct, ITweenValue + { + protected MonoBehaviour m_CoroutineContainer; + protected IEnumerator m_Tween; + + // utility function for starting the tween + private static IEnumerator Start(T tweenInfo) + { + if (!tweenInfo.ValidTarget()) + yield break; + + var elapsedTime = 0.0f; + while (elapsedTime < tweenInfo.duration) + { + elapsedTime += tweenInfo.ignoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime; + var percentage = Mathf.Clamp01(elapsedTime / tweenInfo.duration); + tweenInfo.TweenValue(percentage); + yield return null; + } + tweenInfo.TweenValue(1.0f); + } + + public void Init(MonoBehaviour coroutineContainer) + { + m_CoroutineContainer = coroutineContainer; + } + + public void StartTween(T info) + { + if (m_CoroutineContainer == null) + { + Debug.LogWarning("Coroutine container not configured... did you forget to call Init?"); + return; + } + + StopTween(); + + if (!m_CoroutineContainer.gameObject.activeInHierarchy) + { + info.TweenValue(1.0f); + return; + } + + m_Tween = Start(info); + m_CoroutineContainer.StartCoroutine(m_Tween); + } + + public void StopTween() + { + if (m_Tween != null) + { + m_CoroutineContainer.StopCoroutine(m_Tween); + m_Tween = null; + } + } + } +} \ No newline at end of file diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta new file mode 100644 index 0000000..01cf5eb --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 658c1fb149e7498aa072b0c0f3bf13f0 +timeCreated: 1464850953 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_DefaultControls.cs b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_DefaultControls.cs new file mode 100644 index 0000000..45eac33 --- /dev/null +++ b/PatchTestProject/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_DefaultControls.cs @@ -0,0 +1,401 @@ +using UnityEngine; +using System.Collections; +using UnityEngine.UI; + +#if UNITY_EDITOR +using UnityEditor; +#endif + + +namespace TMPro +{ + + public static class TMP_DefaultControls + { + public struct Resources + { + public Sprite standard; + public Sprite background; + public Sprite inputField; + public Sprite knob; + public Sprite checkmark; + public Sprite dropdown; + public Sprite mask; + } + + private const float kWidth = 160f; + private const float kThickHeight = 30f; + private const float kThinHeight = 20f; + private static Vector2 s_TextElementSize = new Vector2(100f, 100f); + private static Vector2 s_ThickElementSize = new Vector2(kWidth, kThickHeight); + private static Vector2 s_ThinElementSize = new Vector2(kWidth, kThinHeight); + //private static Vector2 s_ImageElementSize = new Vector2(100f, 100f); + private static Color s_DefaultSelectableColor = new Color(1f, 1f, 1f, 1f); + //private static Color s_PanelColor = new Color(1f, 1f, 1f, 0.392f); + private static Color s_TextColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f); + + + private static GameObject CreateUIElementRoot(string name, Vector2 size) + { + GameObject child = new GameObject(name); + RectTransform rectTransform = child.AddComponent(); + rectTransform.sizeDelta = size; + return child; + } + + static GameObject CreateUIObject(string name, GameObject parent) + { + GameObject go = new GameObject(name); + go.AddComponent(); + SetParentAndAlign(go, parent); + return go; + } + + private static void SetDefaultTextValues(TMP_Text lbl) + { + // Set text values we want across UI elements in default controls. + // Don't set values which are the same as the default values for the Text component, + // since there's no point in that, and it's good to keep them as consistent as possible. + lbl.color = s_TextColor; + lbl.fontSize = 14; + } + + private static void SetDefaultColorTransitionValues(Selectable slider) + { + ColorBlock colors = slider.colors; + colors.highlightedColor = new Color(0.882f, 0.882f, 0.882f); + colors.pressedColor = new Color(0.698f, 0.698f, 0.698f); + colors.disabledColor = new Color(0.521f, 0.521f, 0.521f); + } + + private static void SetParentAndAlign(GameObject child, GameObject parent) + { + if (parent == null) + return; + + child.transform.SetParent(parent.transform, false); + SetLayerRecursively(child, parent.layer); + } + + private static void SetLayerRecursively(GameObject go, int layer) + { + go.layer = layer; + Transform t = go.transform; + for (int i = 0; i < t.childCount; i++) + SetLayerRecursively(t.GetChild(i).gameObject, layer); + } + + // Actual controls + + public static GameObject CreateScrollbar(Resources resources) + { + // Create GOs Hierarchy + GameObject scrollbarRoot = CreateUIElementRoot("Scrollbar", s_ThinElementSize); + + GameObject sliderArea = CreateUIObject("Sliding Area", scrollbarRoot); + GameObject handle = CreateUIObject("Handle", sliderArea); + + Image bgImage = scrollbarRoot.AddComponent(); + bgImage.sprite = resources.background; + bgImage.type = Image.Type.Sliced; + bgImage.color = s_DefaultSelectableColor; + + Image handleImage = handle.AddComponent(); + handleImage.sprite = resources.standard; + handleImage.type = Image.Type.Sliced; + handleImage.color = s_DefaultSelectableColor; + + RectTransform sliderAreaRect = sliderArea.GetComponent(); + sliderAreaRect.sizeDelta = new Vector2(-20, -20); + sliderAreaRect.anchorMin = Vector2.zero; + sliderAreaRect.anchorMax = Vector2.one; + + RectTransform handleRect = handle.GetComponent(); + handleRect.sizeDelta = new Vector2(20, 20); + + Scrollbar scrollbar = scrollbarRoot.AddComponent(); + scrollbar.handleRect = handleRect; + scrollbar.targetGraphic = handleImage; + SetDefaultColorTransitionValues(scrollbar); + + return scrollbarRoot; + } + + public static GameObject CreateButton(Resources resources) + { + GameObject buttonRoot = CreateUIElementRoot("Button", s_ThickElementSize); + + GameObject childText = new GameObject("Text (TMP)"); + childText.AddComponent(); + SetParentAndAlign(childText, buttonRoot); + + Image image = buttonRoot.AddComponent(); + image.sprite = resources.standard; + image.type = Image.Type.Sliced; + image.color = s_DefaultSelectableColor; + + Button bt = buttonRoot.AddComponent